मैंने इस MPI C प्रोग्राम को linux पर लिखा है। मास्टर को दासों को कार्य भेजने और दासों से डेटा प्राप्त करने के लिए माना जाता है (और यदि उन्हें समाप्त दासों को देने के लिए अधिक कार्य हैं)।

सभी कार्यों के पूरा होने के बाद, इसका समाधान प्रिंट करना चाहिए।

यह कुछ भी नहीं छापता है और मैं यह पता नहीं लगा सकता कि क्यों। यह अटक नहीं है, यह सिर्फ एक सेकंड के बाद खत्म होता है और कुछ भी प्रिंट नहीं करता है।

P.S- मैंने कोड में अलग-अलग जगहों पर एक प्रिंटफ रखकर डिबगिंग की कोशिश की है। कोड में एकमात्र स्थान जो कुछ मुद्रित करता था, वह मास्टर सेक्शन में MPI_Recv से पहले था, और यह कुछ समय (प्रक्रियाओं की संख्या से कम) मुद्रित करता था।

यहाँ पूर्ण कोड है:

#include <mpi.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define NUMS_TO_CHECK 2000
#define RANGE_MIN -5
#define RANGE_MAX 5

#define PI  3.1415
#define MAX_ITER 100000

double func(double x);

int main (int argc, char *argv[])
{
    int numProcs, procId;
    int errorCode= MPI_ERR_COMM;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
    MPI_Comm_rank(MPI_COMM_WORLD, &procId);
    MPI_Status status;
    int i;
    double recieve=0;
    int countPositives=0;
    double arr[NUMS_TO_CHECK];
    double difference= (RANGE_MAX - RANGE_MIN) / NUMS_TO_CHECK;
    int counter = NUMS_TO_CHECK-1; //from end to start...
    //Initiallizing the array.
    for(i=0; i<NUMS_TO_CHECK; i++){
        arr[i]=RANGE_MIN+i*difference;
    }
    //master
    if(procId==0){
        //Send tasks to all procs
        for(i=1; i<numProcs; i++){
            MPI_Send(&arr[counter], 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD);
            counter--;
        }
        do{
            MPI_Recv(&recieve, 1, MPI_DOUBLE, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
            if(recieve>0) 
            {
                countPositives++;
            }
            MPI_Send(&arr[counter], 1, MPI_DOUBLE, status.MPI_SOURCE, 0, MPI_COMM_WORLD);
            counter--;

        }while(counter>0);

        printf("Number of positives: %d", countPositives);
        MPI_Finalize();

    }
    //slaves
    else{
        MPI_Recv(&recieve, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        recieve=func(recieve);
        MPI_Send(&recieve, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);


    }

}

double func(double x) 
{
    int i;
    double value = x;
    int limit = rand() % 3 + 1;

    for(i = 0;  i < limit * MAX_ITER;  i++)
        value = sin(exp(sin(exp(sin(exp(value))))) - PI / 2) - 0.5;

    return value;
}
0
Jacob.B 27 नवम्बर 2015, 07:39

2 जवाब

सबसे बढ़िया उत्तर

मुझे लगता है कि आपके दासों को थोड़ी देर में डेटा पढ़ने की जरूरत है। वे केवल 1 प्राप्त करते हैं और 1 भेजते हैं। जबकि मास्टर 2000 में शुरू होता है। यह डिजाइन द्वारा हो सकता है, इसलिए मैं गलत हो सकता हूं।

2
msmith81886 27 नवम्बर 2015, 17:21

सिद्धांत पर, आपका कोड लगभग ठीक दिखता है। यहां केवल दो चीजें गायब हैं:

  1. सबसे स्पष्ट है कि दास के पक्ष में एक प्रकार का एक लूप है, जो मास्टर से अपने निर्देश प्राप्त करने के लिए, और फिर अपने काम को वापस भेज देता है; तथा
  2. कम स्पष्ट लेकिन जितना आवश्यक हो: काम करने के लिए मास्टर को बताने के लिए एक साधन। यह एक विशेष मूल्य भेज सकता है, जिसे दासों द्वारा परीक्षण किया जाता है, और जो उन्हें आरईवी + काम + को रिसेप्शन पर लूप भेजने या एक अलग टैग जिसे आप परीक्षण करते हैं, मौजूद करने के लिए ले जाता है। बाद के मामले में, आपको दासों के पक्ष में रिसेप्शन कॉल के लिए MPI_ANY_TAG का उपयोग करना होगा।

इसे ध्यान में रखते हुए, मुझे यकीन है कि आप अपना कोड काम कर सकते हैं।

0
Gilles 27 नवम्बर 2015, 13:21