我有一个目前在一个块上运行的 3D 内核:
// The two following variables are set elsewhere in the program.
// I give them possible value here for demonstration purposes.
int* N = {14, 5, 1};
int L = 2; // N's size - 1
int idx = blockIdx.x * blockDim.x + threadIdx.x;
int idy = blockIdx.x * blockDim.y + threadIdx.y;
int idz = blockIdx.x * blockDim.z + threadIdx.z;
int idxInc = idx + 1; // for not to waste threads whose idx = 0
if (idxInc >= 1 && idxInc <= L)
{
if (idy < N[idxInc])
{
if (idz < N[idxInc-1])
{
dw[ idxInc ][ idy ][ idz ] = 0;
}
}
}
如果我在一个尺寸为 {2, 5, 14} 的块上启动这个内核,一切都很好。这正是块的每个维度所需的线程数,以便内核执行前两行中定义的数据工作。现在,我不知道如何在多个块之间划分这项工作。我的大脑错误只是试图在两个块上为每个维度找到合适数量的线程。此外,L 可能会有所不同(但我可能会对此有所限制),更有可能 N[1] 会发生很大变化(在此示例中为 5,但可能是 128、256 或 2048...)。所以我必须找到一种算法来自动平衡块的数量,以及块的三个维度中每个维度的线程数。
我真的不知道该怎么办,现在我觉得我很愚蠢!我开始认为我应该停止玩 3 维……或者也许有一个我看不到的简单技巧……
一些帮助?谢谢!
编辑:串行检查结果...
for (layer = 1; layer <= L; layer++)
{
for (i = 0; i < N[layer]; i++)
{
for (j = 0; j < N[layer-1]; j++)
{
printf("%1.0f", dw[ layer ][ i ][ j ]);
}
printf("\n");
}
printf("\n");
}
显示的每个数字都应为 0。