gpt4 book ai didi

c - 使用多线程 FFTW 时执行时间增加

转载 作者:太空宇宙 更新时间:2023-11-04 04:21:58 33 4
gpt4 key购买 nike

我是 FFTW 图书馆的新手。我已经使用 FFTW 库成功实现了 1D 和 2D fft。我将 2D fft 代码转换为多线程 2D fft。但结果却截然相反。多线程 2D FFT 代码比序列化 2D FFT 代码需要更长的运行时间。我在某处遗漏了一些东西。我遵循了 FFTW documentation 中给出的所有说明。并行化代码。

这是我的并行二维 FFT C 程序

#include <mpi.h>
#include <fftw3.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define N 2000
#define M 2000
#define index(i, j) (j + i*M)

int i, j;

void get_input(fftw_complex *in) {
for(i=0;i<N;i++){
for(j=0;j<M;j++){
in[index(i, j)][0] = sin(i + j);
in[index(i, j)][1] = sin(i * j);
}
}
}

void show_out(fftw_complex *out){
for(i=0;i<N;i++){
for(j=0;j<M;j++){
printf("%lf %lf \n", out[index(i, j)][0], out[index(i, j)][1]);
}
}
}

int main(){
clock_t start, end;
double time_taken;
start = clock();

int a = fftw_init_threads();
printf("%d\n", a);
fftw_complex *in, *out;
fftw_plan p;

in = (fftw_complex *)fftw_malloc(N * M * sizeof(fftw_complex));
out = (fftw_complex *)fftw_malloc(N * M * sizeof(fftw_complex));
get_input(in);

fftw_plan_with_nthreads(4);
p = fftw_plan_dft_2d(N, M, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

fftw_execute(p);

/*p = fftw_plan_dft_1d(N, out, out, FFTW_BACKWARD, FFTW_ESTIMATE);
fftw_execute(p);
puts("In Real Domain");
show_out(out);*/

fftw_destroy_plan(p);

fftw_free(in);
fftw_free(out);
fftw_cleanup_threads();

end = clock();
time_taken = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("%g \n", time_taken);

return 0;
}

有人可以帮我指出我在做什么的错误吗?

最佳答案

这种行为是错误绑定(bind)的典型表现。

一般来说,OpenMP 线程都应该绑定(bind)到同一个套接字的核心,以避免 NUMA 效应(这会使性能不理想甚至最差)。

另外,确保正确绑定(bind) MPI 任务(一个任务应绑定(bind)到来自相同套接字的多个内核,并且每个内核应使用一个 OpenMP 线程)。

由于 MPI,您的 OpenMP 线程最终可能会进行时间共享。

首先,我建议您开始同时打印 MPI 和 OpenMP 绑定(bind)。

如何实现取决于 MPI 库和 OpenMP 运行时。如果您使用 Open MPI 和 Intel 编译器,您可以KMP_AFFINITY=verbose mpirun --report-bindings --tag-output ...

然后,如前所述,我建议您从简单开始并增加复杂性

  1. 1 个 MPI 任务和 1 个 OpenMP 线程
  2. 1 个 MPI 任务和 x 个 OpenMP 线程(x 是一个插槽上的内核数)
  3. x MPI 任务和每个任务 1 个 OpenMP 线程
  4. x 个 MPI 任务和每个任务 y 个 OpenMP 线程

希望 2. 比 1. 快,4. 比 3. 快

关于c - 使用多线程 FFTW 时执行时间增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45966027/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com