0

我为合成孔径雷达图像处理编写了一个 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;
}
4

2 回答 2

0

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

查看此文档以启用所有 4 个主要 ARM 内核(HP 集群)以利用 Hyper-Q。

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

于 2015-03-25T10:22:21.400 回答
-1

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

此外,CUDA 对经纱/线程/网格大小总是有点挑剔,因此袖口算法完全有可能针对 Fermis 的本地存储大小进行了优化,并且不适用于 Kepler。

于 2015-02-25T16:19:23.397 回答