首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对C语言SIMD的澄清

对C语言SIMD的澄清
EN

Stack Overflow用户
提问于 2021-12-19 10:58:15
回答 2查看 498关注 0票数 3

这就是我对SIMD的了解。单指令-多数据是一种处理数据的方法,它对多个值的向量执行相同的指令。SIMD是根据机器的处理器(SSE、SSE2、NEON.)在不同级别上实现的,每个级别都提供了不同的指令集。

我们可以通过包含immintrin.h来使用这些指令集。我还没有真正理解的是:当实际使用SIMD开发某些东西时,我们应该关心检查支持哪些指令集吗?开发这类程序时的最佳做法是什么?例如,如果一个指令集不受支持,我们应该做什么?我们应该提供一个非SIMD替代方案,还是编译器为我们解压缩整个事情?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-19 11:10:48

当然,我们需要注意支持哪一个ISA,因为如果我们使用一个未知的指令,那么程序就会被一个不支持的指令信号杀死。此外,它还允许我们为每个体系结构进行优化,例如在带有AVX-512的CPU上,我们可以使用AVX-512来获得更好的性能,但是如果在较老的CPU上,我们可以回到适合该体系结构的版本。

开发这类程序时的最佳做法是什么?

没有一般的最佳做法。这取决于每种情况,因为每个编译器都有不同的工具。

  • 如果编译器不支持动态调度,则需要为每个ISA编写单独的代码,并为当前平台调用相应的版本
  • 一些编译器会自动分派到为运行平台进行优化的版本,例如ICC可以编译一个热循环以分离SSE/AVX/AVX-512的不同版本,并跳转到正确的版本以获得最大的性能。
  • 其他一些编译器支持编译单个函数的不同版本并自动分派,但您需要指定要优化的函数。例如,在GCC、Clang和ICC中,您可以使用属性targettarget_clones。请参阅使用新的CPU指令支持构建向后兼容的二进制文件
票数 3
EN

Stack Overflow用户

发布于 2021-12-19 15:28:12

我们应该关心检查哪些指令集是支持的吗?

通常是的,但不总是这样。如果您为PC编译64位代码,您将得到SSE1和SSE2的保证,这两种代码都是AMD64指令集的一部分,保证会得到支持。

开发这类程序时的最佳做法是什么?

与人们就您正在开发的软件的最低硬件要求进行协商。如果你没有老板,客户,或用户,找一些统计数据,并试图作出有根据的猜测。蒸汽有一个不错的个人电脑玩家的统计数据谁安装了他们的软件,展开“其他设置”,你会看到百分比的全球用户与特定指令集。

就我个人而言,我认为在2021年,要求SSE达到并包含SSE 4.1通常是可以的,如果不支持,则在启动时失败。假设您可以优雅地这样做,即在硬件需求中和运行时向最终用户显示一条关于不支持的CPU的可理解错误消息。

我们应该提供一种非SIMD的替代方案吗?

在过去的十年里,99%的新电脑至少有4GB内存和64位操作系统。我认为对于大多数项目来说,只发布64位二进制文件是可以的,这给了你SSE 1和2,不需要标量替代。

有时,当我需要支持仅支持SSE的CPU但AVX在性能方面带来了太多的利润时,我确实实现了两个替代方案和一个运行时调度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70410806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档