void *_starpu_gordon_worker(void *arg) { struct starpu_worker_set_s *gordon_set_arg = arg; _starpu_bind_thread_on_cpu(gordon_set_arg->config, gordon_set_arg->workers[0].bindid); /* TODO set_local_memory_node per SPU */ gordon_init(gordon_set_arg->nworkers); /* NB: On SPUs, the worker_key is set to NULL since there is no point * in associating the PPU thread with a specific SPU (worker) while * it's handling multiple processing units. */ _starpu_set_local_worker_key(NULL); /* TODO set workers' name field */ unsigned spu; for (spu = 0; spu < gordon_set_arg->nworkers; spu++) { struct starpu_worker_s *worker = &gordon_set_arg->workers[spu]; snprintf(worker->name, 32, "SPU %d", worker->id); } /* * To take advantage of PPE being hyperthreaded, we should have 2 threads * for the gordon driver : one injects works, the other makes sure that * gordon is progressing (and performs the callbacks). */ /* launch the progression thread */ PTHREAD_MUTEX_INIT(&progress_mutex, NULL); PTHREAD_COND_INIT(&progress_cond, NULL); pthread_create(&progress_thread, NULL, gordon_worker_progress, gordon_set_arg); /* wait for the progression thread to be ready */ PTHREAD_MUTEX_LOCK(&progress_mutex); while (!progress_thread_is_inited) PTHREAD_COND_WAIT(&progress_cond, &progress_mutex); PTHREAD_MUTEX_UNLOCK(&progress_mutex); _STARPU_DEBUG("progress thread is running ... \n"); /* tell the core that gordon is ready */ PTHREAD_MUTEX_LOCK(&gordon_set_arg->mutex); gordon_set_arg->set_is_initialized = 1; PTHREAD_COND_SIGNAL(&gordon_set_arg->ready_cond); PTHREAD_MUTEX_UNLOCK(&gordon_set_arg->mutex); gordon_worker_inject(gordon_set_arg); _STARPU_DEBUG("gordon deinit...\n"); gordon_deinit(); _STARPU_DEBUG("gordon was deinited\n"); pthread_exit((void *)0x42); }
int main(int argc, char** argv) { if (argc != 2) { fprintf(stderr,"%s bus\n",argv[0]); return -1; } if (gordon_init()) { fprintf(stderr,"Error Opening Gordon Device\n"); return -1; } unsigned char bus = atoi(argv[1]); gordon_reset_cyclecount(bus); return 0; }