在内嵌PTX负载函数的参数(load function parameters in inlined

2019-08-31 08:39发布

我有内联汇编下面的函数,在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];"::); 我该如何正确与释放模式直列PTX加载函数的参数?

PS建设有-G标志(GPU生成调试信息)的发布模式会导致代码在释放模式正常运行。 谢谢,

Answer 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


文章来源: load function parameters in inlined ptx