性能比较MPI与OpenMP

时间:2017-03-17 21:59:27

标签: c++ performance time mpi openmp

我有一个非常奇怪的问题。 我甚至不知道我是否能为您提供回答我问题所需的所有信息;如果遗漏了什么,请告诉我。

我使用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对于理解问题无关紧要。它们只是定义数组的维度。

1 个答案:

答案 0 :(得分:0)

由于您没有提供有关环境的更多详细信息,因此我将尝试进行解释。首先,我们来点几点:

  • 你看似相同只是什么都不做,所以一个聪明的编译器完全有权优化你的计算循环并只是打印;
  • 您的OpenMP代码是使用vanilla icc编译的(C ++代码BTW的奇数选择),因此优化级别将是默认的-O2(减去额外的优化,看作不是线程安全的默认使用-qopenmp将禁用;
  • 您的MPI代码是使用普通mpicxx编译的,它将在内部调用icpc作为编译器。

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

所以这是我的猜测,你的mpicxx设置-O3优化选项,因此,编译器将优化MPI的循环,而你得到的默认-O2对于您的OpenMP代码不这样做。因此,在你的MPI代码的情况下,你的时间几乎没有什么,而你正在使用你的OpenMP执行实际的循环执行。

只是一个猜测,但这看起来很公平。一个好的测试是检查mpicxx -cxx=icpc -show会给你什么......

相关问题