Я изучал параллельные циклы (С++ 11) и тестировал их с помощью MS Visual Studio 2013. Мне они понятны (особенно лямбда-выражения), которые довольно круты.
Но меня беспокоит то, что я должен вызвать функцию, которая выполняет простую евклидову меру расстояния. Функция сама по себе понятна, но я должен переместить функцию в класс с именем EuclideanDistance и выполнить евклидовы вычисления внутри функции Match(vectorA,vectorB) для двух векторов, которые просто вычисление нормы (...). И возвращает значение с плавающей запятой.
Теперь, как мне это сделать внутри цикла 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);
}
};
Любые подводные камни будут высоко оценены!
Match()
состояние объектаEuclideanDistance
? Если это так, вы можете столкнуться с проблемами при объявлении его за пределами вашегоparallel_for_each
, но вы также ожидаете других результатов от объявления его внутри, если изменения состояния повлияют на результаты ваших вычислений. - person mattnewport   schedule 27.08.2015Match()
не имеет побочных эффектов, ее безопасно использовать внутри вашегоparallel_for_each
везде, где вы определяете объектEuclideanDistance
. - person mattnewport   schedule 27.08.2015static
? Тогда объект не нужен. - person Blacktempel   schedule 28.08.2015