【问题标题】:Converting C/C++ for loops into CUDA将 C/C++ for 循环转换为 CUDA
【发布时间】:2011-07-07 15:30:09
【问题描述】:

我想了解如何将基本的 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 在一百万左右,MAXj=1000000;我们希望所有线程都可以工作。 我只用内循环就成功了:

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

使用二维块,我怎样才能并行化这种循环?它们在 C 语言中很常见,学习如何做会非常有用。

【问题讨论】:

  • 答案完全取决于“...使用 i 和 j....的代码”的作用。在问题中添加一些进一步的细节,可能会得到有用的答案。您可能会发现 this thread 也值得一看。

标签: loops cuda


【解决方案1】:

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

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....

}

内循环被划分为线程,外循环被划分为块(2D块)

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

【讨论】:

    猜你喜欢
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多