2014-10-31 4 views
1

Я пытаюсь связать потоки OpenMP с CPU. Были опробованы два метода.Сходство потоков OpenMP с GOMP_CPU_AFFINITY и sched_setaffinity

Первый: sched_setaffinity. Каждый раз, когда потоки разветвляются, я вызываю sched_setaffinity для привязки потоков OpenMP к процессорам. Кажется, что привязка к каждому времени слишком дорогостоящая. Действительно ли это необходимо для привязки для каждого раза или просто привязки на один раз?

Второй - GOMP_CPU_AFFINITY. Я установил GOMP_CPU_AFFINITY=0-7 и OMP_NUM_THREADS=4. Для вычисления используются два узла. Каждый узел имеет 2 фишки, и каждый чип имеет 4 ядра. Я размещаю процесс в каждом узле, и каждый процесс обрабатывает 4 потока. Если GOMP_CPU_AFFINITY не установлен, OpenMP ускоряет работу программы. Если GOMP_CPU_AFFINITY установлено следующее возвращаются и OpenMP не работает:

OMP: Warning #123: Ignoring invalid OS proc ID 1. 
OMP: Warning #123: Ignoring invalid OS proc ID 2. 
OMP: Warning #123: Ignoring invalid OS proc ID 3. 
OMP: Warning #123: Ignoring invalid OS proc ID 4. 
OMP: Warning #123: Ignoring invalid OS proc ID 5. 
OMP: Warning #123: Ignoring invalid OS proc ID 6. 
OMP: Warning #123: Ignoring invalid OS proc ID 7. 
+2

Результат выглядит так, как если бы среда OpenMP увидела, что ваша система имеет только один процессор. Что такое компилятор и операционная система? –

+0

@HristoIliev Я тоже получил это сегодня, с Intel Fortran 14 и GOMP_CPU_AFFINITY = "0-7: 2". Странно, я регулярно использую эту настройку, теперь просто сижу из дома. –

+0

@VladimirF, это может произойти, если ваш сеанс оболочки каким-то образом ограничен внутри контейнера cgroups с очень узкой маской процессора. Я просто не могу придумать другие правдоподобные объяснения. –

ответ

0

с OpenMP 4.0, можно установить сходство в параллельной области

#pragma omp parallel proc_bind(close) 

с вложенной параллельности, можно также использовать proc_bind(spread) в передняя область сначала грубоватая.

+0

OP использует GCC 4.6.0, который поддерживает только OpenMP 3.0. –