2016-02-06 2 views
3

Я пытаюсь получить программу «привет мир», которая использует как OpenMP, так и MPI. Я начал с примера здесьПрограмма «hello world» C, использующая гибрид OpenMP и MPI

http://www.slac.stanford.edu/comp/unix/farm/mpi_and_openmp.html

, но я не могу воспроизвести вывод. Вот точный источник Я использую:

#include <stdio.h> 
#include <mpi.h> 
#include <omp.h> 

int main(int argc, char *argv[]) { 
    int numprocs, rank, namelen; 
    char processor_name[MPI_MAX_PROCESSOR_NAME]; 
    int iam = 0, np = 1; 

    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &numprocs); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Get_processor_name(processor_name, &namelen); 

    //omp_set_num_threads(4); 

#pragma omp parallel default(shared) private(iam, np) 
    { 
    np = omp_get_num_threads(); 
    iam = omp_get_thread_num(); 
    printf("Hello from thread %d out of %d from process %d out of %d on %s\n", 
      iam, np, rank, numprocs, processor_name); 
    } 

    MPI_Finalize(); 
} 

Я использую Xeon рабочих станций с двумя процессорами (2x6 ядра) под управлением Ubuntu 12.10. У меня нет проблем с получением программ, которые используют MPI или OpenMP (но не оба) для работы.

я составил источник выше, используя команду

mpicc -fopenmp hello.c -o hello 

затем бегала с использованием

export OMP_NUM_THREADS=4 
mpirun ./hello -np 2 -x OMP_NUM_THREADS 

Вот результат я получаю:

Hello from thread 0 out of 4 from process 0 out of 1 on SteinbergT5600Linux 
Hello from thread 2 out of 4 from process 0 out of 1 on SteinbergT5600Linux 
Hello from thread 1 out of 4 from process 0 out of 1 on SteinbergT5600Linux 
Hello from thread 3 out of 4 from process 0 out of 1 on SteinbergT5600Linux 

Я ДОЛЖНА, в соответствии с Например, получите что-то вроде этого:

Hello from thread 0 out of 4 from process 0 out of 2 on SteinbergT5600Linux 
Hello from thread 2 out of 4 from process 0 out of 2 on SteinbergT5600Linux 
Hello from thread 1 out of 4 from process 0 out of 2 on SteinbergT5600Linux 
Hello from thread 3 out of 4 from process 0 out of 2 on SteinbergT5600Linux 
Hello from thread 0 out of 4 from process 1 out of 2 on SteinbergT5600Linux 
Hello from thread 2 out of 4 from process 1 out of 2 on SteinbergT5600Linux 
Hello from thread 1 out of 4 from process 1 out of 2 on SteinbergT5600Linux 
Hello from thread 3 out of 4 from process 1 out of 2 on SteinbergT5600Linux 

Может ли кто-нибудь дать мне подсказку о том, что я делаю неправильно? Насколько я могу судить, я точно воспроизводил пример в приведенной выше ссылке.

+2

Вы должны использовать MPI_Init_thread с MPI_THREAD_FUNNELED для этого использования MPI и потоков. – Jeff

ответ

1

Вы указываете свое имя программы как первый аргумент mpirun, поэтому остальные аргументы игнорируются (особенно: -np 2). Таким образом, для -np вы получили все системное значение по умолчанию.

Изменение:

mpirun ./hello -np 2 -x OMP_NUM_THREADS 

В:

mpirun -np 2 -x OMP_NUM_THREADS ./hello 

Примечание стороны: Я испытал это на моей машине. По умолчанию для -np здесь 3. На вашей машине, по-видимому, значение по умолчанию 1

+0

О, это все, что было ... довольно немой! Я должен отметить, что это работает без использования предложения Джеффа. Однако при использовании обоих предложений результат несколько отличается. Используя мой исходный источник с правильным порядком аргументов, все четыре потока в первом процессе всегда отображают свой вывод перед любым потоком из второго процесса. Используя MPI_Init_thread вместо MPI_Init, распечатки от потоков разностных процессов чередуются. Это говорит о том, что процессы MPI могут не выполняться параллельно, когда я просто использую MPI_Init. Так что это кажется необходимым. –

+0

Все ошибки «тупые», как только они были диагностированы и исправлены ;-) MPI_Init_thread обеспечивает большую общность/гибкость. Выбор MPI_THREAD_ * частично зависит от того, какую топологию вы желаете. Поскольку вы также используете openmp, это может повлиять. (например). Без openmp вы можете использовать MPI_THREAD_MULTIPLE. Но с помощью openmp вы можете предпочесть MPI_THREAD_FUNNELED. YMMV Сначала подумайте о ваших потребностях. Затем переместите вызов в соответствии с ними. Обычно я создаю скрипт [с бенчмаркингом], который может обобщать все возможные комбо, а затем я выбираю окончательную конфигурацию, основанную на анализе результатов. –

Смежные вопросы