有没有办法在CUDA内核中并行化独立for循环?

有没有办法在CUDA内核中并行化独立for循环?,cuda,Cuda,我正在尝试在CUDA内核中并行化for循环。例如,下面是一个简单的内核示例: __global__ void sample_kernel(int n, float *x, float *y) { for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; i += blockDim.x * gridDim.x) { for (int j = 0; j < 10; ++j) { y[10 * i +

我正在尝试在CUDA内核中并行化for循环。例如,下面是一个简单的内核示例:

__global__ void sample_kernel(int n, float *x, float *y) {
  for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < n; i += blockDim.x * gridDim.x) {
    for (int j = 0; j < 10; ++j) {
        y[10 * i + j] = j * x[i];
    }
  }
}
\uuuuu全局\uuuuu无效样本\u内核(int n,float*x,float*y){
对于(int i=blockIdx.x*blockDim.x+threadIdx.x;i

因为
j
的循环是独立的,所以我也想并行化这个循环。有什么可能的方法可以做到这一点吗

在CUDA中,线程执行工作。向一组线程发出指令,在CUDA的情况下,该线程由32个线程组成。这意味着,在理论上,您可以在硬件的限制范围内并行化几乎任何您想要的代码

在您的例子中,现在这样做的方式是,一个线程为外循环执行网格跨步,为外循环的每个迭代执行网格跨步,为内循环的每个迭代执行网格跨步

只要嵌套循环不超过三个,完成所要完成任务的标准方法是利用CUDA中网格是三维的这一事实(尽管可以使用1D网格),并执行嵌套网格跨步:

__global__ void sample_kernel(int n, float *x, float *y) {
  for (int i = blockIdx.y * blockDim.y + threadIdx.y; i < n; i += blockDim.y * gridDim.y) {
    for (int j = blockIdx.x * blockDim.x; j < 10; j += blockDim.x * gridDim.x) {
        y[10 * i + j] = j * x[i];
    }
  }
}
\uuuuu全局\uuuuu无效样本\u内核(int n,float*x,float*y){
对于(int i=blockIdx.y*blockDim.y+threadIdx.y;i
当然,这不是唯一的方法:您可以使用一维网格实现相同的效果。为此,您只需以不同的方式分割工作,而不是执行常规的网格步长