Cuda GPGPU:处理';不规则';使改变

Cuda GPGPU:处理';不规则';使改变,cuda,opencl,gpgpu,Cuda,Opencl,Gpgpu,在常规转换中,每个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线程都应具有相同的时间复杂度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线程?如何设计一个“好”的内核?有一种通用的方法吗?

如果硬件不是Vega或Volta(每项都可以执行几乎独立的命令),那么最好将可疑的工作重新分组在一起。例如,mandelbrot图像生成器(每个项目的工作量不同)可以通过2D平铺生成更快,因为同一组中的所有项目都可以具有或多或少相同的工作量和相邻工作项,并且比一维(扫描线)生成(每个组的结果差异更大)更平衡。或者,您应该根据上一次迭代对元素重新排序,或者使用空间分组

在最坏的情况下,每个计算单元的最大循环数(每个计算单元有8,64128192个内核)决定了最终的性能,随着计算单元的增加,性能会更快。但所有其他工作项的工作仍将隐藏在这些最大周期之后,并且比CPU更高效