एक तस्वीर कहते हैं और अधिक से अधिक हजार शब्दों, इसलिए यहाँ कई ASCII आर्ट तस्वीरें हैं:
rank send buf recv buf
---- -------- --------
0 a,b,c MPI_Allgather a,b,c,A,B,C,#,@,%
1 A,B,C ----------------> a,b,c,A,B,C,#,@,%
2 #,@,% a,b,c,A,B,C,#,@,%
यह केवल इस मामले सभी प्रक्रियाओं डेटा हिस्सा प्राप्त में बस नियमित MPI_Gather
है, आपरेशन यानी, जड़ कम है।
rank send buf recv buf
---- -------- --------
0 a,b,c MPI_Alltoall a,A,#
1 A,B,C ----------------> b,B,@
2 #,@,% c,C,%
(a more elaborate case with two elements per process)
rank send buf recv buf
---- -------- --------
0 a,b,c,d,e,f MPI_Alltoall a,b,A,B,#,@
1 A,B,C,D,E,F ----------------> c,d,C,D,%,$
2 #,@,%,$,&,* e,f,E,F,&,*
(बेहतर लग रहा है, तो प्रत्येक तत्व रैंक है कि यह भेजता है लेकिन ... द्वारा रंग है) संयुक्त MPI_Scatter
और MPI_Gather
रूप
MPI_Alltoall
काम करता है - प्रत्येक प्रक्रिया में भेजने बफर MPI_Scatter
में तरह विभाजित है और तो भाग के प्रत्येक कॉलम को संबंधित प्रक्रिया द्वारा एकत्र किया जाता है, जिसका रैंक खंड कॉलम की संख्या से मेल खाता है। MPI_Alltoall
को वैश्विक ट्रांसपोजिशन ऑपरेशन के रूप में भी देखा जा सकता है, जो डेटा के हिस्सों पर कार्य करता है।
क्या कोई ऐसा मामला है जब दो संचालन एक दूसरे के बदले में हो?ठीक से इस सवाल का जवाब करने के लिए, एक बस प्राप्त बफर में भेजने बफर में और डेटा के डेटा के आकार का विश्लेषण करने के होते हैं:
operation send buf size recv buf size
--------- ------------- -------------
MPI_Allgather sendcnt n_procs * sendcnt
MPI_Alltoall n_procs * sendcnt n_procs * sendcnt
प्राप्त बफर आकार वास्तव में n_procs * recvcnt
है, लेकिन एमपीआई जनादेश है कि संख्या भेजे गए मूलभूत तत्वों की संख्या मूलभूत तत्वों की संख्या के बराबर होनी चाहिए, इसलिए यदि एक ही एमपीआई डेटाटाइप का उपयोग MPI_All...
के हिस्सों को भेजने और प्राप्त करने में किया जाता है, तो recvcnt
sendcnt
के बराबर होना चाहिए।
यह तुरंत स्पष्ट है कि प्राप्त डेटा के उसी आकार के लिए, प्रत्येक प्रक्रिया द्वारा भेजे गए डेटा की मात्रा अलग है। दोनों परिचालनों के बराबर होने के लिए, एक आवश्यक शर्त यह है कि दोनों मामलों में भेजे गए बफर के आकार बराबर हैं, यानी n_procs * sendcnt == sendcnt
, जो केवल n_procs == 1
है, यानी यदि केवल एक प्रक्रिया है, या sendcnt == 0
, यानी कोई डेटा नहीं है बिल्कुल भेजा जा रहा है। इसलिए कोई व्यावहारिक रूप से व्यवहार्य मामला नहीं है जहां दोनों परिचालन वास्तव में अंतर-परिवर्तनीय हैं। लेकिन कोई MPI_Allgather
MPI_Alltoall
के साथ n_procs
दोहराए गए बफर में समान डेटा (जैसा कि पहले से ही टायलर गिल द्वारा नोट किया गया है) को दोहरा कर अनुकरण कर सकता है।
rank send buf recv buf
---- -------- --------
0 a MPI_Allgather a,A,#
1 A ----------------> a,A,#
2 # a,A,#
और यहाँ एक ही MPI_Alltoall
के साथ लागू किया:
rank send buf recv buf
---- -------- --------
0 a,a,a MPI_Alltoall a,A,#
1 A,A,A ----------------> a,A,#
2 #,#,# a,A,#
रिवर्स है संभव नहीं - एक MPI_Allgather
साथ MPI_Alltoall
की कार्रवाई नहीं दिखाई जा सकतीं यहाँ एक तत्व भेज बफ़र्स साथ MPI_Allgather
की कार्रवाई है सामान्य मामले में।
MPI_Allgatherv

MPI_Alltoallv

इस एक कंपनियों हालांकि:
क्या आपने इस प्रश्न पूछने से पहले एमपीआई मानक पढ़ा था? यह बहुत स्पष्ट स्पष्टीकरण देता है और यहां तक कि कई सामूहिक सामग्रियों के ग्राफिकल प्रतिनिधित्व भी करता है। – Jeff