【问题标题】:Will threading affect image processing performance on Raspberry Pi?线程会影响 Raspberry Pi 上的图像处理性能吗?
【发布时间】:2019-09-09 13:43:54
【问题描述】:

我从事一个关于自动驾驶汽车的项目。在这个项目中,使用 C++ 中的 Opencv 4.0 在 Raspberry Pi(模型 3B)上进行实时视频处理。车辆前部还有一个距离传感器,可以与偶然的障碍物保持距离。任务是在 1 米内有障碍物时停车。

为了实现这个任务,我想在我的编程结构中使用线程。我将图像处理设计为主线程,将距离传感器测量设计为副线程。我担心的是这种结构是否会影响图像处理速度。你有什么主意吗?另外我想知道主线程是否使用Raspberry Pi的4核?如果是这样,是否将线程引入结构拆分核心,3 用于图像处理,1 用于距离传感器测量?

我对此感到困惑。我脑子里的设计可以看下面的sn-p(注意主线程无限循环):

int measuredDistance;
int distanceThreshold = 1; // 1 meter

void * sensor_thread(void * threadid) {
   // measure distance
   // update measuredDistance 
}

int main () {
   while(1){
      // do image processing
      if (measuredDistance < distanceThreshold)
         stopTheCar();
   }
}

【问题讨论】:

    标签: c++ multithreading opencv image-processing raspberry-pi


    【解决方案1】:

    首先,您必须手头有一个问题,可以将其拆分为子问题。图像处理就是这样一个问题。对你有好处,你可以考虑拆分你的问题。

    您的系统是否能够一次执行超过 1 个线程 - 多核、多线程或超线程或其他任何方式。如果我理解正确,您的 Pi 一次最多可以处理 4 个线程。这很好,您已经准备好使用多线程程序了。

    回答您的问题:主线程是否使用所有 4 个内核?基本上没有,主线程只有一个线程,运行在一个核心上。您的测量线程将在另一个内核上运行。

    因此,您希望将图像处理拆分为线程。当您将图像处理放入主线程之外的一个额外线程时,您几乎看不到任何改进。您必须将图像拆分为多个部分并将它们放入至少两个线程中。我会建议一种通用方法,可以轻松更改线程数,因此您可以进行试验,最快的设置是什么。

    简而言之,您不能指望我们给出明确的答复。这取决于您的实现和您的系统,它还需要做什么以及您的数据存储在哪里......等等等等......但是如果您阅读了一些好书并明智地选择如何实现您的图像处理,我希望性能有所提高。

    如果您擅长估算,可以使用数学方法。这在LINK 中有更详细的解释。

    并行化公式:

    S(n) = 1/( (1-P) + P/n )
    
    • S(n) 是理论加速比
    • P 是算法中可以并行的部分
    • n 是 CPU 线程数

    这基本上是说,程序通过使用 n 个内核将看到的加速量取决于程序有多少是串行的(只能在单个 CPU 内核上运行)以及有多少是并行的(可以在多个 CPU 内核之间拆分)。

    【讨论】:

    • 如我所见,添加测量线程不会影响图像处理性能,因为图像处理在 1 个核心上运行,而其他线程还有 3 个核心。但是作为所有进程的一般速度,将图像处理分成线程将有助于总循环时间?
    • 如果你正确地分割你的算法或数据,你会发现自己有一个很好的加速。是的。
    猜你喜欢
    • 2016-09-26
    • 2017-06-16
    • 2018-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多