Jetson Nano 性能测试
1、CPU计时和GPU计时对⽐
1.1 GPU动态频率下测试FFT耗时
//第1次测试
FFT LENGTH : 1048576
Gpu clock : 13.941823 ms
Cpu Clock : 0.084000 ms
//第2次测试
FFT LENGTH : 1048576
Gpu clock : 14.107969 ms
Cpu Clock : 0.087000 ms
//第3次测试
FFT LENGTH : 1048576
Gpu clock : 17.229115 ms
Cpu Clock : 0.105000 ms
1.2 GPU锁最⾼频测试
//921M 锁频
//第1次测试
FFT LENGTH : 1048576
Gpu clock : 3.566250 ms
Cpu Clock : 0.091000 ms
//第2次测试
FFT LENGTH : 1048576
Gpu clock : 3.564010 ms
Cpu Clock : 0.116000 ms
//第3次测试
FFT LENGTH : 1048576
Gpu clock : 3.583594 ms
Cpu Clock : 0.096000 ms
2、整体性能测试
2.1 GPU动态频率下测试
//第1次测试
FFT LENGTH : 1048576
CpuMem2GpuMem : 6.026094 ms
FFT use time : 15.625417 ms
GpuMem2CpuMem : 6.198854 ms
Total time :27.850365 ms
//第2次测试
FFT LENGTH : 1048576
2.2 GPU锁最⾼频率下测试
3、性能对⽐
3.1 TMS320C6678 性能
CpuMem2GpuMem : 6.088542 ms
FFT use time : 14.518177 ms
GpuMem2CpuMem : 6.637500 ms
Total time :27.244219 ms
//第3次测试
FFT LENGTH : 1048576
CpuMem2GpuMem : 9.515364 ms
FFT use time : 27.618490 ms
GpuMem2CpuMem : 10.108125 ms
Total time :47.241978 ms
2.2 GPU锁最⾼频率下测试
//第1次测试
FFT LENGTH : 1048576
CpuMem2GpuMem : 4.264896 ms
FFT use time : 3.800885 ms
GpuMem2CpuMem : 6.094115 ms
Total time :14.159896 ms
//第2次测试
FFT LENGTH : 1048576
CpuMem2GpuMem : 4.782812 ms
FFT use time : 3.651094 ms
GpuMem2CpuMem : 5.188437 ms
Total time :13.622343 ms
//第3次测试
FFT LENGTH : 1048576
CpuMem2GpuMem : 4.732708 ms
FFT use time : 3.666042 ms
GpuMem2CpuMem : 5.137031 ms
Total time :13.535781 ms
3、性能对⽐
3.1 TMS320C6678 性能
3.2 Nano 性能
在nano测试中采⽤1024kfft进⾏性能测试,在最终结果如前两章所⽰。cpu计时并不准确,所以最终结 果以GPU计时为准。 在当前测试中,Nano的GPU使⽤率仅在1/4左右,在实际应⽤中,代码有进⼀步优化的空间。在实际使 ⽤中,内存拷⻉时间也可以进⼀步缩短。
4、源码
#include "stdio.h"
#include "cuda_runtime.h"
#include "cufft.h"
#include "device_launch_parameters.h"
#include "time.h"
#include "math.h"
#define LENGTH 1048576
int main()
{
cudaEvent_t startTime, endTime1,endTime2,endTime3;
cudaEventCreate(&startTime);
cudaEventCreate(&endTime1);
cudaEventCreate(&endTime2);
cudaEventCreate(&endTime3);
float Data[LENGTH] = {0};
cufftHandle plan;
cufftPlan1d(&plan,LENGTH,CUFFT_C2C,1);
cufftComplex *CompData=(cufftComplex*)malloc(LENGTH*sizeof(cufftComplex));
cufftComplex *d_fftData;
cudaMalloc((void**)&d_fftData,LENGTH*sizeof(cufftComplex));
int i;
for(i=1;i<LENGTH;i++)
{
Data[i] = sin((i)/100.0);
}
for(i=0;i<LENGTH;i++)
{
CompData[i].x=Data[i];
CompData[i].y=0;
}
cudaEventRecord(startTime);
cudaMemcpy(d_fftData,CompData,LENGTH*sizeof(cufftComplex),cudaMemcpyHostToDevice
);
cudaEventRecord(endTime1);
cufftExecC2C(plan,(cufftComplex*)d_fftData,
(cufftComplex*)d_fftData,CUFFT_FORWARD);
cudaEventRecord(endTime2);
cudaMemcpy(CompData,d_fftData,LENGTH*sizeof(cufftComplex),cudaMemcpyDeviceToHost
);
cudaEventRecord(endTime3);
cudaEventSynchronize(endTime1);
cudaEventSynchronize(endTime2);
cudaEventSynchronize(endTime3);
float t1,t2,t3,t4;
cudaEventElapsedTime(&t1, startTime, endTime1);
cudaEventElapsedTime(&t2, endTime1, endTime2);
cudaEventElapsedTime(&t3, endTime2, endTime3);
cudaEventElapsedTime(&t4, startTime, endTime3);
cufftDestroy(plan);
free(CompData);
cudaFree(d_fftData);
printf("FFT LENGTH : %d \n", LENGTH);
printf("CpuMem2GpuMem : %f ms \n", t1);
printf("FFT use time : %f ms \n", t2);
printf("GpuMem2CpuMem : %f ms \n", t3);
printf("Total time :%f ms \n", t4);
return 0;
}