Я пытаюсь получить программу «привет мир», которая использует как 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
Может ли кто-нибудь дать мне подсказку о том, что я делаю неправильно? Насколько я могу судить, я точно воспроизводил пример в приведенной выше ссылке.
Вы должны использовать MPI_Init_thread с MPI_THREAD_FUNNELED для этого использования MPI и потоков. – Jeff