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语句之前进行另一个地址计算。但这使事情变得复杂。
答案 0 :(得分:1)
这似乎不适合您引用的PTX文档,但您可以添加与数组中项目大小相对应的乘数。例如,要获得第10个32位字:
ld.const.u32 my_u32, [my_ptr + 10 * 4];