我正在尝试用CUDA开发一个小程序,但由于它很慢,我做了一些测试并搜索了一下。我发现,虽然单变量默认存储在本地线程内存中,但数组通常不是,我想这就是为什么它需要这么多时间来执行的原因。现在我在想:既然本地线程内存至少应该是16KB,而且我的数组就像52个字符一样长,有没有办法(语法请:)将它们存储在本地内存中?
它不应该是这样的吗:
__global__ my_kernel(int a)
{
__local__ unsigned char p[50];
}
发布于 2012-04-24 19:47:08
你所需要的就是:
__global__ my_kernel(int a)
{
unsigned char p[50];
........
}
如果需要的话,编译器会自动将其溢出到线程本地内存。但请注意,本地内存存储在GPU之外的SDRAM中,其速度与全局内存一样慢。因此,如果你希望这样做可以改善工作表现,你可能会感到失望……
发布于 2012-04-24 21:00:22
您混淆了本地和寄存器内存空间。
单变量和恒定大小的数组自动保存在芯片的寄存器空间中,几乎没有读写成本。
如果您超过了每个多处理器的寄存器数量,它们将存储在本地内存中。
本地内存驻留在全局内存空间中,对于读取和写入操作具有相同的慢速带宽。
#DEFINE P_SIZE = 50
__global__ void kernel()
{
unsigned char p[P_SIZE];
}
发布于 2012-04-24 21:31:25
您要查找的关键字是__shared__
。共享内存空间无法容纳大型数组,但编译器应将共享内存用于小的固定大小的数组,如本例所示。您可以使用__shared__
关键字来确保发生这种情况。如果超过块的最大共享内存量,您将看到编译时错误。
https://stackoverflow.com/questions/10297067
复制相似问题