我第一次开始使用 OpenCL,我正在尝试优化缩减内核。内核采用大小为宽乘长像素的浮点数方格(数据表示灰度图像的亮度值)。内核沿每一列求和,并将每一列的总和返回到输出数组。
/*
input -- "2D" array of floats with width * height number of elements
output -- 1D array containing summation of column values with width number of elements
width -- number of elements horizontally
height -- number of elements vertically
Both width and height must be a multiple of 64.
*/
kernel void sum_columns(global float* input, global float* output, int width, int height)
{
size_t j = get_global_id(0);
float sum = 0.0;
int i;
for(i=0; i<height; i++) {
sum += input[i + width*j];
}
output[j] = sum;
}
OpenCL 应该同时执行每列求和,因为我将全局维度设置为数据中的列数。我在 MacOS 上使用了 Instruments.app,并计算了在 CPU 和 GPU 上执行时内核的 1000 次迭代需要多长时间。这可以通过将设备指定为CL_DEVICE_TYPE_CPU
或来完成CL_DEVICE_TYPE_GPU
。
表现并不好!事实上,CPU 一直比 GPU 快,这让我觉得很奇怪。内核有问题吗?CPU最多只能同时执行大约8个线程,怎么能更快呢?
这个项目的代码在这里(一个 Xcode 项目),https://github.com/danieljfarrell/Xcode-4-OpenCL-Example。
这是我增加数据大小时的计时结果,
更新
通过查看使用 Instruments.app 运行内核所花费的时间,简单地暗示了 CPU 和 GPU 的时序,