如下代码:
#include <ppl.h>
int i;
vector<int> val(10),summ(10,0);
for(i=0;i<10;i++) val[i]=i;
parallel_for(0, 10, [&] (int y){
vector<int> vett(1000);
double vall=val[y];
for(i=0;i<vett.size();i++)
vett[i]=vall;
for(i=0;i<vett.size();i++)
summ[y]+=vett[i];
});
for(i=0;i<10;i++)
cout<<summ[i]<<endl;
产生如下的随机输出:
0
1000
1468
204
3600
25
5898
7000
7456
1395
我猜应该使用“可组合的”,但是我发现的文档不是很好。您知道如何使此代码正常工作吗?如果vett是2d vector 怎么办?
由于我想学习并行计算,因此值得学习这个新的Microsoft库还是有更好的选择?
最佳答案
代码的主要问题是i
下标变量。多个并行任务同时使用。随之而来的是困惑,这是产生奇怪结果的原因。最简单的解决方法是像这样在lambda中声明循环:
for(int i=0;i<vett.size();i++)
vett[i]=vall;
for(int i=0;i<vett.size();i++)
summ[y]+=vett[i];
注意,每个循环索引都在
for
循环初始化中声明。这是更惯用的用法,可以在所有循环中使用,除非循环结束后确实需要i
的最终值。关于c++ - 人,如何正确使用它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9269535/