У меня есть код C ++, который может быть запущен параллельно, но с методами общей памяти. Я связал код с PETSc, и PETSc может выполнять код параллельно, но с помощью метода распределенной памяти. Когда я запускаю код (c ++, связанный с PETSc) параллельно, кажется, что все процессоры повторяют одну и ту же работу. Например, когда число процессоров равно 4, граничные условия и начальные условия читаются 4 раза, или, если я использую команду printf, что-то будет напечатано 4 раза. Таким образом, это означает, что работа не распределяется между процессорами, и все процессоры выполняют всю работу вместо того, чтобы выполнять некоторые ее части. У кого-нибудь есть такой же опыт и каковы ваши предложения по решению этой проблемы?
Например, ниже вы можете видеть, что код читает сетку дважды, а не читает ее один раз:
чтение файла сетки Mesh_cavity2d.txt:
чтение файла сетки Mesh_cavity2d.txt:
или же:
Такое поведение обычно указывает на одну из двух вещей. Либо вы забыли ограничить вывод (и другие функциональные возможности) только в одном ранге. Самый простой способ сделать это — использовать MPI_Comm_rank для получения номера ранга и заключить в скобки все операции ввода-вывода и другие операции в
if (rank==0)
{
// I/O here
}
Вы также можете столкнуться с проблемами, заставляя ваши ряды общаться друг с другом. Я видел несколько причин, от неправильных библиотек до запуска не-MPI-программ под MPI.