2012-04-18 67 views
0

我學習了一下MPI的,並決定作出的程序來調用對象,例如main.c做測試 - >主程序,function.c - >任何功能MPI 2倍打印

function.c即會只使用MPI。我編譯如下:

gcc-c main.c 

創建main.ompicc-c創造function.cfunction.o,我當然創建文件function.h了。

我編譯mpicc-o程序main.ofunction.o

這裏是main.c

#include <stdio.h> 
#include "function.h" 

void main(int argc, char *argv[]) 
{ 
    printf("Hello\n"); 
    function(); 
    printf("Bye\n"); 
} 

只是函數具有MPI代碼,但是當我運行程序mpiexe -np 2我得到

Hello 
Hello 
----- function job here ----- 
Bye 
Bye 

但我希望它是

Hello 
------ function job ----- 
Bye 

我該怎麼辦?

回答

1

你的整個程序上都與你的-np 2設定的兩個處理器上運行。防止打印輸出,最終結果等重複的常見方法是讓一個線程先完成線程ID檢查。像:

int id; 
MPI_Comm_rank(MPI_COMM_WORLD, &id); 
if (id == 0) { 
    printf("only process %d does this one\n", id); 
} 

printf("hello from process %d\n", id); // all processes do this one 

當在MPI中開始時,我發現打印出這些ID號以及每個線程正在處理的任何部分結果或數據是有幫助的。幫助我更好地理解正在發生的事情。

+0

所以,在每一個程序,我必須使用MPI_Comm_rank和只有1個等級的打印,但我需要調用MPI_INIT在每次常規嗎? – 2012-04-18 23:24:44

+0

你不需要在外部函數中調用MPI_Init - 只需在你的'main' – 2012-04-19 00:20:10

0

基本上mpirun -np 2開始2個相同的進程,你必須使用MPI_Comm_rank函數來檢查進程的等級。

這裏是一個快速片段:

int main(int argc, char **argv) 
{ 
    int myrank; 
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    if (myrank == 0) { 
    printf("Hello\n"); 
    function(); 
    MPI_Barrier(MPI_COMM_WORLD); 
    printf("Done\n"); 
    } else { 
    function(); 
    MPI_Barrier(MPI_COMM_WORLD); 
    } 
    MPI_Finalize(); 
    return 0; 
} 
0

我通常更喜歡這種方法打印數據。 它涉及到障礙。所以你在使用時一定要小心。

if(1) 
do 
    for(i = 0 to num_threads) 
    do 
    if(i==my_rank) 
    do 
     do_printf 
    done 

     ******* barrier ******** 
    end for 
done 

如果打印該值的線程集不包含所有線程,只需將相關線程添加到屏障即可。

另一種方法是讓每個線程將其輸出寫入專用文件。通過這種方式:

  1. 你沒有訪問任何屏障螺紋
  2. 你輸出是明確的
  3. 你不會失去printfs輸出。所以在調試程序時不會出現混亂。

代碼:

sprintf(my_op_file_str, "output%d", myThreadID); 
close(1) 
open(my_op_file_str) 

Now use printf's anywhere you may like.