【发布时间】:2015-09-12 04:13:04
【问题描述】:
我在 GPU 上使用 OpenCL 进行立体图像处理,在我将 C++ 实现移植到 OpenCL 后,我开始尝试优化。一个非常简单的实验是交换尺寸。
考虑一个简单的内核,它针对二维工作空间(例如 640x480)上的每个像素执行。在我的情况下,这是一个人口普查转换。
交换自:
int globalU = get_global_id(0);
int globalV = get_global_id(1);
也
int globalU = get_global_id(1);
int globalV = get_global_id(0);
在以相同方式调整 NDRange 时,性能提升了约 500%。 3d 空间中的其他实验实现了从 72 毫秒到 2 毫秒的执行时间,仅对维度进行了重新排序。
谁能解释一下,这是怎么回事? 它只是内存管道和缓存使用的影响吗?
编辑:图像具有标准的mamory 布局。这就是为什么我想知道效果。我期望最好的速度,当迭代像图像存储在内存中一样时,情况并非如此。
在阅读了一些 AMD APP SDK 文档后,我发现了一些关于内存通道的有趣细节。这可能是一个原因。
【问题讨论】:
-
我不知道 opencl,但通常二维数组可以将它们的元素放在内存中,这样行或列都在连续的内存中(但不能同时在内存中)。如果您从同一行(或列)访问大部分时间元素,这将解释为什么交换维度会产生如此巨大的影响。
-
除了@tobi303 所说的,查找“coalesced reads”——它们有很大的不同!
标签: c++ performance opencl gpu