summaryrefslogtreecommitdiff
path: root/ufo/ufo-scheduler.c
diff options
context:
space:
mode:
authorMatthias Vogelgesang <matthias.vogelgesang@gmail.com>2013-03-08 09:50:28 +0100
committerMatthias Vogelgesang <matthias.vogelgesang@kit.edu>2013-03-08 09:50:38 +0100
commit2f63d08b23b64946b7f0f0a4226db10576c900cf (patch)
tree5ca26bdae9eb050d377080fb2ac990cc3cb8c254 /ufo/ufo-scheduler.c
parent22c50b09e43f5e277c21064d04741ca91ba0a462 (diff)
Use simpler remote multi-GPU scheduling
Diffstat (limited to 'ufo/ufo-scheduler.c')
-rw-r--r--ufo/ufo-scheduler.c59
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)));
}