Сбой при назначении ядра openmp - PullRequest
1 голос
/ 28 июня 2019

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 ошибка, как показано ранее.

...