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

smo*_*mok 4 c# cuda cudafy.net

我正在使用Cudafy在NVIDIA GPU上进行一些计算.(Quadro K1100M功能3.0,如果重要的话)

我的问题是,当我使用以下内容时

cudaGpu.Launch(new dim3(44,8,num), new dim(8, 8)).MyKernel...
Run Code Online (Sandbox Code Playgroud)

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

int z = thread.blockIdx.z * thread.blockDim.z + thread.threadIdx.z;
Run Code Online (Sandbox Code Playgroud)

此外,如果我必须做类似的事情

cudaGpu.Launch(new dim3(44,8,num), new dim(8, 8, num)).MyKernel...
Run Code Online (Sandbox Code Playgroud)

z确实提供了不同的索引,但由于每个块的线程数限制,num不能很大.有关如何解决这个问题的任何消息?

编辑

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

小智 5

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

但是,CUDAfy目前使用不推荐的运行时API函数来启动内核,并且只使用gridDim.x和gridDim.y,而不是考虑使用gridDim.z:

_cuda.Launch(function, gridSize.x, gridSize.y);
Run Code Online (Sandbox Code Playgroud)

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

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