2016-04-25 6 views
4

Ich benutze Cudafy, um einige Berechnungen auf einer NVIDIA-GPU zu machen. (Quadro K1100M Fähigkeit 3.0, wenn es darauf ankommt)Warum ist z immer Null im CUDA-Kernel

Meine Frage ist, wenn ich die folgende

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

verwenden, warum mein z Indizes aus der GThread Instanz immer Null, wenn ich diese verwende in meinem Kernel?

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

Außerdem, wenn ich muss etwas tun, wie

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

z verschiedene Indizes nicht geben, wie es sollte, aber num kann nicht sehr groß sein wegen der Beschränkungen Anzahl der Threads pro Block. Irgendeine Belastung wie man das umgeht?

bearbeiten

Ein anderer Weg, um es zu Ausdruck. Kann ich thread.z in meinem Kernel (für etwas Nützliches) verwenden, wenn die Blockgröße nur 2D ist?

+0

0 könnte der Standardwert sein? Sie sollten Ihrem "num" immer einen Wert von mindestens 1 geben. Um die Grenze der Threads pro Block zu bewältigen, erhöhen Sie einfach die Anzahl der Blöcke (also mehr Blöcke mit weniger Threads). – Taro

+0

num war nur um anzuzeigen, es könnte alles sein, aber ich bin positiv, es ist> 0. – smok

+1

Ich weiß nicht viel über cudafy aber es könnte sein, dass die Zuordnung zwischen dot net und cuda, entworfen vor cuda GridDim.z Dimension erlaubt , wurde nicht aktualisiert und berücksichtigt nicht die z-Dimension. Dies erfordert Überprüfung jedoch –

Antwort

5

Auf allen derzeit unterstützten Hardware ermöglicht CUDA die Verwendung von dreidimensionalen Gittern und dreidimensionalen Blöcken. Auf Rechenkapazität 1.x-Geräten (die nicht mehr unterstützt werden) wurden Gitter auf zwei Dimensionen beschränkt.

verwendet jedoch CUDAfy derzeit eine veraltete Laufzeit-API-Funktion Kernel zu starten, und leise verwendet nur gridDim.x und gridDim.y, nicht gridDim.z in Rechnung zu tragen:

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

Wie in the function DoLaunch() in CudaGPU.cs gesehen.

Während Sie in CUDAfy ein dreidimensionales Raster angeben können, wird die dritte Dimension beim Start des Kernels ignoriert. Danke an Florent, dass er darauf hingewiesen hat!

+0

Das ist nicht wirklich richtig. Dreidimensionale Grids * werden * auf der gesamten Hardware mit CC> = 2.0 unterstützt (also alle Hardware mit Unterstützung in CUDA 7) – talonmies

+0

Im Cheatsheet gibt es auch Beispiele, wo ein 3D-Gitter von Blöcken indiziert wird, aber ich hatte nie eine Nvidia-GPU 3D-Gitter aus Blöcken. Nsight hat immer berichtet, dass ich 65535 pro 65535 pro 1 Blöcke von verschiedenen Anzahlen von Threads starten konnte, abhängig von der GPU. – Taro

+0

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#compute-capabilities. Grids von 65535 x 65535 x 65535 werden unterstützt, oder 2^31-1 für 1D Grids für CC> = 3 – talonmies