Accéder au contenu.
Menu Sympa

starpu-devel - [Starpu-devel] support de l'extension cl_khr_icd par socl

Objet : Developers list for StarPU

Archives de la liste

[Starpu-devel] support de l'extension cl_khr_icd par socl


Chronologique Discussions 
  • From: Brice Videau <brice.videau@imag.fr>
  • To: starpu-devel@lists.gforge.inria.fr
  • Cc: vincent.danjean@imag.fr
  • Subject: [Starpu-devel] support de l'extension cl_khr_icd par socl
  • Date: Tue, 26 Jun 2012 13:23:04 -0300
  • List-archive: <http://lists.gforge.inria.fr/pipermail/starpu-devel>
  • List-id: "Developers list. For discussion of new features, code changes, etc." <starpu-devel.lists.gforge.inria.fr>
  • Mailscanner-null-check: 1341332551.89337@b2HiiQXKHuHr6gvXnj6uLA

Bonjour,

Je souhaite proposer un patch pour StarPU. Ce patch ajoute le support de l'extension cl_khr_icd à socl ce qui permet de multiplexer les pilotes opencl sur une même plateforme.

Il manque une dépendance sur le paquet ocl-icd-dev (disponible dans wheezy) dans le buildsystem ainsi que l'installation du fichier /etc/OpenCL/vendors/socl.icd qui contient le path vers libsocl-1.0.so.

Cordialement,

Brice Videau
Index: src/drivers/opencl/driver_opencl.c
===================================================================
--- src/drivers/opencl/driver_opencl.c	(revision 6853)
+++ src/drivers/opencl/driver_opencl.c	(working copy)
@@ -350,6 +350,8 @@
 						platform_valid = 0;
 					}
 				}
+				if(strcmp(name, "StarPU Platform") == 0)
+					platform_valid = 0;
 #ifdef STARPU_VERBOSE
 				if (platform_valid)
 					_STARPU_DEBUG("Platform: %s - %s\n", name, vendor);
Index: socl/src/cl_getplatforminfo.c
===================================================================
--- socl/src/cl_getplatforminfo.c	(revision 6853)
+++ socl/src/cl_getplatforminfo.c	(working copy)
@@ -39,6 +39,7 @@
 	INFO_CASE_STRING(CL_PLATFORM_NAME,    SOCL_PLATFORM_NAME);
 	INFO_CASE_STRING(CL_PLATFORM_VENDOR,  SOCL_VENDOR);
 	INFO_CASE_STRING(CL_PLATFORM_EXTENSIONS, SOCL_PLATFORM_EXTENSIONS);
+	INFO_CASE_STRING(CL_PLATFORM_ICD_SUFFIX_KHR, SOCL_PLATFORM_ICD_SUFFIX_KHR);
    default:
          return CL_INVALID_VALUE;
    }
