gpt4 book ai didi

c++ - `valarray` 是否能够利用 SIMD 支持?

转载 作者:行者123 更新时间:2023-12-05 05:37:23 25 4
gpt4 key购买 nike

我知道 valarray 类最初是为了优化高速数值计算而实现的。

作为一个缺点,它的许多设计方面都支持这一点 - 例如限制指针别名的restrict-type 机制,或者缺少范围检查 -对开发人员施加繁琐的限制,并增加运行时错误的风险。valarray 无法执行 append()emplace() 也是一个问题。

另一方面,valarray 的吸引力在于它能够将 vector 运算呈现为标量表达式:

#include <valarray>
using std::valarray

int main() {
valarray<int> a = {1, 2, 3}, b = {4, 5, 6};
valarray<int> c = a + b;
// instead of a loop or something like transform(begin(a), end(a), begin(b), begin(c), plus<int>());
}

用户喜欢简洁的符号,例如上面的语言,就像在 FORTRAN 和 Matlab 中一样。

主要优势是,这消除了求助于 Eigen 或 Blitz++ 等外部库,或求助于表达式模板等奇特结构的需要。

在自定义 myVector 类中使用 friend 运算符可以很容易地模拟上面代码中的 vector 和:

myVector<int>& operator+(const myVector<int>& a, const myVector<int>& b) { 
for (size_t i=0, i!=a.size(), ++i)
c[i] = a[i] + b[i];

return c;
}

但我怀疑 valarray 的实现如此简单。

实际上,我了解到现代 CPU 具有原生 SIMD(同一指令多数据)功能。也就是说,他们可以将相同的指令应用于多个合并数据的 block 。这是一种硬件级矢量化,在编译时优化代码时由(足够现代的)编译器自动激活。

显然,为了让编译器使用 SIMD,程序员所能做的最多的事情就是对数据进行编码以便它们连续存储,并使用 STL 算法 函数代替循环。顺便说一句,这与 GPU 为促进涉及多维 vector 的计算所做的工作非常相似。

鉴于以上所有情况,对我来说,valarray 的使用应该会自动刺激编译器实现 SIMD,这似乎合乎逻辑。是这样吗?

我知道英特尔在几年前从默默无闻中挖出了 valarray,现在提供了矢量化数学函数库。他们是否设法调整 valarray 以供 SIMD 使用?

最佳答案

Intel 有自己的 valarray 实现,用于实现性能优势和并行性。

英特尔的 valarray 实现使用英特尔® 集成性能原语(英特尔® IPP),它是英特尔 BaseToolkit 的一部分。

请引用以下链接:

https://www.intel.com/content/www/us/en/develop/documentation/cpp-compiler-developer-guide-and-reference/top/compiler-reference/libraries/intel-c-class-libraries/intel-s-valarray-implementation.html

关于c++ - `valarray` 是否能够利用 SIMD 支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73138069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com