GPU组如何进入warp / wavefronts?

时间:2013-03-07 08:57:52

标签: gpu gpgpu gpu-warp

我的理解是warp是一组在运行时通过任务调度程序定义的线程,CUDA的一个性能关键部分是warp中线程的分歧,有没有办法很好地猜测硬件如何将在一个线程块中构造warp?

例如我在一个线程块中启动了一个包含1024个线程的内核,如何安排warp,我能从线程索引中判断出(或者至少做出一个好的猜测)?

通过这样做,可以最小化给定warp中线程的分歧。

2 个答案:

答案 0 :(得分:4)

warp中的线程安排依赖于实现,但atm我经历过相同的行为:

warp由32个线程组成,但warp scheduller将发出1条指令,每次halp a warp(16个线程)

  • 如果使用1D块(只有threadIdx.x维度有效),则warp scheduller将为 threadIdx.x =(0..15)(16..31)发出1条指令 ......等

  • 如果您使用2D块(threadIdx.x和threadIdx.y维度有效),那么warp scheduller将尝试按照这种方式发布:

threadIdx.y = 0 threadIdx.x =(0 ..15)(16..31) ......等

因此,具有连续threadIdx.x组件的线程将以16个组的形式执行相同的指令。

答案 1 :(得分:2)

warp由32个线程组成,这些线程将同时执行。在任何给定时间,一批32个将在GPU上执行,这称为 warp

我还没有发现任何可以控制warp接下来要执行的地方,你唯一知道的是它由32个线程组成,并且一个threadblock应该总是这个数字的倍数。

  

单个块中的线程将在单个多处理器上执行,共享软件数据缓存,并且可以与同一块中的线程同步和共享数据; warp将始终是来自单个块的线程的子集。

关于内存操作和延迟,还有这个:

  

当warp中的线程发出器件存储器操作时,由于存储器延迟时间过长,该指令将花费很长时间,可能需要数百个时钟周期。主流架构将添加缓存内存层次结构以减少延迟,Fermi确实包含一些硬件缓存,但主要是GPU设计用于流或吞吐量计算,其中缓存内存无效。相反,这些GPU通过使用高度多线程来容忍内存延迟。特斯拉在每个多处理器上支持多达32个活动warp,而Fermi最多支持48个。当一个warp在内存操作停止时,多处理器选择另一个就绪warp并切换到那个。在此只要有足够的并行性来保持它们忙碌,核心就可以高效工作。

source

关于将线程块划分为warp,我发现了这个:

  

如果块是2D或3D,则线程按第一维排序,然后是第二维,然后是第三维 - 然后拆分为32的经线

source