Visual Studio 2022 17.9.6为何忽略#pragma omp parallel for?已解决
问题:OpenMP并行循环未生效,循环内始终显示单线程运行
我尝试并行化一个DLL中运行时间极长的函数,该DLL使用以下命令行编译:
/JMC /permissive- /MP /ifcOutput "x64\Debug\" /GS /W3 /Zc:wchar_t /ZI /Gm- /Od /sdl /Fd"x64\Debug\vc143.pdb" /Zc:inline /D "_WINDOWS" /D "_USRDLL" /D "BOOST_INTERPROCESS_SHARED_DIR_FUNC" /D "_SILENCE_FPOS_SEEKPOS_DEPRECATION_WARNING" /D "USE_NEW_CACHE" /D "_UNICODE" /D "UNICODE" /D "_WINDLL" /D "_DEBUG" /errorReport:prompt /WX /Zc:forScope /RTC1 /Gd /MTd /std:c++17 /FC /Fa"x64\Debug\" /EHsc /nologo /Fo"x64\Debug\" /Fp"x64\Debug\MyLib.pch" /diagnostics:column
我原本认为/MP标志能让#pragma指令生效。由于保密限制,仅能提供相关代码片段:
#include <omp.h> ... int totalThreads = omp_get_num_procs(); int nThreads = totalThreads; if (totalThreads > 6) { nThreads -= 4; } else if (totalThreads > 2) { nThreads -= 2; } stringstream ss; ss << "Total Threads: " << totalThreads << " using: " << nThreads; TRACE(ss.str().c_str()); omp_set_num_threads(nThreads); #pragma omp parallel for for (int i = 0; i < 11; i++) { int avail = omp_get_num_threads(); stringstream ss; ss <<"parallel run: " << i << " of " << avail; TRACE(ss.str().c_str());
TRACE宏输出显示循环外的Total Threads: 20 using 16符合预期,但循环内始终输出parallel run: 0 of 1,说明循环并未真正并行执行。编译无警告,请问遗漏了什么?
解决方案
问题核心是对编译标志的误解:
/MP标志不具备启用OpenMP的功能:该标志仅用于开启多进程并行编译,目的是加快项目构建速度,和运行时的OpenMP并行执行没有关系。- 正确的启用方式:在Visual Studio项目属性中,进入C++ -> 语言选项,勾选开启Open MP Support(对应底层编译标志为
/openmp)。
启用该选项后,编译器才会识别并处理#pragma omp相关指令,并行循环才能真正以多线程方式运行。
内容的提问来源于stack exchange,提问作者Mark D Henning
相关产品推荐
相关产品推荐

