2011-03-03 14 views
7

मैं MPI_Barrier की openmpi कार्यान्वयन का उपयोग कुछ तुल्यकालन मुद्दों कर:openmpi MPI_Barrier समस्याओं

int rank; 
int nprocs; 

int rc = MPI_Init(&argc, &argv); 

if(rc != MPI_SUCCESS) { 
    fprintf(stderr, "Unable to set up MPI"); 
    MPI_Abort(MPI_COMM_WORLD, rc); 
} 

MPI_Comm_size(MPI_COMM_WORLD, &nprocs); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 


printf("P%d\n", rank); 
fflush(stdout); 

MPI_Barrier(MPI_COMM_WORLD); 

printf("P%d again\n", rank); 

MPI_Finalize(); 

mpirun के लिए -n 2 ./a.out

उत्पादन किया जाना चाहिए: P0 P1 .. ।

उत्पादन कभी कभी है: P0 P0 फिर P1 पी 1 फिर से

क्या चल रहा है?

उत्तर

13

जिस क्रम में आपकी प्रिंट आउट लाइनें आपके टर्मिनल पर दिखाई देती हैं वह जरूरी नहीं है जिसमें चीजें मुद्रित हों। आप इसके लिए एक साझा संसाधन (stdout) का उपयोग कर रहे हैं, इसलिए हमेशा एक ऑर्डरिंग समस्या होनी चाहिए। (और fflush यहां मदद नहीं करता है, stdout किसी भी तरह से लाइन buffered है।)

आप अपने आउटपुट को टाइमस्टैम्प के साथ उपसर्ग करने का प्रयास कर सकते हैं और यह सब अलग-अलग फ़ाइलों में से एक को प्रति एमपीआई प्रक्रिया में सहेज सकते हैं।

फिर अपने लॉग का निरीक्षण करने के लिए आप दो फाइलों को एक साथ विलय कर सकते हैं और टाइमस्टैम्प के अनुसार क्रमबद्ध कर सकते हैं।

आपकी समस्या गायब होनी चाहिए, फिर।

+1

टाइमस्टैम्प पर निर्भर होना आदर्श नहीं हो सकता है यदि एमपीआई प्रक्रिया विभिन्न नोड्स पर चल रही हो, जब तक आप गारंटी नहीं दे सकते कि घड़ियों को सिंक किया गया है। –

+1

@Shawn: इसके लिए MPI_Wtime() है। – suszterpatt

+3

@suszterpatt: 'MPI_Wtime()' आमतौर पर वैश्विक/सिंक्रनाइज़ घड़ी नहीं है! (यह केवल तभी होता है जब 'एमपीआई_WTIME_IS_GLOBAL' परिभाषित और सत्य है) – Zulan

10

MPI_Barrier() के साथ कुछ भी गलत नहीं है।

Jens mentioned के रूप में, आप जिस आउटपुट को अपेक्षित आउटपुट नहीं देख रहे हैं, वह कारण है क्योंकि प्रत्येक प्रक्रिया पर stdout buffered है। इस बात की कोई गारंटी नहीं है कि कई प्रक्रियाओं से प्रिंट क्रम में कॉलिंग प्रक्रिया पर प्रदर्शित किए जाएंगे। (यदि प्रत्येक प्रक्रिया से स्टडआउट वास्तविक समय में प्रिंटिंग के लिए मुख्य प्रक्रिया में स्थानांतरित किया जाता है, तो इससे बहुत अनावश्यक संचार हो जाएगा!)

यदि आप स्वयं को यह समझाना चाहते हैं कि अवरोध काम करता है, तो आप एक को लिखने का प्रयास कर सकते हैं इसके बजाए फ़ाइल करें। एक फ़ाइल में कई प्रक्रियाओं को लिखने से अतिरिक्त जटिलताओं का कारण बन सकता है, इसलिए आप प्रत्येक प्रो को एक फ़ाइल में लिख सकते हैं, फिर बाधा के बाद, उन फ़ाइलों को स्वैप करें जिन्हें वे लिखते हैं। उदाहरण के लिए:

Proc-0   Proc-1 
     |     | 
f0.write(..)  f1.write(...) 
     |     | 
     x ~~ barrier ~~ x 
     |     | 
f1.write(..)  f0.write(...) 
     |     | 
    END    END 

नमूना कार्यान्वयन:

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

int main(int argc, char **argv) { 
    char filename[20]; 
    int rank, size; 
    FILE *fp; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    if (rank < 2) { /* proc 0 and 1 only */ 
     sprintf(filename, "file_%d.out", rank); 
     fp = fopen(filename, "w"); 
     fprintf(fp, "P%d: before Barrier\n", rank); 
     fclose(fp); 
    } 

    MPI_Barrier(MPI_COMM_WORLD); 

    if (rank < 2) { /* proc 0 and 1 only */ 
     sprintf(filename, "file_%d.out", (rank==0)?1:0); 
     fp = fopen(filename, "a"); 
     fprintf(fp, "P%d: after Barrier\n", rank); 
     fclose(fp); 
    } 

    MPI_Finalize(); 
    return 0; 

} 

कोड चलाने के बाद, आप निम्नलिखित परिणाम प्राप्त करना चाहिए:

[[email protected]]$ cat file_0.out 
P0: before Barrier 
P1: after Barrier 

[[email protected]]$ cat file_1.out 
P1: before Barrier 
P0: after Barrier 

सभी फाइलों के लिए, "बैरियर के बाद" बयान होगा हमेशा बाद में दिखाई देते हैं।

+0

उत्कृष्ट स्पष्टीकरण ... :) – RoboAlex

3

एमपीआई कार्यक्रमों में आउटपुट ऑर्डरिंग की गारंटी नहीं है।

यह MPI_Barrier से बिल्कुल संबंधित नहीं है।

इसके अलावा, मैं एमपीआई कार्यक्रमों के साथ आउटपुट ऑर्डरिंग के बारे में चिंता करने पर बहुत अधिक समय नहीं लगाऊंगा।

यदि आप वास्तव में करना चाहते हैं, तो इसे प्राप्त करने का सबसे शानदार तरीका प्रक्रियाओं को अपने संदेशों को एक रैंक पर भेजना है, कहें, रैंक 0, और रैंक 0 को आउटपुट प्रिंट करने के क्रम में प्रिंट करने दें रैंक द्वारा

फिर से, एमपीआई कार्यक्रमों से आउटपुट ऑर्डर करने का प्रयास करने में बहुत अधिक समय नहीं लगाएं। यह व्यावहारिक नहीं है और इसका बहुत कम उपयोग है।

संबंधित मुद्दे