在高性能计算领域,快速傅里叶变换(FFT)是处理信号和图像等数据的关键工具。为了充分利用多核处理器的计算能力,结合使用FFTWOpenMP提升FFT性能。本文将通过一个简单的C++示例,介绍如何使用FFTW与OpenMP进行多线程FFT规划和执行。

一、代码结构

  1. 定义FFT计划结构体:存储每个线程的输入、输出数组和FFT计划。
  2. 初始化FFT计划:为每个线程创建独立的FFT计划。
  3. 销毁FFT计划:释放资源,销毁FFT计划。
  4. 并行执行FFT:在多线程环境下并行执行FFT任务。
  5. 进一步优化:利用OpenMP的高级特性提升性能。

.h中:

1.1定义FFT计划结构体
typedef struct plan_thread{
fftw_complex*input;
fftw_complex*output;
fftw_plan plan;
}planThreads;

static planThreads*init_omp_fft(int N);

static void row_fft_1d_thread(Array2D<_complex>* array_in, Array2D<_complex>* array_out, int N, int row,planThreads* m_vecPlan);

static void free_fft_destroy(planThreads* m_vecPlan);

.cpp中:

1.2初始化FFT计划
tool::planThreads *tool::init_omp_fft(int N)
{
    int thread_num = omp_get_max_threads();//获取最大线程
    if(!fftw_init_threads())
    {
        perror("init threads fail\n");
    }

    planThreads *m_vecPlan;
    fftw_plan_with_nthreads(thread_num);//设置线程数
    m_vecPlan = new planThreads[thread_num];

    for(int i = 0; i<thread_num;i++)
        {
            m_vecPlan[i].input = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*N);
            m_vecPlan[i].output = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*N);
            m_vecPlan[i].plan = fftw_plan_dft_1d(N,m_vecPlan[i].input,m_vecPlan[i].output,FFTW_FORWARD,FFTW_ESTIMATE);
        }
    return  m_vecPlan;
}
1.3销毁FFT计划
void tool::free_fft_destroy(tool::planThreads *m_vecPlan)
{
    for (int i = 0; i < omp_get_max_threads(); i++) {
        fftw_free(m_vecPlan[i].input);
        fftw_free(m_vecPlan[i].output);
        fftw_destroy_plan(m_vecPlan[i].plan);
    }
}
1.4并行执行FFT
tool::planThreads* row_fft_plan = tool::init_omp_fft(Na);
#pragma omp parallel for
for(int j = 0; j < Nr; j++) {
    tool::row_fft_1d_thread(echo, Srd_temp, Na, j,row_fft_plan);
}
1.5进一步优化

调整循环的调度策略 下面使用的是静态调度( 将循环均匀分配给线程 ) :

#pragma omp parallel for schedule(static) private(fac, D_f_ref, D_f, km_yin, Km, tau2, eexp)

使用collapse子句将多个循环合并为一个并行循环,以提高并行度

#pragma omp parallel for collapse(2)

上面两个一起使用:

#pragma omp parallel for collapse(2) schedule(static) private(D_f, eexp1)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