在常规转换中,每个GPU线程都应具有相同的时间复杂度O.例如:
for i=0 to 10: c[i] = a[i]*b[i]
在不规则变换上,它不是:
for i=0 to len(arr)
for k=0 to random()%100
arr[i] += 1
导致像[2,50,32,77,1,5,66,...]这样的数组,其中每个元素大致表示计算成本。
GPGPU编程非常适合常规变换,如'逐元素加法','矩阵乘法','卷积',...... 但是不规则变换怎么样?如何'好'分配GPU线程?如何设计一个“好”的内核?有共同的方法吗?
答案 0 :(得分:2)
如果硬件不是Vega也不是Volta(每个项目都可以执行几乎独立的命令执行),那么最好的办法是将可疑作品重新组合在一起。例如,使用2D平铺生成时,mandelbrot图像生成器(每个项目的不同工作量)可以更快,因为同一组中的所有项目可以具有或多或少相同数量的工作邻居工作项并且比1-D(扫描线)更平衡生成(每组有更多不同的结果)。此外,您应该根据最后一次迭代重新排序元素或使用空间分组。
在最坏的情况下,每个计算单元的最大周期(每个具有8,64,128,192个核心)决定了最终的性能,随着计算单元的增加,性能会更快。但是所有其他工作项目仍然会隐藏在这些最大周期之后,并且比CPU更有效。