Cuda 共享内存寻址

Cuda 共享内存寻址,cuda,gpu,shared-memory,addressing,Cuda,Gpu,Shared Memory,Addressing,我知道,当我在内核中声明共享内存数组时,所有线程都会声明相同大小的数组。像这样的代码 __shared__ int s[5]; 将在每个线程中创建一个20字节的数组。我对寻址共享内存的理解是,它在所有线程中都是通用的。所以,如果我对下标10进行如下处理 s[10] = 1900; 它在所有线程中都是完全相同的内存位置。不同的线程不会访问下标10的不同共享内存地址。这是正确的吗?编译器当然会发出警告,指出下标超出范围。实际上,它将为每个块而不是每个线程创建一个20字节数组 块中的每个线程都将能

我知道,当我在内核中声明共享内存数组时,所有线程都会声明相同大小的数组。像这样的代码

__shared__ int s[5];
将在每个线程中创建一个20字节的数组。我对寻址共享内存的理解是,它在所有线程中都是通用的。所以,如果我对下标10进行如下处理

s[10] = 1900;

它在所有线程中都是完全相同的内存位置。不同的线程不会访问下标10的不同共享内存地址。这是正确的吗?编译器当然会发出警告,指出下标超出范围。

实际上,它将为每个块而不是每个线程创建一个20字节数组

块中的每个线程都将能够访问这20个字节。因此,如果您需要每个线程有N个字节,并且一个块有M个线程,那么您需要为每个块创建一个N*M的缓冲区

在您的情况下,如果有128个线程,您将有

__shared__ int array[5*128];

数组[10]应该是块内任何线程的有效地址。

实际上,它将为每个块而不是每个线程创建一个20字节的数组

块中的每个线程都将能够访问这20个字节。因此,如果您需要每个线程有N个字节,并且一个块有M个线程,那么您需要为每个块创建一个N*M的缓冲区

在您的情况下,如果有128个线程,您将有

__shared__ int array[5*128];

数组[10]应该是块中任何线程的有效地址。

顾名思义,共享内存数组位于共享内存中,而不是在每个线程中创建。换句话说,只有一个共享数组
s
,这就是为什么当不同线程访问共享内存中的同一地址时,可能会出现库冲突。共享内存由块中的线程共享,而不是内核的所有线程共享。它可以被视为一个可编程缓存。顾名思义,共享内存阵列位于共享内存中,而不是在每个线程中创建。换句话说,只有一个共享数组
s
,这就是为什么当不同线程访问共享内存中的同一地址时,可能会出现库冲突。共享内存由块中的线程共享,而不是内核的所有线程共享。可以将其视为可编程缓存。