Browse Source

add missing barriers

should fix issue #597
tags/v0.2.15^2
Grazvydas Ignotas 10 years ago
parent
commit
d3e2f0a1af
2 changed files with 13 additions and 1 deletions
  1. +10
    -1
      driver/others/blas_server.c
  2. +3
    -0
      driver/others/memory.c

+ 10
- 1
driver/others/blas_server.c View File

@@ -425,6 +425,10 @@ static int blas_thread_server(void *arg){
main_status[cpu] = MAIN_FINISH;
#endif

// arm: make sure all results are written out _before_
// thread is marked as done and other threads use them
WMB;

thread_status[cpu].queue = (blas_queue_t * volatile) ((long)thread_status[cpu].queue & 0); /* Need a trick */
WMB;

@@ -775,7 +779,12 @@ int exec_blas(BLASLONG num, blas_queue_t *queue){
stop = rpcc();
#endif

if ((num > 1) && queue -> next) exec_blas_async_wait(num - 1, queue -> next);
if ((num > 1) && queue -> next) {
exec_blas_async_wait(num - 1, queue -> next);

// arm: make sure results from other threads are visible
MB;
}

#ifdef TIMING_DEBUG
fprintf(STDERR, "Thread[0] : %16lu %16lu (%8lu cycles)\n",


+ 3
- 0
driver/others/memory.c View File

@@ -1153,6 +1153,9 @@ void blas_memory_free(void *free_area){
printf(" Position : %d\n", position);
#endif

// arm: ensure all writes are finished before other thread takes this memory
WMB;

memory[position].used = 0;

#ifdef DEBUG


Loading…
Cancel
Save