0

我一直在研究并行循环(C++11)并使用 MS Visual Studio 2013 对其进行测试。我很清楚它们(尤其是 lambdas)非常酷。

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

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

例如,为了便于阅读,我将代码保持缩写。

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); 
        }
    };

任何陷阱将不胜感激!

4

1 回答 1

1

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

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

于 2015-08-27T20:16:36.250 回答