Rutina MKL o BLAS para multiplicar vector por un escalar fuera de lugar

Rutina MKL o BLAS para multiplicar vector por un escalar fuera de lugar


Trabajo en un software de simulación y una de las muchas operaciones que se realizan en los arreglos es escalar un vector por un número.


Tengo un código como este:


//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;
}

Tengo la biblioteca MKL disponible, por lo que si mis cálculos se realizan "in situ", se puede escribir lo siguiente:


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

Sin embargo, esto cambiará el input variable, que no es lo que quiero.


Intenté usar el mkl_domatcopy() pero es muy lento para esta operación.


Respuestas:


La solución que se me ocurrió fue llamar a cblas_dcopy() entonces cblas_dscal() .


No es el mejor de todos los mundos, pero sigue siendo más rápido que el bucle sin formato.