如何在OpenCV中禁用并行性?

时间:2017-04-05 15:41:31

标签: c++ opencv parallel-processing openmp intel-ipp

我使用英特尔IPP构建了OpenCV,因此我认为只要有可能就使用它(例如矩阵乘法)。

我想通过将其与串行版本进行比较来测试并行应用程序的可伸缩性。为了做到这一点,我这样做:

omp_set_num_threads(1);
cv::setNumThreads(1);

但是,通过监视CPU使用情况,我发现仍然使用了多个CPU。这是为什么?如何只使用一个CPU强制执行程序?

4 个答案:

答案 0 :(得分:0)

在代码中的第一个IPP调用之前添加ippSetNumThreads(1);。这应该将IPP中的OpenMP线程数设置为1.可以在英特尔IPP基元"控制OpenMP线程中找到更多信息here"节

答案 1 :(得分:0)

您是否使用多线程的opencv?你必须从每个线程中禁用opencv的多线程,至少在我的经验中。

Opencv'rallel_for函数创建多个线程来分配工作。

答案 2 :(得分:0)

使用以下CMake参数从源重新构建OpenCV应该可以:

cmake .. -DWITH_IPP=OFF -DWITH_TBB=OFF -DWITH_OPENMP=OFF -DWITH_PTHREADS_PF=OFF

,您将发现CV_PARALLEL_FRAMEWORK宏不再定义为modules/core/src/parallel.cpp中的某个东西:

#if defined HAVE_TBB
#  define CV_PARALLEL_FRAMEWORK "tbb"
#elif defined HAVE_HPX
#  define CV_PARALLEL_FRAMEWORK "hpx"
#elif defined HAVE_OPENMP
#  define CV_PARALLEL_FRAMEWORK "openmp"
#elif defined HAVE_GCD
#  define CV_PARALLEL_FRAMEWORK "gcd"
#elif defined WINRT
#  define CV_PARALLEL_FRAMEWORK "winrt-concurrency"
#elif defined HAVE_CONCURRENCY
#  define CV_PARALLEL_FRAMEWORK "ms-concurrency"
#elif defined HAVE_PTHREADS_PF
#  define CV_PARALLEL_FRAMEWORK "pthreads"
#endif

答案 3 :(得分:0)

您可以通过以下方式禁用它:

cv::setNumThreads(0);
<块引用>

OpenCV 将尝试为下一个并行区域设置线程数。

如果线程 == 0,OpenCV 将禁用线程优化并运行所有它的 依次发挥作用。传递线程 < 0 会将线程数重置为系统 默认。此函数必须在并行区域之外调用。

https://docs.opencv.org/4.5.1/db/de0/group__core__utils.html