Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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
什么样的变量使用CUDA中的寄存器?_Cuda - Fatal编程技术网

什么样的变量使用CUDA中的寄存器?

什么样的变量使用CUDA中的寄存器?,cuda,Cuda,在上面的例子中,我猜x,y,偏移量在 nvcc-Xptxas-v提供4个寄存器,24+16字节smem 探查器显示4个寄存器 以及ptx文件的头部: __global__ void add( int *c, const int* a, const int* b ) { int x = blockIdx.x; int y = blockIdx.y; int offset = x + y * gridDim.x; c[offset] = a[offset] + b[

在上面的例子中,我猜
x
y
偏移量

  • nvcc-Xptxas-v提供
    4个寄存器,24+16字节smem

  • 探查器显示4个寄存器

  • 以及ptx文件的头部:

    __global__ void add( int *c, const int* a, const int* b )
    {
        int x = blockIdx.x;
        int y = blockIdx.y;
        int offset = x + y * gridDim.x;
        c[offset] = a[offset] + b[offset];
    }
    
    .reg.u16%相对湿度;
    .reg.u32%r;
    .reg.u64%rd;
    loc 15 21 0
    $LDWbegin_uuZ3ADDPIpkis1_uu:
    loc 15 26 0
    
有人能澄清登记册的使用情况吗?在费米中,每个线程的最大寄存器数为63。在我的程序中,我想测试内核占用过多寄存器的情况(因此变量可能必须自动存储在本地内存中,从而导致性能下降)。然后在这一点上,我可以把一个内核分成两个,这样每个线程都有足够的寄存器。假设SM资源对于并发内核是足够的


我不确定我是否正确。

PTX中的寄存器分配与内核的最终寄存器消耗完全无关。PTX只是最终机器代码的中间表示形式,并且使用,这意味着PTX中的每个寄存器只使用一次。一块有数百个寄存器的PTX可以编译成一个只有几个寄存器的内核

寄存器分配由
ptxas
完成,作为一个完全独立的编译过程(静态或由驱动程序实时,或两者兼而有之),它可以对输入PTX执行大量代码重新排序和优化,以提高吞吐量和保存寄存器,这意味着原始C中的变量或PTX中的寄存器与汇编内核的最终寄存器计数之间几乎没有关系


nvcc
确实提供了一些方法来影响汇编程序的寄存器分配行为。您可以使用
\uuuu launch\u bounds\uuuu
向编译器提供启发性提示,这可能会影响寄存器分配,并且编译器/汇编程序采用
-maxrregcount
参数(以寄存器溢出到本地内存的潜在代价为代价,这可能会降低性能)。volatile关键字用于改变基于nvopen64的编译器的旧版本,并可能影响本地内存溢出行为。但是您不能在原始C代码或PTX汇编语言代码中任意控制或控制寄存器分配。

您的问题是“为什么此代码使用4个寄存器而不是3个?”如果是这样,答案是:为了添加
a[offset]
b[offset]
,必须获取这两个值。它必须在获取另一个时,将首先获取的任何一个存储到某个位置。所以还需要一个寄存器。谢谢你的回答,那么我们可以说中间变量将保存在寄存器中吗?必要时,可以。要知道什么时候需要它并不总是容易的,而且它甚至可以根据硬件目标的不同而变化。明白了吗:-P因为寄存器的使用是复杂的,有没有办法找到内核的寄存器使用边界,因为我想测试寄存器溢出的情况,但是当我试图声明更多的变量时,寄存器的用法保持不变。非常感谢,Talonmes。所以我想我们对内核中的寄存器使用控制无能为力?编译器总是做很多事情。您可以使用
\uuu启动\u边界\uu
向编译器提供启发性提示,这可能会影响寄存器分配,并且编译器/汇编器使用
-maxrregcount
参数。
volatile
关键字用于改变早期版本的nvopen64编译器,并可能影响本地内存溢出行为。但是您不能在原始C代码中任意控制或控制寄存器分配。
.reg .u16 %rh<4>;
.reg .u32 %r<9>;    
.reg .u64 %rd<10>;  
.loc    15  21  0   

$LDWbegin__Z3addPiPKiS1_:   
.loc    15  26  0