gpt4 book ai didi

c - 使用更新的 CPU 指令支持构建向后兼容的二进制文件

转载 作者:行者123 更新时间:2023-12-04 02:37:29 29 4
gpt4 key购买 nike

如果可用(在运行时测试),实现使用特定 CPU 指令(在运行时测试)的相同功能的多个版本的最佳方法是什么,或者如果没有,则回退到较慢的实现?

例如,x86 BMI2 提供了一个非常有用的 PDEP操作说明。我将如何编写 C 代码,以便在启动时测试执行 CPU 的 BMI2 可用性,并使用两种实现之一——一种使用 _pdep_u64调用(可与 -mbmi2 一起使用),另一个使用 C 代码“手动”进行位操作。是否有对此类情况的内置支持?在提供对较新内在函数的访问权限的同时,如何使 GCC 为较旧的架构进行编译?我怀疑如果函数是通过全局函数指针调用的,而不是每次都使用 if/else,执行速度会更快?

最佳答案

您可以通过调用 cpuid 声明一个函数指针并在程序启动时将其指向正确的版本。确定当前架构
但最好利用许多现代编译器的支持。 Intel的ICC有automatic function dispatching很久以前就为每个架构选择优化版本。我不知道细节,但看起来它只适用于英特尔的图书馆。此外,它仅调度到 Intel CPU 上的高效版本,因此将是 unfair to other manufacturers . Agner`s CPU blog 中有许多补丁和解决方法。
后来有一个功能叫做 Function Multiversioning介绍于 GCC 4.8 .它添加了 target您将在函数的每个版本上声明的属性

__attribute__ ((target ("sse4.2")))
int foo() { return 1; }

__attribute__ ((target ("arch=atom")))
int foo() { return 2; }

int main() {
int (*p)() = &foo;
return foo() + p();
}
这会重复很多代码并且很麻烦,所以 GCC 6 添加了 target_clones这告诉 GCC 将一个函数编译为多个克隆。例如 __attribute__((target_clones("avx2","arch=atom","default"))) void foo() {}将创建 3 个不同的 foo版本。有关它们的更多信息,请访问 GCC's documentation about function attribute
该语法随后被 Clang 采用。和 ICC .性能甚至可以优于全局函数指针,因为 function symbols can be resolved at process loading time而不是运行时。这是原因之一 Intel's Clear Linux运行 so fast . ICC 也可以创建 multiple versions of a single loop在自动矢量化期间
  • Function multi-versioning in GCC 6
  • Function Multi-Versioning
  • The - surprisingly limited - usefulness of function multiversioning in GCC
  • Generate code for multiple SIMD architectures

  • 这是来自 The one with multi-versioning (Part II) 的示例连同它的 demo这是关于 popcnt 但你明白了
    __attribute__((target_clones("popcnt","default")))
    int runPopcount64_builtin_multiarch_loop(const uint8_t* bitfield, int64_t size, int repeat) {
    int res = 0;
    const uint64_t* data = (const uint64_t*)bitfield;

    for (int r=0; r<repeat; r++)
    for (int i=0; i<size/8; i++) {
    res += popcount64_builtin_multiarch_loop(data[i]);
    }

    return res;
    }
    请注意 PDEP and PEXT are very slow on current AMD CPUs所以它们应该只在英特尔上启用

    关于c - 使用更新的 CPU 指令支持构建向后兼容的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61005492/

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