фатальная ошибка в pmpi_gather

Итак, у меня есть raytracer, который я пишу, который прекрасно компилируется, но когда я добираюсь до функции MPI_Gather (), я получаю эту ошибку. Если я напишу в файлы, все закончится нормально, но я не смогу запустить его в распределенной вычислительной системе.

Fatal error in PMPI_Gather: Internal MPI error!, error stack:
PMPI_Gather(856)......:
MPI_Gather(sbuf=0x8e05468, scount=882000, MPI_BYTE, rbuf=0x8df7628, rcount=882000, MPI_BYTE, root=0, MPI_COMM_WORLD) failed
MPIR_Gather_impl(681).:
MPIR_Gather(641)......:
MPIR_Gather_intra(152):
MPIR_Localcopy(378)...:
memcpy arguments alias each other, dst=0x8df7628 src=0x8e05468 len=882000

===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   EXIT CODE: 1
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================

Я не совсем уверен, что означает эта ошибка, поэтому ее трудно обойти.

Вот источник основной функции:

int main(int argc, char **argv) {
clock_t total_time = clock(), otime;
init_MPI(argc, argv);   //Initialize OpenMPI
glutInit(&argc,argv);

get_params(argc, argv);   //Get parameters from command line
if (buildScene(scene, cam) == -1) MPI_Abort(MPI_COMM_WORLD,rc); exit(1);
samples = samples > 0 ? whitted ? 1 : samples : 1;
if (numprocs == 1) {
scn = new RGBApixmap(h,w);
raytrace(h,scn);
if (smult > 1) *scn = scaleImage(scn,smult);
} else {
int rows = h / numprocs;
subscn = new RGBApixmap(rows,w);
raytrace(rows, subscn);
if (smult > 1) *subscn = scaleImage(subscn,smult);

if (pid == MASTER) scn = new RGBApixmap(h/smult,w/smult);
MPI_Gather(subscn,rows/smult*w,MPI_BYTE,scn,rows/smult*w,MPI_BYTE,MASTER,MPI_COMM_WORLD);
}
if (pid == MASTER) {
initGlut(argc, argv);
glutMainLoop();
}
MPI_Finalize();
return 0;
}

РЕДАКТИРОВАТЬ:

Я исправил проблему и разместил обновленный код ниже:

int main(int argc, char **argv) {
clock_t total_time = clock(), otime;
init_MPI(argc, argv);
glutInit(&argc,argv);
bool OK = get_params(argc, argv);
if (buildScene(scene, cam) == -1) { MPI_Abort(MPI_COMM_WORLD,rc); exit(1); }
samples = samples > 0 ? whitted ? 1 : samples : 1;
int rows = h / numprocs;
subscn = new RGBApixmap(rows,w);
raytrace(rows, subscn);
MPI_Barrier(MPI_COMM_WORLD);          /* Synchronize all processes */
if (smult > 1) *subscn = scaleImage(subscn,smult);
MPI_Barrier(MPI_COMM_WORLD);          /* Synchronize all processes */

int nElts = subscn->getWidth()*subscn->getHeight();
RGBA *subscnpix, *scnpix;
subscnpix = subscn->getPixs();
scnpix = (RGBA*)malloc(sizeof(RGBA)*((w/smult)*(h/smult)));

MPI_Datatype pixel;
MPI_Type_contiguous(4,MPI_UNSIGNED_CHAR,&pixel);
MPI_Type_commit(&pixel);

MPI_Gather(subscnpix,nElts,pixel,scnpix,nElts,pixel,MASTER,MPI_COMM_WORLD);

scn = new RGBApixmap(h/smult,w/smult,scnpix);

MPI_Type_free(&pixel);

MPI_Barrier(MPI_COMM_WORLD);          /* Synchonize all processes */
if (pid == MASTER) {
initGlut(argc, argv);
glutMainLoop();
}
MPI_Finalize();
return 0;
}

0

Решение

Ваши буферы отправки и получения в вызове MPI_Gather в ранге MASTER перекрытие, которое противоречит ограничению, наложенному стандартом MPI. subscn я сидела 0x8e05468 в то время как scn я сидела 0x8df7628, Объем памяти от 0x8df7628 в 0x8e05468 только 56896 байт, и вы пытаетесь записать в него 882000 раз numprocs байты, которые не будут работать.

Это связано с тем, что вы делите количество строк на коэффициент масштабирования, но при этом забыли разделить ширину изображения w по коэффициенту масштабирования.

MPI_Gather(subscn, rows/smult*w/smult, MPI_BYTE,
scn, rows/smult*w/smult, MPI_BYTE,
MASTER, MPI_COMM_WORLD);

Обратите внимание, что если растровое изображение не имеет оттенков серого, вам также придется умножить количество элементов данных на количество цветовых компонентов (возможно, считая также альфа-канал) или создать вместо этого непрерывный производный тип данных.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]