是 std::transform SIMD 功能吗?

Posted

技术标签:

【中文标题】是 std::transform SIMD 功能吗?【英文标题】:Is std::transform SIMD function? 【发布时间】:2020-12-01 21:52:50 【问题描述】:

是 std::transform SIMD 吗?我的意思是如果我有两个数组 std::array<int,4> a1,2,3,4;std::array<int,4> b1,2,3,4;。让我们将这两个数组与std::transform(a.begin(),a.end(),b.begin(),result.begin(),std::plus<>()); 相加,并将结果存储在一个新的std::array<int,4> result; 数组中。我用 SIMD 命令求和了吗?如果不是,我怎样才能实现 SIMD?

注意:我正在使用 clang 进行编译,优化级别为 -O3 并进行发布构建。

【问题讨论】:

唯一知道的方法是编译和检查程序集。 C++ 标准不要求它创建 SIMD 指令。 这将取决于编译器、编译器标志和可能的编译指示 @1201ProgramAlarm 更新了问题 @NathanOliver 我不太懂汇编,不过这是godboltgodbolt.org/z/KE53cK生成的汇编代码,请看) 如果您真的非常想要一个 simd 转换,请查看github.com/xtensor-stack/xsimd 【参考方案1】:

std::transform 是否使用 SIMD 指令取决于实现和编译器。 如果您需要确保您的转换使用 SIMD 功能,这里有一个库,它提供了一个与 STL 具有相同接口的 SIMD 转换函数https://github.com/xtensor-stack/xsimd

【讨论】:

std::transform 绝对不是 SIMD,因为您可以传入您选择的任何操作。在内联所有内容之后,如果您传入适合 SIMD 的操作,编译器有时可能能够优化生成的代码,就像编译器可以转换任何循环一样。 C++ 库确实包含用于矢量化操作的数据类型 -- std::valarray<T> -- 其中使用 SIMD 仍然是实现质量问题,但选择的操作肯定是 SIMD 友好的。 不太可能是的,我绝对不会说,你可以专攻某些电话,不是吗?

以上是关于是 std::transform SIMD 功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::transform 从特定目标偏移量插入目标

Mono中的SIMD还有什么发展吗?

我可以将SIMD内在函数用于在云上运行的软件吗?

我可以将 SIMD 内在函数用于在云上运行的软件吗?

std::transform 到任意容器

理解std::transform