diff options
author | Matthias Vogelgesang <matthias.vogelgesang@gmail.com> | 2013-03-08 09:50:28 +0100 |
---|---|---|
committer | Matthias Vogelgesang <matthias.vogelgesang@kit.edu> | 2013-03-08 09:50:38 +0100 |
commit | 2f63d08b23b64946b7f0f0a4226db10576c900cf (patch) | |
tree | 5ca26bdae9eb050d377080fb2ac990cc3cb8c254 /ufo/ufo-scheduler.c | |
parent | 22c50b09e43f5e277c21064d04741ca91ba0a462 (diff) |
Use simpler remote multi-GPU scheduling
Diffstat (limited to 'ufo/ufo-scheduler.c')
-rw-r--r-- | ufo/ufo-scheduler.c | 59 |
1 files changed, 28 insertions, 31 deletions
diff --git a/ufo/ufo-scheduler.c b/ufo/ufo-scheduler.c index ae836a5..f07832c 100644 --- a/ufo/ufo-scheduler.c +++ b/ufo/ufo-scheduler.c @@ -182,53 +182,50 @@ release_inputs (TaskLocalData *tld, } static void -exchange_data (UfoBuffer *input, - TaskLocalData *tld) -{ - UfoRemoteNode *remote; - UfoGroup *group; - UfoBuffer *output; - UfoRequisition requisition; - - remote = UFO_REMOTE_NODE (ufo_task_node_get_proc_node (UFO_TASK_NODE (tld->task))); - ufo_remote_node_send_inputs (remote, &input); - release_inputs (tld, &input); - - ufo_remote_node_get_requisition (remote, &requisition); - group = ufo_task_node_get_out_group (UFO_TASK_NODE (tld->task)); - output = ufo_group_pop_output_buffer (group, &requisition); - ufo_remote_node_get_result (remote, output); - ufo_group_push_output_buffer (group, output); -} - -static void run_remote_task (TaskLocalData *tld) { UfoRemoteNode *remote; - UfoBuffer *input; guint n_remote_gpus; - GThreadPool *pool; - GError *error = NULL; + gboolean done = FALSE; g_assert (tld->n_inputs == 1); remote = UFO_REMOTE_NODE (ufo_task_node_get_proc_node (UFO_TASK_NODE (tld->task))); n_remote_gpus = ufo_remote_node_get_num_gpus (remote); - pool = g_thread_pool_new ((GFunc) exchange_data, tld, (gint) n_remote_gpus, TRUE, &error); - g_assert_no_error (error); /* * We launch a new thread for each incoming input data set because then we * can send as many items as we have remote GPUs available without waiting * for processing to stop. */ - while (1) { - if (get_inputs (tld, &input)) - g_thread_pool_push (pool, input, &error); - else - break; + while (!done) { + for (guint i = 0; i < n_remote_gpus; i++) { + UfoBuffer *input; + + if (get_inputs (tld, &input)) { + ufo_remote_node_send_inputs (remote, &input); + release_inputs (tld, &input); + } + else { + done = TRUE; + break; + } + } + + if (!done) { + for (guint i = 0; i < n_remote_gpus; i++) { + UfoGroup *group; + UfoBuffer *output; + UfoRequisition requisition; + + ufo_remote_node_get_requisition (remote, &requisition); + group = ufo_task_node_get_out_group (UFO_TASK_NODE (tld->task)); + output = ufo_group_pop_output_buffer (group, &requisition); + ufo_remote_node_get_result (remote, output); + ufo_group_push_output_buffer (group, output); + } + } } - g_thread_pool_free (pool, FALSE, TRUE); ufo_group_finish (ufo_task_node_get_out_group (UFO_TASK_NODE (tld->task))); } |