MPI возвращает неправильные результаты для одного из процессов

#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