У меня есть программа на C++, в которой я хочу разобрать огромный файл, ища какое-то регулярное выражение, которое я реализовал. Программа работала нормально, когда выполнялась последовательно, но затем я хотел запустить ее, используя MPI.Разбор большого файла с MPI в C++
Я начал адаптацию к MPI дифференцирования мастера (тот, который координирует выполнение) из рабочих (те, которые анализируют файл параллельно) в главной функции . Что-то вроде этого:
MPI::Init(argc, argv);
...
if(rank == 0) {
...
// Master sends initial and ending byte to every worker
for(int i = 1; i < total_workers; i++) {
array[0] = (i-1) * first_worker_file_part;
array[1] = i * first_worker_file_part;
MPI::COMM_WORLD.Send(array, 2, MPI::INT, i, 1);
}
}
if(rank != 0)
readDocument();
...
MPI::Finalize();
мастер направит каждому работника массив с 2 позиции, которая содержит байт, где он будет начать чтение файла в позиции и байт, где он необходимо прекратить чтение в позиции .
readDocument() функция выглядит следующим образом теперь (не разбор, просто каждый работник читает его часть файла):
void readDocument()
{
array = new int[2];
MPI::COMM_WORLD.Recv(array, 10, MPI::INT, 0, 1, status);
int read_length = array[1] - array[0];
char* buffer = new char [read_length];
if (infile)
{
infile.seekg(array[0]); // Start reading in supposed byte
infile.read(buffer, read_length);
}
}
Я пробовал различные примеры, от написания файл выводит показание для запуска его с различным количеством процессов. Случается, что когда я запускаю программу с 20 процессами вместо 10, например, она длится в два раза больше времени для чтения файла. Я ожидал, что это будет почти в половину времени, и я не могу понять, почему это происходит.
Кроме того, в другом вопросе, я хочу, чтобы сделать мастер ожидания для всех рабочих завершить их выполнение, а затем распечатать последний раз. Есть ли способ «блокировать» его, пока рабочие обрабатывают? Как cond_wait в C pthreads?
У вас есть файл, размещенный на параллельно файловая система? В противном случае все чтения будут эффективно блокироваться глобально. В 2 раза медленнее может быть немного странно, но это может произойти, если вы действительно исчерпаете источник. – luk32
@ luk32: Я запускаю программу локально, со всеми процессами на моем компьютере. Файл хранится в той же папке, что и исполняемый файл. Есть ли способ, чтобы файл читался только одним процессом за раз? Если да, то как я могу это решить? –
@HighPerformanceMark Я не совсем понял вопрос, извините. Как узнать, сколько каналов у меня связано с процессами на диске? –