parallel_for / parallel_for_each内部或外部的类对象?

时间:2015-08-27 19:33:08

标签: c++ c++11 mfc ppl

我一直在研究并行循环(C ++ 11)并使用MS visual studio 2013测试它们。我很清楚它们(lambdas esp。)非常酷。

但我担心的是我必须调用一个执行简单的欧氏距离测量的函数。函数本身很清楚,但是我必须将函数移动到一个名为 EuclideanDistance 的类中,并在函数匹配(vectorA,vectorB)中对两个向量进行欧几里德数学运算。只是一些规范(...)计算。并返回一个浮点值。

现在我如何在parallel_for / parallel_foreach循环中进行此操作?我是在循环中创建类对象还是将类对象保留在循环外会导致不一致?如果我理解正确的并行循环,它所运行的函数基本上是每个启动的线程的干净副本。在类函数的情况下会发生这种情况吗?我的预感不是!除非我在类中创建一个对象,如第二个代码片段所示。

e.g。 为了便于阅读,我保留了代码缩写。

vectorA; // Floating point array of 1024 entries.
concurrent_queue vectorQ; // each entry in the queue is a 1024 array
EuclideanDistance euclid;
parallel_for_each(begin,end,[&](auto item)
{
    auto distance = euclid.Match(vectorA,item);
});

或者这是正确的做法吗?

parallel_for_each(begin,end,[&](auto item)
{
EuclideanDistance euclid;
    auto distance = euclid.Match(vectorA,item);
});

整个课程只不过是一个单一的功能。

    class EuclideanDistance
    {
public:
       float Match(vectorA,vectorB)
        {
           return norm(vectorA,vectorB); 
        }
    };

任何陷阱都会受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

如果您在EuclideanDistance lambda正文之外定义parallel_for_each对象,那么它是正确的,它将在执行parallel_for_each的所有工作线程中共享。如果您的Match()函数具有影响EuclideanDistance对象中共享状态的副作用,那么这将是一个问题,但在这种情况下,它很可能在lambda中定义对象(这将给出循环体的每次执行)它自己的本地实例)在外面定义它会产生不同的结果。

只要您在EuclideanDistance对象上调用的任何函数没有副作用/不修改共享状态,那么您可以使用在lambda之外定义的一个对象。如果您正在调用具有副作用的函数,那么您需要进行自己的同步,这可能会显着影响parallel_for_each的性能增益。