*
@Swordfish sagte in Wartbarkeit std::any_of:
Ich finde den ausdrucksvollen Namen eines Algorithms scheller und einfacher zu lesen als eine Schleife.
Das klingt zuerst ganz toll. Aber Algorithmen sollten einen bestimmten Grad an Abstraktion bieten, und bei trivialen Schleifen ist das nicht mehr der Fall. Zudem wird man irgend wann doch eine Schleife im Code haben müssen, nämlich dann wenn man den Algorithmus implementiert.
Dazu kommt ein weiterer Aspekt. Die ganzen tollen neuen C++ Sprachfeatures sind nur ein Versprechen auf eine tolle Zukunft, aber sie bieten deutlich weniger als die alten etablierten Sprachfeatures, weil man sich bei der Einführung dieser nicht darauf geachtet hat, dass sie mit alten Erweiterungen kompatibel sind.
Jetzt vier mal das gleiche und die Frage ist, was ist in der Praxis die beste Lösung?
#include <mkl_cblas.h>
#include <iostream>
#include <numeric>
#include <vector>
int main() {
const size_t s = 100000;
std::vector<double> v1(s), v2(s);
double r = 0.0;
// (1)
for (size_t i = 0; i < s; ++i) {
r += v1[i] * v2[i];
}
// (2)
r = inner_product(v1.begin(), v1.end(), v2.begin(), 0.0);
// (3)
#pragma omp parallel for shared(v1, v2) reduction (+:r)
for (size_t i = 0; i < s; ++i) {
r += v1[i] * v2[i];
}
// (4)
r = cblas_ddot(s, v1.data(), 0, v2.data(), 0);
}
Die Schleife 3 ist eine Variation der ersten Schleife, und die Lösung vier ist die klassische Algorithmenlösung, die man so seit einer halben Ewigkeit im HPC nutzt. Was kann 2 besser als 4?