共享内存中的PTX可变长度缓冲区

时间:2012-10-26 15:07:58

标签: cuda buffer shared-memory ptx

我正在尝试在PTX中实现一个全局缩减内核,它在一个线程块中使用共享内存进行缩减(就像那里的所有CUDA C示例一样)。在CUDA中,C on可以使用

在共享内存中定义可变长度数组
extern __shared__ float sdata[];

如何在PTX中获得等效物?

似乎不合适的是像

那样的固定长度数组
.shared .f32 sdata[ LENGTH ];

因为我希望内核可以重用于不同的输入数组长度。

我能做的是定义一个变量

.shared .f32 sdata;

并将其用作数组的基址。希望它在共享内存的开头分配。然后我可以访问像

这样的数组元素
ld.shared.f32 %r4,[sdata + <offset>]

这看起来有点滑稽,因为sdata被定义为float。但真正的是浮动的地址。从这个意义上说,上面这条线确实是正确的。 但是我不确定这是否保证是正确的,只要偏移量不大于内核启动时指定的共享内存大小。

PTX手册没有解释共享内存中的可变长度缓冲区。

任何人都知道如何在PTX中实现可变长度缓冲区?

2 个答案:

答案 0 :(得分:1)

这很有效。然而,它不是完美的解决方案,因为它引入了extern链接变量。

.version 2.3
.target sm_20
.extern .shared .align 4 .b8 sdata[];
.entry func (.param .s32 param0,...)
{
 //
 // Base addresses
 mov.u64 w2,sdata;  // shared memory
 ld.shared.s32 i9,[w2+0];
}

答案 1 :(得分:-1)

在CUDA C中,可以使用以下命令在共享内存中定义一个可变长度的数组

extern __shared__ float sdata[];

这不是usual sense of that term中的可变长度数组-仅仅是用于访问动态限制的共享内存的语法,该内存是在内核启动期间设置的。

CUDA编译器引入了.extern定义这一事实是TBH,这是一个不幸的实现细节-不幸的是nVIDIA作为CUDA语法的一部分公开了。