GPU 2D споделена динамична памет

Наясно съм с динамичното разпределение, когато се използват 1D масиви, но как може да се направи, когато се използват 2D масиви?

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

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

Да кажем, че искам да разпределя 2D споделен масив от памет:

__shared__ float sData[32][32];

Как може да се направи динамично? би било:

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

person Manolete    schedule 02.11.2012    source източник
comment
Вашият статично деклариран масив от 2D споделена памет не е двуизмерен, той е просто линейна памет и компилаторът генерира достъп до него по ред на главния ред. Въз основа на безкрайния ви брой въпроси относно многомерните масиви, може би е време да седнете с малко справочни материали и да научите как работят масивите в C++..   -  person talonmies    schedule 02.11.2012


Отговори (1)


Както правилно сте написали, трябва да посочите размера на динамично разпределената споделена памет преди всяко извикване на ядрото в конфигурацията на изпълнение (в <<<blocks, threads, sizeofSharedMemoryinBytes>>>). Това указва броя на байтовете в споделената памет, която е динамично разпределена на блок за това повикване в допълнение към статично разпределената памет. IMHO няма начин за достъп до такава памет като 2D масив, трябва да използвате 1D масив и да го използвате като 2D. Последна мисъл, не забравяйте квалификатора extern. Така че вашият код трябва да изглежда така:

   sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float);

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

   __global__ void myKernerl() {

       extern __shared__ float sData[];
       .....
       sData[dimX * y + x] = ...
   }
person stuhlo    schedule 26.11.2012
comment
Това също мисля. - person Ono; 29.09.2014