Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/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
理解OpenCL中的寄存器_Opencl_Gpgpu - Fatal编程技术网

理解OpenCL中的寄存器

理解OpenCL中的寄存器,opencl,gpgpu,Opencl,Gpgpu,对于OpenCL内核内部寄存器的使用,我有点困惑。我使用-cl nv verbose来捕获内核的寄存器使用情况。目前,我的内核正在录制ptxas info:Used 4个寄存器,用于内核中的一些代码。以下部分: double a; a = pow(2.0,2.0) if (index != 0) { } 使用的寄存器更改ptxas信息:使用了6个寄存器。我知道if循环中没有任何内容。但如果我再次将结构重组为: double a; if (index != 0) { a = pow(2.

对于OpenCL内核内部寄存器的使用,我有点困惑。我使用-cl nv verbose来捕获内核的寄存器使用情况。目前,我的内核正在录制
ptxas info:Used 4个寄存器
,用于内核中的一些代码。以下部分:

double a;
a = pow(2.0,2.0)
if (index != 0) {
}
使用的寄存器更改
ptxas信息:使用了6个寄存器
。我知道if循环中没有任何内容。但如果我再次将结构重组为:

double a;
if (index != 0) {
    a = pow(2.0,2.0)
}
这会将寄存器使用更改为
ptxas info:Used 15个寄存器
。我不会更改内核的工作组大小。也许答案在于查看ptx代码,但我不理解它(尽管如果需要,我可以得到它)。我更感兴趣的是,为什么仅仅通过移动一行代码,寄存器的使用就增加了两倍。有什么想法吗?(索引是私有的

更新:PTX代码和

更新:内核代码:

__kernel void butterfC( __global double *sI,    
                        __global double *sJ,
                        __global double *sK,
                        const int zR, 
                        const int yR,   
                        const int xR,
                        unsigned int l1,
                        const int dir,
                        unsigned int type   ) 
{
    int idX = get_global_id(0);
    int idY = get_global_id(1);
    int idZ = get_global_id(2);

    int BASE = idZ*xR*yR;
    int STRIDE = 1;

    int powX = pow(4.0f,l1);
    int powXm1 = pow(4.0f,l1-1);

    int yIndex, kIndex;

    switch(type)
    {
        case 1: BASE += idY*xR; 
                yIndex  = idX / powXm1 * powX;
                kIndex  = (idX % powXm1) + yIndex;  
                break;
        case 2: BASE += idX; STRIDE = xR; 
                yIndex  = idY / powXm1 * powX;
                kIndex  = idY % powXm1 + yIndex;
                break;
        case 3: BASE = idY*xR + idX; STRIDE = xR * yR; 
                yIndex  = idZ / powXm1 * powX;
                kIndex  = idZ % powXm1 + yIndex;
                break; 
    }

    double a;   

    //a = pow(2.0,2.0);
    if (kIndex != 0) {
        a = pow(2.0,2.0);
        .... do stuff
    }
}

猜测编译器在第一种情况下编译对常量的
pow
调用,但在第二种情况下不编译。
pow
函数的内联扩展将消耗大量寄存器。唯一的方法是查看PTX。我们需要查看PTX文件来了解发生了什么。这些都是密码吗?如果索引==0,那么集合是什么??因为我怀疑编译器正在使用额外的寄存器作为分支预测代码。我已经在更改前后添加了ptx代码。Tim,index==0没有任何区别。@OmarKhan:这是一个很大的PTX。比上面显示的代码片段多得多。你能让内核代码也可用吗?好吧,很抱歉把东西分块分发出去。我已经更新了问题。大量的PTX是我的另一块牛肉,也许是相关的,也许不是。所有800行左右的PTX代码都是由于代码中存在pow()函数。如果我保持所有内容不变,只需删除pow()函数(在代码中出现3次)。PTX减少到只有两行,
.reg.s32%r
ret。我观察到CUDA中pow()的PTX代码比OpenCL小得多。