gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:06:37 24 4
gpt4 key购买 nike

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

但我担心的是我必须调用一个函数来执行简单的欧氏距离测量。函数本身很清楚,但我必须将该函数移动到一个名为 EuclideanDistance 的类中,并在函数 Match(vectorA,vectorB) 中对两个 vector 进行欧几里得数学运算只是一些 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);
}
};

如有任何陷阱,我们将不胜感激!

最佳答案

你是对的,如果你定义你的 EuclideanDistance parallel_for_each 之外的对象lambda 主体,它将在执行 parallel_for_each 的所有工作线程之间共享.如果您的 Match() 这将是一个问题函数有影响共享状态的副作用 EuclideanDistance对象,但在那种情况下,它很可能在 lambda 内部定义对象(这将为循环体的每次执行提供其自己的本地实例)将与在外部定义它产生不同的结果。

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

关于c++ - parallel_for/parallel_for_each 内部或外部的类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32258006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com