Ich versuche, eine Summe von komponentenweise Exponentialfunktionen eines Arrays zu berechnen. Das Array ist ein Eigen::ArrayXd
, also erwarte ich, dass Eigens exp
Funktion auf denselben Code oder besser als eine manuelle Schleife optimiert wird. Stattdessen sehe ich, dass eine manuelle Schleife einige zehn Prozent schneller ist. (Im folgenden Beispiel ungefähr 2,1 Sekunden für Eigen und 1,6 Sekunden für eine manuelle Schleife.)Eigener Ausdruck Vorlage langsamer als manuelle Schleife für exponentielle
Ich verwende keine Eigen-Vektorisierung (SSE ist deaktiviert), MKL oder irgendetwas anderes Besonderes. Dies ist nur ein Standard-Visual Studio 2010-Projekt in der Release-Konfiguration mit Eigen 3.2.9 out-of-the-box. Die Angabe von "Vollständige Optimierung" (/ Ox) und "Bevorzugter schneller Code" (/ Ot) macht keinen Unterschied zu den Ergebnissen.
Ich bin nicht sachkundig genug, um kompilierten Code zu sehen, um zu verstehen, was passiert - könnte jemand vorschlagen, warum Eigennutzung direkt langsamer sein könnte, und wie man es dazu bringt, die gleiche Leistung wie eine manuelle Schleife zu erzeugen?
#include <ctime>
#include <iostream>
#include <Eigen/Dense>
int main(int argc, char* argv[])
{
const Eigen::ArrayXd xs(Eigen::ArrayXd::Random(1000000));
Eigen::ArrayXd array_result(Eigen::ArrayXd::Zero(xs.size())), loop_result(Eigen::ArrayXd::Zero(xs.size()));
{
std::clock_t start_time = std::clock();
for (int i = 1; i <= 100; ++i) {
const double b = i; // Values not important;
array_result += exp(b * xs);
}
std::clock_t end_time = std::clock();
std::cout << "Array time (seconds): " << static_cast<double>(end_time - start_time)/CLOCKS_PER_SEC << std::endl;
}
{
std::clock_t start_time = std::clock();
for (int i = 1; i <= 100; ++i) {
const double b = i; // Values not important;
for (Eigen::ArrayXd::Index i = 0; i < xs.size(); ++i) {
loop_result[i] += exp(b * xs[i]);
}
}
std::clock_t end_time = std::clock();
std::cout << "Loop time (seconds): " << static_cast<double>(end_time - start_time)/CLOCKS_PER_SEC << std::endl;
}
system("pause");
return 0;
}
Haben Sie versucht, '(b * xs) .exp()'? –
Sie haben 'EIGEN_DONT_VECTORIZE' definiert? – kangshiyin
@Avi, ich habe versucht '(b * xs) .exp()' - die Leistung schien identisch. @ kangshiyin, das'EIGEN_DONT_VECTORIZE' definiert, scheint die Leistung nicht zu beeinträchtigen. – GavinTruter