2016-04-25 37 views
4

我正在使用Cudafy在NVIDIA GPU上進行一些計算。 (的Quadro K1100M能力3.0,如果它的事項)爲什麼z在CUDA內核中始終爲零

我的問題是,當我使用以下

cudaGpu.Launch(new dim3(44,8,num), new dim(8, 8)).MyKernel... 

爲什麼從g線程情況下我的小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

0可能是默認值?您應該始終爲您的「num」提供一個至少爲1的值。 要處理每個塊的線程數限制,只需增加塊數(因此,多個塊數少的線程)。 – Taro

+0

num只是爲了表明它可能是任何東西,但我肯定它是> 0. – smok

+1

我對cudafy瞭解不多,但它可能是在cuda之前設計的dot net和cuda之間的映射允許gridDim.z dimension ,尚未更新並且未考慮z尺寸。 這需要驗證,雖然 –

回答

5

在當前支持的所有硬件上,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指出這一點!

+0

這是不正確的。在CC> = 2.0的所有硬件上都支持三維網格*(即所有支持CUDA 7的硬件) – talonmies

+0

在cheatsheet中也有一些例子,其中有一個3D網格索引,但我從來沒有Nvidia GPU支持塊的3D網格。 Nsight總是報告我可以根據GPU以每65535個塊的不同數量線程啓動65535個線程。 – Taro

+0

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities。 65535 x 65535 x 65535網格支持,或2^31-1一維網格爲CC> = 3 – talonmies

相關問題