MPI_Comm_rank всегда пишет 0

Как я могу получить ожидаемый результат

rank 0
size 2
rank 1
size 2

или какая-то перестановка этих строк?

ranktest.c

#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[]){
    MPI_Init(NULL, NULL);
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    int world_size;
    MPI_Comm_size(MPI_COMM_WORLD, &world_size);
    printf("rank %d\n", world_rank);
    printf("size %d\n", world_size);
    MPI_Finalize();
    return 0;
}

компиляция и запуск

tsbertalan@hustlenbustle:~$ mpicc ranktest.c
tsbertalan@hustlenbustle:~$ mpirun -np 2 ./a.out 
rank 0
size 1
rank 0
size 1

На другом хосте:

tsbertalan@stamp:~$ mpicc ranktest.c
tsbertalan@stamp:~$ mpirun -np 2 ./a.out 
rank 0
size 2
rank 1
size 2

я пробовал

tsbertalan@hustlenbustle:~$ sudo aptitude reinstall openmpi-bin libopenmpi-dev

но ничего не изменилось. Оба файла / etc / openmpi / openmpi-default-hostfile и /etc/openmpi/openmpi-mca-params.conf содержат только комментарии к обоим хостам. Что здесь может отличаться?

Изменение на MPI_Init(&argc, &argv)или поочередно, int main() тоже ничего не делает.

Реальная проблема, благодаря пользователю 3469194:

linuxmint@linuxmint ~ $ sudo aptitude remove libopenmpi-dev mpich2
linuxmint@linuxmint ~ $ sudo aptitude install libmpich2-dev openmpi-bin
linuxmint@linuxmint ~ $ mpicc ranktest.c
linuxmint@linuxmint ~ $ mpirun -np 2 ./a.out
rank 0
size 1
rank 0
size 1
linuxmint@linuxmint ~ $ sudo aptitude remove libmpich2-dev openmpi-bin
linuxmint@linuxmint ~ $ sudo aptitude install libopenmpi-dev mpich2
linuxmint@linuxmint ~ $ mpicc ranktest.c
linuxmint@linuxmint ~ $ mpirun -np 2 ./a.out
[linuxmint:16539] [[INVALID],INVALID] ORTE_ERROR_LOG: A system-required executable either could not be found or was not executable by this user in file ../../../../../../orte/mca/ess/singleton/ess_singleton_module.c at line 357

(и многое другое)

Ответы на некоторые предложения:(Смотрите это репозиторий github, коммит на 1 декабря 2012 г.)

Попробуйте переместить определения world_rank и world_size до MPI_Init(), это что-то меняет?

Естественно, это не так хорошо работает:

tsbertalan@perrin:~/svn/524hw4$ git checkout 7b5e229 ranktest.c
(reverse-i-search)`clean': tsbertalan@hustlenbustle:~/Documents/School/12fall2012/524apc524/hw/hw4$ make ^Cean && make ranktest && mpirun -np 2 ranktest
tsbertalan@perrin:~/svn/524hw4$ make clean && make ranktest && mpirun -np 2 ranktest
rm -f heat_serial heat_omp heat_mpi heat_serial_O* ranktest
mpicc ranktest.c -o ranktest
*** An error occurred in MPI_Comm_rank
*** before MPI was initialized
*** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
[perrin:15206] Abort before MPI_INIT completed successfully; not able to guarantee that all other processes were killed!
*** An error occurred in MPI_Comm_rank
*** before MPI was initialized
*** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
[perrin:15207] Abort before MPI_INIT completed successfully; not able to guarantee that all other processes were killed!
tsbertalan@perrin:~/svn/524hw4$ git checkout HEAD ranktest.c

Или на моем домашнем компьютере:

tsbertalan@hustlenbustle:~/Documents/School/12fall2012/524apc524/hw/hw4$ git checkout 7b5e229 ranktest.c
tsbertalan@hustlenbustle:~/Documents/School/12fall2012/524apc524/hw/hw4$ vim ranktest.c 
tsbertalan@hustlenbustle:~/Documents/School/12fall2012/524apc524/hw/hw4$ make clean && make ranktest && mpirun -np 2 ranktest
rm -f heat_serial heat_omp heat_mpi heat_serial_O* ranktest
mpicc ranktest.c -o ranktest
Attempting to use an MPI routine before initializing MPICH
Attempting to use an MPI routine before initializing MPICH
tsbertalan@hustlenbustle:~/Documents/School/12fall2012/524apc524/hw/hw4$ git checkout HEAD ranktest.c

Это почти всегда проблема запуска программы, скомпилированной с одним MPI с другим mpirun. На первой машине (hustlenbustle) также установлен mpich2? Где вещи появляются на пути? В частности, что является результатом which mpicc а также which mpirun?

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

tsbertalan@hustlenbustle:~$ which mpicc
/usr/bin/mpicc
tsbertalan@hustlenbustle:~$ which mpirun
/usr/bin/mpirun

tsbertalan@perrin:~/svn/524hw4$ which mpicc
/usr/bin/mpicc
tsbertalan@perrin:~/svn/524hw4$ which mpirun
/usr/bin/mpirun

И, для shiggles, вот вывод некоторых поисков способностей для hnb и perrin. Дайте мне знать, если я должен искать что-то еще.

Под Open MPI следующая команда должна распечатать версию: mpirun -V, Если это не печатает mpiexec (OpenRTE) 1.x.x. тогда у вас может быть несоответствие времени выполнения.

tsbertalan@hustlenbustle:~$ mpirun -V
mpirun (Open MPI) 1.4.3

tsbertalan@perrin:~/svn/524hw4$ mpirun -V
mpirun (Open MPI) 1.4.1

Тем не менее, я перекомпилирую для каждого теста.

возможно sudo aptitude reinstall SOMETHING может помочь?

2 ответа

Решение

Нашел этот код в версии mpic.c, которая была у меня на компьютере (это доставляло мне неприятности, когда я установил новый пакет, который принес с собой mpi). Кажется, на вашем компьютере есть что-то подобное, а на другом хосте правильная версия.

int MPI_Comm_rank( MPI_Comm comm, int *rank)
{
  *rank=0;
  return 0;
}

Как вы можете видеть, rank всегда устанавливается в 0 (и подобная функция размера, вероятно, устанавливает переменную в 1).

У меня тоже была эта пробема. Проблема заключалась в том, что mpicc был OpenMPI (чтобы увидеть это, просто запустите mpicc -v), а mpirun был MPICH2 (mpirun -V). Я просто решил это, удалив MPICH2.

Другие вопросы по тегам