我具有以下内联汇编函数,在32位Visual Studio 2008中的调试模式下可以正常运行:

__device__ void add(int* pa, int* pb)
{
  asm(".reg .u32   s<3>;"::);
  asm(".reg .u32   r<14>;"::);

  asm("ld.global.b32    s0, [%0];"::"r"(&pa));      //load addresses of pa, pb
  printf(...);
  asm("ld.global.b32    s1, [%0];"::"r"(&pb));
  printf(...);
  asm("ld.global.b32    r1, [s0+8];"::);
  printf(...);  
  asm("ld.global.b32    r2, [s1+8];"::);
  printf(...);

  ...// perform some operations
}

pa和pb全局分配在设备上,例如

__device__ int pa[3] = {0, 0x927c0000, 0x20000011};  
__device__ int pb[3] = {0, 0xbb900000, 0x2000000b};

但是,此代码在发布模式下在asm("ld.global.b32 r1, [s0+8];"::);行中失败asm("ld.global.b32 r1, [s0+8];"::); 如何在发布模式下使用内联ptx正确加载函数参数?

PS使用-G标志(生成GPU调试信息)构建发布模式会导致代码在发布模式下正确运行。 谢谢,

===============>>#1 票数:1 已采纳

希望这段代码会有所帮助。 我仍然在猜测您到底想做什么,但是我从您的代码开始,决定在papb数组中添加一些值,然后将它们存储回pa[0]pb[0]

该代码是为64位计算机编写的,但是将其转换为32位指针并不难。 我已经用注释标记了需要更改的32位指针的行。 希望这能回答您有关如何使用指向设备内存的函数参数的问题:

#include <stdio.h>

__device__ int pa[3] = {0, 0x927c0000, 0x20000011};
__device__ int pb[3] = {0, 0xbb900000, 0x2000000b};

__device__ void add(int* mpa, int* mpb)
{
  asm(".reg .u64   s<2>;"::);  // change to .u32 for 32 bit pointers
  asm(".reg .u32   r<6>;"::);

  asm("mov.u64    s0, %0;"::"l"(mpa));      //change to .u32 and "r" for 32 bit
  asm("mov.u64    s1, %0;"::"l"(mpb));      //change to .u32 and "r" for 32 bit
  asm("ld.global.u32    r0, [s0+4];"::);
  asm("ld.global.u32    r1, [s1+4];"::);
  asm("ld.global.u32    r2, [s0+8];"::);
  asm("ld.global.u32    r3, [s1+8];"::);
  asm("add.u32    r4, r0, r2;"::);
  asm("add.u32    r5, r1, r3;"::);
  asm("st.global.u32    [s0], r4;"::);
  asm("st.global.u32   [s1], r5;"::);
}

__global__ void mykernel(){
  printf("pa[0] = %x, pb[0] = %x\n", pa[0], pb[0]);
  add(pa, pb);
  printf("pa[0] = %x, pb[0] = %x\n", pa[0], pb[0]);
}

int  main() {
  mykernel<<<1,1>>>();
  cudaDeviceSynchronize();
  return 0;
}

当我运行此代码时,我得到:

$ ./t128
pa[0] = 0, pb[0] = 0
pa[0] = b27c0011, pb[0] = db90000b
$

我相信这是正确的输出。

我用它编译:

nvcc -O3 -arch=sm_20 -o t128 t128.cu

  ask by Meriko translate from so

未解决问题?本站智能推荐:

2回复

PTX ISA中的错误(传播)?

库达(Cuda)中有错误吗? 我在GTX580上运行了以下代码,并且r1最后为零。 我希望这是由于进位传播? 我已经使用Cuda Toolkit 4.2.9和5.5测试了代码,并使用“ nvcc -arch = sm_20 bug.cu -o bug && ./bug”进行
1回复

使用内联PTX asm()指令时,“ volatile”有什么作用?

当我们使用通常的C / C ++ CUDA代码编写内联PTX程序集时,例如: 我们可以在asm之后添加volatile关键字,例如: 嵌入式PTX组装的CUDA 文档说: 编译器假定asm()语句除更改输出操作数外没有其他影响。 为了确保在生成PTX期间不会删除或移动
1回复

在Inline PTX CUDA中简单添加向量

我尝试制作简单的代码,将V1(向量)与V2相加并将值保存在V3中。 它在CUDA中是可行的,但是我不能在PTX中编写它,有人可以帮忙吗? 当我打印Vector CC时,运行PTX代码后,每个地方都是零。 您能告诉我代码的原因和位置吗? ////////////// 在V
1回复

如何解释CUDA的内联PTX内部编译器错误

我想测量gpu全局内存的缓存行为,以下是我设计的微基准测试。 我想做的是从全局内存地址r_add0加载并将其存储到共享内存s_tvalue [0]中。 由于某些原因,我需要用内联PTX代码替换全局内存中的加载指令。 但是,当我用nvcc编译时,它抱怨编译错误 有人知道我的密码
1回复

如何解释ptx函数名称

当我编译我的cuda文件时: 我收到许多注册溢出警告: 如何判断溢出的函数是什么,因为此处显示的函数名称对我来说无法识别。 我只想看到“dualBlock”功能的溢出。 这可能吗?
2回复

内联PTX是否比C / C ++代码更有效?

我注意到PTX代码允许使用一些具有复杂语义的指令,例如位字段提取( bfe ),查找最高有效的非符号位( bfind )和填充计数( popc )。 显式地使用它们而不是用C / C ++编写具有预期语义的代码是否更有效? 例如:“ population count”或popc表示对
1回复

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

我正在尝试在PTX中实现全局还原内核,该内核使用共享内存在线程块内进行还原(就像那里的所有CUDA C示例一样)。 在CUDA C上,可以使用以下命令在共享内存中定义可变长度数组 如何获得PTX中的等效物? 似乎不合适的是固定长度的数组 由于我希望内核可用于不同的输入数组
1回复

ptx中的原始数据类型

上面的代码来自这里: CUDA仅为一个变量禁用L1缓存 据作者说, “d”表示浮点数, “r”表示int。 我想写一小段内联asm代码,我想知道其余原始类型变量的符号(如unsigned short,unsigned long long,float-32等),我无法从ptx isa
1回复

在CUDA PTX中,%warpid到底是什么意思?

在CUDA PTX中,有一个特殊的寄存器,用于保存线程的翘曲索引: %warpid 。 现在,规格说明: 请注意, %warpid是易失性的,并在读取时返回线程的位置,但是它的值在执行期间可能会更改,例如,由于抢占后重新安排了线程。 嗯,那是什么位置? 它不应该是块内的位置
1回复

对于PTX文件中的某些受损名称,c ++ filt不够激进

我正在通过c ++ filt过滤我编译的PTX,但它只能解析一些名称/标签,并保留一些原样。 例如,这个: 被解构为: 而不是至少这个: 我意识到c ++ filt没有明确支持CUDA PTX; 但请注意,未示出的名称与示例中的解码名称的区别仅在于添加了_param_