MKL 或 BLAS 例程,用于将矢量乘以标量错位
MKL or BLAS routine to multiply vector by a scalar out-of-place
我在仿真软件中工作,在数组上完成的众多操作之一是按数字缩放向量。
我有这样的代码:
//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 是标量,x 和 y 是向量,每个向量都有等于 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);
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 什么是临时错位
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 特征中的自定义标量类型
- 为什么从具有较大阵列的 SIMD 内部函数中获得的相对加速比标量更大?
- 如何在C++中将一个特征张量乘以另一个特征张量的标量和?
- 标量类型的特征模板无法编译固定大小的子矩阵操作
- 结构 init:字符**类型的标量初始值设定项两边的大括号
- 将标准::时间点乘以标量
- 请求从"点*"转换为非标量类型"点"
- 循环中标量乘积的自动矢量化
- 转换为非标量误差是什么意思?我该如何解决?
- 标量类型上的特征模板
- 迭代器和标量对象之间的未定义行为有什么区别吗?
- C++中的标量初始值设定项错误两边的大括号
- MSVC 编译器/链接器何时合成标量/矢量删除析构函数
- 通过运算符使用标量参数重写来修改类成员
- 错误:在 C++ 中从 'Counter' 转换为非标量类型'CountDn'
- MKL 或 BLAS 例程,用于将矢量乘以标量错位