标量变量和寄存器:CUDA

标量变量和寄存器:CUDA,cuda,gpu,Cuda,Gpu,我认为CUDA会尝试在寄存器中分配标量变量,在费米类GPU中,每个线程有63个寄存器。 我的代码如下: __global__ void test20 (double a) { double i1=1.0; double i2=2.0; double i3=3.0; double i4=4.0; double i5=5.0; double i6=6.0; double i7=7.0; double i8=8.0; double

我认为CUDA会尝试在寄存器中分配标量变量,在费米类GPU中,每个线程有63个寄存器。 我的代码如下:

__global__ void test20 (double a)
{
    double i1=1.0;
    double i2=2.0;
    double i3=3.0;
    double i4=4.0;
    double i5=5.0;
    double i6=6.0;
    double i7=7.0;
    double i8=8.0;
    double i9=9.0;
    double i10=10.0;
    ...

    a = i1+i2+i3 ... i20
 }
 __global__ void test (double *a)
{
    double reg1;
    double reg2;
    double reg3;
    double reg4;
    double reg5;
    double reg6;
    double reg7;
    double reg8;
    ....till 40
    reg1 = log10f(a[0]);
    reg2 = log10f(a[1]);
    reg3 = log10f(a[2]);
    reg4 = log10f(a[3]);
    reg5 = log10f(a[4]);
    reg6 = log10f(a[5]);
    reg7 = log10f(a[6]);
    reg8 = log10f(a[7]);
    reg9 = log10f(a[8]);
    ....till 40
    a[0] = reg1;
    a[1] = reg2;
    a[2] = reg3;
    a[3] = reg4;
    a[4] = reg5;
    a[5] = reg6;
    a[6] = reg7;
    a[7] = reg8;
   }
但是当我看到使用NVVP的每个线程的寄存器数量时,我只看到每个线程分配了2个寄存器,而我期望的是一个更高的数量。即使我将变量减少到10,分配的寄存器数量也保持不变。为什么会发生这种情况?如果我有n个变量,我如何确保CUDA使用n个寄存器(考虑到每个变量可以存储在单个寄存器中)

编辑:

根据建议,我对代码进行了如下修改:

__global__ void test20 (double a)
{
    double i1=1.0;
    double i2=2.0;
    double i3=3.0;
    double i4=4.0;
    double i5=5.0;
    double i6=6.0;
    double i7=7.0;
    double i8=8.0;
    double i9=9.0;
    double i10=10.0;
    ...

    a = i1+i2+i3 ... i20
 }
 __global__ void test (double *a)
{
    double reg1;
    double reg2;
    double reg3;
    double reg4;
    double reg5;
    double reg6;
    double reg7;
    double reg8;
    ....till 40
    reg1 = log10f(a[0]);
    reg2 = log10f(a[1]);
    reg3 = log10f(a[2]);
    reg4 = log10f(a[3]);
    reg5 = log10f(a[4]);
    reg6 = log10f(a[5]);
    reg7 = log10f(a[6]);
    reg8 = log10f(a[7]);
    reg9 = log10f(a[8]);
    ....till 40
    a[0] = reg1;
    a[1] = reg2;
    a[2] = reg3;
    a[3] = reg4;
    a[4] = reg5;
    a[5] = reg6;
    a[6] = reg7;
    a[7] = reg8;
   }
我正在
memcpy
-ing将阵列
a
返回主机。我现在看到每个线程都使用了所有63个寄存器:
ptxas信息:使用了62个寄存器,40字节cmem[0]
。虽然我通过了更多的考试
在寄存器中可以容纳的变量,我没有看到任何溢出到本地内存;我认为NVCC正在优化代码,以便只使用寄存器。

如果您按照@Talonmes的建议使用无法在运行时计算的表达式,那么您可能仍然无法获得每个声明的寄存器(或者在本例中,两个寄存器包含一个双精度寄存器)。您可能还必须在持续时间内保持变量的活动状态

__global__ void test20 (double a)
{
    double i1=1.0 * a;
    double i2=2.0 * i1;
    double i3=3.0 * i2;
    double i4=4.0 * i3;
    double i5=5.0 * i4;

    a = i1+i2+i3+i4+i5;

    printf("a = %f = %f + %f + %f + %f + %f\n", a, i1, i2, i3, i4, i5);
}
这是在浏览器中编写的示例代码。目标是在寄存器中保留值。此示例没有实际应用程序,因为编译器的目标是使用最少的寄存器。其中唯一的值是用于调试以使变量在其作用域期间保持活动状态


如果您想了解寄存器的用法,应该使用cuobjump-sass转储内核的汇编代码。

这是编译器优化。编译器可以预计算结果并替换常量。您能建议如何防止这种情况发生吗?请使用无法在编译时计算的表达式。另外,请注意,您可以声明一个小数组,编译器将把元素放入寄存器中,前提是可以计算索引。。。编译时:值得注意的是,如果没有printf调用,为了防止同样的优化问题,需要一个全局内存写入,其中包含所有双值的值。我想我应该使用数组而不是@ArchaeaSoftware建议的变量来缩短code@sayan:在这种情况下,请确保您理解ArchaeaSoftware的所有注释。