我为合成孔径雷达图像处理编写了一个 CUDA 程序。计算的重要部分涉及查找 FFT 和 iFFT,我使用了 cuFFT 库。我在 Jetson TK1 和具有 GT635M (Fermi) 的笔记本电脑上运行了我的 CUDA 代码,我发现它在 Jetson 上慢了三倍。这是因为 FFT 需要更多时间并且在 Jetson 上显示出较低的 GFLOPS/s。我编写的内核的 GFLOPS/s 性能在 Jetson 和 Fermi GT635M 中几乎相同。在 Jetson 上运行缓慢的是 FFT。
我观察到的其他分析器参数是:发布的控制流指令、纹理缓存事务、本地内存存储吞吐量(字节/秒)、每个请求的本地内存存储事务在 Jetson 上很高,而请求的全局负载吞吐量(字节/秒)和Fermi GT635M 的全局负载事务很高。
杰特森
GPU 时钟频率:852 Mhz
内存时钟速率:924 Mhz
费米GT635M
GPU 时钟频率:950 Mhz
内存时钟速率:900 Mhz
它们都具有几乎相同的时钟频率。那么为什么 FFT 在 Jetson 上花费更多时间并且显示较差的 GFLOPS/s 呢?
为了查看 FFT 的性能,我编写了一个简单的 CUDA 程序,它在大小为 2048 * 4912 的矩阵上执行一维 FFT。这里的数据是连续的,没有跨步。他们的耗时和 GFLOPS/s 是:
杰特森
3.251 GFLOPS/s 持续时间:1.393 秒
费米GT635M
47.1 GFLOPS/s 持续时间:0.211 秒
#include <stdio.h>
#include <cstdlib>
#include <cufft.h>
#include <stdlib.h>
#include <math.h>
#include "cuda_runtime_api.h"
#include "device_launch_parameters.h"
#include "cuda_profiler_api.h"
int main()
{
int numLines = 2048, nValid = 4912;
int iter1, iter2, index=0;
cufftComplex *devData, *hostData;
hostData = (cufftComplex*)malloc(sizeof(cufftComplex) * numLines * nValid);
for(iter1=0; iter1<2048; iter1++)
{
for(iter2=0; iter2<4912; iter2++)
{
index = iter1*4912 + iter2;
hostData[index].x = iter1+1;
hostData[index].y = iter2+1;
}
}
cudaMalloc((void**)&devData, sizeof(cufftComplex) * numLines * nValid);
cudaMemcpy(devData, hostData, sizeof(cufftComplex) * numLines * nValid, cudaMemcpyHostToDevice);
// ----------------------------
cufftHandle plan;
cufftPlan1d(&plan, 4912, CUFFT_C2C, 2048);
cufftExecC2C(plan, (cufftComplex *)devData, (cufftComplex *)devData, CUFFT_FORWARD);
cufftDestroy(plan);
// ----------------------------
cudaMemcpy(hostData, devData, sizeof(cufftComplex) * numLines * nValid, cudaMemcpyDeviceToHost);
for(iter1=0; iter1<5; iter1++)
{
for(iter2=0; iter2<5; iter2++)
{
index = iter1*4912 + iter2;
printf("%lf+i%lf \n",hostData[index].x, hostData[index].y);
}
printf("\n");
}
cudaDeviceReset();
return 0;
}