我有这样的代码(伪代码,因为我无法显示我的程序):
concurrent_vector a, b, c;
concurrent_unordered_map mapForResult;
for(i=0; i<sequenceCount; i++){
variables temp_a, temp_b, temp_c;
database->read(&a, &b, &c);
}
parallel_for(0, sequenceCount, [](int i){
var aa = a[i];
var bb = b[i];
var cc = c[i];
resultOfFunction = MakeFunction(aa, bb, cc);
mapForResults.insert(resultOfFunction);
}, static_partitioner());
它正在运行,但它比顺序版慢得多。有什么想法吗?这是我第一次使用ppl.h,所以我不知道所有提示和技巧。
答案 0 :(得分:0)
程序的每个并行版本都需要比单线程版本更多的指令。在设置线程和管理对共享数据的访问方面,这是一个不可避免的开销。这通常是有限的开销,当您有足够的可用内核时,额外的指令不会转化为额外的时间。简单地说,如果你有300%的额外核心,10%的开销并不是什么大问题。
在这种情况下,MakeFunction
可能非常小。这意味着你确实会有很多开销,而你的额外内核会花费他们所有的时间来争夺mapForResults
。