Мои вопросы:CUDA переменные внутри глобального ядра
1) ли я понимаю правильно, что при объявлении переменной в глобальном ядре, будут разные экземпляры этой переменной для каждого потока. Это позволяет хранить промежуточный результат в этой переменной для каждого потока. Пример: вектор c = a + b:
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = threadIdx.x;
int p;
p = a[i] + b[i];
c[i] = p;
}
Здесь мы объявляем промежуточную переменную p. Но на самом деле есть N копий этой переменной, каждая для каждого потока.
2) Правда ли, что если я объявлю массив, будут созданы N копий этого массива, каждый для каждого потока? И пока все внутри глобального ядра происходит на памяти gpu, вам нужно в N раз больше памяти на gpu для любой объявленной переменной, где N - количество ваших потоков.
3) В моей текущей программе у меня есть 35 * 48 = 1680 блоков, каждый блок включает 32 * 32 = 1024 потока. Означает ли это, что любая переменная, объявленная в глобальном ядре, будет стоить мне N = 1024 * 1680 = 1 720 320 раз больше, чем вне ядра?
4) Чтобы использовать общую память, мне требуется в разы больше памяти для каждой переменной, чем обычно. Здесь M - число блоков. Это правда?
5) Почему люди всегда голосуют за мои вопросы? – Mihon
Я не спустил вас вниз, но сразу задал несколько вопросов. Переполнение стека обычно предполагает, что вопросы будут четкими и целенаправленными. –
Да, но вопросы связаны друг с другом .. – Mihon