Я программирую на 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).Из-за этого существуют определенные ограничения на массивы:
- Каждый вызванный поток должен иметь max_size * 3 элемента массива для манипуляции.
- Эти массивы широко используются, и поэтому ядро должно иметь возможность быстрого (или локального) доступа к ним.
- max_size не может быть константой, поскольку плотность чисел моих координат является переменнойоснованный на вводе данных в хост.Я просто ищу руководство о том, что можно сделать и какой из этих вариантов самый быстрый.
Если уместно, max_size будет одинаковым (постоянным) в каждой симуляции.Другими словами, он изменяется только от одной симуляции к другой и никогда в пределах одной и той же.