我尝试将此处给出的示例转换为带有Boost threads的多线程版本。
为什么 OpenCV LUT 函数比我的 Boost 实现快两倍以上?
我能够击败 C 实现,但不能击败 TBB 版本(LUT)。我不明白为什么。我的是4核笔记本电脑。在他们的示例中,他们已经证明 OpenCV LUT 功能是最快的。LUT 使用英特尔 TBB。
这是衡量性能和启动 Boost 线程的部分。
t = (double)getTickCount();
_global_I = I.clone();
int channels = _global_I.channels();
int nRows = _global_I.rows;
_global_NCOLS = _global_I.cols * channels;
CV_Assert(_global_I.isContinuous());
_global_NCOLS *= nRows;
for (int i = 0; i < times; ++i)
{
NTHREADS = 4; //number of threads
boost::thread_group tgroup;
for(int i=0;i<NTHREADS;i++)
{
tgroup.create_thread(boost::bind(ScanImageAndReduceBoost,i));
}
tgroup.join_all();
}
t = 1000*((double)getTickCount() - t)/getTickFrequency();
t /= times;
cout << "Time of reducing with Boost (averaged for "
<< times << " runs): " << t << " milliseconds."<< endl;
这是进行映射的函数:
void ScanImageAndReduceBoost(int start)
{
int i=0;
uchar* p;
p = _global_I.ptr<uchar>(i);
for ( int j = start; j < _global_NCOLS; j=j + NTHREADS)
{
p[j] = _global_table[p[j]];
}
}
_global_I
并且_global_table
是表示图像和查找表的全局变量(如示例中所示)。
输出,平均运行 100 次:
- 使用 C 运算符的运行时间
[]
:4.65387 毫秒。 - 使用 LUT 函数的运行时间:0.79165 毫秒。
- 使用 Boost 的运行时间:1.99125 毫秒。