为什么CUDA内核中的z始终为零

4
我将使用Cudafy在NVIDIA GPU上进行一些计算。(Quadro K1100M能力为3.0,如果有关系的话)
我的问题是,当我使用以下内容时:
cudaGpu.Launch(new dim3(44,8,num), new dim(8, 8)).MyKernel...

当我在内核中使用GThread实例时,为什么我的z索引总是为零?

int z = thread.blockIdx.z * thread.blockDim.z + thread.threadIdx.z;

此外,如果我需要做类似以下的事情:
cudaGpu.Launch(new dim3(44,8,num), new dim(8, 8, num)).MyKernel...

z会给出应有的不同索引,但由于每个块中线程数量的限制,num不能太大。有什么建议可以解决这个问题吗?

编辑

另一种表述方式是:当块大小只有2D时,我能在我的内核中使用thread.z吗(用于任何有用的东西)?


0 可能是默认值吗?您应该始终为您的“num”提供至少1个值。 为了处理每个块的线程限制,只需增加块数(因此,更多块,每个块的线程更少)。 - Taro
num只是表示它可以是任何值,但我确定它大于0。 - smok
1
我对cudafy不是很了解,但可能是因为在cuda允许gridDim.z维度之前设计的dot net和cuda之间的映射尚未更新,因此没有考虑z维度。不过这需要进一步验证。 - Florent DUGUET
经过研究,我只发现了这个话题,在这个话题中,一个用户指出CUDAfy报告他的设备的CC错误:http://cudafy1.rssing.com/chan-12112480/all_p2.html 。这可能是因为它认为它*不能启动一个三维网格,尽管您的设备可以。 - Taro
1个回答

5

在目前支持的所有硬件上,CUDA允许使用三维网格和三维块。但是,在不再受支持的计算能力为1.x的设备上,网格被限制为两个维度。

然而,CUDAfy目前使用一个已弃用的运行时API函数来启动内核,并且默默地仅使用gridDim.x和gridDim.y,不考虑gridDim.z:

_cuda.Launch(function, gridSize.x, gridSize.y);

如在CudaGPU.cs中的DoLaunch()函数所示

因此,虽然您可以在CUDAfy中指定三维网格,但在内核启动期间将忽略第三个维度。感谢Florent指出这一点!


作弊表中还有一些索引3D格子的示例,但我从未拥有过支持3D格子块的Nvidia GPU。 Nsight始终报告我可以启动65535个各种线程数量的块的每个65535。 - Taro
支持65535 x 65535 x 65535的网格,或者对于CC>=3的1D网格为2^31-1。请参阅http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities。 - talonmies
如果你知道的话,为什么不考虑回答smok的问题呢? 无论如何,我会编辑我的回答以进行更正。 - Taro
不,我没有,但我可以去找一下,也许能找到答案。如果你不想回答smok的问题,至少让其他人试试。 - Taro
1
@Taro,偷看CUDAfy代码的时候似乎发现它正在使用已弃用的CUDA运行时API,只允许2D调用:https://cudafy.codeplex.com/SourceControl/latest#Cudafy/Cudafy.Host/CudaGPU.cs(DoLaunch)。仅仅利用了gridSize.x和gridSize.y。 - Florent DUGUET
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接