CUDA:为sm_20显示错误的lmem统计信息?

CUDA:为sm_20显示错误的lmem统计信息?,cuda,nvcc,ptxas,Cuda,Nvcc,Ptxas,当指定sm_20GPU体系结构时,使用选项--ptxas options=-v编译的CUDA内核似乎显示错误的lmem(本地内存)统计信息。同样,对于sm_10/sm_11/sm_12/sm_13体系结构,也给出了有意义的lmem统计数据 有人能澄清一下,sm_20 lmem统计数据是否需要以不同的方式解读,还是完全错误 以下是内核: __global__ void fooKernel( int* dResult ) { const int num = 1000;

当指定
sm_20
GPU体系结构时,使用选项
--ptxas options=-v
编译的CUDA内核似乎显示错误的lmem(本地内存)统计信息。同样,对于
sm_10/sm_11/sm_12/sm_13
体系结构,也给出了有意义的lmem统计数据

有人能澄清一下,sm_20 lmem统计数据是否需要以不同的方式解读,还是完全错误

以下是内核:

__global__ void fooKernel( int* dResult )
{
        const int num = 1000;
        int val[num]; 

        for ( int i = 0; i < num; ++i )
        val[i] = i * i; 

        int result = 0; 

        for ( int i = 0; i < num; ++i )
        result += val[i]; 

        *dResult = result;

        return;
}
--ptxas选项=-v
sm_10/sm_11/sm_12/sm_13
报告:

1>ptxas info    : Compiling entry function '_Z9fooKernelPi' for 'sm_20'
1>ptxas info    : Used 5 registers, 4+0 bytes lmem, 36 bytes cmem[0]
1>ptxas info    : Compiling entry function '_Z9fooKernelPi' for 'sm_10'
1>ptxas info    : Used 3 registers, 4000+0 bytes lmem, 4+16 bytes smem, 4 bytes cmem[1]
sm_20报告了一个4字节的lmem,如果您看到内核中正在使用4x1000字节数组,这是不可能的。较旧的GPU体系结构报告了正确的4000字节lmem统计数据


这是用CUDA 3.2尝试的。我已经参考了NVCC手册(v3.2)中的打印代码生成统计信息部分,但它并没有帮助解释这种异常现象

编译器是正确的。通过巧妙的优化,阵列不需要存储。您所做的基本上是计算
result+=i*i
,而从不将临时值存储到
val

查看生成的ptx代码不会显示sm_10与sm_20的任何差异。使用decuda反编译生成的立方体将显示优化效果


顺便说一句:尽量避免使用本地内存!它和全局内存一样慢。

编译器是正确的。通过巧妙的优化,阵列不需要存储。您所做的基本上是计算
result+=i*i
,而从不将临时值存储到
val

查看生成的ptx代码不会显示sm_10与sm_20的任何差异。使用decuda反编译生成的立方体将显示优化效果


顺便说一句:尽量避免使用本地内存!它和全局内存一样慢。

可能是不同的优化。显示ptx程序集以获取发生的情况。可能是不同的优化。显示ptx程序集以了解发生了什么。编译器优化是我的第一个怀疑。但是,它仍然报告了4个字节(仅在sm_20以下)的内核代码,无法进行优化。编译器优化是我的第一个怀疑。但是,对于无法优化的内核代码,它仍然报告了4个字节(仅在sm_20下)。