2017-02-15 71 views
3

因为我们知道,波前(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

enter image description here


但是是否有任何优化寄存器至寄存器项之间数据exchage指令波前(线程)

该混洗指令可以,例如,执行减少来自8个线程/泳道(加起来的数字)8个元件,对于3个周期,没有任何同步,也没有使用任何缓存/本地/共享内存(每个访问具有〜3个周期延迟)。

I.e.线程直接发送其值注册其他线程:https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/

enter image description here

或者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_shuffleintel_sub_group_shuffle_downintel_sub_group_shuffle_downintel_sub_group_shuffle_uphttps://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);

摘要:

  1. shuffle -functions保持更灵活的功能,并确保在线程之间具有直接的寄存器到寄存器的数据交换可能的最快的通信。

  2. ,但功能sub_group_broadcast/_reduce/_scan不保证直接寄存器到寄存器的数据交换,并且这些亚组函数不太灵活。

+0

@huseyin tugrul buyukisik是的,我需要访问另外一个线程的私有寄存器。例如,如果我在本地内存中有32-64个元素的小数组,我想对它们进行总结。那么最快的方法就是使用32-64个线程,但不要对本地内存进行太多访问。 – Alex

+0

如果数组很大,work_group_-reduce-scan命令可能会有所帮助 –

+0

我不完全确定,但这里描述的'swizzle'操作让我想起nvidia shuffle。有人可以对此有更多的了解吗? [1]:http://gpuopen.com/amd-gcn-assembly-cross-lane-operations/ – mSSM

回答

1

gentype work_group_reduce<op> (gentype x) 

的版本> = 2.0

,但它的定义并没有说明使用本地内存或寄存器任何东西。这只会将每个协作者的x值减少为所有的总和。此功能必须由所有工作组项目打中,因此它不在波前水平方式。也不保证浮点运算的顺序。

也许有些供应商会使用注册方式,而有些使用本地内存。 Nvidia与我所设想的注册表一样。但是一个老的主流的Amd GPU具有3.7 TB/s的本地内存带宽,这还是不错的数量。 (编辑:不是22 TB/s)对于2k内核,这意味着接近1。每个内核每个周期5个字节或每个缓存行速度更快。

对于100%寄存器(如果不是泄漏到全局存储器)版本,可以减少线程的数目和线程中本身做矢量减少而不与其他人进行通信,如果元件的数目是只有8或16如

v.s= v.s4567 
v.s01 += v.s23 
v.s0 += v.s1 

它应该类似于__m128i _mm_shuffle_epi8及其在CPU上编译时的总和版本,非标量实现将在GPU上使用相同的SIMD来完成这3个操作。

也使用这些矢量类型往往使用高效的内存交易,即使是全局和本地,而不仅仅是寄存器。

SIMD一次只能在一个波前工作,但波前可能会被多个SIMD处理,因此,此矢量操作并不意味着正在使用整个波前。甚至整个波前可能计算一个周期中所有矢量的第一个元素。但对于CPU来说,大多数逻辑选项是SIMD计算工作项目(avx,sse),而不是通过相同的索引元素并行计算它们。


如果主要的工作组不适合那些要求,有孩子内核产卵和使用动态宽度内核为这种操作。子内核同时在名为sub-group的另一个组上工作。这是在设备端队列中完成的,并且需要OpenCl版本至少为2.0。在http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf

AMD APP SDK

查找“装置侧入队”支持分小组

+0

谢谢!你可以添加一个答案,现在AMD APP SDK支持Sub-Group类似于WaveFronts吗?并且存在与CUDA“全部(谓词)”和CUDA“任何(谓词)”相似的'sub_group_all(谓词)和'sub_group_any(谓词)'。但是没有类似于CUDA-'_ballot(predicate)'和CUDA-'_shfl(value,thread)'的函数。网页-160:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf我会接受一个答案。 – Alex

+0

实际上它是opencl功能,不仅适用于amd。如果它是2.0设备,它必须支持或让我们知道它的查询。我加入了答案的结尾。是的,它变得更像CUDA bot不完全。 “无序设备队列是强制性的,而且任何支持OpenCL 2.0的设备都支持它们。”这里说:https://community.amd.com/thread/170319 –

相关问题