Я пытаюсь создать многопроцессорный raytracer для моего старшего проекта с использованием OpenMPI, чтобы я мог запустить его на суперкомпьютере в моей школе.OpenMPI MPI_Gather segfault или ошибка утверждения
Я получил его до точки, где код компилируется нормально и работает хорошо, пока я не достигну линии
MPI_Gather(subscn,w*rows,MPI_BYTE,&scn,w*rows,MPI_BYTE,0,MPI_COMM_WORLD);
Мой вопрос заключается в том, что проблема с этой линии, так как она вызывает мою программу либо выдаёт ошибку сегментации или приводит к одному из (до сих пор) до 5 различных ошибок утверждения в зависимости от количества выполняемых процессов или сцены, которую я пытаюсь выполнить.
Функция, о которой идет речь, с отменными заявлениями printf().
int main(int argc, char **argv) {
init_MPI(argc, argv);
if (argc == 2) {
string arg1 = argv[1];
if (arg1 == "--help" || arg1 == "-?") print_help_message();
}
glutInit(&argc,argv);
bool OK = get_params(argc, argv);
Ray cam;
if (buildScene(scene, cam) == -1) {
MPI_Abort(MPI_COMM_WORLD,rc);
exit(1);
}
if (tid == MASTER) scn.initNewRGBApixmap(w,h); /* RGBA pixel map to display */
int rows = h/numprocs;
RGBA *subscn = new RGBA[w*rows];
samples = samples > 0 ? whitted ? 1 : samples : 1;
MPI_Barrier(MPI_COMM_WORLD); /* Synchronize all processes */
rtrace_time = 0.0 - MPI_Wtime(); /* Begin timer */
MPI_Scatter(&scn,w*rows,MPI_BYTE,subscn,w*rows,MPI_BYTE,0,MPI_COMM_WORLD);
raytrace(cam, rows, subscn);
MPI_Gather(subscn,w*rows,MPI_BYTE,&scn,w*rows,MPI_BYTE,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD); /* Synchronize all processes */
rtrace_time += MPI_Wtime(); /* End timer */
if (tid == MASTER) {
initGlut(argc, argv);
glutMainLoop();
}
MPI_Finalize();
return 0;
}
Функция init_MPI (ARGC, ARGV) выглядит следующим образом:
void init_MPI(int argc, char **argv) {
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&tid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
if (numprocs < 2) {
printf("\nError: At least two MPI tasks must be created. Exiting.\n");
MPI_Abort(MPI_COMM_WORLD,rc);
exit(1);
} else if (numprocs > MAX_PROCS) {
printf("\nError: More than %d MPI tasks started. Exiting.\n",MAX_PROCS);
MPI_Abort(MPI_COMM_WORLD,rc);
exit(1);
}
}
И 'scn' is ...? –
'scn' - это всего лишь карта пикселей с значениями R, G, B, A. Извините, я забыл прокомментировать это. – RevanProdigalKnight
'scn' кажется экземпляром какого-то класса. Является ли 'operator & 'redefined возвращать указатель на фактическую область хранения данных внутри объекта? –