我正在使用占用计算器,但我无法理解如何获得每个块的每个线程/共享内存的寄存器。我阅读文档。我在CUDA构建规则 - >命令行 - >下的项目属性中使用visual studio .So。我添加的其他选项--ptxas-options = -v。程序编译正常。但我没有看到任何输出。可以有人帮忙吗?
谢谢
答案 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信息,如下图所示......
答案 3 :(得分:0)
另一种查找此信息的方法是使用visual profiler或nvidia的并行nsight。