3d线程索引和并行化2个问题

时间:2014-03-12 13:14:40

标签: c cuda

我正在创建2d数据以生成图像。

我正在扫描所有列和行并获取图像。

现在,我希望将其并行化并同时获得多个切片(图像)。

这就是为什么我要考虑另一个维度,我将在其中存储我想要获取的不同切片。

所以,我的第一个问题是如何在3d中完成这项工作(如下所示)?

RowIdx = threadIdx.y + blockDim.y * blockIdx.y;
ColIdx = threadIdx.x + blockDim.x * blockIdx.x;

另外,在c代码中我有类似的东西:

size_t RowIdx,ColIdx,theIJ;
float * t2DArrRe,
  * t2DArrIm;

theJ = 0;
for ( RowIdx = 0; RowIdx < NRows; RowIdx++ )
{

    // boundary effect
    *(t2DArrRe + theJ) = 0.0f;
    *(t2DArrIm + theJ) = 1.0f;
   ...
    ++theIJ;
    ...
        }

在上面的代码中,我考虑了图像的边界(行和列),并使用neighboor位置进行一些计算。

我不知道如何处理&#34; J&#34;并行方法。

我希望很清楚,谢谢!

--------- UPDATE ----------------------

也许我需要类似的东西:

RowIdx = threadIdx.y +  blockDim.y * threadIdx.x + (blockDim.y * blockDim.x) * threadIdx.z;
ColIdx = threadIdx.x +  blockDim.x * threadIdx.y + (blockDim.x * blockDim.y) * threadIdx.z;

我不确定它是否正确,但我仍然不知道如何处理&#34; theJ&#34;。

theJ += gridDim.x * blockDim.x够了吗?

我将如何考虑网格的所有维度?

1 个答案:

答案 0 :(得分:1)

第三个维度上有cuda的第三个组成部分,你可以重塑你的问题:

Pos_x = threadIdx.x + blockDim.x * blockIdx.x;
Pos_y = threadIdx.y + blockDim.y * blockIdx.y;
Pos_z = threadIdx.z + blockDim.z * blockIdx.z;

你的问题的第二部分对我来说不清楚,但我认为这可能是一个答案:

size_t RowIdx,ColIdx,theIJ;
float * t2DArrRe,
  * t2DArrIm;

theJ = threadIdx.x + blockDim.x * blockIdx.x;
for ( RowIdx = 0; RowIdx < NRows; RowIdx++ )
{

    // boundary effect
    *(t2DArrRe + theJ) = 0.0f;
    *(t2DArrIm + theJ) = 1.0f;
   ...
    theJ += gridDim.x * blockDim.x;
    ...
        }

希望这可以提供帮助。