2014-10-24 4 views
2

Я пытаюсь написать простой метод для чтения файла параллельно, где каждый процесс будет считывать несколько int из файла, чтобы разделить данные на каждый процесс, но я получаю ошибку сегментации и я не могу понять, почему и как это исправить. Вот код, который я написал:Ошибка сегментации при использовании MPI_File_read_at

#include <stdio.h> 
#include <stdlib.h> 

#include "mpi.h" 

#define NUM_INTS 5 

int main (int argc, char** argv) { 

MPI_Init(&argc, &argv); 

int i; 
int rank,processes,name_len; 
const int root=0; 
int *buf; 
char *filename = "file.txt"; 

MPI_File fh; 
MPI_Status status; 
MPI_Offset offset; 

char processor_name[MPI_MAX_PROCESSOR_NAME]; 

MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Comm_size(MPI_COMM_WORLD, &processes); 
MPI_Get_processor_name(processor_name, &name_len); 

MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh); 

buf = malloc(NUM_INTS * sizeof(int)); 

MPI_File_set_view(fh, 0, MPI_INT, MPI_INT, (char *)NULL, MPI_INFO_NULL); 

offset = rank * NUM_INTS; 

MPI_File_read_at(fh, offset, buf, NUM_INTS, MPI_INT, &status); 
MPI_Barrier(MPI_COMM_WORLD); 

MPI_File_close(&fh); 

for (i=0;i<NUM_INTS;i++) 
    printf("rank %d data[%d] = %d\n", rank, i, buf[i]); 

free(buf); 

MPI_Finalize(); 
return 0; 
} 

Файл содержит 10 ints, которые я попытался разбить на 2 процесса. Я думаю, что проблема в MPI_File_read_at, потому что все печатные издания работают до этой линии

Спасибо заранее

ответ

0

Не будучи полностью осведомлены о функциональности MPI, я не уверен на 100%, где ваша проблема либо, однако вот несколько общих советов по отладке, которые вы можете использовать, чтобы попытаться выявить проблему.

1) Используйте отладчик. GDB или аналогичный ваш друг здесь, вы должны иметь возможность использовать его для выполнения вашей программы по строкам, следя за всеми переменными, когда вы идете, и это должно помочь вам отследить, где именно он генерирует ошибку сегментации, и вы должны знайте значения переменных в то время. Это должно значительно помочь выяснить, в чем проблема.

2) Если у вас есть дамп ядра, вы можете снова использовать gdb для выполнения посмертной отладки и получить трассировку стека от точки сбоя, это может пролить свет на проблему.

3) В противном случае вы всегда можете использовать метод «отладки» printf(), отлаживать/выгружать все, как вы его вычисляете, это может помочь, но в прошлом я обнаружил, что это может привести к местам памяти вещей, которые нужно изменить, а иногда и удалить сбой ... Обратите внимание, что это не устраняет вашу проблему, вы просто переделали память так, чтобы она не выпадала из строя в текущих обстоятельствах.

+0

Я уже использовал несколько отпечатков, и я знаю, что указатель файла не является NULL, buf выделен, и смещение имеет правильные значения в каждом процессе (0 в корне, 5 в процессе 1). –

+0

ok, начните с простейшего случая, делает ли файл с 1 целым числом, прочитанным одним процессом? затем попробуйте 2 целых числа с одним процессом, затем 2 целых числа с двумя процессами, каждый процесс считывает по одному файлу каждый. Затем определите, какой процесс работает, 0 начальных процессов или смещения –

3

Почему вы передаете «null» в ваше представление типа данных? (на самом деле, почему вы вообще настраиваете просмотр файла?)

Если вы следовали совету @Colin Cassidy, у вас был бы задний след, указывающий непосредственно на проблему: это не MPI_File_read_at, это MPI_File_set_view.

Либо удалите эту строку, или изменения (символ *) NULL в «родной»

Кроме того, вы должны проверить возвращаемые значения, но это не поможет вам здесь. См. Мой ответ на этот вопрос: How to use and interpret MPI-IO Error codes?

MPICH (или, скорее, ROMIO) не должен segfault на вашем входе в мусор. У меня есть патч для этого. У вас есть смешной побочный эффект: ваш вызов MPI_File_set_view возвращает ошибку, которую вы игнорируете, а затем остальная часть вашего кода ведет себя так, как вы этого хотели.

+0

Я не совсем понял использование MPI_File_set_view, поэтому спасибо, что указали это. Хотя, я пробовал комментировать эту строку и использовать «родной», но он все еще не работает должным образом. Я получаю вывод из buf в процессе 0, но это мусор, а затем он зависает, я ничего не получаю от процесса 1, и мне приходится прерывать вручную. Я также попытался использовать gdb, и он показывает только данные в buf из процесса 0. Я не очень опытный, поэтому простите меня, если я пропущу что-то очевидное.Спасибо за ваше время в любом случае –

+0

Я забыл упомянуть, что я также запускаю его на одном процессе, и он не зависает, но у меня все еще есть тот же мусор в buf –

+0

, потому что ваш файл содержит текстовые номера? Если вы читаете текст, ваша обработка будет немного иной (и, вероятно, более сложной). –

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