简短背景:
在CUDA中,我们有warp的概念,它是32个线程,保证同步。我有一个依赖于此SIMD行为的内核,以避免一大堆同步调用的潜在开销(在一些循环之后,1个线程完成并在共享内存中写入一个值,其余线程用于计算)。 p>
那么有没有办法在OpenCL中使用例如这种行为来成像Sub_Slices? According to Intel看起来他们的工作方式是这样的,但OpenCL中是否有任何保护SIMD行为的功能?
答案 0 :(得分:3)
对于OpenCL
上的NVIDIA
,这些也称为warps
,通常有32个工作项。在AMD
上wavefront
包含64个工作项。在Intel
上,这可以是SIMD-8
或SIMD-16
或SIMD-32
(8/16/32个工作项),可以放在硬件线程上并同时执行。这是SIMD-8
还是SIMD-16
还是SIMD-32
,具体取决于编译器的选择。
通常可以从CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
中的clGetKernelWorkGroupInfo()
参数中检索信息。
答案 1 :(得分:2)
是的,这是一个有用的习语。我认为您正在寻找的是OpenCL subgroups扩展。 “子组”相当于HW线程(英特尔的“wave”字样)。
子拼接实际上是欧盟的集合,每个欧盟都有7个“SIMD线程”(波浪)。但是,它们共享一个采样器,数据端口,指令缓存和纹理缓存。