Как определить общую память CUDA с размером, известным во время выполнения? - PullRequest
6 голосов
/ 30 марта 2012

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

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

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

Ответы [ 2 ]

5 голосов
/ 30 марта 2012

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

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

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

1 голос
/ 18 октября 2016

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

...