/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은리스트 반복자와 어떻게 동작합니까? 어떤 대답
이 코드의 기본 개념은 모든 스레드에서 전체 루프를 실행하는 것이지만 단일 스레드에서만 루프의 내부 코드를 실행하는 것입니다. 이것은 기본적으로 작동하지만, 이것이 올바른지 아니면 잘 수행되는지는 당신이 보여주지 않은 많은 것들에 달려 있습니다. 유용한 답변을 얻으려면 [mcve]를 제공해야합니다. – Zulan
어쨌든 당신은 무엇을 기대 했습니까? 병렬 프로그래밍의 기본 전제는 병렬화가 작동하기 위해 데이터 구조가 적합해야한다는 것입니다. 목록 항목을 병렬 처리 할 수 있지만 목록을 보행하는 것은 기본적으로 단일 스레드입니다. N 번째 항목을 찾고 단축키는 찾지 않으려면 O (N) _sequential_ steps이 필요합니다. – MSalters
라이브러리가 2.0으로 지원되지 않는 목록 반복자를 사용하기 때문에 Visual Studio에서 openMP 버전 2.0을 구현한다는 사실이 문제가 될 수 있는지 궁금한 결과를 얻었습니다. openmp 지원없이 라이브러리를 컴파일하려고 시도했지만 결과가 매번 실행될 때마다 안정적으로 보입니다. – user1839352