Browse Source

SOCL: use starpu_execute_on_specific_workers

Sylvain Henry 13 years ago
parent
commit
374524ebe9

+ 7 - 4
socl/src/cl_buildprogram.c

@@ -97,12 +97,15 @@ soclBuildProgram(cl_program         program,
    data->num_devices = num_devices;
    data->device_list = device_list;
 
-   /*FIXME: starpu_execute_on_each_worker is synchronous.
+   /*FIXME: starpu_execute_on_specific_workers is synchronous.
     * However pfn_notify is useful only because build is supposed to be asynchronous
-    *
-    * We shouldn't execute on every worker as device list may be specified.
     */
-   starpu_execute_on_each_worker(soclBuildProgram_task, data, STARPU_OPENCL);
+   unsigned workers[num_devices];
+   unsigned i;
+   for (i=0; i<num_devices; i++) {
+      workers[i] = device_list[i]->worker_id;
+   }
+   starpu_execute_on_specific_workers(soclBuildProgram_task, data, num_devices, workers, "SOCL_BUILD_PROGRAM");
 
 
    if (pfn_notify != NULL)

+ 8 - 5
socl/src/cl_createkernel.c

@@ -59,9 +59,11 @@ static void rk_task(void *data) {
 
    int range = starpu_worker_get_range();
 
-   cl_int err = clReleaseKernel(k->cl_kernels[range]);
-   if (err != CL_SUCCESS)
-      DEBUG_CL("clReleaseKernel", err);
+   if (k->cl_kernels[range] != NULL) {
+      cl_int err = clReleaseKernel(k->cl_kernels[range]);
+      if (err != CL_SUCCESS)
+         DEBUG_CL("clReleaseKernel", err);
+   }
 }
 
 static void release_callback_kernel(void * e) {
@@ -89,7 +91,7 @@ static void release_callback_kernel(void * e) {
     free(kernel->arg_type);
 
   //Release real kernels...
-  starpu_execute_on_each_worker(rk_task, kernel, STARPU_OPENCL);
+  starpu_execute_on_each_worker_ex(rk_task, kernel, STARPU_OPENCL, "SOCL_RELEASE_KERNEL");
 
   //Release perfmodel
   free(kernel->perfmodel);
@@ -145,6 +147,7 @@ soclCreateKernel(cl_program    program,
    device_count = starpu_opencl_worker_get_count();
    k->cl_kernels = (cl_kernel*)malloc(device_count * sizeof(cl_kernel));
    k->errcodes = (cl_int*)malloc(device_count * sizeof(cl_int));
+
    {
       int i;
       for (i=0; i<device_count; i++) {
@@ -155,7 +158,7 @@ soclCreateKernel(cl_program    program,
 
    /* Create kernel on each device */
    DEBUG_MSG("[Kernel %d] Create %d kernels (name \"%s\")\n", k->id, starpu_opencl_worker_get_count(), kernel_name);
-   starpu_execute_on_each_worker(soclCreateKernel_task, k, STARPU_OPENCL);
+   starpu_execute_on_each_worker_ex(soclCreateKernel_task, k, STARPU_OPENCL, "SOCL_CREATE_KERNEL");
 
    if (errcode_ret != NULL) {
       int i;

+ 2 - 2
socl/src/cl_createprogramwithsource.c

@@ -53,7 +53,7 @@ static void release_callback_program(void * e) {
   cl_program program = (cl_program)e;
 
   /* Destruct object */
-  starpu_execute_on_each_worker(rp_task, program, STARPU_OPENCL);
+  starpu_execute_on_each_worker_ex(rp_task, program, STARPU_OPENCL, "SOCL_RELEASE_PROGRAM");
 
   /* Release references */
   gc_entity_unstore(&program->context);
@@ -135,7 +135,7 @@ soclCreateProgramWithSource(cl_context      context,
    data->errcodes = (cl_int*)malloc(sizeof(cl_int) * device_count);
 
    /* Init real cl_program for each OpenCL device */
-   starpu_execute_on_each_worker(soclCreateProgramWithSource_task, data, STARPU_OPENCL);
+   starpu_execute_on_each_worker_ex(soclCreateProgramWithSource_task, data, STARPU_OPENCL, "SOCL_CREATE_PROGRAM");
 
    if (errcode_ret != NULL) {
       int i;

+ 2 - 2
socl/src/cl_getkernelworkgroupinfo.c

@@ -108,7 +108,7 @@ soclGetKernelWorkGroupInfo(cl_kernel                kernel,
       case CL_KERNEL_WORK_GROUP_SIZE:
          /* We take the smallest value to be sure the kernel can be executed on any available device */
          data.work_group_size = SIZE_MAX;
-         starpu_execute_on_each_worker(gkwgi_task, &data, STARPU_OPENCL);
+         starpu_execute_on_each_worker_ex(gkwgi_task, &data, STARPU_OPENCL, "SOCL_GET_KERNEL_WORKGROUP_INFO");
          INFO_CASE_EX2(data.work_group_size);
       case CL_KERNEL_COMPILE_WORK_GROUP_SIZE: {
          struct starpu_task *task;
@@ -125,7 +125,7 @@ soclGetKernelWorkGroupInfo(cl_kernel                kernel,
       case CL_KERNEL_LOCAL_MEM_SIZE:
          /* We take the biggest value to be sure the kernel can be executed on any available device */
          data.local_mem_size = 0;
-         starpu_execute_on_each_worker(gkwgi_task, &data, STARPU_OPENCL);
+         starpu_execute_on_each_worker_ex(gkwgi_task, &data, STARPU_OPENCL, "SOCL_GET_KERNEL_WORKGROUP_INFO");
          INFO_CASE_EX2(data.local_mem_size);
       default:
          return CL_INVALID_OPERATION;