Объявление массивов в ядре CUDA с параметрами ядра - PullRequest
0 голосов
/ 05 марта 2019

Я программирую на C ++ / CUDA и столкнулся с проблемой:

__global__ void KERNEL(int max_size, double* x, double* y, double* z)
{
      double localArray_x[max_size]
      double localArray_y[max_size]
      double localArray_z[max_size]
      //do stuff here
}

Сейчас мое единственное решение этого вопроса - это предопределение max_size следующим образом:

#define max_size 20

Эти массивыосновной фокус моей работы с ядром.По сути, у меня есть глобальные координаты, и к трем local_arrays добавляются только сегменты этих координат, основанные на местоположении в окне имитации.Затем выполняется работа с этими координатами, и, наконец, эти координаты добавляются обратно в глобальные массивы в конце моделирования (x, y, z).Из-за этого существуют определенные ограничения на массивы:

  1. Каждый вызванный поток должен иметь max_size * 3 элемента массива для манипуляции.
  2. Эти массивы широко используются, и поэтому ядро ​​должно иметь возможность быстрого (или локального) доступа к ним.
  3. max_size не может быть константой, поскольку плотность чисел моих координат является переменнойоснованный на вводе данных в хост.Я просто ищу руководство о том, что можно сделать и какой из этих вариантов самый быстрый.

    Если уместно, max_size будет одинаковым (постоянным) в каждой симуляции.Другими словами, он изменяется только от одной симуляции к другой и никогда в пределах одной и той же.

1 Ответ

0 голосов
/ 20 марта 2019

Это было проще, чем я думал.Для достижения этого используйте new и delete так же, как вы делали бы это на хосте.

Единственное отличие заключается в необходимости использовать вызов API времени выполнения, который выделяет память в куче для ваших целей:

cudaDeviceSetLimit(cudaLimitMallocHeapSize, heapsize);

где размер кучи для системы, в которой запущено N ядер с 3 массивами int размером N_SIZE каждое:

size_t heapsize = (size_t)( N*3*N_SIZE*sizeof(int) );
...