首页 > 解决方案 > 在 C++ 11 中多线程处理多个短任务会减慢进程?

问题描述

当涉及到多线程时,我并没有真正的经验。我有一个面部标志检测器,可以检测面部组件周围的 68 个标志。对于它周围的每一个地标 HoG 特征,需要提取并附加到之前的地标特征以创建一个巨大的向量,然后再将其传递给回归器。

目前,所有特征都被一个接一个地串行提取,我正在尝试并行提取它们以加快进程。

在我的系统上,在 SERIAL 中提取所有地标周围的特征大约需要 2.5 毫秒。当我尝试使用 68 个线程对其进行并行化时,大约需要 8.5 毫秒来提取所有地标周围的特征。所以它实际上减慢了进程,我猜这可能是因为线程初始化时间。

以下是串行的原始代码

for(int i = 0; i < 68; i++){   // for each landmark

    fx = shape[i];       // x position
    fy = shape[i + 68];  // y position

    extract_features(image, fx, fy, &features[i]);
}

现在这就是我为并行化它所做的事情

vector<std::thread> threads;

for(int i = 0; i < 68; i++){   // for each landmark

    fx = shape[i];       // x position
    fy = shape[i + 68];  // y position

    threads.emplace_back( 
        [image, fx, fy, &] () { extract_features(image, fx, fy, &features[i]); } 
    );  
}

for(int x  = 0; x < 68; x++)
    threads[x].join();

我应该做错事,这会减慢进程而不是加快进程。我最好的猜测是,以我正在做的方式初始化线程比任务本身更耗时。如果是这种情况,有没有办法可以初始化线程并在 for 循环中运行它们?

非常感谢您帮助指导我找到该项目的正确方法。

谢谢,

标签: multithreadingc++11

解决方案


推荐阅读