我使用英特尔IPP构建了OpenCV,因此我认为只要有可能就使用它(例如矩阵乘法)。
我想通过将其与串行版本进行比较来测试并行应用程序的可伸缩性。为了做到这一点,我这样做:
omp_set_num_threads(1);
cv::setNumThreads(1);
但是,通过监视CPU使用情况,我发现仍然使用了多个CPU。这是为什么?如何只使用一个CPU强制执行程序?
答案 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