当涉及多线程时,我并没有真正的经验。我有一个面部标志检测器,可以检测面部组件周围的68个标志。对于每个周围的地标HoG特征,都需要提取它并附加到以前的地标特征上,以在将其传递给回归器之前创建一个巨型矢量。
当前,所有功能都将依次提取,而我正尝试以并行方式提取它们,以加快流程。
在我的系统上,以SERIAL提取所有地标周围的要素大约需要2.5毫秒。当我尝试使用68个线程对其进行并行化时,提取所有地标周围的特征大约需要8.5ms。因此,它实际上减慢了进程的速度,我猜测这可能是由于线程初始化时间所致。
以下是串行的原始代码
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循环中运行它们?
非常感谢您的帮助,以指导我找到适合该项目的方法。
谢谢