2
基本上我有兩個GPU,我想在它們的每一個上執行一些內核。我不希望GPU在同一個內核上工作,每個人都在做一些部分(我不知道這是否可能),以防萬一我甚至不想看到這種行爲。同時在不同的GPU上執行不同的內核
我只是想確保兩個設備都在運行。我創建了上下文,併爲它們兩個創建了命令隊列。但是我看到只有一個內核被執行,這意味着只有一個設備正在被使用。這是我做到的。 。 。
cl_device_id *device;
cl_kernel *kernels;
...
// creating context.
context = clCreateContext(0, num_devices, device, NULL, NULL, &error);
...
// creating command queues for all kernels
for(int i = 0; i<num_kenrels; i++)
cmdQ[i] = clCreateCommandQueue(context, *device, 0, &error);
...
// enqueue kernels
error = clEnqueueNDRangeKernel(*cmdQ, *kernels, 2, 0, glbsize, 0, 0, NULL, NULL);
我正確的方式嗎?
同意。另外請注意,不同的實現處理跨多個設備分配工作負載不同(有時甚至阻止clEnqueueNDRangeKernel http://stackoverflow.com/questions/11562543/clenqueuendrange-blocking-on-nvidia-hardware-also-multi-gpu/11562814#comment15294577_11562814) - 在某些情況下可能性能較差。要真正在兩臺設備之間分離處理並自行控制它,您可以使用兩個上下文,每個上下文使用一個設備創建。 – Ani 2012-07-25 20:50:14
謝謝。只是一個簡單的問題,我不能使用一個clEnqueueNDRangeKernel語句來啓動這兩個內核嗎? – Nike 2012-07-25 23:43:04
不,不是真的。但是在OpenCL程序中,如果你真的想分離邏輯,你可以調用在同一個程序中定義的其他函數。 – matthias 2012-07-26 06:29:04