基于FFTW3.3.9的FFT标准测试

基于FFTW3.3.9的FFT标准测试

1 环境准备

1.1 确保g++可用

本次编译是基于 GNU C++ 环境的,因此务必确定g++编译器可用,使用如下命令验证:

g++ --version

出现类似如下输出则表明编译器可用:

基于FFTW3.3.9的FFT标准测试

1.2 下载 FFTW 3.3.9 源码包

到FFTW官网(http://www.fftw.org/download.html)下载活着直接使用命令下载:

wget http://www.fftw.org/fftw-3.3.9.tar.gz

1.3 解压缩 fftw-3.3.9 源码包

直接使用 Centos 下的解压缩命令即可:

tar -xvf fftw-3.3.9.tar.gz

解压缩后进入hpl-2.3目录

cd fftw-3.3.9
  • 注意:此目录为本文所有操作的主目录,若下文提到主目录,皆表示此处。

2 编译安装

./configure --enable-threads
make
sudo make install

3 准备代码以及编译

FFT测试的代码如下所示:

/*
 * @Author: Bo Cai
 * @Mail: caibo0520@qq.com
 * @Date: 2021-04-01 20:35:07
 * @LastEditors: Bo Cai
 * @LastEditTime: 2021-04-01 20:44:27
 */
#include <fftw3.h>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <vector>
using namespace std;

float my_fftw(int nthreads, int num) //数据量、并行进程数
{
    /*******************初始化********************/
    srand(520);  //设置随机数种子,确保每次数据一致
    double cost; //计算用时

    fftw_init_threads(); // 初始化FFTW线程
    fftw_complex *in, *out;

    in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * num); // 为FFTW输入输出数组分配空间
    out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * num);
    if ((in == NULL) || (out == NULL))
    {
        printf("错误:内存不足,请尝试降低数据量!\n");
        return -1;
    }
    else
    {
        printf("============正在生成数据===========\n");
        for (int i = 0; i < num; i++) //使用固定的随机数种子生成数据
        {
            in[i][0] = (double)rand() / (double)(RAND_MAX);
            in[i][1] = 0;
        }
        printf("============数据生成成功===========\n");

        clock_t start, end; //数据准备好了,开始计时
        time(&start);

        cout << "==============计算开始=============\n";
        fftw_plan p;
        fftw_plan_with_nthreads(nthreads);
        p = fftw_plan_dft_1d(num, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
        for (int i = 0; i < 2; i++) //循环计算100次
        {
            fftw_execute(p);
        }

        time(&end);
        cost = difftime(end, start);
        cout << "计算结束,总共用时: " << cost << " s" << endl;

        /*******************回收空间********************/
        fftw_destroy_plan(p);
        fftw_cleanup();
        if (in != NULL)
            fftw_free(in);
        if (out != NULL)
            fftw_free(out);
        fftw_cleanup_threads();
    }
    return cost;
}

int main()
{
    vector<float> time_history; //记录计算时间的列表
    int num = 1000000000;         //生成数据的个数
    int nthreads = 64;          //最大测试现场数
    cout << "进程:1" << endl;
    time_history.push_back(my_fftw(1, num));
    for (int i = 2; i <= nthreads; i += 2)//从一个线程开始测试,然后按照两个进程递增
    {
	cout << "进程:" << i << endl;
        time_history.push_back(my_fftw(i, num));
    }
    for (int i = 0; i < time_history.size(); i++)
    {
        cout << time_history[i] << endl;
    }
    return 0;
}

根据测试需求修改main函数中的numnthreads这两个变量。(标准测试要求num设置为1000000000nthreads设置为机器的逻辑核心数)。

然后执行如下命令编译它:

g++ [file_name] -o fftw_test.exe -lfftw3 -lfftw3_threads -lpthread
  • 注意:其中[file_name]为源程序保存后的文件名,请自己替换

4 运行测试

直接运行3中比编译好的程序(比如我编译时指定的文件名是fftw_test.exe):

./fftw_test.exe

基于FFTW3.3.9的FFT标准测试

注意:其中[file_name]为源程序保存后的文件名,请自己替换

上一篇:ITK:计算图像的逆FFT


下一篇:FFT x 字符串匹配