Как определить общую память CUDA с размером, известным во время выполнения?

__shared__ Кажется, что память в CUDA требует известного размера во время компиляции. Однако в моей проблеме __shared__ объем памяти известен только во время выполнения, т.е.

int size=get_size();
__shared__ mem[size];

Это закончится сообщением "ошибка: постоянное значение неизвестно", и я не уверен, как обойти эту проблему.

2 ответа

Решение

Цель разделяемой памяти состоит в том, чтобы позволить потокам в блоке сотрудничать. Когда вы объявляете массив как __shared__каждый поток в блоке видит одну и ту же память, поэтому для данного потока не имеет смысла устанавливать собственный размер для массива в разделяемой памяти.

Тем не менее, особый случай динамического указания размера одного __shared__ Поддерживается массив одинакового размера для всех потоков. Смотрите распределение общей памяти.

Если вам нужно динамически распределять память для каждого потока, вы можете использовать new или malloc внутри ядра (в Fermi), но они выделяют глобальную память, которая, вероятно, будет медленной.

Вы должны использовать extern__shared__ mem[];(Динамическая общая память) вместо __shared__ mem[size];Статическая общая память. см. [ https://devblogs.nvidia.com/parallelforall/using-shared-memory-cuda-cc/][1]

Другие вопросы по тегам