My Centos 6 VM показывает четыре ядра при отображении содержимого /proc/cpuinfo
, а /sys/devices/system/cpu/online
показывает 0-3
.
Я пытаюсь запустить следующий код на ядре 2 и 3, используя KMP_AFFINITY="explicit,proclist=[2-3]"
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
int main (int argc, char *argv[]) {
int nthreads, tid, cid;
#pragma omp parallel private(nthreads, tid)
{
tid = omp_get_thread_num();
cid = sched_getcpu();
printf("Hello from thread %d on core %d\n", tid, cid);
if (tid == 0) {
nthreads = omp_get_num_threads();
printf("Number of threads = %d\n", nthreads);
}
}
}
При компиляции с icc (ICC) 16.0.1 20151021
он не может обнаружить доступные ядра и выполняет все на ядре 0.
$ OMP_NUM_THREADS=4 ./a.out
OMP: Warning #123: Ignoring invalid OS proc ID 2.
OMP: Warning #123: Ignoring invalid OS proc ID 3.
OMP: Warning #124: No valid OS proc IDs specified - not using affinity.
Hello from thread 0 on core 0
Number of threads = 1
Hello from thread 0 on core 0
Number of threads = 1
Hello from thread 0 on core 0
Number of threads = 1
Hello from thread 0 on core 0
Number of threads = 1
Где, как gcc (GCC) 4.4.7 20120313
, с GOMP_CPU_AFFINITY="2-3"
, правильно работает на ядрах 2 и 3, как set.
Я использовал strace
, чтобы проверить, что происходит под капотом, и заметил кое-что странное:
[...]
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
read(3, "0-3\n", 8192) = 4
[...]
sched_getaffinity(0, 1048576, { 1 }) = 8
sched_setaffinity(0, 8, { 4521c26fbb1c38c1 }) = -1 EFAULT (Bad addres
[...]
Может ли это быть ошибкой в реализации OpenMP, сделанной Intel?
Я не могу обновить свой компилятор, чтобы исправить это в этом случае. Можно ли использовать библиотеку GCC OpenMP вместо Intel при компиляции с icc
?
Обновление:
Мне удалось скомпилировать код с gcc
и связать его с iomp
, используя следующую команду
gcc omp.c -L/opt/intel/compilers_and_libraries_2016/linux/lib/intel64_lin/ -liomp5
Выполнение не выводит предупреждения и все еще не правильно:
$ OMP_NUM_THREADS=4 ./a.out
Hello from thread 0 on core 0
Number of threads = 1
Такая же sched_setaffinity
ошибка, как показано ранее.