Я пытаюсь заставить 2 графических процессора Nvidia работать бок о бок для моделирования n-тел (источник). Я делаю правильное обнаружение и храню все материалы OpenCL в одной структуре:
struct ocl_wrap {
cl_event event;
cl_program program;
cl_kernel kernel;
cl_command_queue command_queue;
cl_device_id device_id;
cl_context context;
cl_mem masses;
cl_mem bodies;
cl_mem speeds;
cl_mem newBodies;
cl_int ret;
};
Итак, теперь каждое устройство назначает свою собственную структуру (свой собственный контекст, очередь и т. д.), и на каждом этапе я запускаю эти 2 функции:
void writeGPU() {
clCreateBuffer() //4*
clSetKernelArg() //5*
clEnqueueNDRangeKernel()
}
void readGPU() {
clEnqueueReadBuffer() //2*
clFlush()
clReleaseMemObject() //4*
}
И один шаг выглядит так:
void step() {
for each gpu
writeGPU();
runCPU();
for each gpu
readGPU();
}
Где каждому устройству дается подмножество проблем, которые необходимо решить.
У меня проблема, что первые 64 (иногда 128) выплывают из одного или другого GPU, которые я пытаюсь скопировать обратно в CPU, на самом деле не копируются. В остальном все работает корректно, первый GPU работает без нареканий. Иногда это просто работает, но просто случайным образом появляется ошибка, и она не исчезает. Какие-либо предложения?