Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.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
Optimization CUDA代码优化;登记册数目_Optimization_Cuda_Numerical Integration - Fatal编程技术网

Optimization CUDA代码优化;登记册数目

Optimization CUDA代码优化;登记册数目,optimization,cuda,numerical-integration,Optimization,Cuda,Numerical Integration,我在这里粘贴了一些代码供大家查看 __global__ void Integrate(double a, double b) { __shared__ double extrapol[16]; __shared__ double result[32]; __shared__ double h; __shared__ double err; __shared__ double x; __shared__ int n; if (thread

我在这里粘贴了一些代码供大家查看

__global__ void Integrate(double a, double b) {
    __shared__ double extrapol[16];
    __shared__ double result[32];
    __shared__ double h;
    __shared__ double err;

    __shared__ double x;
    __shared__ int n;

    if (threadIdx.x == 0) {
        h       = b - a;
        err     = 1.0;
        
        if (0.0 == a)
            extrapol[0] = 0.5 * h * myfunc(b);
        else
            extrapol[0] = 0.5 * h * (myfunc(a) + myfunc(b));

        n = 1;
    }

    for (int i = 1; i < 16; i++) {
        if (threadIdx.x == 0)
            x = a + h * 0.5;

        __syncthreads();
    
        if (err <= EPSILON)
            break;

        Trapezoid(result, x, h, n);
        if (threadIdx.x == 0) {
            result[0] = (extrapol[0] + h * result[0]) * 0.5;

            double power = 1.0;
            for (int k = 0; k < i; k++) {
               power *= 4.0;
               double sum  = (power * result[0] - extrapol[k]) / (power - 1.0);
               extrapol[k] = result[0];
               result[0] = sum;
            }

            err = fabs(result[0] - extrapol[i - 1]);
            extrapol[i] = result[0];
            n *= 2;
            h *= 0.5;
         }
    }
}
代码执行良好,得到了预期的积分。 内核以以下方式执行(目前)

集成>(1,2);
问题:
当我使用nvidia visual profiler检查此函数的寄存器使用情况时。结果是每个线程有52个寄存器。我不明白为什么?这段代码中的大多数变量都是共享变量。你能告诉我怎样才能知道我的代码的哪些部分在使用寄存器吗

我怎样才能减少它们?我可以用这段代码进行任何优化吗

硬件 我使用的是费米装置Geforce GTX 470,计算能力2.0


谢谢,

寄存器的使用与已定义变量的数量没有直接关系,因为例如,寄存器用于存储未定义变量的中间计算结果

尝试使用寄存器找出代码部分的一种可能性是,尝试通过使用如下语法手动注释ptx文件,对其进行黑客攻击

asm volatile ("// code at this line is doing this and this ..."); 

您可以使用
ptxas
程序分析ptx文件,以显示每个函数的寄存器和内存使用情况。在您的情况下,您需要执行
ptxas--gpu name sm_20-v code.ptx

当我用CUDA5.0编译这段代码时,每个线程有29个寄存器。你确定你没有做任何类似于构建调试或禁用优化的事情吗?@talonmies是的,你是对的;我正在使用调试配置。在哪个版本配置中,我每个线程有30个寄存器(我使用nsight进行开发)。你能建议对这段代码进行进一步的优化吗?你的问题是关于寄存器的使用,我能告诉你的是,这不是一个问题,或者至少不能根据你发布的内容进行复制。优化从何而来?
 __device__ void Sum(volatile double *sdata, int tId) {
     if (tId < 16) {
         sdata[tId] += sdata[tId + 16];
         sdata[tId] += sdata[tId + 8];
         sdata[tId] += sdata[tId + 4];
         sdata[tId] += sdata[tId + 2];
         sdata[tId] += sdata[tId + 1];
     }
}
__device__ double myfunc(double x) {
     return 1 / x;
}
Integrate <<< 1, 32 >>>(1, 2);
asm volatile ("// code at this line is doing this and this ...");