我正在尝试让 2 个 Nvidia GPU 并排工作以进行 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 完美运行。有时它只是工作,但只是随机出现错误并且它不会消失。有什么建议么?