Numba CUDA - размер разделяемой памяти во время выполнения?

В CUDA C просто определить общую память размера, указанного во время выполнения. Как я могу сделать это с помощью Numba / NumbaPro CUDA?

То, что я сделал до сих пор, привело только к ошибкам с сообщением «Форма аргумента должна быть константой».

РЕДАКТИРОВАТЬ: Чтобы уточнить, то, что я хочу, эквивалентно следующему в C CUDA (пример взят и адаптирован из здесь:

__global__ void dynamicReverse(int *d, int n)
{
  extern __shared__ int s[];

  // some work in the kernel with the shared memory
}

int main(void)
{
  const int n = 64;
  int a[n];

  // run dynamic shared memory version
  dynamicReverse<<<1,n,n*sizeof(int)>>>(a, n);

}

person diogoaos    schedule 28.05.2015    source источник
comment
Вам, вероятно, следует спросить об этом у специалистов по континуальной аналитике (это их продукт), но я предполагаю, что они этого не поддерживают.   -  person talonmies    schedule 29.05.2015


Ответы (1)


Я нашел решение (через очень полезную службу поддержки пользователей Continuum Analytics). Что мы делаем, так это определяем разделяемую память, как обычно, но устанавливаем форму равной 0. Затем, чтобы определить размер разделяемого массива, мы должны передать его как четвертый параметр (после идентификатора потока) ядру. Например.:

@cuda.autojit
def myKernel(a):
   sm = cuda.shared.array(shape=0,dtype=numba.int32)

   # do stuff

arga = np.arange(512)
grid = 1
block = 512
stream = 0
sm_size = arga.size * arga.dtype.itemsize
myKernel[grid,block,stream,sm_size](arga)
person diogoaos    schedule 29.05.2015
comment
можно ли создать таким образом 2 массива разделяемой памяти разного размера? - person Ilya.K.; 23.12.2019
comment
Вы должны иметь возможность создавать столько, сколько захотите. - person diogoaos; 10.04.2021