我对整个OpenCL世界都很陌生,所以我正在学习一些初学者教程。我正在尝试合并this和this来比较在不同设备上添加两个数组所需的时间。但是我的结果令人困惑。考虑到代码太长,我做了this GitHub Gist。
在我的Mac上我有1个平台,有3个设备。当我在
中分配j
时
cl_command_queue command_queue = clCreateCommandQueue(context, device_id[j], 0, &ret);
手动为0,似乎在CPU上运行计算(约5.75秒)。当放置1和2时,计算时间急剧下降(0.01076秒)。我假设是因为计算是在我的Intel或AMD GPU上运行的。但是有一些问题:
j
调整为更高的数字,但它似乎仍在GPU上运行。0<j
进行计算所需的时间非常接近。我想知道他们是不是真的在不同的设备上运行。我对OpenCL一无所知,所以如果你能看一下my code我会很感激,让我知道我的错误是什么以及如何解决它/它们。或者让我指出一个很好的例子,它在不同的设备上运行计算并比较时间。
P.S。我也发布了这个问题here in Reddit
答案 0 :(得分:1)
在为您遇到的问题提交问题之前,请务必检查错误(具体而言,在这种情况下,每个API调用都会返回CL_SUCCESS
)。否则结果毫无意义。
在特定情况下,代码中的问题是,在获取设备ID时,您只获得一个设备ID(第60行,第三个参数),这意味着其他所有内容缓冲区是假的,j > 0
的结果毫无意义。
唯一令人惊讶的是它不会崩溃。
此外,在检查运行时时,请使用OpenCL事件,而不是主机端时钟时间。在你的情况下,你至少在clFinish
之后做,所以你确保内核执行终止,但你实际上是在计算所有设置所需的时间,而不仅仅是复制时间。