loops - 将 C/C++ for 循环转换为 CUDA

标签 loops cuda

我想了解如何将基本 C/C++ 循环转换为 CUDA 内核。简单来说:

for (int i=0;i < MAXi;i++)
   for(int j=0;j< MAXj;j++){

       ...code that uses i and j....
   }

每个 i 都需要计算 MAXj 个元素。 对于某些人来说这可能是非常基本的,但我在这里真的很挣扎。 假设Maxj约为100万,MAXj=1000000;我们希望所有线程都能工作。 我仅使用内部循环就取得了成功:

int tid=threadIdx.x + blockDim.x*blockIdx.x + blockDim.x*gridDim.x*blockIdx.y;

使用 2d block ,如何并行化这种循环?它们在 C 语言中非常常见,学习如何做到这一点将非常有用。

最佳答案

划分此类 2D 循环的最佳方法是使用 1D block 和网格

dim3 blocks(MAXj, 1);
dim3 grids(MAXi, 1);

kernel<<<grids, blocks, 1>>>()

__global__ kernel()
{
   int i = blockIdx.x;
   int j = threadIdx.x;

   ...code that uses i and j....

}

内循环分为线程,外循环分为 block (2D block )

如果 MAXj 和 MAXi 是非常大的值,那么您需要将其分成小组并进行计算。该代码与此 thread 中发布的代码非常相似.

关于loops - 将 C/C++ for 循环转换为 CUDA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613106/

相关文章:

r - 在 R 的 for 循环中使用粘贴函数编写 ifelse 语句

cuda - 每个网格的最大块数 :CUDA

c# - 这段代码在性能方面有什么问题? List.Contains,随机使用,线程?

python - 在 python 中有效投影二分图(使用 networkx)

cuda - 在 CUDA 9 中附加了一些以 `_sync()` 命名的内在函数;语义相同?

cuda - CUSPARSE_STATUS_INTERNAL_ERROR 与 cuSparse cusparseSnnz 函数

sdk - 从哪里下载 CUDA SDK

c++ - OpenCV 3.0 上的 GPU 功能在哪里?

javascript - For 循环没有按预期工作,我做错了什么?

java - 如何重构重复的代码?