1. 程式人生 > >VS2013的MPI和OpenMP並行環境配置

VS2013的MPI和OpenMP並行環境配置

VS2013的MPI和OpenMP並行環境配置

linux下的ddd除錯MPI程式

  • 編譯時要使用-g選項生成除錯資訊;
  • 用形如ddd a.out開啟ddd除錯的GUI;
  • 在程式碼行上設定斷點(通過單擊將游標挪到對應程式碼行上,然後單擊的“Break”按鈕)。
  • display x 監視變數,Step按鈕前進,找到哪一行錯誤後,可以用kill殺死程序。

這裡提ddd除錯,是為了說明linux下的除錯工具是相當不好使,即使是帶GUI的ddd除錯,十分醜不說,用起來也十分費勁。對於稍微大一點的程式,或者錯誤稍微隱蔽一點的程式,Debu無疑是大海撈針。

如果不是以並行為專業方向或者工作的,不建議花費太多時間去在linux環境下利用GDB或者DDD除錯。不是吃這碗飯的,何必吃這個苦。

我們可以再win下使用我們慣用的Visual Studio,建立一個專案,配置好專案屬性,使之支援MPI和OpenMP,作為一個專門編輯和除錯並行程式的模板,以後要除錯並行程式碼,直接拷貝進來即可,等除錯好了,再拷貝出去儲存。VS不好的地方就是塊頭太大,有時候顯得笨重。

VS2013下MPI環境的配置

  • 下載安裝相關庫檔案:下載地址,找到MS-MPI vx.x.x (new!) ,下載,靜靜等待,傻瓜式安裝。
  • 新建一個空專案Visual C++ >> Win32 >>Win32控制檯應用程式>>隨意起個名>>在嚮導中選擇控制檯應用程式,附加選項選空專案>>完成
    。這個步驟沒有太高要求,你能建出一個專案就行。
  • 開啟新建的專案後,點選“除錯”->“屬性”,點選“配置屬性” -> “配置管理器”,在“活動解決方案平臺”下選擇“新建”“ARM”替換為“X64”,這樣就新建了一個新的專案平臺。
  • C/C++ ->前處理器->前處理器(下拉)-->編輯,新增:MPICH_SKIP_MPICXX。
  • C/C++ -> 程式碼生成 -> 執行庫,選擇:多執行緒除錯(/MTd)
  • 連結器 -> 輸入 -> 附加依賴項,新增:msmpi.lib
  • VC++目錄中:包含目錄中新增D:\Microsoft SDKs\MPI\Include
    庫目錄的裡面新增:D:\Microsoft SDKs\MPI\Lib\x64
  • 重啟VS。

現在,可以新建cpp檔案,編寫MPI程式,MPI程式的單機除錯同VS中C程式的除錯方式。下附一個MPI程式簡單模板:

#include <stdio.h>
#include "mpi.h"
#include <math.h>

int main(int argc, char *argv[]) {
	int myrank;
	int size;
	MPI_Status status;
	MPI_Init(0, 0);//這個得寫在MPI_Comm_rank和MPI_Comm_size前面
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);




//這裡編寫程式主體




	MPI_Finalize();
	return 0;
}

程式的執行:生成解決方案成功後,在xxx\template\X64\Debug 目錄下,代開CMD視窗,執行mpiexec -n 10 ./template.exe

OpenMP支援

在配置屬性下,選擇C/C++,找到語言,把OpenMPI支援開啟即可。
OpenMP程式執行:在程式末尾加上getchar(),保持dos視窗的停留,按F5執行即可。
這有一個簡單的程式示例:

#include <stdio.h>
#include <omp.h>

int main()
{
  int x;
  x = 7;
//#pragma omp parallel num_threads(4) shared(x)
#pragma omp parallel private(x)
  {
    // 定義私有變數y。
    int y;
    y = 3;
    if (omp_get_thread_num() == 0)
      {
        x = 5;
        y = 6;
      }
    else
      {
        x = omp_get_thread_num();
      }
    //sleep(4-x);
    fprintf(stderr, "Thread# %d: x = %d, y = %d\n", omp_get_thread_num(), x, y);
  } // end for pragma omp parallle
    fprintf(stderr, "x = %d\n", x);
}

Windows下,VS和Dev C++、Visual C++ 6.0相比,還是十分令人滿意的,除了塊頭大點,寫個小指令碼還要建個專案外,在很多方面,都是很有優勢的。所以,吃過6.0和dev的各種虧後,最後還是決定轉戰VS。