为什么 CUDA 内核中的 z 总是零
Why is z always zero in CUDA kernel
我正在使用 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(用于任何有用的东西)吗?
在所有当前支持的硬件上,CUDA 允许使用三维网格和三维块。在计算能力 1.x 设备(不再受支持)上,网格被限制为二维。
但是,CUDAfy 目前使用已弃用的运行时 API 函数来启动内核,并且只默默地使用 gridDim.x 和 gridDim.y,而不考虑 gridDim.z :
_cuda.Launch(function, gridSize.x, gridSize.y);
如 the function DoLaunch() in CudaGPU.cs 中所示。
因此,虽然您可以在 CUDAfy 中指定三维网格,但在内核启动期间会忽略三维。感谢 Florent 指出这一点!
我正在使用 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(用于任何有用的东西)吗?
在所有当前支持的硬件上,CUDA 允许使用三维网格和三维块。在计算能力 1.x 设备(不再受支持)上,网格被限制为二维。
但是,CUDAfy 目前使用已弃用的运行时 API 函数来启动内核,并且只默默地使用 gridDim.x 和 gridDim.y,而不考虑 gridDim.z :
_cuda.Launch(function, gridSize.x, gridSize.y);
如 the function DoLaunch() in CudaGPU.cs 中所示。
因此,虽然您可以在 CUDAfy 中指定三维网格,但在内核启动期间会忽略三维。感谢 Florent 指出这一点!