如下代码:

#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/

10-09 07:33