2012-07-25 3 views
2

기본적으로 두 개의 GPU가 있고 각 커널에서 일부 커널을 실행하려고합니다. 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); 

올바른 방법 있으십니까?

답변

7

실제적으로 device 배열을 채운 방법에 따라 다릅니다. 올바르게 초기화 한 경우 장치에 걸쳐 context을 만드는 것이 정확합니다.

아쉽게도 커널 및 명령 대기열에 대해 잘못된 생각을 가지고 있습니다. 커널은 특정 컨텍스트의 프로그램에서 작성됩니다. 반면 은 특정 장치와 통신하는 데 사용됩니다.

for (int i = 0; i < num_devices; i++) 
    cmdQ[i] = clCreateCommandQueue(context, device[i], 0, &error); 

는 이제 해당 명령 큐를 통해 다른 장치에 다른 (또는 동일한) 커널을 대기열 수 :

clEnqueueNDRangeKernel(cmdQ[0], kernels[0], /* ... */); 
clEnqueueNDRangeKernel(cmdQ[1], kernels[1], /* ... */); 

당신이하고 싶은 장치 하지 커널 당 하나의 큐를 만드는 것입니다 조건을 요약하면 :

cl_context는 특정 cl_platform_id 만들어 및 장치들의 서브 세트 0에 대한 컨테이너처럼된다
  • cl_programcl_context 및 관련 장치에 만들어 세우는
  • cl_kernelcl_program로부터 추출되지만, 프로그램의 콘텍스트와 관련된 장치에 사용될 수있다
  • ,
  • cl_command_queue은 특정 장치에 대해 생성된다
  • 메모리 조작과 커널 호출은 명령 대기열에 대기열에 포함되고 해당 장치에서 실행됩니다.
+1

동의. 또한 다른 구현은 여러 장치에서 작업 부하를 다르게 분배하는 것을 처리합니다 (때로는 심지어 차단할 수도 있음). clEnqueueNDRangeKernel http://stackoverflow.com/questions/11562543/clenqueuendrange-blocking-on-nvidia-hardware-also-multi-gpu/11562814#comment15294577_11562814) - 경우에 따라 실적이 저조 할 수도 있습니다. 두 장치에서 처리를 분리하고 모두 제어하려면 두 장치를 각각 하나의 장치로 생성해야합니다. – Ani

+0

감사합니다. 간단한 질문입니다. 단일 clEnqueueNDRangeKernel 문을 사용하여 두 커널을 모두 시작할 수 있습니까? – Nike

+0

아니,별로. 그러나 OpenCL 프로그램 내에서 논리를 분리하려는 경우 동일한 프로그램에 정의 된 다른 함수를 호출 할 수 있습니다. – matthias

관련 문제