VS2013的MPI和OpenMP並行環境配置
阿新 • • 發佈:2018-10-31
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。