我正在编写一些程序,我需要在主机和设备之间重复执行一些数据传输。我会尽量减少最好的,但有没有更快的方法来执行此操作?这里,复制到设备的数组在每次迭代时都在变化,因此需要使用新的数组值更新设备。任何建议/指示/帮助将不胜感激。
for (i = 0; i <= SEVERALCALLS; i++) {
wrtBuffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(double) * num, NULL, &ret);
if (ret != 0) {
printf("clCreateBuffer wrtBuffer error: %d. couldn't load\n", ret);
exit(1);
}
// update cti array
ret = clEnqueueWriteBuffer(command_queue, wrtBuffer, CL_TRUE, 0, sizeof(double) * num, cti, 0, NULL, NULL);
if (ret != 0) {
printf("clEnqueueWriteBuffer wrtBuffer error: %d. couldn't load\n", ret);
exit(1);
}
// NDRange Kernel call
ret = clEnqueueReadBuffer(command_queue, readBuffer, CL_TRUE, 0, sizeof(double) * num, newcti, 0, NULL, NULL);
if (ret != 0) {
printf("clEnqueueReadBuffer readBuffer error: %d. couldn't load\n", ret);
exit(1);
}
}
答案 0 :(得分:1)
优化此方法的三种方法:
在集成GPU(如Intel或AMD APU)上使用&#34;零拷贝&#34;缓冲,这样您就不会为任何转账支付费用。
在NVIDIA上使用固定主机内存作为clEnqueueWriteBuffer的主机端内存源或接收clEnqueueReadBuffer的缓冲区。这比使用普通的malloc内存更快,并且不会阻止。
重叠转移和计算。使用三个命令队列,一个用于上载,一个用于计算,一个用于下载,并使用事件来确保依赖性。请参阅NVIDIA的示例:oclCopyComputeOverlap(尽管它不是最理想的;它可能会比它们说的要快一些)。