MKL- oder BLAS-Routine zum Multiplizieren des Vektors mit einem skalaren Out-of-Place
Ich arbeite mit Simulationssoftware und eine der vielen Operationen, die auf Arrays ausgeführt werden, ist das Skalieren eines Vektors um eine Zahl.
Ich habe Code wie folgt:
//Just some initialization code, don't bother about this part
int n = 10000;
std::vector<double> input(n, 42.0);
std::vector<double> output(input.size());
double alpha = 69.0;
//the actual calculation:
for (size_t i = 0; i < n; ++i) {
output[i] = input[i] * alpha;
}
Ich habe die MKL-Bibliothek zur Verfügung, so dass, wenn meine Berechnungen "in-place" durchgeführt werden, Folgendes geschrieben werden kann:
cblas_dscal(n, alpha, &input[0], 1);
Dadurch ändert sich jedoch der input
Variable, was ich nicht will.
Ich habe versucht, den mkl_domatcopy()
zu verwenden aber es ist sehr langsam für diese Operation.
Antworten:
Die Lösung, die ich mir ausgedacht habe, war der Aufruf von cblas_dcopy()
dann cblas_dscal()
.
Es ist nicht die beste aller Welten, aber es ist immer noch schneller als die Rohschleife.