2013-07-19 3 views
7

के साथ क्रैश होता है जब भी मैं mpi_reduce को mpi_in_place के साथ भेजने की कोशिश करता हूं क्योंकि प्रेषण बफर इसे क्रैश करता है। Google का एक ट्रैवल ओएमपीआई 1.3.3 के लिए मैक ओएस पर एक समस्या होने का खुलासा करता है - लेकिन मैं ओएमपीआई 1.6.3 के साथ सेंटोस पर हूं (gfortran 4.4.6 के साथ)।जगह में mpi_reduce ओपनएमपीआई

निम्नलिखित कार्यक्रम दुर्घटनाओं:

PROGRAM reduce 

    USE mpi 

    IMPLICIT NONE 

    REAL, DIMENSION(2, 3) :: buffer, gbuffer 

    INTEGER :: ierr, me_world 
    INTEGER :: buf_shape(2), counts 

    CALL mpi_init(ierr) 
    CALL mpi_comm_rank(mpi_comm_world, me_world, ierr) 

    buffer = 1. 
    IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer 

    buf_shape = SHAPE(buffer) 
    counts = buf_shape(1)*buf_shape(2) 

    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, mpi_real, mpi_sum, 0, mpi_comm_world, ierr) 
    IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer 

    CALL mpi_finalize(ierr) 

END PROGRAM reduce 

एमपीआई त्रुटि है:

MPI_ERR_ARG: invalid argument of some other kind 

जो बहुत उपयोगी नहीं है।

क्या मुझे कुछ याद आ रहा है कि कैसे mpi_reduce कहा जाना चाहिए? क्या यह अन्य कंपाइलर्स/एमपीआई कार्यान्वयन के साथ काम करता है?

उत्तर

14

आप कैसे यथा-स्थान में कमी आपरेशन एमपीआई में काम करता है की एक बहुत ही महत्वपूर्ण हिस्सा (बोल्ड पाठ देखें) याद कर रहे हैं:

जब कम्युनिकेटर एक intracommunicator है, तो आप एक आपरेशन in- को कम कर सकते हैं जगह (आउटपुट बफर इनपुट बफर के रूप में प्रयोग किया जाता है)। रूट प्रक्रियाsendbuf के मान के रूप में परिवर्तनीय MPI_IN_PLACE का उपयोग करें। इस मामले में, इनपुट डेटा प्राप्त बफर से रूट पर लिया जाता है, जहां इसे आउटपुट डेटा द्वारा प्रतिस्थापित किया जाएगा।

IF (me_world == 0) THEN 
    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
ELSE 
    CALL mpi_reduce(buffer, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
END IF 

आप सुरक्षित रूप से गैर-मूल प्रक्रियाओं में दोनों sendbuf और recvbuf रूप buffer पारित कर सकते हैं:

अन्य प्रक्रियाओं अभी भी sendbuf, नहीं MPI_IN_PLACE के रूप में अपने स्थानीय बफ़र्स की आपूर्ति करने के लिए है चूंकि MPI_REDUCE उन प्रक्रियाओं में recvbuf पर नहीं लिखता है।

+0

धन्यवाद, यह तय है! मैंने गलत तरीके से 'MPI_IN_PLACE' दस्तावेज़ को गलत व्याख्या किया क्योंकि मैंने सोचा था कि सामूहिक संचार को सभी प्रक्रियाओं द्वारा बिल्कुल उसी तर्क के साथ बुलाया जाना था। – Yossarian

+0

ओह, क्या आप वाकई निश्चित हैं? बस मेरे उत्पादन कोड में देखा और मेरे पास गलत उपयोग के कई उदाहरण हैं और मुझे अब तक कोई समस्या नहीं आई है। –

+0

@VladimirF, कुछ सामूहिक संचालन हैं जहां 'एमपीआईआईपी_PLACE' को सभी रैंकों द्वारा प्रेषण बफर के रूप में निर्दिष्ट किया जाना चाहिए, उदाहरण के लिए, 'एमपीआई_ओएलटीओएल' या 'एमपीआई_ALLREDUCE'। मानक अलग-अलग प्रत्येक ऑपरेशन के लिए उचित उपयोग सूचीबद्ध करता है। –

संबंधित मुद्दे