दिलचस्प पोस्ट
सिस्टम का उपयोग करके जेडब्ल्यूटी टोकन को डिकोड करना और सत्यापित करना। आईडेंटिटीमोडेल.Tokens.Jwt कॉरस अनुरोध Safari में काम नहीं कर रहा है HTML5 में दातावादियों के लिए स्क्रॉल पट्टी SQL में हेक्स में एक स्ट्रिंग परिवर्तित करना SQLite दशमलव परिशुद्धता संकेतन का उपयोग कैसे करें Piv.xml को ivy.xml कन्वर्ट करें एक टुकड़ा में Google Maps API V2 जोड़ें जब लिंक नए टैब में खुलता है, तो वर्तमान विंडो पर कैसे रहें? JSON में टिप्पणियों का उपयोग किया जा सकता है? इनपुट फ़ील्ड में पाठ जोड़ें स्थानीय यातायात के लिए यातायात की अनदेखी को रोकने के लिए मैं फिल्डल को कैसे प्राप्त करूं? Drupal 6.13 में PHP 5.3.0 के पदावनत फ़ंक्शन ereg () का उपयोग कैसे करें कैसे खिड़की का पता लगाने के लिए। प्रिंट () समाप्त जावा में स्ट्रीम करें वीडियो उपयोगकर्ता को लॉगिन / अनुमति देने के लिए बाध्य किए बिना सार्वजनिक फेसबुक पेज की गतिविधि फीड को एम्बेड करें

एमपीआई पर 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 } 

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

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

Solutions Collecting From Web of "एमपीआई पर 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 भेजता है और / या प्राप्त करता है

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