Я получаю эту ошибку, и мне было интересно, как я могу это исправить. Немного предыстории: он работает в открытом MPI, но не Intel MPI.
Ошибка:
Fatal error in MPI_Recv: Invalid argument, error stack:
MPI_Recv(200): MPI_Recv(buf=0x7fffffff92f0, count=2, MPI_INT, src=0,
tag=123, MPI_COMM_WORLD, status=(ni$
MPI_Recv(93).: Null pointer in parameter status
Код: первая отправка
int rank;
int store[2];
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// if master node
if(rank == 0) {// Some maths to distribute the workload where positions_start and
// positions end are std::vector<int>
int this_core[2];
for(int i = 0; i < number_threads; i++) {
store[0] = positions_start[i];
store[1] = positions_end[i];
if (i == 0) {
//memcpy(this_core, store, 2 * sizeof(int));
this_core[0] = positions_start[i];
this_core[1] = positions_end[i];
} else {
MPI_Send(&store, 2, MPI_INT, i, 123, MPI_COMM_WORLD);
}
}
}
сначала получите:
// not master node
{ else {
// Create array
store[0] = -1;
store[1] = -1;
MPI_Recv(&store, 2, MPI_INT, 0, 123, MPI_COMM_WORLD, NULL);
вторая отправка:
float tempDataSet[(aVolumeSize[1] * aVolumeSize[0]) * ((store[1] - store[0]) + 1)];
// Some math comutations here and results stored in tempDataset
// Send results to the master
MPI_Send(&tempDataSet, (aVolumeSize[1] * aVolumeSize[0]) * ((store[1] - store[0]) + 1), MPI_FLOAT, 0, 124, MPI_COMM_WORLD);
}
во-вторых, получите:
// back in master node receive the array from other nodes and store them in a larger array
// Set the size of the buffer is necessary
unsigned int number_of_voxels(aVolumeSize[0] * aVolumeSize[1] * aVolumeSize[2]);
std::vector<float>& apVoxelDataSet;
apVoxelDataSet.resize(number_of_voxels, 0);
for (int i = 1; i < number_threads; ++i) {
// Calculate the size of the array
arrSize = (aVolumeSize[1] * aVolumeSize[0]) * ((positions_end[i] - positions_start[i]) + 1);
float values[arrSize + 1];
MPI_Recv(&values, arrSize, MPI_FLOAT, i, 124, MPI_COMM_WORLD, NULL);
std::copy(values, values + arrSize + 1, apVoxelDataSet.begin() + curLoc);
curLoc += arrSize;
}
С openmpi все работает как положено, однако ошибка появляется только при использовании intelmpi. Как я могу исправить эту ошибку, чтобы она работала в Intelmpi?
РЕДАКТИРОВАТЬ: файл slurm
#!/bin/bash --login
#SBATCH --job-name=MPI_assignment
#SBATCH -o MPI_assignment.out
#SBATCH -e MPI_assignment.err
#SBATCH -t 0-12:00
#SBATCH --ntasks=60
#SBATCH --tasks-per-node=8
module purge
module load compiler/intel mpi/intel
printf "Making Project ...\n"make
printf "Done!"mpirun -np $SLURM_NTASKS ./test >& MPI_assignment.log.$SLURM_JOBID
Если я изменю строку:
module load compiler/intel mpi/intel
в
module load compiler/intel mpi/openmpi
или же
module load compiler/gnu mpi/openmpi
Программа работает и никаких ошибок не происходит.
Makefile
CXX=mpiicc
BIN=test
LIB=libImplicitSurface.a
OBJECTS= ImplicitSurface.o test.o
CXXFLAGS+=-I../include -O3 -Wall
LDFLAGS+=-L. -lImplicitSurfaceall: $(BIN)$(BIN): $(LIB) test.o
@echo Build $@
@$(CXX) -o $@ test.o $(LDFLAGS)$(LIB): ImplicitSurface.o
@echo Build $@ from $<
@$(AR) rcs $@ $<# Default rule for creating OBJECT files from CXX files
%.o: ../src/%.cxx
@echo Build $@ from $<
@$(CXX) $(CXXFLAGS) -c $< -o [email protected]: ../include/ImplicitSurface.h
../include/ImplicitSurface.inl ../src/ImplicitSurface.cxx
test.o: ../include/ImplicitSurface.h $(LIB) ../src/test.cxxclean:
$(RM) $(OBJECTS)
$(RM) $(LIB)
$(RM) $(BIN)
$(RM) -r ../doc/html
$(RM) -r ../doc/tex
Если вы не планируете использовать статус «возвращен» MPI_Recv()
, вы должны использовать MPI_STATUS_IGNORE
вместо NULL
,
Ваша программа неверна и, следовательно, имеет неопределенное поведение (читайте, вам повезло, что она работала с Open MPI).
Других решений пока нет …