Я думаю, что проблема заключалась в том, как send проходит через память, выделенную для вектора.Он отлично работает, когда я использую 1D-буфер для передачи результатов, что заставляет меня чувствовать, что данные, которые я хотел передать, были не полностью в непрерывном блоке памяти.Так что, возможно, изменение индексов при выделении вектора сделает память, к которой я хочу получить доступ, смежной.Но, пожалуй, то, что у меня есть, это договоренность «упорядоченная пара», а не то, что я на самом деле хочу, чтобы это было.Мне придется сделать то же самое для DiffCrossSections.
Редактировать: я транспонировал CrossSections и DiffCrossSections в их инициализации, и это решило проблему.Итак, похоже, что я отправлял в память данные, которые, по моему мнению, были смежными, но не были.
std::vector<std::vector<double > > DiffCrossSections (NumEnergies+1,std::vector<double>(181,0.0));
std::vector< std::vector<double > > CrossSections (2, std::vector<double> (NumEnergies,0.0));
#define MASTER 0
MPI_Init(NULL,NULL);
MPI_Status status;
int rank,size,name_len;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Get_processor_name(processor_name, &name_len);
chunksize = (NumEnergies / size);
if (rank == MASTER)
{
offset = chunksize;
for (dest=1; dest<size; dest++)
{
MPI_Send(&offset, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
offset = offset + chunksize;
}
//master does its calcs for CrossSections and DiffCrossSections
for (int i=1; i<size; i++)
{
source = i;
MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status);
MPI_Recv(&CorssSections[1][offset], chunksize, MPI_DOUBLE, source, tag2, MPI_COMM_WORLD, &status);
MPI_Recv(&DiffCrossSections[offset+1][0], (181)*chunksize, MPI_DOUBLE, source, tag3, MPI_COMM_WORLD, &status);
}
}
if (rank > MASTER)
{
/* Receive my portion of array from the master task */
source = MASTER;
MPI_Recv(&offset, 1, MPI_INT, source, tag1, MPI_COMM_WORLD, &status);
std::cout<<"Processor: "<<processor_name<<" rank:"<<rank<<" Energies="<<CrossSections[0][offset]<<" - "<<CrossSections[0][offset+chunksize-1]<<std::endl;
/* Each task does its part of the work */
/* Send task results back to the master task */
dest = MASTER;
MPI_Send(&offset, 1, MPI_INT, dest, tag1, MPI_COMM_WORLD);
MPI_Send(&CrossSections[1][offset], chunksize, MPI_DOUBLE, dest, tag2, MPI_COMM_WORLD);
MPI_Send(&DiffCrossSections[offset+1][0], (181)*chunksize, MPI_DOUBLE, dest, tag3, MPI_COMM_WORLD);
}
MPI_Finalize();