Index: socl/src/devices.c
===================================================================
--- socl/src/devices.c	(revision 6853)
+++ socl/src/devices.c	(working copy)
@@ -24,6 +24,7 @@
 
 const struct _cl_device_id socl_devices[] = {
    { 
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_CPU,
       .max_compute_units = 1,
       .max_work_item_dimensions = 3,
@@ -56,6 +57,7 @@
       .extensions = ""
    },
    {
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_GPU,
       .max_compute_units = 12,
       .max_work_item_dimensions = 3,
@@ -88,6 +90,7 @@
       .extensions = ""
    },
    {
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_GPU,
       .max_compute_units = 12,
       .max_work_item_dimensions = 3,
@@ -120,6 +123,7 @@
       .extensions = ""
    },
    {
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_GPU,
       .max_compute_units = 12,
       .max_work_item_dimensions = 3,
@@ -152,6 +156,7 @@
       .extensions = ""
    },
    {
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_GPU,
       .max_compute_units = 12,
       .max_work_item_dimensions = 3,
@@ -184,6 +189,7 @@
       .extensions = ""
    },
    {
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_GPU,
       .max_compute_units = 12,
       .max_work_item_dimensions = 3,
@@ -216,6 +222,7 @@
       .extensions = ""
    },
    {
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_GPU,
       .max_compute_units = 12,
       .max_work_item_dimensions = 3,
@@ -248,6 +255,7 @@
       .extensions = ""
    },
    {
+      .dispatch = &socl_master_dispatch,
       .type = CL_DEVICE_TYPE_GPU,
       .max_compute_units = 12,
       .max_work_item_dimensions = 3,
Index: socl/src/devices.h
===================================================================
--- socl/src/devices.h	(revision 6853)
+++ socl/src/devices.h	(working copy)
@@ -16,13 +16,14 @@
 
 #ifndef SOCL_DEVICES_H
 #define SOCL_DEVICES_H
-
+#include "socl.h"
 // OpenCL 1.0 : Mandatory format: major_number.minor_number
 const char * SOCL_DRIVER_VERSION;
 
 const cl_uint SOCL_DEVICE_VENDOR_ID;
 
 struct _cl_device_id {
+   struct _cl_icd_dispatch * dispatch;
    cl_device_type    type;
    cl_uint           max_compute_units;        //OpenCL 1.0: minimum value is 1
    cl_uint           max_work_item_dimensions; //OpenCL 1.0: minimum value is 3
Index: socl/src/gc.c
===================================================================
--- socl/src/gc.c	(revision 6853)
+++ socl/src/gc.c	(working copy)
@@ -141,6 +141,7 @@
 void gc_entity_init(void *arg, void (*release_callback)(void*)) {
   struct entity * e = (entity)arg;
 
+  e->dispatch = &socl_master_dispatch;
   e->refs = 1;
   e->release_callback = release_callback;
   e->prev = NULL;
Index: socl/src/cl_getextensionfunctionaddress.c
===================================================================
--- socl/src/cl_getextensionfunctionaddress.c	(revision 6853)
+++ socl/src/cl_getextensionfunctionaddress.c	(working copy)
@@ -14,6 +14,7 @@
  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  */
 
+#include <string.h>
 #include "socl.h"
 
 CL_API_ENTRY void * CL_API_CALL
@@ -22,3 +23,10 @@
    //TODO
    return NULL;
 }
+
+CL_API_ENTRY void * CL_API_CALL clGetExtensionFunctionAddress(
+             const char *   func_name) CL_API_SUFFIX__VERSION_1_0 {
+  if( func_name != NULL &&  strcmp("clIcdGetPlatformIDsKHR", func_name) == 0 )
+    return (void *)soclIcdGetPlatformIDsKHR;
+  return NULL;
+}
Index: socl/src/cl_createcontextfromtype.c
===================================================================
--- socl/src/cl_createcontextfromtype.c	(revision 6853)
+++ socl/src/cl_createcontextfromtype.c	(working copy)
@@ -15,6 +15,7 @@
  */
 
 #include "socl.h"
+#include "init.h"
 
 CL_API_ENTRY cl_context CL_API_CALL
 soclCreateContextFromType(const cl_context_properties * properties,
@@ -23,6 +24,8 @@
                         void *                        user_data,
                         cl_int *                      errcode_ret) CL_API_SUFFIX__VERSION_1_0
 {
+   if( ! _starpu_init )
+      socl_init_starpu(); 
    //We assume clCreateContext doesn't support devices
    //TODO:use devices
    return soclCreateContext(properties, 0, NULL, pfn_notify, user_data, errcode_ret);
Index: socl/src/command_queue.c
===================================================================
--- socl/src/command_queue.c	(revision 6853)
+++ socl/src/command_queue.c	(working copy)
@@ -144,7 +144,8 @@
 	int is_barrier = 0;
 	if (cmd->typ == CL_COMMAND_BARRIER) {
 		is_barrier = 1;
-		/* OpenCL has no CL_COMMAND_BARRIER type, so we fall back on CL_COMMAND_MARKER */
+		/* OpenCL has no CL_COMMAND_BARRIER type, so we fall back on CL_COMMAND_MARKER 
+                   WARNING OpenCL has CL_COMMAND_BARRIER in 1.2*/
 		cmd->typ = CL_COMMAND_MARKER;
 	}
 
Index: socl/src/socl.c
===================================================================
--- socl/src/socl.c	(revision 6853)
+++ socl/src/socl.c	(working copy)
@@ -16,13 +16,140 @@
 
 #include "socl.h"
 
-struct _cl_platform_id socl_platform = {};
+struct _cl_icd_dispatch socl_master_dispatch = {
+  soclGetPlatformIDs,
+  soclGetPlatformInfo,
+  soclGetDeviceIDs,
+  soclGetDeviceInfo,
+  soclCreateContext,
+  soclCreateContextFromType,
+  soclRetainContext,
+  soclReleaseContext,
+  soclGetContextInfo,
+  soclCreateCommandQueue,
+  soclRetainCommandQueue,
+  soclReleaseCommandQueue,
+  soclGetCommandQueueInfo,
+  soclSetCommandQueueProperty,
+  soclCreateBuffer,
+  soclCreateImage2D,
+  soclCreateImage3D,
+  soclRetainMemObject,
+  soclReleaseMemObject,
+  soclGetSupportedImageFormats,
+  soclGetMemObjectInfo,
+  soclGetImageInfo,
+  soclCreateSampler,
+  soclRetainSampler,
+  soclReleaseSampler,
+  soclGetSamplerInfo,
+  soclCreateProgramWithSource,
+  soclCreateProgramWithBinary,
+  soclRetainProgram,
+  soclReleaseProgram,
+  soclBuildProgram,
+  soclUnloadCompiler,
+  soclGetProgramInfo,
+  soclGetProgramBuildInfo,
+  soclCreateKernel,
+  soclCreateKernelsInProgram,
+  soclRetainKernel,
+  soclReleaseKernel,
+  soclSetKernelArg,
+  soclGetKernelInfo,
+  soclGetKernelWorkGroupInfo,
+  soclWaitForEvents,
+  soclGetEventInfo,
+  soclRetainEvent,
+  soclReleaseEvent,
+  soclGetEventProfilingInfo,
+  soclFlush,
+  soclFinish,
+  soclEnqueueReadBuffer,
+  soclEnqueueWriteBuffer,
+  soclEnqueueCopyBuffer,
+  soclEnqueueReadImage,
+  soclEnqueueWriteImage,
+  soclEnqueueCopyImage,
+  soclEnqueueCopyImageToBuffer,
+  soclEnqueueCopyBufferToImage,
+  soclEnqueueMapBuffer,
+  soclEnqueueMapImage,
+  soclEnqueueUnmapMemObject,
+  soclEnqueueNDRangeKernel,
+  soclEnqueueTask,
+  soclEnqueueNativeKernel,
+  soclEnqueueMarker,
+  soclEnqueueWaitForEvents,
+  soclEnqueueBarrier,
+  soclGetExtensionFunctionAddress,
+  (void *) NULL, //  clCreateFromGLBuffer,
+  (void *) NULL, //  clCreateFromGLTexture2D,
+  (void *) NULL, //  clCreateFromGLTexture3D,
+  (void *) NULL, //  clCreateFromGLRenderbuffer,
+  (void *) NULL, //  clGetGLObjectInfo,
+  (void *) NULL, //  clGetGLTextureInfo,
+  (void *) NULL, //  clEnqueueAcquireGLObjects,
+  (void *) NULL, //  clEnqueueReleaseGLObjects,
+  (void *) NULL, //  clGetGLContextInfoKHR,
+  (void *) NULL, //
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL, //  clSetEventCallback,
+  (void *) NULL, //  clCreateSubBuffer,
+  (void *) NULL, //  clSetMemObjectDestructorCallback,
+  (void *) NULL, //  clCreateUserEvent,
+  (void *) NULL, //  clSetUserEventStatus,
+  (void *) NULL, //  clEnqueueReadBufferRect,
+  (void *) NULL, //  clEnqueueWriteBufferRect,
+  (void *) NULL, //  clEnqueueCopyBufferRect,
+  (void *) NULL, //  clCreateSubDevicesEXT,
+  (void *) NULL, //  clRetainDeviceEXT,
+  (void *) NULL, //  clReleaseDeviceEXT,
+  (void *) NULL,
+  (void *) NULL, //  clCreateSubDevices,
+  (void *) NULL, //  clRetainDevice,
+  (void *) NULL, //  clReleaseDevice,
+  (void *) NULL, //  clCreateImage,
+  (void *) NULL, //  clCreateProgramWithBuiltInKernels,
+  (void *) NULL, //  clCompileProgram,
+  (void *) NULL, //  clLinkProgram,
+  (void *) NULL, //  clUnloadPlatformCompiler,
+  (void *) NULL, //  clGetKernelArgInfo,
+  (void *) NULL, //  clEnqueueFillBuffer,
+  (void *) NULL, //  clEnqueueFillImage,
+  (void *) NULL, //  clEnqueueMigrateMemObjects,
+  (void *) NULL, //  clEnqueueMarkerWithWaitList,
+  (void *) NULL, //  clEnqueueBarrierWithWaitList,
+  (void *) NULL, //  clGetExtensionFunctionAddressForPlatform,
+  (void *) NULL, //  clCreateFromGLTexture,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL,
+  (void *) NULL
+};
 
+
+struct _cl_platform_id socl_platform = {&socl_master_dispatch};
+
 const char * SOCL_PROFILE = "FULL_PROFILE";
 const char * SOCL_VERSION = "OpenCL 1.0 StarPU Edition (0.0.1)";
 const char * SOCL_PLATFORM_NAME    = "StarPU Platform";
 const char * SOCL_VENDOR  = "INRIA";
-const char * SOCL_PLATFORM_EXTENSIONS = "";
+const char * SOCL_PLATFORM_EXTENSIONS = "cl_khr_icd";
+const char * SOCL_PLATFORM_ICD_SUFFIX_KHR ="SOCL";
 
 
 /* Command queues with profiling enabled
Index: socl/src/init.c
===================================================================
--- socl/src/init.c	(revision 6853)
+++ socl/src/init.c	(working copy)
@@ -14,29 +14,29 @@
  * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  */
 
+#include <pthread.h>
 #include "socl.h"
 #include "gc.h"
 #include "mem_objects.h"
 
 int _starpu_init_failed;
+int _starpu_init = 0;
+pthread_mutex_t _socl_mutex = PTHREAD_MUTEX_INITIALIZER;
 
-/**
- * Initialize SOCL
- */
-__attribute__((constructor)) static void socl_init() {
+void socl_init_starpu(void) {
+  pthread_mutex_lock(&_socl_mutex);
+  if( ! _starpu_init ){
+    struct starpu_conf conf;
+    starpu_conf_init(&conf);
+    conf.ncuda = 0;
 
-  struct starpu_conf conf;
-  starpu_conf_init(&conf);
-  conf.ncuda = 0;
 
-  mem_object_init();
-
-  _starpu_init_failed = starpu_init(&conf);
-  if (_starpu_init_failed != 0)
-  {
+    _starpu_init_failed = starpu_init(&conf);
+    if (_starpu_init_failed != 0)
+    {
        DEBUG_MSG("Error when calling starpu_init: %d\n", _starpu_init_failed);
-  }
-  else {
+    }
+    else {
        if (starpu_cpu_worker_get_count() == 0)
        {
 	    DEBUG_MSG("StarPU did not find any CPU device. SOCL needs at least 1 CPU.\n");
@@ -47,11 +47,23 @@
 	    DEBUG_MSG("StarPU didn't find any OpenCL device. Try disabling CUDA support in StarPU (export STARPU_NCUDA=0).\n");
 	    _starpu_init_failed = -ENODEV;
        }
+    }
+
+    /* Disable dataflow implicit dependencies */
+    starpu_data_set_default_sequential_consistency_flag(0);
+    _starpu_init = 1;
   }
+  pthread_mutex_unlock(&_socl_mutex);
 
-  /* Disable dataflow implicit dependencies */
-  starpu_data_set_default_sequential_consistency_flag(0);
+}
+/**
+ * Initialize SOCL
+ */
+__attribute__((constructor)) static void socl_init() {
 
+
+  mem_object_init();
+
   gc_start();
 }
 
@@ -59,17 +71,21 @@
  * Shutdown SOCL
  */
 __attribute__((destructor)) static void socl_shutdown() {
+  pthread_mutex_lock(&_socl_mutex);
+  if( _starpu_init )
+    starpu_task_wait_for_all();
 
-  starpu_task_wait_for_all();
-
   gc_stop();
 
-  starpu_task_wait_for_all();
+  if( _starpu_init )
+    starpu_task_wait_for_all();
 
   int active_entities = gc_active_entity_count();
 
   if (active_entities != 0)
     DEBUG_MSG("Unreleased entities: %d\n", active_entities);
 
-  starpu_shutdown();
+  if( _starpu_init )
+    starpu_shutdown();
+  pthread_mutex_unlock(&_socl_mutex);
 }
Index: socl/src/socl.h
===================================================================
--- socl/src/socl.h	(revision 6853)
+++ socl/src/socl.h	(working copy)
@@ -24,13 +24,16 @@
 #endif
 
 /* Additional command type */
-#define CL_COMMAND_BARRIER 0x99987
+#ifndef CL_COMMAND_BARRIER
+#define CL_COMMAND_BARRIER 0x1205
+#endif
 
 #include <string.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <unistd.h>
 #include <pthread.h>
+#include <ocl_icd.h>
 
 #include <starpu.h>
 #include <starpu_opencl.h>
@@ -66,6 +69,7 @@
 
 
 struct entity {
+  struct _cl_icd_dispatch * dispatch;
   /* Reference count */
   size_t refs;
 
@@ -81,8 +85,9 @@
  * this macro as their first field */
 #define CL_ENTITY struct entity _entity;
 
-struct _cl_platform_id {};
 
+struct _cl_platform_id {struct _cl_icd_dispatch *dispatch;};
+
 #define RETURN_EVENT(cmd, event) \
 	if (event != NULL) { \
 		cl_event ev = command_event_get(cmd);\
@@ -109,12 +114,12 @@
 	}
 
 /* Constants */
-struct _cl_platform_id socl_platform;
 const char * SOCL_PROFILE;
 const char * SOCL_VERSION;
 const char * SOCL_PLATFORM_NAME;
 const char * SOCL_VENDOR;
 const char * SOCL_PLATFORM_EXTENSIONS;
+const char * SOCL_PLATFORM_ICD_SUFFIX_KHR;
 
 struct _cl_context {
   CL_ENTITY;
@@ -746,4 +751,12 @@
 extern CL_API_ENTRY void * CL_API_CALL
 soclGetExtensionFunctionAddress(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0;
 
+extern CL_API_ENTRY cl_int CL_API_CALL
+soclIcdGetPlatformIDsKHR(cl_uint          /* num_entries */,
+                 cl_platform_id * /* platforms */,
+                 cl_uint *        /* num_platforms */) CL_EXT_SUFFIX__VERSION_1_0;
+
+
+struct _cl_icd_dispatch socl_master_dispatch;
+struct _cl_platform_id socl_platform;
 #endif /* SOCL_H */
Index: socl/src/init.h
===================================================================
--- socl/src/init.h	(revision 0)
+++ socl/src/init.h	(revision 0)
@@ -0,0 +1,28 @@
+/* StarPU --- Runtime system for heterogeneous multicore architectures.
+ *
+ * Copyright (C) 2010,2011 University of Bordeaux
+ *
+ * StarPU is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or (at
+ * your option) any later version.
+ *
+ * StarPU is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * See the GNU Lesser General Public License in COPYING.LGPL for more details.
+ */
+
+#include <pthread.h>
+#include "socl.h"
+#include "gc.h"
+#include "mem_objects.h"
+
+extern int _starpu_init_failed;
+extern volatile int _starpu_init;
+/**
+ * Initialize StarPU
+ */
+
+void socl_init_starpu(void);
Index: socl/src/cl_getdeviceids.c
===================================================================
--- socl/src/cl_getdeviceids.c	(revision 6853)
+++ socl/src/cl_getdeviceids.c	(working copy)
@@ -15,8 +15,8 @@
  */
 
 #include "socl.h"
+#include "init.h"
 
-
 /**
  * \brief Return one device of each kind
  *
@@ -29,6 +29,8 @@
                cl_device_id *   devices, 
                cl_uint *        num_devices) CL_API_SUFFIX__VERSION_1_0
 {
+   if( ! _starpu_init )
+      socl_init_starpu(); 
    if (platform != NULL && platform != &socl_platform)
       return CL_INVALID_PLATFORM;
 
Index: socl/src/cl_icdgetplatformidskhr.c
===================================================================
--- socl/src/cl_icdgetplatformidskhr.c	(revision 0)
+++ socl/src/cl_icdgetplatformidskhr.c	(revision 0)
@@ -0,0 +1,22 @@
+#include "socl.h"
+
+extern int _starpu_init_failed;
+
+CL_API_ENTRY cl_int CL_API_CALL soclIcdGetPlatformIDsKHR(
+             cl_uint num_entries,
+             cl_platform_id *platforms,
+             cl_uint *num_platforms) CL_EXT_SUFFIX__VERSION_1_0{
+     if ((num_entries == 0 && platforms != NULL)
+	 || (num_platforms == NULL && platforms == NULL))
+	  return CL_INVALID_VALUE;
+
+     else {
+	  if (platforms != NULL)
+	       platforms[0] = &socl_platform;
+
+	  if (num_platforms != NULL)
+	       *num_platforms = 1;
+     }
+
+   return CL_SUCCESS;
+}
Index: socl/src/Makefile.am
===================================================================
--- socl/src/Makefile.am	(revision 6853)
+++ socl/src/Makefile.am	(working copy)
@@ -35,7 +35,8 @@
   mem_objects.h					\
   socl.h					\
   task.h					\
-  util.h
+  util.h					\
+  init.h
 
 libsocl_@STARPU_EFFECTIVE_VERSION@_la_LDFLAGS = $(ldflags) -no-undefined			\
   -version-info $(LIBSOCL_INTERFACE_CURRENT):$(LIBSOCL_INTERFACE_REVISION):$(LIBSOCL_INTERFACE_AGE)
@@ -118,7 +119,8 @@
   cl_enqueuendrangekernel.c \
   cl_enqueuenativekernel.c \
   cl_geteventprofilinginfo.c \
-  cl_getextensionfunctionaddress.c
+  cl_getextensionfunctionaddress.c \
+  cl_icdgetplatformidskhr.c
 
 
 



Archives gérées par MHonArc 2.6.19+.

Haut de le page