OpenCL中工作项和全局内存之间的内存传输?
我对工作项和全局内存之间的数据传输有一些疑问。让我们考虑下面的非常低效的内存绑定内核。OpenCL中工作项和全局内存之间的内存传输?,opencl,Opencl,我对工作项和全局内存之间的数据传输有一些疑问。让我们考虑下面的非常低效的内存绑定内核。 __kernel void reduceURatios(__global myreal *coef, __global myreal *row, myreal ratio) { size_t gid = get_global_id(0);//line no 1 myreal pCoef = coef[gid];//line no 2 myreal pRow = row[gid];//
__kernel void reduceURatios(__global myreal *coef, __global myreal *row, myreal ratio)
{
size_t gid = get_global_id(0);//line no 1
myreal pCoef = coef[gid];//line no 2
myreal pRow = row[gid];//line no 3
pCoef = pCoef - (pRow * ratio);//line no 4
coef[gid] = pCoef;//line no 5
}
障碍
和成员篱笆
的原因。例如,一些GPU只按顺序执行工作组WI的一个子集。在CPU中,它们甚至可能完全无序运行- 否(1个全局->1个私有)(问题中的内核就是这种情况)
- 那么,内存是全局->私有的,没有办法改进它,不要使用本地内存,因为这会浪费时间李>
- 是(1个全局->X个私有)
- 首先尝试将全局内存移动到本地内存,然后为每个WI直接从本地读取到专用。根据重用量(可能只有两个WI使用相同的全局数据),如果计算量已经很高,那么它甚至可能不值得。您必须考虑额外内存使用和全局访问增益之间的权衡。对于图像处理来说,这通常是一个好主意,而对于其他类型的处理来说则不是那么多
注意:如果尝试写入全局内存,同样的过程也适用。在写入全局之前,最好在本地内存中通过多个WI进行操作。但如果每个WI都写入全局中唯一的地址,则直接写入。实际上,1和2的答案在很大程度上取决于。例如,256个AMD HW工作组有64个项目执行一行,可能更多,只有在该工作组内的下64个项目开始执行时。有一个很好的理由可以解释为什么必须在一个工作组中使用本地内存围栏。是的,你是对的,你实际上无法预测所有线程都将一起运行。例如,因为它们可以在小型并行工程中进一步划分(即:64 WI在4个块中组合在一起,形成256 WG)。这就是围栏和障碍存在的原因。我会更新我的答案。