Research Article
Multi-GPU Support on Single Node Using Directive-Based Programming Model
Algorithm 7
The master algorithm for multi-GPU programming in OpenACC.
| (1) function ENQUEUE_TASK_XXXX | | (2) Allocate memory and populate the task argument | | (3) Allocate memory and populate the task | | (4) pthread_mutex_lock(&cur_thread queue_lock) | | (5) if then ⊳push the task into the FIFO queue | | (6) cur_thread queue_head = cur_task; | | (7) cur_thread queue_tail = cur_task; | | (8) pthread_cond_signal(&cur_thread queue_ready); ⊳signal the worker that the queue is not empty and the task is ready | | (9) else | | (10) cur_thread queue_tail next = cur_task; | | (11) cur_thread queue_tail = cur_task; | | (12) end if | | (13) cur_thread queue_size++; | | (14) pthread_mutex_unlock(&cur_thread queue_lock); | | (15) if then ⊳if the task is synchronous | | (16) pthread_mutex_lock(&cur_thread queue_lock); | | (17) while do ⊳wait until this task is done | | (18) pthread_cond_wait(&cur_thread work_done, &cur_thread queue_lock); | | (19) end while | | (20) pthread_mutex_unlock(&cur_thread queue_lock); | | (21) end if | | (22) end function |
|