使用CUDA占用计算器

时间:2011-02-17 19:03:18

标签: cuda


我正在使用占用计算器,但我无法理解如何获得每个块的每个线程/共享内存的寄存器。我阅读文档。我在CUDA构建规则 - >命令行 - >下的项目属性中使用visual studio .So。我添加的其他选项--ptxas-options = -v。程序编译正常。但我没有看到任何输出。可以有人帮忙吗? 谢谢

4 个答案:

答案 0 :(得分:4)

启用此开关后,编译器输出窗口上应该有一行,告诉您寄存器的数量和共享内存的数量。
你在编译器输出窗口看到了什么吗?你能复制并粘贴到问题吗?
它应该看起来像

ptxas info : Used 3 registers, 2084+1060 bytes smem, 40 bytes cmem[0], 12 bytes cmem[1]

答案 1 :(得分:3)

尝试这个简单的规则:

内核中的所有局部变量(如 int a,float b 等)都存储在寄存器中。仅当代码中的局部变量保持在多处理器中可用寄存器的限制内时, See Limits 。但是,如果您声明一千个整数,如 int a [1000] ,那么 a 将不会存储在寄存器中,而是存储在本地存储器(DRAM)中。

内核代码中使用的共享内存量是Shared Memory / Block。例如,如果您定义__shared__ float shMem[256],则使用256 * 4(浮点大小)= 1024字节的共享内存。

以下示例代码(它不能正常工作,例如)每个线程使用 9 32位寄存器: int xIndex,yIndex,Idx,shY, shX,aLocX,aLocY 浮动t,temp 。该代码每块使用 324字节的共享内存,BLOCK_DIM = 16。

__global__ void averageFilter (unsigned char * outImage,
                           int imageWidth,
                           int imageHeight,
                           cuviPoint2 loc){


    unsigned int xIndex = blockIdx.x * BLOCK_DIM + threadIdx.x;
    unsigned int yIndex = blockIdx.y * BLOCK_DIM + threadIdx.y;
    unsigned int Idx = yIndex*imageWidth + xIndex;
    float t = INC;


    if(xIndex>= imageWidth|| yIndex>=imageHeight)
        return;


    else if(xIndex==0 || xIndex== imageWidth-1 || yIndex==0 || yIndex==imageHeight-1){

          for (int i=-1; i<=1; i++)
             for (int j=-1; j<=1; j++)
                 t+= tex1Dfetch(texMem,Idx+i*imageWidth+j);
                    outImage[Idx] = t/6;

          }


    __shared__ unsigned char shMem[BLOCK_DIM+2][BLOCK_DIM+2];


    unsigned int shY = threadIdx.y + 1;
    unsigned int shX = threadIdx.x + 1;


   if (threadIdx.x==0 || threadIdx.x==BLOCK_DIM-1 || threadIdx.y==0 || threadIdx.y==BLOCK_DIM-1){


 for (int i=-1; i<=1; i++)
      for (int j=-1; j<=1; j++)
        shMem[shY+i][shX+j]=  tex1Dfetch(texMem,Idx+i*imageWidth+j);

    }
    else
    shMem[shY][shX] =  tex1Dfetch(texMem,Idx);

     __syncthreads();     



if(xIndex==0 || xIndex== imageWidth-1 || yIndex==0 || yIndex==imageHeight-1)
        return;     

  int aLocX = loc.x, aLocY = loc.y;

    float temp=INC;

      for (int i=aLocY; i<=aLocY+2; i++)
         for (int j=aLocX; j<=aLocX+2; j++)
        temp+= shMem[shY+i][shX+j];

        outImage[Idx] = floor(temp/9);

}

答案 2 :(得分:3)

shoosh's answer可能是查找寄存器和共享内存使用情况的最简单方法。确保首先查看输出窗格(在“视图”下拉菜单中选择“输出”),然后重新编译。编译器应该为输出窗格中的所有内核提供ptxas信息,如下图所示......

View of ptxas compiler output in VS output window

答案 3 :(得分:0)

另一种查找此信息的方法是使用visual profiler或nvidia的并行nsight。