2014-01-13 5 views
5

Ich arbeite in Simulationssoftware und eine der vielen Operationen auf Arrays ist Skalierung eines Vektors um eine Zahl.MKL oder BLAS Routine Vektor mit einem skalaren out-of-place zu multiplizieren

Ich habe Code wie folgt aus:

//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 kann getan werden, das folgende "in-place" geschrieben werden:

cblas_dscal(n, alpha, &input[0], 1); 

jedoch Dies wird die input Variable ändern, was nicht das ist, was ich will.

Ich versuchte mit der , aber es ist sehr langsam für diesen Vorgang.

+1

Sie suchen etwas, das tut 'B <- aA'? – 111111

+0

Ja @ 111111, genau. –

+1

'cblas_dcopy' dann' cblas_dscal' oder null und 'cblas_daxpy'? Wäre das langsamer? – francis

Antwort

1

Die Lösung, die ich kam, rief cblas_dcopy() dann cblas_dscal().

Es ist nicht die beste aller Welten, aber es ist immer noch schneller als die rohe Schleife.

+3

Haben Sie cblas_daxpy mit einem 0-Array versucht? –

+0

habe ich nicht, aber ich werde versuchen, dass –

1

Von Referenz MKL:

Die cblas_ axpy Routinen führen eine Operation Vektor-Vektor definiert als

y: = a * x + y wobei: a ist ein Skalar, x und y Vektoren sind jeweils mit einer Anzahl von Elementen, die gleich ist n.

1

Es ist eine Routine innerhalb der BLAS artigen Verlängerungen cblas_?axpby

Hier genannt ist ein Auszug aus der Dokumentation:

Scales zwei Vektoren, fügt sie einen anderen und speichert führen im Vektor zu einem .

Der Unterschied zu cblas_?axpy ist, dass Sie einen zweiten Skalierungsparameter für den Ergebnisvektor y haben. In Ihrem Fall könnten Sie einfach b := 0.0 einstellen und haben somit Ihre veraltete Skalierung in einem Anruf statt der beiden cblas_dcopy() und cblas_dscal().

Ihr Code könnte wie folgt aussehen:

//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: 
cblas_daxpby (output.size(), alpha, input.data(), 1, 0.0, output.data(), 1); 
+0

Das sieht wie die perfekte Lösung aus. Leider arbeite ich nicht mehr in dieser Firma und kann mir nicht wirklich sicher sein, dass das gemacht wird. –