C++ ppl.h的并行#u不快于顺序c++;

C++ ppl.h的并行#u不快于顺序c++;,c++,parallel-processing,ppl,C++,Parallel Processing,Ppl,我有这样的代码(伪代码,因为我不能显示我的程序): concurrent_向量a,b,c; 并发\u无序\u映射结果; 对于(i=0;iread(&a,&b,&c); } (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_par

我有这样的代码(伪代码,因为我不能显示我的程序):

concurrent_向量a,b,c;
并发\u无序\u映射结果;
对于(i=0;iread(&a,&b,&c);
}
(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,所以我不知道所有的技巧和窍门。

程序的每个并行版本都比单线程版本需要更多的指令。设置线程和管理对共享数据的访问时,不可避免地会有开销。这是一个问题通常是有限的开销,当您有足够的可用内核时,额外的指令不会转化为额外的时间。简单地说,如果您有300%的额外内核,10%的开销不是什么大问题


在这种情况下,
MakeFunction
可能非常小。这意味着您确实有很多开销,并且您的额外内核花费了所有时间来争夺
mapForResults

每个并行版本的程序都比单线程版本需要更多的指令。setti中存在不可避免的开销中断线程和管理对共享数据的访问。这通常是有限的开销,当您有足够的可用内核时,额外的指令不会转化为额外的时间。简单地说,如果您有300%的额外内核,10%的开销不是什么大问题


在这种情况下,
MakeFunction
可能非常小。这意味着您确实有很多开销,而且您的额外内核一直在为
mapForResults

而斗争。缓存在两个循环之间的行为如何?在并行版本中是否有很多缓存未命中?我如何验证它?我是beginne如果你在Linux上,你可以使用。不幸的是Windows。也许会有帮助。缓存在两个循环之间是如何表现的?你在并行版本中有很多缓存缺失吗?我如何验证它?我是C++ C++的初学者。如果你在Linux上,你可以使用。不幸的是,Windows可能会有帮助。unobe。这个函数很大。当我在小数据库(大约30个序列)上使用它时,它的速度是顺序的两倍。但当我试图在数据库上使用大约10000个序列时,它的速度很慢。还有一个问题:如果我使用的是并发向量或并发无序映射战斗也可能是问题?我选择它而不是关键部分,因为我认为它不会战斗。“MakeFunction很大”这有点让人困惑-但是你接着说的是“数据库”。在添加“数据库”这个词时,你改变了你的问题。也许你可以添加更多关于这个“MakeFunction”是什么和做什么的信息。@Queen:为什么选择无序映射(又称哈希表)作为输出结构?它是O(1)每次插入都必须维护查找,这不是免费的。使用大小为
sequenceCount
的普通向量可能更容易。它不需要是并发的,因为容器不需要更改大小,每个元素都由单个线程访问一次。确定:
std::vector示例(sequenceCount)
不幸的是MakeFunction很大。当我在小数据库上使用它时(大约30个序列),它的速度是顺序的两倍。但当我试图在数据库上使用大约10000个序列时,它的速度很慢。还有一个问题:如果我使用的是并发向量或并发无序映射战斗也可能是问题?我选择它而不是关键部分,因为我认为它不会战斗。“MakeFunction很大”这有点让人困惑-但是你接着说的是“数据库”。在添加“数据库”这个词时,你改变了你的问题。也许你可以添加更多关于这个“MakeFunction”是什么和做什么的信息。@Queen:为什么选择无序映射(又称哈希表)作为输出结构?它是O(1)每次插入都必须保持查找,这不是免费的。使用大小为
sequenceCount
的普通向量可能更容易。它不需要是并发的,因为容器不需要更改大小,每个元素都由单个线程访问一次。确保:
std::vector example(sequenceCount);
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());