2017-03-07 3 views
0

저는 컴퓨터 비전 라이브러리를 개발하는 회사에서 일하고 있습니다. 그것은 부분적으로 더 복잡한 알고리즘을 가진 많은 행렬 연산을 포함합니다. 모든 것을 더 빠르게하기 위해 우리는 행렬 연산에서 실행해야 할 엄청난 양의 이중 루프를 병렬화하기 위해 OpenMP를 사용하기 시작했으며,이 알고리즘을 때로는 여러 개를 호출 할 수있는 더 복잡한 알고리즘을 사용하기 시작했습니다.pragma 내에서 OpenMP pragma를 처리하는 방법

다른 pragma 내부에서 OpenMP pragma를 사용하는 것이 최상의 성능을 제공하지 않는다는 것을 알고 있습니다. 그러나 우리의 복잡한 알고리즘은 가능한 것보다 느리지 만, 여전히 기본적인 작업을 더 빠르게합니다.

이런 일 수 있습니다 예를 들어 줄 :

// in resize.c 
image resize_bilinear(const image& img, int rows, int cols) { 
image out(rows, cols); 
#pragma omp parallel for 
for (int i = 0; i < rows; ++i) { 
    for (int j = 0; j < cols; ++j) { 
    // bilinear interpolation to get out(i,j) 
    } 
} 
return out; 
} 

을 우리가 어딘가에있을 수 있습니다 :

// in more_complex.c 
std::vector<image> resize_all(const std::vector<image> imgs, int rows, int cols) { 
std::vector<image> out(imgs.size()); 
#pragma omp parallel for 
for (int i = 0; i < imgs.size(); ++i) { 
    out[i] = resize_bilinear(imgs[i], rows, cols); 
} 
} 

이 가능 그가 할 모든 아래 프라그 마를 사용하지 않도록 상단 프라그를 만드는 것입니다 만남? 아니면 OpenMP를 사용하여 모든 라이브러리를 병렬화한다면 운명에 처하게 될까요?

환경 변수는 OMP_MAX_ACTIVE_LEVELS입니다. 그러나 pragma 자체에서이를 제어하는 ​​방법이 있습니까?

+0

외부 루프에서만'#pragma '를 사용하기 위해 응용 프로그램을 설계 할 수 있으므로 내부 함수에서 제거해야합니다. – Jepessen

답변

1

중첩 된 병렬 처리를 활성화 또는 비활성화 할 수있는 omp_set_nested을 사용할 수 있습니다.

+0

그래, 내가 그걸 봤어! 이것이 내가 생각하기를 원하는 것입니다. 그리고 내 지식을 위해서 우리는 단지 일부 지역에 대해서만 설정할 수있는 특별한 경우가 있는지 알고 있습니까? 일부 pragma와 마찬가지로 중첩 된 병렬 처리는 허용되지 않지만 다른 일부에서는 괜찮습니다. – baptiste

+0

필자는 한번도 시도한 적이 없지만이 함수를 사용하면이 함수를 사용하여 원하는 위치에서 중첩 된 병렬 처리를 활성화/비활성화 할 수 있습니다. 중첩 된 루프 전에 1로 설정하고 다른 중첩 된 루프 전에 0으로 설정할 수 있습니다. – Jepessen

+0

네가하는 일을 정말로 * 알지 못하면 중첩 된 병렬 처리를 피할 것을 강력하게 제안한다. 머신을 너무 많이 (N 개의 논리적 CPU에 N ** 2 개의 스레드가 있음) 매우 쉽기 때문에 성능이 매우 떨어집니다. 또한 병렬 pragma에 omp_in_parallel() 및 "if"절을 보면 필요한 부분에서만 병렬 처리를 도입 할 수 있으며 "omp parallel for"은 "omp parallel"의 줄임말이기도합니다. 뒤에 "omp for"가 나오므로 더 큰 병렬 영역을 가질 수 있습니다. –