Class parallel_for / parallel_for_each 内部或外部的对象?
Class object inside or outside a parallel_for / parallel_for_each?
我一直在研究并行循环 (C++11) 并使用 MS visual studio 2013 对其进行测试。我很清楚它们(lambdas esp.)非常酷。
但我担心的是我必须调用一个执行简单欧氏距离测量的函数。函数本身很清楚,但我必须将函数移动到名为 EuclideanDistance 的 class 并在函数 Match(vectorA,vectorB ) 在两个向量上,这只是一些范数(...) calculation.And returns 一个浮点值。
现在我该如何在 parallel_for/parallel_foreach 循环中处理这个问题?我是在循环内创建 class 对象还是在循环外保留 class 对象会导致不一致?如果我对并行循环的理解正确,那么它运行的函数基本上是每个启动线程的干净副本。 class 函数会发生这种情况吗?我的直觉是不!除非我在 class 中创建一个对象,如第二个代码片段所示。
例如
为了便于阅读,我保留了代码的缩写。
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只不过是一个函数而已。
class EuclideanDistance
{
public:
float Match(vectorA,vectorB)
{
return norm(vectorA,vectorB);
}
};
任何陷阱将不胜感激!
你是正确的,如果你在 parallel_for_each
lambda 主体之外定义你的 EuclideanDistance
对象,它将在执行 parallel_for_each
的所有工作线程之间共享。如果你的 Match()
函数有副作用影响你的 EuclideanDistance
对象中的共享状态,这将是一个问题,但在这种情况下,它可能会在 lambda 中定义对象(这将给出循环体的每次执行它自己的本地实例)与在外部定义它会有不同的结果。
只要您在 EuclideanDistance
对象上调用的任何函数没有副作用/不修改共享状态,那么您就可以使用在 lambda 之外定义的一个对象。如果您调用的函数有副作用,那么您需要自己进行同步,这可能会显着影响 parallel_for_each
的性能增益。
我一直在研究并行循环 (C++11) 并使用 MS visual studio 2013 对其进行测试。我很清楚它们(lambdas esp.)非常酷。
但我担心的是我必须调用一个执行简单欧氏距离测量的函数。函数本身很清楚,但我必须将函数移动到名为 EuclideanDistance 的 class 并在函数 Match(vectorA,vectorB ) 在两个向量上,这只是一些范数(...) calculation.And returns 一个浮点值。
现在我该如何在 parallel_for/parallel_foreach 循环中处理这个问题?我是在循环内创建 class 对象还是在循环外保留 class 对象会导致不一致?如果我对并行循环的理解正确,那么它运行的函数基本上是每个启动线程的干净副本。 class 函数会发生这种情况吗?我的直觉是不!除非我在 class 中创建一个对象,如第二个代码片段所示。
例如 为了便于阅读,我保留了代码的缩写。
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只不过是一个函数而已。
class EuclideanDistance
{
public:
float Match(vectorA,vectorB)
{
return norm(vectorA,vectorB);
}
};
任何陷阱将不胜感激!
你是正确的,如果你在 parallel_for_each
lambda 主体之外定义你的 EuclideanDistance
对象,它将在执行 parallel_for_each
的所有工作线程之间共享。如果你的 Match()
函数有副作用影响你的 EuclideanDistance
对象中的共享状态,这将是一个问题,但在这种情况下,它可能会在 lambda 中定义对象(这将给出循环体的每次执行它自己的本地实例)与在外部定义它会有不同的结果。
只要您在 EuclideanDistance
对象上调用的任何函数没有副作用/不修改共享状态,那么您就可以使用在 lambda 之外定义的一个对象。如果您调用的函数有副作用,那么您需要自己进行同步,这可能会显着影响 parallel_for_each
的性能增益。