Jetson TK1上的FFT速度较慢?

时间:2015-02-25 16:10:10

标签: cuda cufft

我为合成孔径雷达图像处理编写了一个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。这里的数据是连续的而不是跨越的。他们的timetaken和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;
}

2 个答案:

答案 0 :(得分:0)

这可能是因为您正在使用LP(低功耗CPU)。

结帐this document以启用所有4个主要ARM内核(HP群集)以利用Hyper-Q。

我遇到了类似的问题。在激活主HP集群后,我获得了良好的性能(从3 GFLOPS(LP)到160 GFLOPS(HP))。

答案 1 :(得分:-1)

我的盲目猜测是,尽管TK1具有更现代的核心,但635M的144个内核专用的内存带宽明显高于Tegra。

此外,CUDA在经线/线程/网格尺寸上总是有点挑剔,因此完全可能的是,袖口算法针对Fermis的本地存储大小进行了优化,并且不能像以前一样工作和Keplers一起好。