1

当指定 GPU 架构时,使用该选项编译的 CUDA 内核--ptxas-options=-v似乎显示错误的 lmem(本地内存)统计信息。sm_20这同样为架构提供了有意义的 lmem 统计信息sm_10 / sm_11 / sm_12 / sm_13

有人可以澄清 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-options=-vsm_20报告:

1>ptxas info    : Compiling entry function '_Z9fooKernelPi' for 'sm_20'
1>ptxas info    : Used 5 registers, 4+0 bytes lmem, 36 bytes cmem[0]

--ptxas-options=-vsm_10 / sm_11 / sm_12 / sm_13报告:

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 bytes的 lmem ,如果您看到内核中使用了 4x1000 字节数组,这根本不可能。较旧的 GPU 架构报告正确的4000 字节lmem 统计信息。

这是用CUDA 3.2试过的。我参考了NVCC 手册(v3.2) 的打印代码生成统计部分,但它无助于解释这种异常情况。

4

1 回答 1

1

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

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

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

于 2011-02-24T12:39:28.293 回答