2012-11-02 6 views
6

Jestem świadomy alokacji dynamicznej, gdy używane są tablice 1D, ale jak można to zrobić, gdy używane są tablice 2D?Alokacja dynamiczna z podziałem pamięci GPU 2D

myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>(); 
     .... 

__global__ void myKernerl(){ 
__shared__ float sData[][]; 
    ..... 
} 

że chcę przeznaczyć 2D wspólną tablicę pamięci:

__shared__ float sData[32][32]; 

Jak można to zrobić dynamicznie? będzie:

myKernel<<< blocks, threads, sizeof(float)*32*32 >>>(); 
+7

Twój statycznie zadeklarowane „2D wspólną tablicę pamięci” nie jest dwuwymiarowy, to tylko pamięć liniowa i kompilator generuje row-major dostęp celu niego. Opierając się na nieskończonej liczbie pytań dotyczących tablic wielowymiarowych, być może nadszedł czas, aby usiąść z jakimś materiałem referencyjnym i dowiedzieć się, jak działają macierze w C++ .. – talonmies

Odpowiedz

4

Jak już poprawnie napisane trzeba określić wielkość dynamicznie przydzielonego pamięci współdzielonej przed każdym jądrze wywołującego w konfiguracji wykonania (w <<<blocks, threads, sizeofSharedMemoryinBytes>>>). Określa liczbę bajtów w pamięci współużytkowanej, która jest przypisywana dynamicznie na blok dla każdego wywołania oprócz statycznie przydzielonej pamięci. IMHO nie ma sposobu na dostęp do takiej pamięci jak tablica 2D, trzeba użyć tablicy 1D i używać jej jak 2D. Ostatnia myśl, nie zapomnij o kwalifikatorze extern. Więc kod powinien wyglądać tak:

sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float); 

    myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>(); 
    .... 

    __global__ void myKernerl() { 

     extern __shared__ float sData[]; 
     ..... 
     sData[dimX * y + x] = ... 
    } 
+0

Tak też myślę. – Ono