首先我做了一个线程池,并试图对一个大小为40960个float元素的数组做一些重算术运算。C++ 11并行执行
单线程方法得到0.0009秒的结果,而同时运行4线程的并行方法得到0.0003秒。在这个实现中,我手动将任务分配到4个部分,并将它们排入线程池。
现在我想为我的线程池提供一个通用方法parfor
。我试过这个:
void parfor(int begin, int end, std::function<void(int)>func)
{
int delta = (end - begin)/M_count;
for (int i = 0; i < M_count; ++i)
queue([=]{
int localbegin = begin + i*delta;
int localend = (i == M_count - 1) ? end : localbegin + delta;
for (int it = localbegin; it < localend; ++it)
func(it);
});
wait();
}
其中M_count是线程数。执行时间变为0.003秒(大约是手工分发作业的10倍)。我想std ::函数有一个很好的运行时间开销,但不知道任何其他的替代方法。你能给我一些建议吗?非常感谢。
编辑: 根据Rapptz的建议,我尝试这样做:
template <typename Function>
void parfor(int begin, int end, Function)
,并用它是这样的:
pool.parfor(0, 40960, [&](int i){
buff[i] = pow5(buff[i]);
});
它显示了一些错误:
error C2371: 'it' : redefinition; different basic types
error C2512: 'wmain::<lambda_badf06dfbebc4bb15b3ade2b922c7f76>' : no appropriate default constructor available
我想它将lambda视为一种类型,但不知道如何解决它...
也许你的手动版本可以内联函数,而'parfor'显然不能。 – woolstar
使用模板而不是'std :: function'。 – Rapptz
@woolstar是的,我想是的。但不知道如何在我的parfor中强制内联函数。 – babel92