C++ 如何在OpenCV中禁用并行性?
我使用Intel IPP构建了OpenCV,因此我认为只要有可能就会使用它(例如矩阵乘法) 我想通过将并行应用程序与串行版本进行比较来测试并行应用程序的可伸缩性。为此,当我这样做时:C++ 如何在OpenCV中禁用并行性?,c++,opencv,parallel-processing,openmp,intel-ipp,C++,Opencv,Parallel Processing,Openmp,Intel Ipp,我使用Intel IPP构建了OpenCV,因此我认为只要有可能就会使用它(例如矩阵乘法) 我想通过将并行应用程序与串行版本进行比较来测试并行应用程序的可伸缩性。为此,当我这样做时: omp_set_num_threads(1); cv::setNumThreads(1); 但是,通过监视CPU使用情况,我发现仍然使用多个CPU。为什么呢?如何仅使用一个CPU强制执行程序?添加ippSetNumThreads(1)在代码中的第一个IPP调用之前。这应将IPP中的OpenMP线程数设置为1。有关
omp_set_num_threads(1);
cv::setNumThreads(1);
但是,通过监视CPU使用情况,我发现仍然使用多个CPU。为什么呢?如何仅使用一个CPU强制执行程序?添加
ippSetNumThreads(1)代码>在代码中的第一个IPP调用之前。这应将IPP中的OpenMP线程数设置为1。有关更多信息,请参阅“在英特尔IPP原语中控制OpenMP线程”部分您是否从多线程使用opencv?您必须从每个线程禁用opencv的多线程,至少在我的经验中是这样
Opencv的函数并行_创建多个线程来跨多个线程分发工作 使用以下CMake参数从源代码重新构建OpenCV应该可行:
cmake .. -DWITH_IPP=OFF -DWITH_TBB=OFF -DWITH_OPENMP=OFF -DWITH_PTHREADS_PF=OFF
您会发现宏CV_PARALLEL_框架不再定义为:
#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
您可以通过以下方式禁用它:
cv::setNumThreads(0);
OpenCV将尝试为下一个并行区域设置线程数。
如果线程==0,OpenCV将禁用线程优化并运行所有线程
按顺序运行。传递小于0的线程将重置系统的线程数
违约此函数必须在并行区域之外调用
它可能正在使用英特尔TBB
-检查您的配置getBuildInformation()
@MarkSetchellcv::setNumThreads
应该解决这个问题(如上所述)有没有人知道是否有OpenCV的人/开发人员参与了SO,并能回答像这样深入的问题?如何知道OpenCV函数中实际使用了哪些优化(SIMD、OpenMP、TBB、CUDA),对我来说一直是个谜。。。。或者有人告诉我们任何特定硬件上所有OpenCV函数的典型性能数字?有人吗?我认为在这种情况下,唯一的方法是在禁用所有并行选项和ipp的情况下重建整个OpenCV。我很抱歉这么说,但如果是这样的话……好吧,这真是个麻烦。@MarkSetchell我想这一切都取决于你是如何编译opencv的。CMake文件中有不同的选项用于控制所有这些内容。