我正在尝试在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中实现可变长度缓冲区?
答案 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语法的一部分公开了。