根据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)的块,并相应地计算出一个网格。
答案 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
要计算理论上最大的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