Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays PTX数组作为操作数不起作用_Arrays_Cuda_Ptx - Fatal编程技术网

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

Arrays PTX数组作为操作数不起作用,arrays,cuda,ptx,Arrays,Cuda,Ptx,PTX手册(版本2.3)()6.4.2规定: 可以使用显式计算的字节访问数组元素 地址,或使用方括号表示法索引到数组中。 方括号内的表达式可以是常量整数,也可以是 寄存器变量,或简单的“具有恒定偏移量的寄存器” 表达式,其中偏移量是一个常量表达式 从寄存器变量中加或减。如果更复杂 如果需要索引,则必须将其写入地址计算 使用前 当我尝试此操作时,只能使版本指针加字节偏移量起作用,即[a+0] 此代码无法加载: .reg .f32 f<1>; .global .f32 a[10];

PTX手册(版本2.3)()6.4.2规定:

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

当我尝试此操作时,只能使版本指针加字节偏移量起作用,即
[a+0]

此代码无法加载:

.reg    .f32 f<1>;
.global .f32 a[10];
ld.global.f32 f0,a[0];
其中,
u0
可能是一个
.reg.u32
或其他兼容整数

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

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

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

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

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

您的编辑案例不符合“使用恒定偏移量注册”的条件。a和u1都是寄存器,都不是常量,可以在汇编时进行计算,这正是问题所在。如果两个寄存器都是非常量寄存器,则这是非法的。然而,如果数组索引能够工作,人们可以做一些整洁的事情,比如
a[u0]
。至少手册上是这么说的。您可以通过地址预计算找到它,但这会使事情复杂化。知道为什么驱动程序拒绝加载
ld.global.f32 f0,a[0]?我意识到,由于在本例中10和4都是常量,所以PTX汇编程序可能会将它们相乘。看看你能不能把寄存器偏移量和乘法运算结合起来。。。我浏览了一些编译器生成的PTX,编译器似乎只使用字节偏移量方法。
ld.global.f32 f0,a[u0];
mul.u32 u1,u0,4;
ld.global.f32 f0,[a+u1]; // here a reg variable is not allowed.
ld.const.u32 my_u32, [my_ptr + 10 * 4];