我有一个很奇怪的问题。 我甚至不知道我是否可以向您提供所有需要回答我的问题的信息;万一缺少什么东西,请告诉我。性能比较MPI vs 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);
这颂歌都无所谓代码的含义是:我只是跑三为循环和evaulating的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对理解问题无关紧要。他们只是定义了数组的维度。
你编译优化?没有他们,这是一个毫无意义的比较;一个编译器可能会默认某种级别的优化,并优化大部分循环(因为结果未被使用,循环实际上可能会被更高的优化级别完全舍弃),另一个编译器可能会做所有的工作然后抛弃它。这不是一个[MCVE];我们不知道'gradient_D_loc'的定义在哪里,任何常量是什么,等等。 – ShadowRanger
我不知道你指的是什么。 实际上在整个代码中使用了该循环的结果。编辑: – Mobius88
我编辑:'gradient_D_loc'应该只是'gradient_D' – Mobius88