MKL- oder BLAS-Routine zum Multiplizieren des Vektors mit einem skalaren Out-of-Place

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.