기본적으로 두 개의 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);
올바른 방법 있으십니까?
동의. 또한 다른 구현은 여러 장치에서 작업 부하를 다르게 분배하는 것을 처리합니다 (때로는 심지어 차단할 수도 있음). clEnqueueNDRangeKernel http://stackoverflow.com/questions/11562543/clenqueuendrange-blocking-on-nvidia-hardware-also-multi-gpu/11562814#comment15294577_11562814) - 경우에 따라 실적이 저조 할 수도 있습니다. 두 장치에서 처리를 분리하고 모두 제어하려면 두 장치를 각각 하나의 장치로 생성해야합니다. – Ani
감사합니다. 간단한 질문입니다. 단일 clEnqueueNDRangeKernel 문을 사용하여 두 커널을 모두 시작할 수 있습니까? – Nike
아니,별로. 그러나 OpenCL 프로그램 내에서 논리를 분리하려는 경우 동일한 프로그램에 정의 된 다른 함수를 호출 할 수 있습니다. – matthias