MKL 或 BLAS 例程,用于将矢量乘以标量错位

MKL or BLAS routine to multiply vector by a scalar out-of-place

本文关键字:标量 错位 BLAS 例程 用于 MKL      更新时间:2023-10-16

我在仿真软件中工作,在数组上完成的众多操作之一是按数字缩放向量。

我有这样的代码:

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

我有可用的 MKL 库,因此如果我的计算是"就地"完成的,则可以编写以下内容:

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

但是,这将更改input变量,这不是我想要的。

我尝试使用mkl_domatcopy()但此操作非常慢。

我想

出的解决方案是打电话给cblas_dcopy()然后cblas_dscal()

它不是所有世界中最好的,但它仍然比原始循环更快。

来自 MKL 参考:

cblas_?axpy 例程执行向量-向量操作,定义为

y

:= a * x + y其中:a 是标量,xy 是向量,每个向量都有等于 n 的元素数。

在类似 BLAS 的扩展中有一个例程,称为 cblas_?axpby

以下是文档的摘录:

缩放两个向量,将它们相互相加,并将结果存储在 向量。

cblas_?axpy的区别在于,结果向量 y 上有第二个缩放参数。在您的情况下,您可以只设置b := 0.0,从而在一次调用中缩放您的错位,而不是两个cblas_dcopy()cblas_dscal()

您的代码可能如下所示:

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