因为我们知道,波前(AMD的OpenCL)非常相似,WARP(CUDA):http://research.cs.wisc.edu/multifacet/papers/isca14-channels.pdf我们可以使用`shuffle()`指令在WaveFront中的项目(线程)之间进行reg-to-reg数据交换吗?
GPGPU语言,如OpenCL的™和CUDA,被称为SIMT因为他们 线程的程序员的观点映射到一个SIMD通道。线程 以锁步执行在相同的SIMD单元上称为波前 (CUDA中的变形)。
另外,AMD公司建议我们使用本地内存(减少)添加数字。和用于添加的加速(降低)建议使用矢量类型:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/01/AMD_OpenCL_Tutorial_SAAHPC2010.pdf
但是是否有任何优化寄存器至寄存器项之间数据exchage指令波前(线程):
如
int __shfl_down(int var, unsigned int delta, int width=warpSize);
在WARP(CUDA):https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/或在x86_64如
__m128i _mm_shuffle_epi8(__m128i a, __m128i b);
SIMD车道:https://software.intel.com/en-us/node/524215
该混洗指令可以,例如,执行减少来自8个线程/泳道(加起来的数字)8个元件,对于3个周期,没有任何同步,也没有使用任何缓存/本地/共享内存(每个访问具有〜3个周期延迟)。
I.e.线程直接发送其值注册其他线程:https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/
或者OpenCL中,我们可以使用只指示gentypen shuffle(gentypem x, ugentypen mask)
只能为矢量类型,如float16/uint16到每个项目(线程)被使用,但https://www.khronos.org/registry/OpenCL/sdk/1.1/docs/man/xhtml/shuffle.html
我们可以使用的东西看起来像shuffle()
为REG至REG项目(线程)之间的波前通过本地存储数据交换,其比数据ECHANGE快多了:没有项目(线程)的波阵面之间?
是否有AMD的OpenCL指令寄存器到寄存器中的数据交换内波阵面如指令__any()
,__all()
,__ballot()
,__shfl()
为内WARP(CUDA):http://on-demand.gputechconf.com/gtc/2015/presentation/S5151-Elmar-Westphal.pdf
经投票功能:
__any(predicate)
返回非零如果任何谓词在经线 线程返回非零__all(predicate)
返回非零值,如果所有的谓词在经线 线程返回非零__ballot(predicate)
返回一个位掩码与相应的位设置线程,其中谓词返回非零- 的
__shfl(value, thread)
返回从所请求的线程 值(但仅当该线程也执行__shfl() - 操作)
ç ONCLUSION:
正如已知的,在OpenCL-2中。0有附属基团与SIMD执行模型类似于波前:Does the official OpenCL 2.2 standard support the WaveFront?
对于分小组有 - 页面-160:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf
int sub_group_all(int predicate)
相同CUDA-__all(predicate)
int sub_group_any(int predicate);
与CUDA相同 -__any(predicate)
但是在OpenCL中没有类似的功能:
- CUDA-
__ballot(predicate)
- CUDA-
__shfl(value, thread)
只有英特尔指定的内置功能洗牌在第4版,2016年8月28日最终草案的OpenCL扩展#35 :intel_sub_group_shuffle
,intel_sub_group_shuffle_down
,intel_sub_group_shuffle_down
,intel_sub_group_shuffle_up
:https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_subgroups.txt
而且OpenCL中有功能,我们ually通过洗牌功能,实现,但也有不是所有的可利用随机函数来实现的功能:
<gentype> sub_group_broadcast(<gentype> x, uint sub_group_local_id);
<gentype> sub_group_reduce_<op>(<gentype> x);
<gentype> sub_group_scan_exclusive_<op>(<gentype> x);
<gentype> sub_group_scan_inclusive_<op>(<gentype> x);
摘要:
个shuffle
-functions保持更灵活的功能,并确保在线程之间具有直接的寄存器到寄存器的数据交换可能的最快的通信。,但功能
sub_group_broadcast
/_reduce
/_scan
不保证直接寄存器到寄存器的数据交换,并且这些亚组函数不太灵活。
@huseyin tugrul buyukisik是的,我需要访问另外一个线程的私有寄存器。例如,如果我在本地内存中有32-64个元素的小数组,我想对它们进行总结。那么最快的方法就是使用32-64个线程,但不要对本地内存进行太多访问。 – Alex
如果数组很大,work_group_-reduce-scan命令可能会有所帮助 –
我不完全确定,但这里描述的'swizzle'操作让我想起nvidia shuffle。有人可以对此有更多的了解吗? [1]:http://gpuopen.com/amd-gcn-assembly-cross-lane-operations/ – mSSM