2016-12-19 6 views
0

/openmp를 사용하여 VC++ 컴파일러의 동작을 알고 싶습니다. cmakefilelist와 함께 제공되는 타사 라이브러리 (OpenMVG)를 사용하고 있습니다. 그래서 컴파일 할 Visual Studio 솔루션을 생성했습니다. CMake는 컴파일러의 openmp 기능을 인식하고 VS에서 everithing 컴파일을 잘 처리합니다. 하지만 실행과 관련하여 프로그램을 실행할 때마다 결과가 달라집니다. 동시에 2 개의 프로그램 인스턴스를 동시에 실행하면 그 결과가 더욱 악화됩니다. 그래서 나는 소스 코드 내부에 약간을 보면서 나는 OpenMP를 내가 웹에서 검색Visual Studio C++ 2015 및 openMP

#pragma omp parallel 
for (Views::const_iterator iter = sfm_data.GetViews().begin(); iter != sfm_data.GetViews().end() && bContinue; ++iter) 
{ 
    pragma omp single nowait 
    { 
    ... process ... 
    } 
} 

목록과지도 반복자와 함께 사용하고 비주얼 스튜디오 만의 OpenMP 2.0을 지원하는 것 같습니다 것을 발견했다. 그렇다면리스트 반복자를 지원합니까? 이것이 문제가 될 수 있습니까? openMP 2.0은리스트 반복자와 어떻게 동작합니까? 어떤 대답

+0

이 코드의 기본 개념은 모든 스레드에서 전체 루프를 실행하는 것이지만 단일 스레드에서만 루프의 내부 코드를 실행하는 것입니다. 이것은 기본적으로 작동하지만, 이것이 올바른지 아니면 잘 수행되는지는 당신이 보여주지 않은 많은 것들에 달려 있습니다. 유용한 답변을 얻으려면 [mcve]를 제공해야합니다. – Zulan

+0

어쨌든 당신은 무엇을 기대 했습니까? 병렬 프로그래밍의 기본 전제는 병렬화가 작동하기 위해 데이터 구조가 적합해야한다는 것입니다. 목록 항목을 병렬 처리 할 수 ​​있지만 목록을 보행하는 것은 기본적으로 단일 스레드입니다. N 번째 항목을 찾고 단축키는 찾지 않으려면 O (N) _sequential_ steps이 필요합니다. – MSalters

+0

라이브러리가 2.0으로 지원되지 않는 목록 반복자를 사용하기 때문에 Visual Studio에서 openMP 버전 2.0을 구현한다는 사실이 문제가 될 수 있는지 궁금한 결과를 얻었습니다. openmp 지원없이 라이브러리를 컴파일하려고 시도했지만 결과가 매번 실행될 때마다 안정적으로 보입니다. – user1839352

답변

-1

코드는 당신이 아마 않는 생각하지 않습니다 FO 사전에

감사합니다. 각각 동일한 루프를 실행하는 스레드 세트를 작성합니다.

Visual Studio의 OpenMP는 실제로 C++을 지원하지 않으므로 C 언어로 처리합니다. 특히, /openmp은 iterator를 지원하지 않습니다. 왜냐하면 C++이기 때문입니다. 그것은 (일부) C 루프 만 지원합니다.

또한 OpenMP는 C++ 98 이전의 구식 표준입니다. C++ 11부터 C++에는 네이티브 스레딩 기능이 있습니다.

+0

OpenMP는 여전히 "정기적으로"업데이트됩니다. atomics 지원은 2013 년에 추가되었으며 그 의미는 "오래됨"이 아닙니다. 오직 VS만이 OpenMP 2.0 이상의 모든 버전을 지원하는 것을 거부했습니다. 또한 마지막 줄에는 OpenMP 및 C++ 스레드가 "비교 가능"하지만 OpenMP 설치 프로그램에서 스레드 풀을 자동으로 구성하는 것과는 달리 크게 차이가 있음을 알 수 있습니다. –

+1

OpenMP는 3.0 (2008!) 이후 C++ 무작위 액세스 반복기를 지원합니다. OpenMP의 최신 버전은 2015 년 11 월부터, 2016 년 11 월의 새로운 초안이 있습니다. 유일한 문제는 16 세 버전을 구현하는 Visual Studio입니다. – Zulan

+0

@ Zulan : 공정한 점은 Visual Studio에서 구현 한 OpenMP에 대해 이야기하고 있다는 것을 분명하게 나타냅니다. "오래된 표준"에 관해서는, 당신이 그것을 더 좋아한다면 "초기 표준"이라고 부를 수도 있습니다. 그것은 오랫동안 C++이 2011 년까지 부족한 기능을 제공했습니다. – MSalters