2014-07-11 3 views
1

작업 스케줄러로 프로그램을 실행하면 스케줄러는 n 프로세서 코어 (사용자가 지정)를 작업에 할당합니다. OpenMP를 사용하는 프로그램이 실행될 때 OpenMP는 일반적으로 OMP_NUM_THREADS 개의 스레드를 사용합니다.이 스레드는 각기 다른 프로세서 코어에 매핑됩니다.OpenMP 스레드는 작업 스케줄러 (예 : LSF)가 할당 한 특정 코어에 어떻게 맵핑됩니까?

OpenMP는 어떤 코어가 스케줄러 (afaik)에 의해 프로그램/작업에 할당되었는지 알지 못합니다. 또한 OS는 실제로 OpenMP 스레드를 OpenMP가 아닌 코어로 매핑합니다.

제 질문은 다음과 같습니다. OpenMP 스레드가 작업 스케줄러에 의해 작업에 할당 된 코어에만 매핑되도록하려면 어떻게해야할까요?

제 질문은 일반적인 것이기를 바랍니다. 그러나 작업 스케줄러에서 프로세스가 실제로 다르다면 LSF 관련 답변이 가장 좋을 것입니다.

답변

3

작동 방식은 매우 간단합니다. DRM (분산 리소스 관리자)은 프로세스가 시작되기 전에 프로세스의 CPU 선호도 마스크를 제한합니다. 선호도 마스크는 OS 스케줄러에게 프로세스를 스케줄 할 수있는 논리 CPU를 알려줍니다. 기본 CPU 선호도 마스크에는 사용 가능한 모든 논리 CPU가 포함됩니다. 별도의 지시가 없으면 대부분의 OpenMP 런타임은 프로그램이 시작될 때 해당 마스크를 얻으며 새 스레드를 생성하는 동안 해당 마스크를 따릅니다. OMP_NUM_THREADS이 지정되지 않은 경우 기본 스레드 수를 결정하기 위해 GNU 및 Intel OpenMP 런타임 모두 선호도 마스크를 검사합니다. 대부분의 OpenMP 런타임은 자체 바인딩 메커니즘 (스레드 별 선호도라고도 함)을 지원합니다. Intel OpenMP의 변수 KMP_AFFINITY 또는 GNU OpenMP의 변수 GOMP_CPU_AFFINITY. 이들 중 일부는 원래 마스크를 존중하도록 지시받을 수 있습니다. KMP_AFFINITY="respect,granularity=core"은 프로세스가 시작된 선호도 마스크에서 활성화 된 CPU에만 Intel OpenMP가 스레드를 바인드하도록 만듭니다.

Linux에는 두 가지 종류의 선호도 마스크가 있습니다. 하나는 부드러운 것으로 간주 될 수 있으며 sched_setaffinity(2) 시스템 호출에 의해 설정됩니다. 이 마스크는 언제든지 덮어 쓰기 및 확장 할 수 있으므로 부드럽습니다. 그러나 리눅스는 cbusets (cgroups 프레임 워크의 일부)를 제공하여 다소 가벼운 컨테이너처럼 작동합니다. cpuset을 생성하고 특정 논리 CPU 만 할당하면 실제 적용된 최종 마스크를 얻기 위해 sched_setaffinity()을 통해 요청 된 마스크와 AND-ED됩니다. 따라서 cpusets은 하드 마스크를 제공합니다. 확장 할 수는 없으며 대신에 사용할 수도 있습니다 (그러나 수퍼 세트는 사용할 수 없음). Linux의 sched_setaffinity()은 PID 또는 TID 중 하나를 사용하므로 개별 스레드의 선호도를 설정하는 데 사용할 수 있으며 OpenMP 런타임이 스레드 별 선호도를 구현하는 방식입니다. 더 이식성이 좋은 호출은 POSIX pthread_setaffinity_np()입니다.

LSF (9.1.1 이상)는 Linux cpusets을 사용하는 선호도를 지원합니다. LSF 관리자 인 경우 설정하는 방법 또는 사용자 인 경우 작업에 대한 특정 선호도 설정을 요청하는 방법에 대한 설명서 here을 참조하십시오.

Sun (errr ... 오라클을 의미합니다.) 올바르게 호출 한 경우 Grid Engine은 버전 6.2u5로 시작하는 프로세스 선호도를 지원합니다.

+0

이 작업을 분명히하기 위해 작업 스케줄러는 프로세스가 OS 특정 시스템 호출을 사용하여 시작할 때 CPU 선호도를 설정합니다. 따라서 OpenMP와는 아무런 관련이 없습니다. 이제 이와 별도로 OpenMP에는 프로그래머가 CPU 선호도를 설정할 수있는 구현 관련 기능이 있습니다. 작업 스케줄러는 하드 마스크 (cpuset)를 사용하고 OpenMP는 소프트 마스크를 사용하기 때문에 프로그램은 cpuset 선호도 마스크와 OpenMP의 소프트 선호도 마스크에 모두 포함 된 프로세서에서 실행됩니다. 이 소리가 맞습니까? 그리고 당신의 도움에 감사드립니다! – Steve

+0

귀하의 이해는 정확하지만 일부 작업 스케줄러는 Linux에서 cpusets을 사용하지 않으며 설정 한 마스크가 "어렵습니다"따라서 OpenMP 런타임에서 쉽게 무시할 수 있으므로 이러한 환경에서는주의해야합니다 (예 : include 인텔의 OpenMP 런타임 용'KMP_AFFINITY'에있는'respect' 키워드). OpenMP 4.0에는 바인딩을 지정하기위한 표준화 된 메커니즘 인 _places_ 개념이 포함되어 있습니다. –