我正在创建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
够了吗?
我将如何考虑网格的所有维度?
答案 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;
...
}
希望这可以提供帮助。