簡體   English   中英

性能比較MPI與OpenMP

[英]Performance comparison 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);

它對代碼的含義並不重要:我只是運行三個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代碼使用vanilla icc編譯(C ++代碼BTW的奇怪選擇),因此優化級別將是默認值-O2 (減去額外的優化,默認情況下看起來不是線程安全的,使用-qopenmp將禁用;
  • 你的MPI代碼是用一個普通的mpicxx編譯的,它會在內部調用icpc作為編譯器。

這是mpicxx我懷疑這里的關鍵是:的確, mpicxx是只是一個包裝,以實際的編譯器,這也將設置一些包括路徑,一些庫路徑和清單,還可以設置一些額外的優化選項。 例如,在某些情況下,安裝MPI庫時使用的優​​化選項將保存在mpicxx包裝器中,默認情況下在編譯代碼時默認使用...

所以這是我的猜測,你的mpicxx設置其他-O3優化選項,因此,編譯器將優化MPI的循環,而你的OpenMP代碼的默認-O2不會這樣做。 因此,在MPI代碼的情況下,你的計時幾乎沒有什么,而你正在使用OpenMP執行實際的循環執行計時。

只是一個猜測,但這似乎很公平。 一個好的測試是檢查mpicxx -cxx=icpc -show會給你什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM