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
सभी फाइलों के लिए, "बैरियर के बाद" बयान होगा हमेशा बाद में दिखाई देते हैं।
टाइमस्टैम्प पर निर्भर होना आदर्श नहीं हो सकता है यदि एमपीआई प्रक्रिया विभिन्न नोड्स पर चल रही हो, जब तक आप गारंटी नहीं दे सकते कि घड़ियों को सिंक किया गया है। –
@Shawn: इसके लिए MPI_Wtime() है। – suszterpatt
@suszterpatt: 'MPI_Wtime()' आमतौर पर वैश्विक/सिंक्रनाइज़ घड़ी नहीं है! (यह केवल तभी होता है जब 'एमपीआई_WTIME_IS_GLOBAL' परिभाषित और सत्य है) – Zulan