2012-05-14 3 views
1

Как я могу заставить каждый поток в потоковом блоке иметь свой собственный указатель на разделяемую память? Я нашел пример объявления таких указателей:Локальный указатель на общую память в CUDA

int __shared__ *p; 
__shared__ int array[256]; 

p = &array[threadId]; 

Это право или есть другой способ?

ответ

4

Нет, это не так. В этом примере код p является общим, поэтому каждый поток в блоке будет пытаться получить доступ к одной и той же части памяти. Вы могли бы сделать это так, если threadId был уникальный индекс резьбы с блоком:

int *p; 
__shared__ int array[256]; 

p = &array[threadId]; 

В этом случае компилятор будет использовать либо регистр или поток локальной памяти для хранения уникального адреса элемента в статической общей памяти распределение array для каждого потока в блоке.

+0

Спасибо, я думал, что я видел его в [http://forums.nvidia.com/index.php?showtopic=35294], но есть заявление, как 'междунар * __ shared__ р ; 'Он должен быть указателем, хранящимся в локальной сети потока, и указывать на разделяемую память. Правильно ли это? – stuhlo

+0

нет это неправильный. Вы можете смело игнорировать все в этом потоке - с 2008 года, когда CUDA был новым, компилятор был примитивным, и не многие люди понимали тонкие детали расширений языка и то, как они сопоставляются с оборудованием. – talonmies

+0

Как я могу принудительно сохранить p в регистре? – spurra

-1

Вы правы. Лучшим способом является динамическое распределение разделяемой памяти. Примером может служить в качестве стажера:

void __global__ test(){ 
extern __shared__ int s[]; 
int *p = &s[xx]; 

} 

... 
test<<<x,y, shared memory length>>>(); 
... 
+0

Но опубликованный код в вопросе _isn't_ справа. '* p' не может быть объявлен' __shared__', то есть расы общей памяти. – talonmies

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