我正在编写一个内核,其中所有线程都将被启动并同时读取全局内存中的相同位置。 我想知道此时会发生什么? 全局内存中的值是否广播到所有线程或是否存在 任何类型的序列化?
我知道当一半的warp线程访问适合全局内存的同一段时,访问将合并为更少的事务。 但是在阅读完全相同的位置时会发生什么? 如果是广播,是否意味着这里不再需要进行任何优化?
我在这里使用AMD 7470。我写了一个迭代,其中所有线程在每次迭代中读取全局内存中相同的4个字节。
答案 0 :(得分:0)
理想情况下,您希望将每个工作组的可用时间读取为全局内存位置。这意味着您应该将其复制到本地内存中,并且应该针对本地缓存的数据进行进一步的读取。
我发现这通常用大于4个字节的数据块来完成,但只要你避免许多全局读取,就应该节省时间。
local int sharedInt;
int id = get_local_id(0);
if(id == 0){
sharedInt = globalVar;
}
barrier(); //or barrier(CLK_LOCAL_MEM_FENCE) if the compiler complains
现在您了解到每个工作组只读取一次全局数据。
此方法适用于所有设备类型。我相信它会强制CPU上的最低缓存级别,但这将取决于实现。
答案 1 :(得分:0)
大多数GPU将相同位置的读取广播到所有工作项。它在优化指南中有具体提及。