我正在尝试在 PTX 中实现一个全局归约内核,它使用共享内存在线程块内进行归约(就像那里的所有 CUDA C 示例一样)。在 CUDA C 中,可以在共享内存中定义一个可变长度数组
extern __shared__ float sdata[];
如何在 PTX 中获得等价物?
看起来不合适的是一个固定长度的数组,比如
.shared .f32 sdata[ LENGTH ];
因为我希望内核可重用于不同的输入数组长度。
我能做的是定义一个变量
.shared .f32 sdata;
并将其用作数组的基地址。希望它是在共享内存开始时分配的。然后我可以访问数组元素
ld.shared.f32 %r4,[sdata + <offset>]
这看起来也有点好笑,因为sdata
它被定义为float
. 但它实际上是浮点数的地址。从这个意义上说,上述行确实是正确的。但是我不确定这是否保证正确,只要偏移量不大于内核启动时指定的共享内存大小。
PTX 手册没有解释共享内存中的可变长度缓冲区。
任何人都知道如何在 PTX 中实现可变长度缓冲区?