2017-01-23 4 views
-1

Я пишу гибридный код openMP/MPI. Впервые я продемонстрировал openMP только на 8 потоках. Затем я добавил слой MPI как следующийболее медленное время работы с гибридным OpenMP/MPI против OpenMP

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); 
//the following function has OPENMP for loop embedded 
parallelfunction(args);//should I add condition on rank? 
MPI_finalize(); 

Функция OpenMP является стандартом OpenMP цикл

#pragma omp parallel for schedule(dynamic,chunk) private(i) 
for(i=0;i<n;i++){ 
//loop code here 
} 

Я составил гибридный код и запустить его на одном процессоре, как этот

mpirun -np 1 -x OMP_NUM_THREADS=8 ./program 

только понять, что время работы в 5 раз медленнее, чем openMP (на одном CPU обязательно). Я сравниваю стену с использованием bash time функция. Любые предложения?

Я использую OpenMP 3.1 с mpicc

EDIT

Я использую OpenMPI v1.10.3

+0

Это невозможно сказать, не видя фактического кода и фактических результатов измерений. – Zulan

+0

Да, действительно. 1 процессор и 8 потоков. – Marouen

+2

Вы явно используете Open MPI. Попробуйте добавить '--bind-to none' в список опций' mpirun'. –

ответ

2

Вы явно не указали реализации MPI, но с использованием -x передать переменные окружения в MPI процессы - это контрольный знак Open MPI. Начиная с версии 1.8, процесс пиннинга/привязка включена по умолчанию, как описано в человека странице MPI process launcher:

Пожалуйста, обратите внимание, что mpirun автоматически связывает процессы, как в начале серии v1.8. Два связывания модели используются при отсутствии каких-либо дополнительных директив:

связываются с ядром:
, когда число процессов < = 2
Привязка к гнезду:
, когда число процессов > 2

Если ваше приложение использует потоки, то вы, вероятно, захотите убедиться, что вы либо не связаны вообще (указав --bind-to none), либо привязанные к нескольким ядрам с использованием соответствующего уровня привязки или определенного количества элементов обработки ts на процесс подачи заявки.

В вашем случае процесс привязан к одному сердечнику, и все потоки должны разделить его на таймер. --bind-to none удаляет привязку и позволяет назначать потоки на всех ядрах ЦП.

+0

, к сожалению, не работал для меня в версии openmpi 2.1.1 !!! – niceman

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