簡體   English   中英

混合用戶線程和 OpenCV 內置多線程

[英]Mixing user threads and OpenCV built-in multithreading

我開發了一個需要同時處理不同圖像的 C++ 應用程序。 處理算法建立在 OpenCV 之上,並使用並行功能。

該應用程序以下列方式工作:對於它擁有的每個圖像,它產生一個線程來執行處理算法。 不幸的是,這種方案似乎不適用於 OpenCV 內部多線程。

最小的例子:

#include <iostream>
#include <thread>
#include <chrono>

#include <opencv2/core.hpp>

void run(int thread_id, cv::Mat& mat) 
{
    auto start = std::chrono::steady_clock::now();
    
    // multithreaded operation on mat
    mat.forEach<float>([](float& pixel, int const* position) {
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    });
    
    auto end = std::chrono::steady_clock::now();
    
    std::cout << "thread " << thread_id << " took " 
              << (end - start).count() * 1e-9 << " sec"
              << std::endl;
}

int main()
{
    cv::Mat mat1(100, 100, CV_32F), mat2(100, 100, CV_32F);
    
    std::thread t1(run, 1, std::ref(mat1));
    std::thread t2(run, 2, std::ref(mat2));
    
    t1.join();
    t2.join();
    
    return 0;
}

Output 在我的機器上:

thread 1 took 1.42477 sec
thread 2 took 12.1963 sec

似乎第二個操作沒有利用多線程。 查看我的 CPU 使用率,我感覺 OpenCV 將其所有內部線程分配給第一個操作,當第二個操作到達時,沒有剩余內部線程。 因此,第二個操作在應用線程體中順序執行。

首先,如果有人已經面臨與 OpenCV 類似的問題,我將不勝感激,可以確認我的假設是正確的。

其次,有沒有辦法更智能地調度內部 OpenCV 資源? 例如,通過將一半線程分配給第一個操作而將一半分配給第二個操作?

多線程目標

寫完我的問題后,我意識到在應用程序級別進行多線程的目的可能還不清楚。 有人可能會爭辯說,在應用程序級別順序運行這兩個操作就足夠了,以充分利用內部 OpenCV 多線程。 對於我在此處發布的最小示例來說確實如此,但通常並非處理算法的所有部分都可以並行運行。

應用程序級別的多線程背后的想法是嘗試同時運行最多“不可並行”的操作:

Operations 1 and 2 sequentially:
[-----seq 1----][-par 2 (full power)-][-----seq 2----][-par 2 (full power)-]

Operations 1 and 2 in parallel:
[-----seq 1----][------------par 2 (half power)------------]
[-----seq 2----][------------par 2 (half power)------------]

seq X = sequential task of operation X
par X = parallelisable task of operation X

我們可以看到應用級多線程減少了總計算時間,因為不同操作的順序部分是同時運行的。

我認為您的多線程方法是正確的。 我運行了您提供的代碼,這是我的 output:

thread 1 took 2.30654 sec 
thread 2 took 2.63872 sec

也許您應該檢查程序的可用線程數?

std::cout << std::thread::hardware_concurrency() << std::endl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM