2017-02-17 17 views
0

Я написал программу гибридной OpenMP/MPI, и я называю это как следующийКак установить несколько числа потоков в гибридных OpenMP/MPI программа

mpirun -np ncores --bind-to none -x OMP_NUM_THREADS=nthreads ./program 

где ncores является числом, не являющихся общих процессы памяти (MPI), а nthreads - количество потоков разделяемой памяти (OpenMP).

Это означает, что в каждом из ncores программа будет выполнена на nthreads.

Я не хочу иметь nthreads в каждом ядре, но я заинтересован в изменении этого числа для каждого ядра. например если ncores = 2, я хотел бы установить 2 потока на сердечники 1 и 6 на сердечник 2.

Есть ли способ сделать это?

Я использую ОТКРЫТОМ MPI 1.10.3

+0

Какова конфигурация вашей вычислительной системы: количество узлов, количество ядер процессора на каждом узле. Вы можете изменить оба аргумента в строке mpirun: ncores и nthreads. Если какой-либо из ваших процессов MPI (с id 0) хочет иметь 2 потока и другой процесс MPI (id 1), хочет 6 потоков, не используйте глобальную переменную окружения, переключитесь на функцию '' omp_set_num_threads' (https: // gcc .gnu.org/onlinedocs/libgomp/omp_005fset_005fnum_005fthreads.html # omp_005fset_005fnum_005fthreads) – osgx

ответ

2

Вы имеет глобальный параметр «OMP_NUM_THREADS» для всех процессов MPI среды. Этот параметр одинаковый для каждого из них, и вы хотите иметь другой номер потока для различных процессов mpi, поэтому вы не должны устанавливать его как глобальную переменную.

Я могу предложить два варианта. Сначала нужно удалить опцию -x и заменить «./program» на некоторый скрипт bash «./program_script.sh», который получит идентификатор процесса из mpirun (используйте имя mpirun -np 2 env, чтобы найти имя переменной с идентификатором процесса) и установите правильное значение переменной env «OMP_NUM_THREADS» для mpi с этим идентификатором, а затем запустите свой ./program.

Второй вариант заключается в удалении -x опции и установить количество потоков непосредственно из процессов MPI с использованием стандартного omp_set_num_threads() вызова OpenMP стандарта:

MPI_Comm_size(MPI_COMM_WORLD,&nproc); 
MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
if(rank == 0) { 
    omp_set_num_threads(2); 
} 
if(rank == 1) { 
    omp_set_num_threads(6); 
} 

Не забудьте установить правильный процессор binding in your mpirun (проверьте --report-bindings, установите с --bind-to или rankfile).

И третий вариант (когда количество потоков меньше или равно только счетчику ядра процессора) должно удалить опцию -x и просто установить правильную привязку cpu из вашего mpirun: включить core 0 и 1 для первого процесса MPI и ядер 2, 3,4,5,6,8 для вашего второго процесса MPI. Большинство библиотек OpenMP будут определять допустимый набор процессоров и запускать по умолчанию one thread per CPU.