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



我对整个OpenCL世界都很陌生,所以我正在遵循一些初学者教程。我正在尝试将这个和这个结合起来,以比较在不同设备上将两个数组一起添加所需的时间。但是我得到了令人困惑的结果。考虑到代码太长,我做了这个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 秒(。我认为这是因为计算正在我的英特尔或AMD GPU上运行。但是也有一些问题:

  1. 我可以将j调整为任何更高的数字,它似乎仍然可以在 GPU 上运行。
  2. 当我将所有计算放在一个循环中时,所有设备测量的时间与在 CPU 上计算的时间相同(正如我假设的那样(。
  3. 对所有0<j进行计算所需的时间可疑地接近。我想知道它们是否真的在不同的设备上运行。

我显然对 OpenCL 一无所知,所以如果您能看看我的代码并让我知道我的错误是什么以及如何解决它/它们,我将不胜感激。或者也许向我指出一个很好的例子,它在不同的设备上运行计算并比较时间。

附言我也在Reddit上发布了这个问题

在针对您遇到的问题提交问题之前,请始终记住检查错误(特别是在这种情况下,每个 API 调用都返回CL_SUCCESS(。否则结果毫无意义。

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

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

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

最新更新