这就是我对SIMD的了解。单指令-多数据是一种处理数据的方法,它对多个值的向量执行相同的指令。SIMD是根据机器的处理器(SSE、SSE2、NEON.)在不同级别上实现的,每个级别都提供了不同的指令集。
我们可以通过包含immintrin.h来使用这些指令集。我还没有真正理解的是:当实际使用SIMD开发某些东西时,我们应该关心检查支持哪些指令集吗?开发这类程序时的最佳做法是什么?例如,如果一个指令集不受支持,我们应该做什么?我们应该提供一个非SIMD替代方案,还是编译器为我们解压缩整个事情?
发布于 2021-12-19 11:10:48
当然,我们需要注意支持哪一个ISA,因为如果我们使用一个未知的指令,那么程序就会被一个不支持的指令信号杀死。此外,它还允许我们为每个体系结构进行优化,例如在带有AVX-512的CPU上,我们可以使用AVX-512来获得更好的性能,但是如果在较老的CPU上,我们可以回到适合该体系结构的版本。
开发这类程序时的最佳做法是什么?
没有一般的最佳做法。这取决于每种情况,因为每个编译器都有不同的工具。
target和target_clones。请参阅使用新的CPU指令支持构建向后兼容的二进制文件发布于 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在性能方面带来了太多的利润时,我确实实现了两个替代方案和一个运行时调度。
https://stackoverflow.com/questions/70410806
复制相似问题