我一直在研究并行循环(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);
}
};
任何陷阱都会受到高度赞赏!
答案 0 :(得分:1)
如果您在EuclideanDistance
lambda正文之外定义parallel_for_each
对象,那么它是正确的,它将在执行parallel_for_each
的所有工作线程中共享。如果您的Match()
函数具有影响EuclideanDistance
对象中共享状态的副作用,那么这将是一个问题,但在这种情况下,它很可能在lambda中定义对象(这将给出循环体的每次执行)它自己的本地实例)在外面定义它会产生不同的结果。
只要您在EuclideanDistance
对象上调用的任何函数没有副作用/不修改共享状态,那么您可以使用在lambda之外定义的一个对象。如果您正在调用具有副作用的函数,那么您需要进行自己的同步,这可能会显着影响parallel_for_each
的性能增益。