2016-09-23 66 views
3

我学习Metal现在,并试图了解以下行:为line 1金属 - 线程和线程组

let threadGroupCount = MTLSizeMake(8, 8, 1) ///line 1 
let threadGroups = MTLSizeMake(drawable.texture.width/threadGroupCount.width, drawable.texture.height/threadGroupCount.height, 1) ///line 2 

command_encoder.dispatchThreadgroups(threadGroups, threadsPerThreadgroup: threadGroupCount) ///line 3 
  1. ,什么是3点的整数代表什么?我的猜测是分配要在过程中使用的线程数量,但哪个是哪个?

  2. line 1和'line 2'之间有什么不同?我的猜测再次是线程和线程组之间的差异。但我不确定什么是根本区别,什么时候使用什么。

回答

5

将工作项的网格分派给计算内核时,您有责任将网格划分成子集,称为线程组,其中每个线程的总线程数(宽*高*深)为小于相应计算流水线状态的maxTotalThreadsPerThreadgroup

尺寸threadsPerThreadgroup指示网格的每个子集的“形状”(即每个网格维度中的线程的数量)。 threadgroupsPerGrid参数指示有多少个线程组组成整个网格。就像你的代码一样,它通常是纹理的尺寸除以你选择的线程组大小的尺寸。

一个性能说明:每个计算管道状态都有一个threadExecutionWidth值,表示线程组的多个线程将由GPU一起调度和执行。因此,最佳线程组大小将始终为threadExecutionWidth的倍数。在开发过程中,只需发送一个小方格即可,完全可以接受。

1

第一行给出每组线程数(在本例中为二维8x8),而第二行给出每个网格的组数。然后第三行上的dispatchThreadgroups(_:threadsPerThreadgroup:)函数使用这两个数字。在这种情况下,组的数量可以省略,默认使用一个组。