gpt4 book ai didi

c++ - MPI 与 OpenMP 的性能比较

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:54 25 4
gpt4 key购买 nike

我有一个很奇怪的问题。我什至不知道我是否可以为您提供回答我的问题所需的所有信息;如果有任何遗漏,请告诉我。

我使用 MPI 运行这样的代码:

#include <mpi.h>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <algorithm>
#include "mkl.h"
double *gradient_D = new double[K*M];
double *DX = new double[M*N];
double gradientD_time = MPI_Wtime();
for (int j = 0; j < K; j++){
for (int i = 0; i < M; i++){
gradient_D[j*M+i] = 0;
for (int k = 0; k < n; k++)
gradient_D[i+M*j] += DX[i+k*M];
}
}
double gradientD_total_time = (MPI_Wtime() - gradientD_time);
printf("Gradient D total = %f \n", gradientD_total_time);

代码的含义并不重要:我只是运行三个 for 循环并评估 CPU 时间。在 cmake 中我写了以下命令:

project(mpi_algo)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_COMPILER "mpicxx")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)
set(CMAKE_CXX_FLAGS "-cxx=icpc -mkl=sequential")
add_executable(mpi_algo main.cpp)

然后我运行代码:

mpirun -np 1 ./mpi_algo

之后,我运行了一个类似的代码,在其中执行相同的操作,但使用的是 OpenMP 而不是 MPI:

#include <omp.h>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <cstdlib>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <algorithm>
#include "mkl.h"
double *gradient_D = new double[K*M];
double *DX = new double[M*N];
double gradientD_time = omp_get_wtime();
for (int j = 0; j < K; j++){
for (int i = 0; i < M; i++){
gradient_D[j*M+i] = 0;
for (int k = 0; k < n; k++)
gradient_D[i+M*j] += DX[i+k*M];
}
}
double gradientD_total_time = (omp_get_wtime() - gradientD_time);
printf("Gradient D total = %f \n", gradientD_total_time);

您可以看到代码中存在细微差别。这是 cmake:

project(openmp_algo)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_COMPILER "icc")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)
set(CMAKE_CXX_FLAGS "-qopenmp -mkl=sequential")
add_executable(openmp_algo main.cpp)

然后我运行代码:

./openmp_algo

现在,我无法解释的是,带有 MPI 的代码运行大约需要 1 秒。另一个应该是一样的,大约需要 20 秒。

有人能解释一下原因吗?

编辑:常量 M、N、n、k 对于理解问题无关紧要。它们只是定义数组的维度。

最佳答案

由于您没有提供太多有关环境的详细信息,我将进行大胆的猜测以尝试给出解释。首先,让我们做几点说明:

  • 您看似完全相同但什么都不做,因此聪明的编译器完全有权优化您的计算循环并只进行打印;
  • 您的 OpenMP 代码是使用原始 icc 编译的(C++ 代码的奇怪选择 BTW)因此哪个优化级别将是默认值 -O2 (减去默认情况下被视为非线程安全的额外优化,使用 -qopenmp 将禁用;
  • 您的 MPI 代码是使用普通 mpicxx 编译的这将在内部调用 icpc作为编译器。

这是 mpicxx我怀疑这是这里的关键:确实,mpicxx只是实际编译器的包装器,它还将设置一些包含路径、一些库路径和列表,但也可能设置一些额外的优化选项。例如,在某些情况下,安装 MPI 库时使用的优​​化选项将保存在 mpicxx 中。包装器并在编译代码时默认静默使用...

所以这是我的猜测,你的 mpicxx其中包括 -O3优化选项,因此,编译器将为 MPI 优化循环,而默认 -O2你得到的 OpenMP 代码并没有做到这一点。因此,对于 MPI 代码,您几乎不计时,而您使用 OpenMP 代码计时实际循环执行。

只是一个猜测,但这似乎很合理。一个好的测试是检查 mpicxx -cxx=icpc -show 是什么会给你...

关于c++ - MPI 与 OpenMP 的性能比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867729/

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