簡體   English   中英

MPI:鎖定標准輸出——一次1個進程?

[英]MPI: Locking the stdout — 1 process at a time?

我想打印出每個進程的 integer 數組的內容。 問題是,由於比賽條件,一切都很混亂。

什么是最簡單的解決方案? 我不想調試。 我想顯示內容,因為我正在做排序算法。 所以在排序前后顯示是很有用的。

我在 lock.c 中添加了這個:

#include <stdio.h>
static int lock=0;   //Don't use if timing execution
void capture(int rank) {
    while(lock!=0);
    lock = 1;
    printf("\nCaptured by %d\n", rank);
}
void release() {
    lock = 0;
}

並在打印之前調用 capture(),然后在打印后調用 release()。 是的,這是一個類似信號量的 hack。 但它不起作用,有什么想法嗎?

假設您使用的是收集所有進程的 STDOUT 的 MPI,您可以使用 MPI_Barrier() 來強制執行排序,如下所示:

for( int i = 0; i < size; ++i ) {
    MPI_Barrier( MPI_COMM_WORLD );
    if ( i == rank ) {
         printf( "..." );
    }
 }

當然,這是低效的,但它可能比安排將所有信息發送回 0 級要簡單一些。

假設您指的是消息傳遞接口,最好的方法是將 output 字符串寫入緩沖區並將它們發送到 rank 0 進程。 此過程不應用於執行實際工作,而應僅用於過濾和輸出 output 字符串。

讓其他隊伍去做真正的工作。 我認為您的上述解決方案不會起作用,因為我是每個級別的本地人。

您也不想使用消息傳遞來阻止各個等級(直到他們可以輸出),因為他們將無法同時進行排序工作。

只需讓 1 到 N 的每個等級都起作用並將字符串發送到等級 0。字符串可以是"NNN:SSSSSS"形式,其中 N 是等級,S 是字符串。 然后 Rank 0 可以過濾掉特定消息或將不同的消息寫入不同的文件,然后在所有工作 rank 關閉后將它們組合(排序)。

每個進程都有自己的變量副本。 所以它不是共享的,你不能用它來同步。

暫無
暫無

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

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