Nvidia Jetson Tx1对抗Jetson NANO(基准测试)

时间:2019-07-09 12:59:34

标签: cuda nvidia nvidia-jetson

根据https://elinux.org/Jetson,我目前正在尝试以Jetson NANO为基准对Jetson TX1进行基准测试,它们都具有maxwell架构,其中128个cuda内核用于NANO,而256个用于TX1。这意味着通常Jetson NANO将达到TX1的一半性能。

为了测试这一点,我创建了一个(浮点)运算乘法内核,如下所示:

__global__ void matrixMultiply(float* mat1, float* mat2, int nx, int ny)
    {
        unsigned int ix = threadIdx.x + blockDim.x*blockIdx.x;
        unsigned int iy = threadIdx.y + blockDim.y*blockIdx.y;
        int idx = iy*nx + ix;

        mat1[idx] = mat1[idx]*mat2[idx] ;

    }

测试:对于TX1 = 130 ms和Jetson NANO = 150 ms,结果是2个“大小为15000 * 15000的浮点数组”的乘积。结果似乎很奇怪,就像我没有使用TX1的第二个SM一样, 因此,我使用sm_efficiency(TX1和NANO = 100%)进行了分析,  实现的入住率(TX1 = 92%,NANO = 88%)。我是在这里丢失了东西还是只是没有使用正确的网格和块配置。

P.S:我尝试了所有可能的配置,并且两种平台的最佳配置都是一个(256,1)的块,并相应地计算出一个网格。

1 个答案:

答案 0 :(得分:3)

  

我在这里错过了什么吗

是的,您在这里缺少什么。您的代码无法衡量您的想法:

  

它们都具有maxwell架构,具有用于NANO的128个cuda内核和用于TX1的256个cuda内核。这意味着通常Jetson NANO将达到TX1的一半性能。

如果您的代码的限制因素是与CUDA内核相关的计算性能,则该语句近似为true。但是,对于您的代码,不是,并且这很容易证明。

我们将从一些规格开始:

spec                 | TX1         | Nano     | source
---------------------=-------------=----------=----------
mem bandwidth (GB/s) | 25.6        | 25.6     | 1,2
---------------------=-------------=----------=----------
(FP32) compute cores | 256         | 128      | 1,2
---------------------=-------------=----------=----------
max core clock (MHz) | 998         | 921      | 1,2

来源:12

要计算理论上最大的FP32计算吞吐量,the formula为:

# of SMs * # of FP32 units per SM * 2 * clock rate

对于Jetson NANO:

128 * 2 * 921MHz = ~236GFlops/s

对于Jetson TX1:

256 * 2 * 998MHz = ~511GFlops/s

(以上公式中的2乘数是由于最大吞吐量是针对执行乘加运算(而不仅仅是乘积)的代码的事实

现在让我们分析代码中FP32计算与内存利用率的比率(忽略用于索引计算的任何整数算法):

    mat1[idx] = mat1[idx]*mat2[idx] ;

我们看到,对于每个FP32乘法运算,我们必须读取两个数量(总共8个字节)并写入一个数量(总共4个字节)。因此,每个乘法运算需要读写12个字节。

现在让我们假设您可以在TX1上达到511GFlops / s的峰值乘法吞吐量。即每秒511,000,000,000次乘法加法运算,或〜256,000,000,000次乘法运算。如果您每秒可以进行256B次乘法运算,则每个乘法将需要12个字节的读/写活动,因此所需的总带宽为:

256,000,000,000 multiply ops              12 bytes        3,072,000,000,000 bytes
----------------------------    *        -----------   =  -----------------------
            sec                          multiply op              sec

这意味着每秒将需要约3 TB的内存带宽,而您的代码将受到TX1的计算吞吐量的限制。但是TX1每秒只有25.6 G的内存带宽。因此,TX1的内存带宽将限制代码的吞吐量。类似的计算表明,NANO的内存带宽也会限制代码的吞吐量,因此,代码的两者之间的性能比的预测指标是内存带宽的比值:

25.6GB/s
--------     = 1
25.6GB/s

因此,您观察到两者之间的性能几乎相同:

150
---          = 1.15
130
对于您的代码,

比预期性能比为2:1更为明智。

如果您希望看到的代码更接近2:1的比例,那么您将需要执行很多计算操作同时又不消耗(相对而言)几乎不占用内存带宽的代码。此类代码的一个实际示例可能是矩阵-矩阵乘法,您可以轻松编写CUBLAS Sgemm代码来对此进行测试。请注意,此处的2:1比率期望值不太正确,因为核心时钟不同。预期比率为:

511
--- = ~2.17
236