#c #mpi
#c #mpi
Вопрос:
Сейчас я изучаю MPI и написал простую программу на C, которая использует MPI_Scatter и MPI_Reduce следующим образом:
int main(int argc, char **argv)
{
int mpirank, mpisize;
int tabsize = atoi(*(argv 1));
MPI_Init(amp;argc, amp;argv);
MPI_Comm_rank(MPI_COMM_WORLD, amp;mpirank);
MPI_Comm_size(MPI_COMM_WORLD, amp;mpisize);
unsigned long int sum = 0;
int rcvsize = tabsize / mpisize;
int *rcvbuf = malloc(rcvsize * sizeof(int));
int *tab = malloc(tabsize * sizeof(int));
int totalsum = 0;
if(mpirank == 0){
for(int i=0; i < tabsize; i ){
*(tab i) = 1;
}
}
MPI_Scatter(tab, tabsize/mpisize, MPI_INT, rcvbuf, tabsize/mpisize, MPI_INT, 0, MPI_COMM_WORLD);
for(int i=0; i < tabsize/mpisize; i ){
sum = *(rcvbuf i);
}
printf("%d sum = %ld %dn", mpirank, sum, tabsize/mpisize);
MPI_Reduce(amp;sum, amp;totalsum, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
if(mpirank == 0){
printf("The totalsum = %lin", totalsum);
}
MPI_Finalize();
return 0;
}
Программа выдает невнимательные результаты, и я не понимаю, почему. Например:
$ mpirun -np 4 03_array_sum 120000000
1 sum = 29868633 30000000
2 sum = 30000000 30000000
0 sum = 30000000 30000000
3 sum = 30000000 30000000
The totalsum = 119868633
Здесь процесс 1 не посчитал все элементы, переданные ему MPI_Scatter .
ОБНОВЛЕНИЕ: как написал пользователь @Gilles Gouaillardet ниже в принятом ответе, я запустил код в цикле тридцать раз для обеих версий с пустым $ OMPI_MCA_pml и установил значение «^ ucx». Когда флаг пуст для одного запуска, 8 из 30 дают неправильные значения, когда флаг установлен, все запуски верны. Затем я запускаю то же самое на Debian GNU / Linux 7 (wheezy) с OpenMPI 1.4.5, и все запуски были правильными с пустым флагом. Похоже, что-то не так с OpenMPI 4.0.4 и / или Fedora 33.
Комментарии:
1. эта программа работает для меня. какую библиотеку MPI вы используете?
2. Пожалуйста, попробуйте запустить его несколько раз. Время от времени он выходит из строя, когда не должен. Я использую ‘openmpi.x86_64 4.0.4-3.fc33 @fedora 33’
3. @user1337 Это также работает для меня
4. @dreamcrash какой дистрибутив / версию Linux вы используете? Какая реализация и версия MPI?
5. mpirun (Open MPI) 1.8.8, Mac OX High Sierre
Ответ №1:
Я смог воспроизвести проблему в той же среде.
Я не знаю, находится ли основная причина в Open MPI или UCX.
Между тем, вы можете
mpirun --mca pml ^ucx ...
или
export OMPI_MCA_pml=^ucx
mpirun ...
или добавить в /etc/openmpi-x86_64/openmpi-mca-params.conf
pml = ^ucx
Комментарии:
1. Я запустил код в цикле тридцать раз для обеих версий с пустым $OMPI_MCA_pml и установил значение «^ ucx». Когда флаг пуст для одного запуска, 8 из 30 дают неправильные значения, когда флаг установлен, все запуски верны. Затем я запускаю то же самое на Debian GNU / Linux 7 (wheezy) с OpenMPI 1.4.5, и все запуски были правильными с пустым флагом. Похоже, что-то не так с OpenMPI 4.0.4 и / или Fedora 33?
2. Как я писал в своем ответе, основная причина либо в Open MPI, либо в библиотеке UCX.
3. Сообщение о проблеме отправлено в список рассылки OpenMPI devel.
4. Проблема решена путем обновления ucx с 1.8 до 1.9.0, как описано в выпуске OpenMPI: 8321