-1
병렬 영역이 시작되기 전에 OpenMp에서 스레드 수를 어떻게 감지합니까? 중첩 된 병렬 처리를 사용하면 OMP_NUM_THREADS
환경 변수는 4,64
처럼 보입니다. 그때 getenv("OMP_NUM_THREADS")
를 호출하는 경우 불행하게도 내가 4,4
대신 4,64
의 중첩 된 병렬 처리를 관찰병렬 영역 이전에 중첩 된 병렬 처리에서 스레드 수를 감지하는 OpenMp
#include <string.h>
#include <stdlib.h>
int get_nested_num_threads(){
char delimiter[] = ",";
char *ptr = NULL;
char *num_threads = NULL;
num_threads = getenv("OMP_NUM_THREADS");
int threads=1, nested=0;
ptr = strtok(num_threads, delimiter);
while (ptr != NULL){
threads *= atoi(ptr);
ptr = strtok(NULL,delimiter);
nested += 1;
}
assert(nested <= 2);
return threads;
}
:
get_nested_num_threads();
#pragma omp parallel
{
// starting 4 threads
#pragma omp parallel
{
// starting 64 threads for each of the 4
}
}
다음 코드로
OMP_NUM_THREADS
를 쿼리 내 구현에 연결됩니다. 나는 정말로 이상합니다. 그것에 대한 설명이 있습니까? 나는 모든 스레드를 조회 할 중첩 된 병렬 영역을 열어, 그것을 해결했습니다
병렬 영역의 리소스를 생성하고 해제하는 오버 헤드가 걱정된다면 Intel 컴퓨터에서'KMP_BLOCKTIME' 값을 200ms로 설정할 수 있습니다. – boraas