Динамическое распределение разделяемой памяти GPU 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>>>). Это указывает количество байтов в разделяемой памяти, которое динамически выделяется на блок для этого вызова в дополнение к статически выделенной памяти. ИМХО, нет возможности получить доступ к такой памяти, как 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