2016-10-24 1 views
-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 
    } 
} 

This answer

다음 코드로 OMP_NUM_THREADS를 쿼리 내 구현에 연결됩니다. 나는 정말로 이상합니다. 그것에 대한 설명이 있습니까? 나는 모든 스레드를 조회 할 중첩 된 병렬 영역을 열어, 그것을 해결했습니다

답변

0

:

int get_nested_num_threads(){ 
    int threads=1; 

#pragma omp parallel shared(threads) 
    { 
    #pragma omp single 
    { 
     threads = omp_get_num_threads(); 

     #pragma omp parallel shared(threads) 
     { 
     #pragma omp single 
     { 
      threads *= omp_get_num_threads(); 
     } 
     } 
    } 
    } 

    return threads; 
} 

는 지금까지 내가 아는 한,이 경우에 C에 firstprivatelastprivate를 사용할 필요가 없습니다. 하지만 포트란에서해야합니다.

+0

병렬 영역의 리소스를 생성하고 해제하는 오버 헤드가 걱정된다면 Intel 컴퓨터에서'KMP_BLOCKTIME' 값을 200ms로 설정할 수 있습니다. – boraas