저는 컴퓨터 비전 라이브러리를 개발하는 회사에서 일하고 있습니다. 그것은 부분적으로 더 복잡한 알고리즘을 가진 많은 행렬 연산을 포함합니다. 모든 것을 더 빠르게하기 위해 우리는 행렬 연산에서 실행해야 할 엄청난 양의 이중 루프를 병렬화하기 위해 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 자체에서이를 제어하는 방법이 있습니까?
외부 루프에서만'#pragma '를 사용하기 위해 응용 프로그램을 설계 할 수 있으므로 내부 함수에서 제거해야합니다. – Jepessen