2014-12-11 3 views
1

Мои вопросы: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 - число блоков. Это правда?

+1

5) Почему люди всегда голосуют за мои вопросы? – Mihon

+1

Я не спустил вас вниз, но сразу задал несколько вопросов. Переполнение стека обычно предполагает, что вопросы будут четкими и целенаправленными. –

+0

Да, но вопросы связаны друг с другом .. – Mihon

ответ

4

1) Да. Каждый поток имеет частную копию не общих переменных, объявленных в функции. Обычно они попадают в память GPU register, хотя могут разливаться в память local.

2), 3) и 4) Хотя это правда, что вам нужно много копий этой частной памяти, это не означает, что ваш GPU должен иметь достаточно приватной памяти для каждого потока сразу. Это связано с тем, что в аппаратных средствах не все потоки должны выполняться одновременно. Например, если вы запускаете N потоков, может быть, что половина в данный момент активна, а другая половина не запускается, пока не будут созданы свободные ресурсы для их запуска.

Чем больше ресурсов ваши потоки будут использовать меньшее количество, тем может быть запущено одновременно аппаратное обеспечение, но это не ограничивает количество запросов, которые вы можете запросить для запуска, так как любые потоки, на которых нет ресурса для GPU, будут выполняться один раз некоторые ресурсы освобождают.

Это не значит, что вы должны сходить с ума и объявить огромное количество местных ресурсов. Графический процессор работает быстро, потому что он способен параллельно выполнять потоки. Чтобы запустить эти потоки параллельно, он должен соответствовать множеству потоков в любой момент времени. В самом общем смысле, чем больше ресурсов вы используете для потока, тем меньше потоков будет активным в данный момент и тем меньше параллелизм, который может использовать оборудование.

+1

Спасибо, понял! – Mihon

Смежные вопросы