c++ - 如何在运行时区分 C++ 中的 Intel CPU 各代?

标签 c++ x86 intel simd intrinsics

SIMD has had an initialisation cost on Intel CPUs in the past.因此,我正在寻找一种方法来在 C++ 运行时区分哪一代 Intel CPU 正在运行我的程序。

是否有一种简单的方法来区分所有早于 Ice Lake 的 Intel CPU ?

注意:detecting whether the CPU running is an Intel CPU相当简单,但遗憾的是对于这个用例来说还不够。

最佳答案

您可以让编译器在加载时使用编译器目标属性(或 GCC 所说的函数多版本控制)来计算出它,而不是在运行时手动检查 cpu 属性。

不幸的是,即使在“三大”编译器之间,它也不是标准功能,但 clang 和 gcc 至少提供了类似的实现。

a tutorial here讨论了一些边缘情况的解决方法,但总的来说这应该是相当透明的。

您可以查看this code on Github但基本上有两种方法可以做到这一点。

首先使用target,您可以手动实现每个架构的版本

namespace detail {
inline Vector multiply(const Matrix& m, const Vector& v) {
    Vector r;
    r[0] = v[0] * m[0] + v[1] * m[2];
    r[1] = v[0] * m[1] + v[1] * m[3];
    return r;
}
}  // namespace detail

__attribute__((target("default"))) Vector multiply(const Matrix& m, const Vector& v) {
    printf("default\n");
    return detail::multiply(m, v);
}

__attribute__((target("arch=core2"))) Vector multiply(const Matrix& m, const Vector& v) {
    printf("core2\n");
    return detail::multiply(m, v);
}

__attribute__((target("arch=sandybridge"))) Vector multiply(const Matrix& m, const Vector& v) {
    printf("sandybridge\n");
    return detail::multiply(m, v);
}

如果所有实现在代码中都相似,那么当您选择所有可能的架构对其进行版本控制时,使用 target_clones 会更方便。

__attribute__((target_clones("default", "arch=core2", "arch=sandybridge", "arch=haswell", "arch=cascadelake",
                             "arch=znver1", "arch=znver2"))) Vector
multiply(const Matrix& m, const Vector& v) {
    Vector r;
    r[0] = v[0] * m[0] + v[1] * m[2];
    r[1] = v[0] * m[1] + v[1] * m[3];
    return r;
}) 

运行后,链接的代码将自动为您的目标计算机选择正确的实现。

了解更多:Documentation

关于c++ - 如何在运行时区分 C++ 中的 Intel CPU 各代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77436818/

相关文章:

linux - 使用数组组装 x86 中的汉诺塔

c - 执行新程序时,ESP 和 EBP 寄存器如何操作?

c++ - Intel TBB 会在 AMD 处理器上工作吗?

c - 在一个 _mm_load_si128 上使用两个 _mm_loadl_epi64

c++ - 如何生成 24 个字符的 UUID?

c++ - 创建密集的动态数组(值数组)作为库

c++ - 找到稀疏矩阵( Eigen )最大值的有效方法

不同编译器中的 C++ 标准库实现

assembly - x86 中是否允许访问跨越零边界的内存?

vectorization - 如何理解icc编译器优化报告中的加速比?