multithreading - 在 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 循环中运行它们?
非常感谢您帮助指导我找到该项目的正确方法。
谢谢,
解决方案
推荐阅读
- c - 我需要将一个字符串分成 3 个不同大小的部分
- java - 如何在将应用程序推送到 github 之前隐藏应用程序的 API 密钥
- twitter-bootstrap - 如何为引导行添加边框和背景颜色?
- java - 比较两个列表并获取子对象
- apache-kafka - 基于 Kafka 主题的寻址/消费
- python - RuntimeWarning:在 scipy.optimize 中遇到的无效值
- java - 引起:org.postgresql.util.PSQLException:错误:“student_id”列中的空值违反非空约束
- python-3.x - PySimpleGui FileBrowse 和 FolderBrowse 对话框在转换为 .exe 文件后看起来不同
- kendo-ui - 如何根据 json 提要中的属性从 JQuery 面板项目中导航
- javascript - 从对象设置器访问父级`this`