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

Reply via email to