Objet : Developers list for StarPU
Archives de la liste
- 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
- [Starpu-devel] support de l'extension cl_khr_icd par socl, Brice Videau, 26/06/2012
- Re: [Starpu-devel] support de l'extension cl_khr_icd par socl, Sylvain HENRY, 26/06/2012
- Re: [Starpu-devel] support de l'extension cl_khr_icd par socl, Brice Videau, 26/06/2012
- Re: [Starpu-devel] support de l'extension cl_khr_icd par socl, Vincent Danjean, 26/06/2012
- Re: [Starpu-devel] support de l'extension cl_khr_icd par socl, Brice Videau, 26/06/2012
- Re: [Starpu-devel] support de l'extension cl_khr_icd par socl, Sylvain HENRY, 26/06/2012
Archives gérées par MHonArc 2.6.19+.