基于FFTW3.3.9的FFT标准测试
1 环境准备
1.1 确保g++可用
本次编译是基于 GNU C++ 环境的,因此务必确定g++编译器可用,使用如下命令验证:
g++ --version
出现类似如下输出则表明编译器可用:
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
函数中的num
和nthreads
这两个变量。(标准测试要求num
设置为1000000000
,nthreads
设置为机器的逻辑核心数)。
然后执行如下命令编译它:
g++ [file_name] -o fftw_test.exe -lfftw3 -lfftw3_threads -lpthread
- 注意:其中[file_name]为源程序保存后的文件名,请自己替换
4 运行测试
直接运行3
中比编译好的程序(比如我编译时指定的文件名是fftw_test.exe
):
./fftw_test.exe
注意:其中[file_name]为源程序保存后的文件名,请自己替换