如何使线程块中的每个线程都有自己的共享内存指针?我找到了一些这样的指针声明的例子:
int __shared__ *p; __shared__ int array[256]; p = &array[threadId];
这是正确的,还是有其他方法?
kmbjn2e31#
不,这不是正确的方式。在该示例代码中,p是共享的,因此这意味着块中的每个线程都将尝试访问同一块内存。如果threadId是块的唯一线程索引,可以这样做:
p
threadId
int *p; __shared__ int array[256]; p = &array[threadId];
在这种情况下,编译器将使用寄存器或线程本地存储器为块中的每个线程存储静态共享存储器分配array中元素的唯一地址。
array
epggiuax2#
你说得对。更好的方法是动态分配共享内存。一个例子是fellow:
void __global__ test(){ extern __shared__ int s[]; int *p = &s[xx]; } ... test<<<x,y, shared memory length>>>(); ...
2条答案
按热度按时间kmbjn2e31#
不,这不是正确的方式。在该示例代码中,
p
是共享的,因此这意味着块中的每个线程都将尝试访问同一块内存。如果threadId
是块的唯一线程索引,可以这样做:在这种情况下,编译器将使用寄存器或线程本地存储器为块中的每个线程存储静态共享存储器分配
array
中元素的唯一地址。epggiuax2#
你说得对。更好的方法是动态分配共享内存。一个例子是fellow: