Changeset: bba012dd2131 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bba012dd2131
Modified Files:
monetdb5/extras/bwd/utilities.c
Branch: bwd
Log Message:
* (hopefull) implemented multi-gpu support, I wonder if it actually works with
multiple gpus :-)
Unterschiede (112 Zeilen):
diff --git a/monetdb5/extras/bwd/utilities.c b/monetdb5/extras/bwd/utilities.c
--- a/monetdb5/extras/bwd/utilities.c
+++ b/monetdb5/extras/bwd/utilities.c
@@ -83,53 +83,81 @@ const char* clError(int err){
return buffer;
}
+int getGPUDeviceForThisThread(){
+ static int threadToResultPositionOffsetMapping[32] = {};
+ static unsigned int numberOfDevices = 0;
+ int thisResultOffset = 0;
+
+ const int threadID = THRgettid();
+ while(threadToResultPositionOffsetMapping[thisResultOffset] > 0
+ &&
threadToResultPositionOffsetMapping[thisResultOffset] != threadID)
+ thisResultOffset++;
+ threadToResultPositionOffsetMapping[thisResultOffset] = threadID;
+ if(!numberOfDevices){
+ cl_platform_id platforms[4];
+ cl_uint foundPlatforms;
+ if(clGetPlatformIDs(4,platforms,&foundPlatforms) != CL_SUCCESS)
printf("problem when finding the platforms");
+ if (!foundPlatforms) printf("didn't find any OpenCL Platforms");
+
+ if (clGetDeviceIDs(*platforms,CL_DEVICE_TYPE_ALL, 0, NULL,
&numberOfDevices) != CL_SUCCESS) printf("error getting GPU device id\n");
+ }
+ if(0) printf ("thread %d is mapped to card %d\n", threadID,
thisResultOffset%numberOfDevices);
+
+
+ return thisResultOffset%numberOfDevices;
+}
cl_device_id getDeviceID(){
static int initialized = 0;
- static cl_device_id result;
- cl_platform_id platforms[4];
- cl_uint foundPlatforms;
- if(clGetPlatformIDs(4,platforms,&foundPlatforms) != CL_SUCCESS)
printf("problem when finding the platforms");
- if (!foundPlatforms) printf("didn't find any OpenCL Platforms");
-
- if (clGetDeviceIDs(*platforms,CL_DEVICE_TYPE_ALL, 1, &result, NULL) !=
CL_SUCCESS) printf("error getting GPU device id\n");
- else initialized = 1;
- return result;
+ static cl_device_id results[4] = {};
+ if(!initialized){
+ cl_platform_id platforms[4];
+ cl_uint foundPlatforms;
+ if(clGetPlatformIDs(4,platforms,&foundPlatforms) != CL_SUCCESS)
printf("problem when finding the platforms");
+ if (!foundPlatforms) printf("didn't find any OpenCL Platforms");
+ cl_int err;
+ cl_uint numberOfDevices;
+ if ((err = clGetDeviceIDs(*platforms,CL_DEVICE_TYPE_ALL, 4,
results, &numberOfDevices)) != CL_SUCCESS) printf("error getting GPU device
id: %s\n", clError(err));
+ else initialized = 1;
+ }
+ return results[getGPUDeviceForThisThread()];
}
static inline void superverboseprintf(const char * format, ... ){};
cl_context getCLContext(){
- static int initialized = 0;
- static cl_context clContextSingleton;
- if(initialized) {
- superverboseprintf("#%s, returning cl_context: %p;\n",
__func__, clContextSingleton);
- return clContextSingleton;
+ static int initialized[4] = {};
+ static cl_context clContextSingletons[4] = {};
+ const int cardID = getGPUDeviceForThisThread();
+ if(initialized[cardID]) {
+ superverboseprintf("#%s, returning cl_context: %p;\n",
__func__, clContextSingletons[cardID]);
+ return clContextSingletons[cardID];
}
int err;
- clContextSingleton = clCreateContext(0,1,
(cl_device_id[]){getDeviceID()}, NULL, NULL, &err);
+ clContextSingletons[cardID] = clCreateContext(0,1,
(cl_device_id[]){getDeviceID()}, NULL, NULL, &err);
if (err != CL_SUCCESS) printf("failure when creating the context\n");
- else initialized= 1;
- superverboseprintf("#%s, returning cl_context: %p;\n", __func__,
clContextSingleton);
- return clContextSingleton;
+ else initialized[cardID]= 1;
+ superverboseprintf("#%s, returning cl_context: %p;\n", __func__,
clContextSingletons[cardID]);
+ return clContextSingletons[cardID];
}
cl_command_queue getCommandQueue(){
- static int initialized = 0;
- static cl_command_queue queue;
- if(initialized) {
- superverboseprintf("#%s, returning queue pointer:
%p;\n", __func__, queue);
- return queue;
+ const int cardID = getGPUDeviceForThisThread();
+ static int initialized[4] = {};
+ static cl_command_queue queues[4] = {};
+ if(initialized[cardID]) {
+ superverboseprintf("#%s, returning queue pointer:
%p;\n", __func__, queues[cardID]);
+ return queues[cardID];
}
int err;
- queue = clCreateCommandQueue(getCLContext(),getDeviceID(),0,&err);
+ queues[cardID] =
clCreateCommandQueue(getCLContext(),getDeviceID(),0,&err);
if (err != CL_SUCCESS) printf("failed to create queue");
- else initialized = 1;
- superverboseprintf("#%s, returning queue pointer: %p;\n", __func__,
queue);
+ else initialized[cardID] = 1;
+ superverboseprintf("#%s, returning queue pointer: %p;\n", __func__,
queues[cardID]);
- return queue;
+ return queues[cardID];
}
#pragma mark Decomposed BAT Handling
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list