使用CUDA占用率计算器

使用CUDA占用率计算器,cuda,Cuda,我正在使用占用率计算器,但我无法理解如何获取每个线程/每个块的共享内存的寄存器。我阅读了文档。我使用visual studio。因此,在CUDA build rule->Command Line->Additional Options(CUDA构建规则->命令行->附加选项)下的项目属性中,我添加了-ptxas Options=-v。该程序编译得很好。但我没有看到任何输出。有人能帮我吗? 谢谢打开此开关后,编译器输出窗口上应该会有一行告诉您有关寄存器数量和共享内存量的信息。 在“编译器输出”窗口

我正在使用占用率计算器,但我无法理解如何获取每个线程/每个块的共享内存的寄存器。我阅读了文档。我使用visual studio。因此,在CUDA build rule->Command Line->Additional Options(CUDA构建规则->命令行->附加选项)下的项目属性中,我添加了-ptxas Options=-v。该程序编译得很好。但我没有看到任何输出。有人能帮我吗?
谢谢

打开此开关后,编译器输出窗口上应该会有一行告诉您有关寄存器数量和共享内存量的信息。 在“编译器输出”窗口中看到任何内容吗?你能把它复制粘贴到问题上吗? 它应该看起来像

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

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

尝试以下简单规则:

内核中的所有局部变量(如int a、float b等)都存储在寄存器中。只有当代码中的局部变量保持在多处理器中可用寄存器的限制范围内时,才会出现这种情况。但是,如果您声明了像int a[1000]这样的1000个整数,那么a将不会存储在寄存器中,而是存储在本地内存DRAM中

内核代码中使用的共享内存量是共享内存/块。例如,如果定义了uu shared uuu float shMem[256],则使用256*4size of float=1024字节的共享内存

下面的示例代码可能无法正常工作,例如,每个线程使用9个32位寄存器,它们是:int xIndex、yIndex、Idx、shY、shX、aLocX、aLocY和float 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);

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


编译器输出窗口是指调试窗口,在这里我可以看到所有printf的输出?如果是,则为“否”。我在该窗口中看不到任何内容。它只是打印出我执行的时间测量值。输出窗口显示文件列表,当您开始构建项目后,这些文件将一个接一个地被编译。它是VisualStudio用户界面的一部分。它与运行程序时看到的内容无关。您可以通过从“视图”菜单中选择“输出”来打开它。谢谢jmiloy,我使用了探查器,但正如我提到的,在3次运行完成时,它会显示“错误显示输出”,我什么也看不到。导致此错误的原因有很多,您应该四处搜索解决方案。这是值得你花时间的。例如,在代码末尾添加对cudaThreadExit的显式调用可能会有所帮助。或者,如果内核占用的时间太长,探查器可能会静默超时。或者,如果在程序末尾有一个scanf,分析器将无法工作。或者,如果内核非常小,它可能会出现此错误。好吧……所以我确实检查了您提到的大部分内容。我检查了上一个cuda错误,它显示cudaSuccess。我最初有getchar功能,但删除了它,并在分析器上完成了3次运行。这就是为什么我更担心为什么它无法工作的原因。