提高基于元素的CUDA内核算术强度的技术



我已经编写了一个CUDA内核,用于计算一组源粒子和目标粒子之间的成对相互作用。

我的M个目标粒子是这样的,

[[x_1,y_1,z_1],...,[x_m, y_m, z_m]]

N个源粒子看起来像

[[x_1,y_1,z_1],...,[x_n, y_n, z_n]]

with M

我的问题是我必须做些什么来避免这个循环?我是CUDA的新手。

并行编程(CUDA或其他)的一个基本概念是,你让不同的处理元素/线程/自动机/任何东西在所有"循环迭代"上工作,而不是在时间上连续发生的循环。并行:N个处理元素每个做1件工作,而不是一个处理元素使用循环做N件工作。

在CUDA中,在你的M和N的情况下,这可能意味着有一个M x N的二维网格,每个CUDA线程在一对源和目标粒子集上工作。或者更小的网格,每个CUDA线程在几对上运行一个循环,但对更少。

你可能还记得CUDA vectorAdd的例子,它计算两个向量的元素加法。下面是一个可能的内核:

__global__ void vecAdd(int *A, int *B, int *C, int N)
{
int i = blockIdx.x * blockDim.x + threadIdx.x;
C[i] = A[i] + B[i]; 
}

你看到了什么?没有任何循环。正是网格中的大量线程确保了每个可能的i(介于0到N-1之间)都有C的相应元素被计算。

最新更新