我使用OpenCL 1.2(来自NVIDIA的SDK)进行实时光线跟踪。现在我遇到了GPU和CPU之间数据传输速度非常慢的问题。最关注的部分是在每帧执行时将输出数据从GPU传输回主机。我使用clEnqueueReadBuffer来读取数据。缓冲区创建为主机数据的副本。读取4 * 800 * 600字节(图像尺寸,RGBA 32位)需要大约8ms。这是不可接受的速度,我该如何解决?
我也尝试了clEnqueueMapBuffer但结果仍然相同。
编辑:添加了主机代码
if($result['Level'] > 1) {
答案 0 :(得分:3)
正如我在评论中所说,你可能会测量内核执行和一起读取数据,并认为读取数据需要很长时间。以下是您应该如何正确衡量它:
void execute()
{
/* Execute OpenCL Kernel */
ret = clEnqueueNDRangeKernel(command_queue, kernel, dimSize, 0, &workGroups, &workItems, 0, NULL, NULL);
clFinish(command_queue);
double curTime = Timer::getTimeNanoSeconds();
clEnqueueReadBuffer(command_queue, memobjOutput, CL_TRUE, 0, outputSize, bufferOut, 0, NULL, NULL);
double curTime2 = Timer::getTimeNanoSeconds();
println("delta kernel: "+ toString(curTime - curTime2));
println("delta data read: "+ toString(Timer::getTimeNanoSeconds() - curTime2));
}
正常阻塞读取之前的clFinish
是多余的,但它有助于获得正确的内核时序。