26 Ağustos 2019 Pazartesi

std::reduce - Paralel Çalışabilir

Giriş
C++14 ile geldi. Şu satır dahil edilir.
#include <numeric>
Paralel çalışabildiği için std::accumulate metoduna tercih edilebilir

Binary işlem associative ve commutative olmalıdır. Açıklaması şöyle
The behavior is non-deterministic if binary_op is not associative or not commutative.
Associative (Birleşme Özelliği) Nedir
Birleşme Özelliği 3 tane elemanın işlem sırasının değiştirilebilmesi ve sonucun etkilenmemesidir. Yani
(a + b) + c ile a + (b + c)
işlemlerinin aynı sonucu vermesidir.
Commutative (Değişme Özelliği)  Nedir
Değişme Özelliği ikili bir işlemde değerlerin yer değiştirebilmesi ve sonucun etkilenmemesidir. Yani
a + b = b + a
olabilmesidir.

Matematiksel olarak Değişme Özelliğini bozan bir kaç sayı olması genel özelliği bozmaz. Açıklaması şöyle. Ancak bu durum kodlama açısından kabul edilebilir değil.
An operation is commutative if for any aa and bb, we have ab=ba. Finding one pair a,ba,b such that ab=baab=ba doesn't prove the operation is commutative; this has to hold for every pair.
İmzası
İmzası şöyle.
template<class InputIt, class T>
T reduce(InputIt first, InputIt last, T init);
İmzası şöyle.
template<class ExecutionPolicy, class ForwardIt, class T, class BinaryOp>
T reduce(ExecutionPolicy&& policy,
         ForwardIt first, ForwardIt last, T init, BinaryOp binary_op);
Örnek
Şöyle yaparız.
double algorithm_polynomials(const vector<double> & coeffs, double x) {
  return reduce(execution::seq, cbegin(coeffs), end(coeffs), 0, ...);
}
std::par ile kullanımı
Şu satır dahil edilir.
#include <execution_policy>
std::par'ın açıklaması şöyle
Any such invocations executing in the same thread are indeterminately sequenced with respect to each other.
Şöyle yapılır
std::vector<double> v(10'000'007, 0.5);
double result = std::reduce(std::par, v.begin(), v.end());

Hiç yorum yok:

Yorum Gönder