2013-06-13 4 views
2

내 C++ 프로젝트에는 여러 개의 #pragma omp parallel for private(i) 문이 있습니다. valgrind를 사용하여 코드에서 버그를 추적하려고하면 OpenMP 장식이 메모리 누출 메시지가 "손실 될 수 있습니다"라는 결과를 초래합니다. 내가 완전히 앞에서 언급 한 #pragma 문을 모두 비활성화하여 문제를 격리 할 수 ​​있습니다.내 C++ 프로젝트의 모든 곳에서 OpenMP pragma 문을 사용하지 않음

그러나 코드에서 omp_get_wtime()을 사용하고 있으며이 함수 호출을 비활성화하지 않으려합니다. 따라서 프로젝트에서 모든 OpenMP 기능을 완전히 비활성화하고 싶지는 않습니다.

간단히 모든 #pragma omp parallel for private(i) 문을 끄면 어떻게됩니까?

필자는 Eclipse CDT를 사용하여 메이크 파일을 자동으로 관리하므로 일반적으로 릴리스 모드에서 make all -C release으로 컴파일합니다. 이상적으로, 나는 상기 언급 한 모든 #pragma 문을 끈 결과 인 make all -C release -TURN_OFF_PARALLEL과 같은 문을 사용하여 컴파일 할 수 있도록하는 문제에 대한 해결책을 원합니다.

  1. 비활성화 OpenMP를
  2. 링크 OpenMP를 스텁 라이브러리 함수 당신의 OpenMP 구현 스텁 기능을, 당신이 당신의 자신을 만들 수 있습니다 제공하지 않는 경우

:

답변

1

가장 간단한 솔루션입니다 standard의 부록 B에서 복사하십시오.

+0

"OpenMP 스텁 라이브러리 함수 링크"가 의미하는 바를 자세히 설명 할 수 있습니까? – synaptik

+0

아이디어는 _serial 라이브러리 _와'omp.h'에 정의 된 API를 링크하는 것입니다. 일부 컴파일러는 그렇게하기위한 플래그를 제공하므로 필요한 것은 컴파일 타임에 플래그를 변경하는 것뿐입니다. 예를 들어, 이것은 [Intel의 참조]입니다 (http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011Update/compiler_c/copts/common_options/option_openmp_stubs.htm) – Massimiliano

+0

OpenMP의 omp_get_wtime 대신'boost :: timer' [class] (http://www.boost.org/doc/libs/1_53_0/libs/timer/doc/cpu_timers.html)를 사용하는 것에 대한 의견은 무엇입니까?)'함수? 다른 OpenMP 함수를 사용하지 않기 때문입니다. – synaptik

1

GCC의 경우 스텁 만 사용하는 옵션이 표시되지 않습니다. OpenMP 표준의 부록 B에 따르면

double omp_get_wtime(void) 
    { 
    /* This function does not provide a working 
    * wallclock timer. Replace it with a version 
    * customized for the target machine. 
    */ 
    return 0.0; 
    } 

실제로 시간을 원하면 쓸모가 없습니다. GCC를 사용하면 시간 함수를 직접 작성하거나 "#pragma omp"를 검색하여 "// #pragma omp"로 바꿀 수 있습니다

전체 코드베이스를 변경하는 대신 시간 함수를 구현할 수 있습니다 GCC에만 해당됩니다. Computing time in linux :granularity and precision

+0

이렇게 보자. 스텁'omp_get_wtime()'을 구현하면 외부 대체 라이브러리를 한 곳에서 수정할 수있다. 당신의 충고는 잠재적으로 프로젝트의 모든 코드베이스를 수정하는 것입니다. – Massimiliano

+0

네, 이해합니다. 그러나 정확한 크로스 플랫폼 타이밍 함수를 작성하는 것은 고통 스러울 수 있습니다. 이것이 omp_get_wtime()을 사용하는 요지입니다. –

2

일부에 대해 an interesting question 주변에 거주하는 다음이 아닌 작업의 OpenMP 코드를, 단지 -lgomp-fopenmp를 대체하여 GCC와 스텁 OpenMP의 lib 디렉토리에 해당 얻을 수 있도록 완벽하게 가능하다고 밝혀졌습니다. 그럼에도 불구하고 의도 한 기능이 아닌 것 같습니다.