दिलचस्प पोस्ट
"अस्थिर" कीवर्ड किस प्रकार इस्तेमाल किया जाता है? संकेतक का उपयोग क्यों करें? जावास्क्रिप्ट: सर्वश्रेष्ठ सिंगलटन पैटर्न IOS में एकाधिक स्टोरीबोर्ड का उपयोग करना प्रत्येक समूह में अधिकतम मूल्य के साथ पंक्तियों का चयन कैसे करें? क्या std :: नक्शा ज्ञात (और मानक द्वारा गारंटीकृत) के माध्यम से पुनरावृत्त करने का क्रम है? React.js: सामग्री के लिए चालू घटना बदलेंअनुमति NSString ऑब्जेक्ट की अधिकतम लंबाई क्या है? एंड्रॉइड एन को आईडीई को जावा 1.8 या उसके बाद के साथ चलना चाहिए? आर में स्ट्रिंग में अंतिम शब्द निकालें विभिन्न उत्पाद स्वादों के लिए विभिन्न निर्भरता को परिभाषित करने के तरीके वाक्य में स्प्लिट स्ट्रिंग क्लिक करें घटना गतिशील उत्पन्न तत्वों पर काम नहीं करता MySQL की तरह ()? मैं जावा में जावास्क्रिप्ट का उपयोग कैसे कर सकता हूं?

एमपीआई पर 2 डी सरणी भेजना और प्राप्त करना

मैं जिस मुद्दे को हल करने की कोशिश कर रहा हूं वह निम्नलिखित है:

सी ++ सीरियल कोड मैं एक बड़े 2 डी मैट्रिक्स भर में गणना की है। इस प्रक्रिया को अनुकूलित करने के लिए, मैं इस बड़े 2 डी मैट्रिक्स को विभाजित करना चाहता हूं और एमपीआई का इस्तेमाल करते हुए 4 नोड्स (कहते हैं) पर चलाना चाहता हूं। नोड्स के बीच होने वाली एकमात्र संचार हर बार चरण के अंत में बढ़त मूल्यों को साझा करना है। हर नोड किनारे सरणी डेटा को साझा करता है, ए [i] [j], अपने पड़ोसी के साथ।

MPI के बारे में पढ़ने के आधार पर, मेरे पास कार्यान्वित करने के लिए निम्नलिखित योजना है I

if (myrank == 0) { for (i= 0 to x) for (y= 0 to y) { C++ CODE IMPLEMENTATION .... MPI_SEND(A[x][0], A[x][1], A[x][2], Destination= 1.....) MPI_RECEIVE(B[0][0], B[0][1]......Sender = 1.....) MPI_BARRIER } if (myrank == 1) { for (i = x+1 to xx) for (y = 0 to y) { C++ CODE IMPLEMENTATION .... MPI_SEND(B[x][0], B[x][1], B[x][2], Destination= 0.....) MPI_RECEIVE(A[0][0], A[0][1]......Sender = 1.....) MPI BARRIER } 

मैं जानना चाहता हूं कि मेरा दृष्टिकोण सही है और अन्य एमपीआई कार्यों पर किसी भी मार्गदर्शन की सराहना भी करता है, वह भी कार्यान्वयन के लिए देखता है।

धन्यवाद, अश्विन

वेब के समाधान से एकत्रित समाधान "एमपीआई पर 2 डी सरणी भेजना और प्राप्त करना"

बस जोएल की बातों को थोड़ा समझने के लिए:

यदि आप अपने सरणियों को आवंटित करते हैं, तो यह बहुत आसान हो जाता है ताकि वे संगत हो (कुछ सी "बहुआयामी arrays" आपको स्वतः नहीं देते 🙂

 int **alloc_2d_int(int rows, int cols) { int *data = (int *)malloc(rows*cols*sizeof(int)); int **array= (int **)malloc(rows*sizeof(int*)); for (int i=0; i<rows; i++) array[i] = &(data[cols*i]); return array; } /*...*/ int **A; /*...*/ A = alloc_2d_init(N,M); 

उसके बाद, आप पूरे एनएक्सएम सरणी के साथ भेज सकते हैं और प्राप्त कर सकते हैं

 MPI_Send(&(A[0][0]), N*M, MPI_INT, destination, tag, MPI_COMM_WORLD); 

और जब आप कर लेंगे, तो स्मृति को मुक्त कर लें

 free(A[0]); free(A); 

इसके अलावा, MPI_Recv एक अवरुद्ध MPI_Recv है, और MPI_Send ब्लॉकिंग MPI_Send हो सकता है। एक बात जिसका मतलब है, जोएल के अनुसार, यह है कि आपको निश्चित रूप से बाधाओं की आवश्यकता नहीं है इसके अलावा, इसका मतलब है कि यदि आपके पास उपरोक्त एक भेजें / प्राप्तकर्ता पैटर्न है, तो आप अपने आप को एक गतिरोध स्थिति में प्राप्त कर सकते हैं – हर कोई भेज रहा है, कोई भी प्राप्त नहीं कर रहा है। सुरक्षित है:

 if (myrank == 0) { MPI_Send(&(A[0][0]), N*M, MPI_INT, 1, tagA, MPI_COMM_WORLD); MPI_Recv(&(B[0][0]), N*M, MPI_INT, 1, tagB, MPI_COMM_WORLD, &status); } else if (myrank == 1) { MPI_Recv(&(A[0][0]), N*M, MPI_INT, 0, tagA, MPI_COMM_WORLD, &status); MPI_Send(&(B[0][0]), N*M, MPI_INT, 0, tagB, MPI_COMM_WORLD); } 

एक अन्य, अधिक सामान्य, दृष्टिकोण MPI_Sendrecv का उपयोग MPI_Sendrecv :

 int *sendptr, *recvptr; int neigh = MPI_PROC_NULL; if (myrank == 0) { sendptr = &(A[0][0]); recvptr = &(B[0][0]); neigh = 1; } else { sendptr = &(B[0][0]); recvptr = &(A[0][0]); neigh = 0; } MPI_Sendrecv(sendptr, N*M, MPI_INT, neigh, tagA, recvptr, N*M, MPI_INT, neigh, tagB, MPI_COMM_WORLD, &status); 

या nonblocking भेजता है और / या प्राप्त करता है

सबसे पहले आपको ज्यादा बाधा की आवश्यकता नहीं है, आपको अपने डेटा को एक ही ब्लॉक के रूप में भेजा जाना चाहिए क्योंकि कई तरह से भेजने / प्राप्त करने के तरीके को अवरुद्ध करना नतीजा होगा।