PTX数组作为操作数不起作用

时间:2012-11-09 09:53:08

标签: arrays cuda ptx

PTX手册(版本2.3)(http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/ptx_isa_2.3.pdf)6.4.2声明:

  

可以使用显式计算的字节访问数组元素   地址,或使用方括号表示法索引到数组中。   方括号内的表达式是一个常数整数,a   寄存器变量,或简单的“具有常量偏移的寄存器”   表达式,其中offset是一个常量表达式   从寄存器变量中添加或减去。如果更复杂   需要索引,必须将其写为地址计算   在使用之前。

 ld.global.u32  s, a[0]; 
 ld.global.u32  s, a[N-1]; 
 mov.u32  s, a[1];  // move address of a[1] into s 

当我尝试这个时,我只能得到版本指针和字节偏移量,即[a+0]

此代码无法加载:

.reg    .f32 f<1>;
.global .f32 a[10];
ld.global.f32 f0,a[0];

然而这很好:

.reg    .f32 f<1>;
.global .f32 a[10];
ld.global.f32 f0,[a+0];

字节偏移版本的问题在于它确实是字节偏移。因此,必须考虑该类型的基础大小,即第二个元素是[a+4]。而a[1]应该为你解决这个问题。

想法出了什么问题?

修改

此处涉及更严重的问题:上述文本指出可以使用寄存器变量来索引数组,例如:

ld.global.f32 f0,a[u0];

其中u0可能是.reg.u32或其他一些兼容的整数。

但是,使用指针加字节偏移方法这是不可能的。做以下事情是违法的:

mul.u32 u1,u0,4;
ld.global.f32 f0,[a+u1]; // here a reg variable is not allowed.

现在这是一个严重的限制。但是,可以在load语句之前进行另一个地址计算。但这使事情变得复杂。

1 个答案:

答案 0 :(得分:1)

这似乎不适合您引用的PTX文档,但您可以添加与数组中项目大小相对应的乘数。例如,要获得第10个32位字:

ld.const.u32 my_u32, [my_ptr + 10 * 4];