2013-08-07 9 views
1

Я пытаюсь создать многопроцессорный 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); 
} 

}

+1

И 'scn' is ...? –

+0

'scn' - это всего лишь карта пикселей с значениями R, G, B, A. Извините, я забыл прокомментировать это. – RevanProdigalKnight

+1

'scn' кажется экземпляром какого-то класса. Является ли 'operator & 'redefined возвращать указатель на фактическую область хранения данных внутри объекта? –

ответ

0

Благодаря Hristo Iliev за его замечания. Как оказалось, я использовал два разных типа данных в своем обращении к MPI_Gather().

Revised код выглядит следующим образом:

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 (pid == MASTER) scn = new RGBApixmap[w*h]; 

int rows = h/numprocs; 
RGBApixmap *subscn = new RGBApixmap[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 */ 

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 (pid == MASTER) { 
    initGlut(argc, argv); 
    glutMainLoop(); 
} 

MPI_Finalize(); 
return 0; 
} 

Так что урок здесь всегда проверять ваши типы данных и убедитесь, что вы не используете различные классы в MPI рассыпного и соберите.

 Смежные вопросы

  • Нет связанных вопросов^_^