OpenMP에서 정의 된 코어의 수는 어떻게됩니까?이 API는 코어의 존재를 어떻게 알 수 있습니까?OpenMP가 시스템의 코어 수를 어떻게 결정합니까?
답변
OpenMP는 기본적으로 병렬 영역의 스레드 수를 제어하는 내부 제어 변수 (ICV) nthreads-var을 정의합니다.
초기 값 nthreads-var (환경 변수 OMP_NUM_THREADS
으로 정의되지 않은 경우)은 구현이 정의됩니다. 코어의 수는 합리적인 기본값처럼 보일 수 있습니다. GCC (libgomp)는 BSD, Linux, mingw32, POSIX, rtems를 gomp_init_num_threads
에 구현합니다. libgomp/config/<platform>/proc.c
에서 특정 구현을 확인할 수 있습니다.
리눅스는 pthread_getaffinity_np
을 통해 스레드 선호도를 확인하고 프로세스가 실행되도록 허용 된 CPU 수로 스레드 수를 설정합니다. 마찬가지로 MinGW는 GetProcessAffinityMask
입니다. 나머지 플랫폼은 기본적으로 sysconf(_SC_NPROCESSORS_ONLN)
을 사용합니다.
OpenMP에는 OpenMP 4.0 이상의 스레드 배치 API에 코어 개념이 있습니다. Linux에서 GCC 및 Intel OpenMP 런타임은 토폴로지 정보를 찾기 위해'sysfs '의 CPU 항목을 구문 분석합니다. –
@HristoIliev 좋은 지적. 나는 OP가 내가 처리하려고했던 OpenMP 쓰레드에 대해 더 근본적인 오해가 있다고 생각한다. 보다 기술적으로 정답을 편집했습니다. – Zulan
@zulan 확인해 보았지만 nthreads-var의 기본값은 1이지만 코어 수가 1보다 큰 것으로 나타났습니다. 따라서 no와 관련이 없습니다. 코어의? –
어디서 그런 말입니까? OpenMP 표준 4.5는 2.3.2에서 기본값이 * 구현 정의 *라고 말합니다. – Zulan