खोज…
टिप्पणियों
सामूहिक संचालन एक एकल ऑपरेशन में एक संचारक द्वारा बताई गई प्रक्रियाओं को इंगित करने और उनके बीच एक सिंक्रनाइज़ेशन करने के लिए एमपीआई कॉल डिज़ाइन किए गए हैं। इनका उपयोग अक्सर अन्य प्रक्रियाओं द्वारा योगदान किए गए डेटा के आधार पर या अन्य सभी प्रक्रियाओं से डेटा को वितरित करने या एकत्र करने के लिए किया जाता है।
ध्यान दें कि संचारक की सभी प्रक्रियाएँ समान सामूहिक कार्यों को क्रम में करना चाहिए, अन्यथा अनुप्रयोग अवरुद्ध हो जाएगा।
प्रसारण
निम्न कोड MPI_COMM_WORLD
संचारक से संबंधित सभी प्रक्रियाओं के बीच buffer
में सामग्री को प्रसारित करता है (अर्थात समानांतर में चलने वाली सभी प्रक्रियाएं) MPI_Bcast
ऑपरेशन का उपयोग करके।
int rank;
int res;
res = MPI_Comm_rank (MPI_COMM_WORLD, &rank);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Comm_rank failed\n");
exit (0);
}
int buffer[100];
if (rank == 0)
{
// Process with rank id 0 should fill the buffer structure
// with the data it wants to share.
}
res = MPI_Bcast (buffer, 100, MPI_INT, 0, MPI_COMM_WORLD);
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Bcast failed\n");
exit (0);
}
बैरियर
MPI_Barrier
ऑपरेशन दिए गए संचारक से संबंधित प्रक्रियाओं के बीच एक सिंक्रनाइज़ेशन करता है। यही है, किसी दिए गए संचारक से सभी प्रक्रियाएं MPI_Barrier
भीतर तब तक प्रतीक्षा MPI_Barrier
जब तक कि वे सभी अंदर नहीं हो जाती हैं, और उस बिंदु पर, वे ऑपरेशन को छोड़ देंगे।
int res;
res = MPI_Barrier (MPI_COMM_WORLD); /* all processes will wait */
if (res != MPI_SUCCESS)
{
fprintf (stderr, "MPI_Barrier failed\n");
exit (0);
}
स्कैटर
मूल प्रक्रिया MPI_Scatter
ऑपरेशन का उपयोग करके सभी प्रक्रियाओं को (सभी स्वयं सहित) sendbuf
में सामग्री को sendbuf
MPI_Scatter
है।
int rank;
int size;
int sendcount = 1;
int recvcount = sendcount;
int sendbuf[3];
int recvbuf;
int root = 0;
MPI_Comm_size (MPI_COMM_WORLD, &size);
if (size != 3)
{
fprintf (stderr, "Number of processes must be 3\n");
exit (0);
}
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
if (rank == 0)
{
sendbuf[0] = 3;
sendbuf[1] = 5;
sendbuf[2] = 7;
}
MPI_Scatter (sendbuf, sendcount, MPI_INT, &recvbuf, recvcount, MPI_INT, root, MPI_COMM_WORLD);
printf ("rank: %i, value: %i\n", rank, recvbuf);
/* Output:
* rank: 0, value: 3
* rank: 1, value: 5
* rank: 2, value: 7
*/