के साथ क्रैश होता है जब भी मैं 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
कहा जाना चाहिए? क्या यह अन्य कंपाइलर्स/एमपीआई कार्यान्वयन के साथ काम करता है?
धन्यवाद, यह तय है! मैंने गलत तरीके से 'MPI_IN_PLACE' दस्तावेज़ को गलत व्याख्या किया क्योंकि मैंने सोचा था कि सामूहिक संचार को सभी प्रक्रियाओं द्वारा बिल्कुल उसी तर्क के साथ बुलाया जाना था। – Yossarian
ओह, क्या आप वाकई निश्चित हैं? बस मेरे उत्पादन कोड में देखा और मेरे पास गलत उपयोग के कई उदाहरण हैं और मुझे अब तक कोई समस्या नहीं आई है। –
@VladimirF, कुछ सामूहिक संचालन हैं जहां 'एमपीआईआईपी_PLACE' को सभी रैंकों द्वारा प्रेषण बफर के रूप में निर्दिष्ट किया जाना चाहिए, उदाहरण के लिए, 'एमपीआई_ओएलटीओएल' या 'एमपीआई_ALLREDUCE'। मानक अलग-अलग प्रत्येक ऑपरेशन के लिए उचित उपयोग सूचीबद्ध करता है। –