我目前正在解决一个问题,需要使用FFTW与MPI相结合计算二维矩阵的傅里叶变换。
根据FFTW文档中的第一部分,在并行计算矩阵的傅里叶变换时,需要在启动的进程之间进行大量通信。例如,对于像下面这样的矩阵:
1,2,3
4,5,6
7,8,9
我们决定使用三个进程计算FFT,每个进程获取该矩阵的一部分,以便数据存储在每个进程的本地内存中,如P_0 [1,2,3],P_1 [4,5,6],P_3 [7,8,9]
。
计算初始傅里叶变换后,需要进行转置,这需要在三个进程之间通信计算出的数据,如下所示:
P_0 -> P_1: 2
P_0 -> P_2: 3
P_1 -> P_0: 4
P_1 -> P_2: 6
P_2 -> P_0: 7
P_2 -> P_1: 8
由于这会产生很大的开销,因此上述FFTW文档页面的第二部分建议直接在傅里叶空间中计算转置,以大幅减少所需的跨进程通信量。
我仍然不确定为什么首先需要计算转置,并且不同块矩阵计算出的数据如何合并。为什么设置FFTW_MPI_TRANSPOSED_OUT
和FFTW_MPI_TRANSPOSED_IN
标志就足以不再需要来自其他进程的大量数据进行跨进程通信了?