OpenCL:比较在可用平台/设备上添加两个整数数组所需的时间

时间:2018-05-11 22:57:21

标签: c opencl

我对整个OpenCL世界都很陌生,所以我正在学习一些初学者教程。我正在尝试合并thisthis来比较在不同设备上添加两个数组所需的时间。但是我的结果令人困惑。考虑到代码太长,我做了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上运行的。但是有一些问题:

  1. 我可以将j调整为更高的数字,但它似乎仍在GPU上运行。
  2. 当我把所有计算都放在一个循环中时,所有设备的测量时间与在CPU上计算的时间相同(正如我所说)。
  3. 对所有0<j进行计算所需的时间非常接近。我想知道他们是不是真的在不同的设备上运行。
  4. 我对OpenCL一无所知,所以如果你能看一下my code我会很感激,让我知道我的错误是什么以及如何解决它/它们。或者让我指出一个很好的例子,它在不同的设备上运行计算并比较时间。

    P.S。我也发布了这个问题here in Reddit

1 个答案:

答案 0 :(得分:1)

在为您遇到的问题提交问题之前,请务必检查错误(具体而言,在这种情况下,每个API调用都会返回CL_SUCCESS)。否则结果毫无意义。

在特定情况下,代码中的问题是,在获取设备ID时,您只获得一个设备ID(第60行,第三个参数),这意味着其他所有内容缓冲区是假的,j > 0的结果毫无意义。

唯一令人惊讶的是它不会崩溃。

此外,在检查运行时时,请使用OpenCL事件,而不是主机端时钟时间。在你的情况下,你至少在clFinish之后做,所以你确保内核执行终止,但你实际上是在计算所有设置所需的时间,而不仅仅是复制时间。