我一直在研究并行循环(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);
}
};
任何陷阱将不胜感激!