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

Cuda 共享内存中的PTX可变长度缓冲区,cuda,buffer,shared-memory,ptx,Cuda,Buffer,Shared Memory,Ptx,我试图在PTX中实现一个全局精简内核,它使用共享内存在线程块中进行精简(就像所有CUDAC示例一样)。在CUDA C中,on可以在共享内存中定义一个可变长度的数组 extern __shared__ float sdata[]; extern __shared__ float sdata[]; 如何获得PTX中的等效值 看起来不合适的是像这样的固定长度数组 .shared .f32 sdata[ LENGTH ]; 因为我希望内核能够对不同的输入数组长度进行重用 我能做的就是定义一个变量

我试图在PTX中实现一个全局精简内核,它使用共享内存在线程块中进行精简(就像所有CUDAC示例一样)。在CUDA C中,on可以在共享内存中定义一个可变长度的数组

extern __shared__ float sdata[];
extern __shared__ float sdata[];
如何获得PTX中的等效值

看起来不合适的是像这样的固定长度数组

.shared .f32 sdata[ LENGTH ];
因为我希望内核能够对不同的输入数组长度进行重用

我能做的就是定义一个变量

.shared .f32 sdata;
并将其用作数组的基址。希望它是在共享内存开始时分配的。然后我可以访问数组元素,如

ld.shared.f32 %r4,[sdata + <offset>]
ld.shared.f32%r4,[sdata+]
这看起来也有点可笑,因为
sdata
被定义为
浮点值。但它实际上是一个浮点数的地址。从这个意义上说,上面这一行确实是正确的。
但是,我不确定这是否保证是正确的,比如说,只要偏移量不大于内核启动时指定的共享内存大小

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


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

这是可行的。但是,它不是完美的解决方案,因为它引入了
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];
}
在CUDA C中,on可以在共享内存中定义一个可变长度的数组

extern __shared__ float sdata[];
extern __shared__ float sdata[];
这不是中的可变长度数组-它只是用于访问动态有限数量的共享内存(在内核启动期间设置)的语法


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

我自己没有这样做,但似乎您可以创建一个简单的CUDA C示例来满足您的需要,然后编译并保留ptx输出(nvcc-ptx…)来看看它在ptx代码中的样子。就像这个想法!我按照你的建议做了。结果发现有一个未记录的
sdata
常量指针,它标志着共享内存的开始。你能把这个解决方案作为一个答案发布吗,@Frank?