【发布时间】:2012-07-01 23:37:19
【问题描述】:
我了解当我在内核中声明一个共享内存数组时,所有线程都会声明相同大小的数组。类似的代码
__shared__ int s[5];
将在每个线程中创建一个 20 字节的数组。我理解解决共享内存的方式是它在所有线程中都是通用的。所以,如果我按如下方式处理下标 10
s[10] = 1900;
它是所有线程中完全相同的内存位置。不同的线程不会为下标10访问不同的共享内存地址。这是正确的吗?编译器当然会抛出下标超出范围的警告。
【问题讨论】:
-
顾名思义,共享内存数组是在共享内存中,并不是在每个线程中创建的。也就是说,共享数组
s只有一个,这就是为什么不同线程访问共享内存中的同一个地址时会发生bank冲突的原因。 -
共享内存由块中的线程共享,而不是内核的所有线程。它可以被视为可编程缓存。
标签: cuda gpu shared-memory addressing