2017-03-22 32 views
0

這可能是一個愚蠢的問題,無論如何,我正在處理一個令人尷尬的並行問題。我可以將工作分成可以並行執行的獨立任務(無通信)。使用Open MPI和OpenMP進行並行處理

在外殼script.sh可以使用以下命令:

#!/bin/bash 
let MY_ID=${OMPI_COMM_WORLD_RANK} 
./a.out $MY_ID 

prog.c我們有一個簡單獨立的程序:

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char *argv[]){ 
    int myid = atoi(argv[1]); 
    if(myid%2==0) 
    printf("\nI am %d and I am an even process\n", myid); 
    else 
    printf("\nI am %d and I am an odd process\n", myid); 
    return 0; 
} 

最後,用12級不同的處理器來執行程序:

mpirun -np 12 script.sh 

我的問題是,它是possi可以使用OpenMP和可能的環境變量來做同樣的事情,比如OMP_NUM_THREADS

回答

1

沒有OpenMP環境變量,如果按照您指示的方式傳遞給程序,則會爲每次調用程序賦予不同的值。如果您考慮OpenMP的工作原理,您可能會認爲這並沒有什麼意義 - 因爲OpenMP程序是作爲線程集合實現的。這與MPI的操作模型形成鮮明對比,其中每個過程都是一個單獨的過程,並輔以一個用於進程間通信的庫 - 在這種情況下,每個過程都有唯一的標識符以便於通信是有意義的。當OpenMP程序執行線程之間的通信時,會受到對共享內存位置的操作的影響,而不會將消息傳遞到指定的線程。

順便說一下,你並不是真的在編寫MPI程序,只是使用它的環境提供的一種工具來讓你的shell腳本寫得更容易一些。您幾乎可以輕鬆編寫一個shell腳本,在不使用MPI環境的情況下爲每個程序調用發送一個不同的ID - 您也可以爲OpenMP程序的調用執行相同的操作。雖然如果你的程序真的是獨立的,你爲什麼要這樣做,我不知道。

+0

「你可以幾乎隨便寫一個shell -script在不使用MPI環境的情況下向程序的每個調用發送一個不同的id - 並且您可以做同樣的事情OpenMP程序的調用「,是我發佈的想法,你有嗎? – Abolfazl

+0

不,我不明白你爲什麼'使用'MPI或OpenMP。對於一個令人尷尬的並行問題,其中每個「任務」完全獨立於任何其他任務,既不需要,也在代碼構建中施加不必要的複雜性。 OpenMP可能會帶來不必要的運行時間開銷。 –

+0

也許我不能解釋清楚,一個bash腳本可以運行一個程序,並通過遞歸循環更改每次運行的參數,但遞歸意味着您可以使用一個核心,而其他核心處於空閒狀態。我使用MPI或OpenMP來實現例如4個遞歸循環,並且在每個循環和每個核心中都有一個獨立的任務正在運行。 – Abolfazl

-1

太長時間才能發表評論。實際上,這種並行處理對集成建模非常有用。當您的程序運行不同的初始條件時,並且每次運行都會創建不同的文件夾或輸出文件。

我想出了這個:

export OMP_NUM_THREADS=4 
g++ prog.cpp -fopenmp 
./a.out 

prog.cpp我們:

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

using std::string; 

int main(){ 
    int nthreads, tid; 
    string cmd; 

    #pragma omp parallel private(tid) 
    {  
     tid = omp_get_thread_num(); 
     cmd = "echo 'this is a test. I am thread :' " + std::to_string(tid) ; 
     system(cmd.c_str()); //each thread can creat a folder and run a script 
     // system("./my_script.sh"); 
    } 

    return 0; 
} 

與輸出如下:

this is a test. I am thread : 0 
this is a test. I am thread : 3 
this is a test. I am thread : 2 
this is a test. I am thread : 1 
+0

'cmd'在你的例子中被共享,所以你有一個巨大的競爭條件。 – Zulan

+0

@Zulan:大拇指。 – Abolfazl