与 AVX/AVX2 一起使用的最低 OS X 版本是什么?

2023-11-30

我有一个图像绘制例程,为 SSE、SSE2、SSE3、SSE4.1、SSE4.2、AVX 和 AVX2 编译多次。 我的程序通过检查 CPUID 标志来动态调度这些二进制变体之一。

在 Windows 上,我检查 Windows 版本,如果操作系统不支持 AVX/AVX2 调度,则禁用它们。 (例如,仅 Windows 7 SP1 或更高版本支持 AVX/AVX2。)

我想在 Mac OS X 上做同样的事情,但我不确定哪个版本的 OS X 支持 AVX/AVX2。

请注意,我想知道的是与 AVX/AVX2 一起使用的 OS X 的最低版本。不支持 AVX/AVX2 的机器型号。


为了检测指令集功能,我参考了两个源文件:

  1. 神秘的cpu_x86.cpp
  2. 阿格纳·福格指令集检测.cpp

如果您的操作系统支持 AVX 和其他功能,这两个文件都会告诉您如何通过 AVX2 以及 XOP、FMA3、FMA4 检测 SSE。

我习惯了 Agner 的代码(MSVC、GCC、Clang、ICC 的一个源文件),所以让我们先看一下。

以下是相关代码片段instrset_detect.cpp用于检测 AVX:

iset = 0;                                              // default value
int abcd[4] = {0,0,0,0};                               // cpuid results
cpuid(abcd, 0);                                        // call cpuid function 0
//....
iset = 6;                                              // 6: SSE4.2 supported
if ((abcd[2] & (1 << 27)) == 0) return iset;           // no OSXSAVE
if ((xgetbv(0) & 6) != 6)       return iset;           // AVX not enabled in O.S.
if ((abcd[2] & (1 << 28)) == 0) return iset;           // no AVX
iset = 7;                                              // 7: AVX supported

with xgetbv定义为

// Define interface to xgetbv instruction
static inline int64_t xgetbv (int ctr) {    
#if (defined (_MSC_FULL_VER) && _MSC_FULL_VER >= 160040000) || (defined (__INTEL_COMPILER) && __INTEL_COMPILER >= 1200) // Microsoft or Intel compiler supporting _xgetbv intrinsic

    return _xgetbv(ctr);                                   // intrinsic function for XGETBV

#elif defined(__GNUC__)                                    // use inline assembly, Gnu/AT&T syntax

   uint32_t a, d;
   __asm("xgetbv" : "=a"(a),"=d"(d) : "c"(ctr) : );
   return a | (uint64_t(d) << 32);

#else  // #elif defined (_WIN32)                           // other compiler. try inline assembly with masm/intel/MS syntax

  //see the source file
}

我没有包括cpuid函数(参见源代码),我从中删除了非 GCC 内联汇编xgetbv使答案更短。

这里是detect_OS_AVX()来自神秘的cpu_x86.cpp用于检测 AVX:

bool cpu_x86::detect_OS_AVX(){
    //  Copied from: http://stackoverflow.com/a/22521619/922184

    bool avxSupported = false;

    int cpuInfo[4];
    cpuid(cpuInfo, 1);

    bool osUsesXSAVE_XRSTORE = (cpuInfo[2] & (1 << 27)) != 0;
    bool cpuAVXSuport = (cpuInfo[2] & (1 << 28)) != 0;

    if (osUsesXSAVE_XRSTORE && cpuAVXSuport)
    {
        uint64_t xcrFeatureMask = xgetbv(_XCR_XFEATURE_ENABLED_MASK);
        avxSupported = (xcrFeatureMask & 0x6) == 0x6;
    }

    return avxSupported;
}

神秘显然是从这个答案.

请注意,两个源文件基本上执行相同的操作:检查 OSXSAVE 位 27,检查 CPUID 中的 AVX 位 28,检查来自xgetbv.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

与 AVX/AVX2 一起使用的最低 OS X 版本是什么? 的相关文章

  • 在 OS X 中,如何检测当前活动应用程序何时发生变化?

    尝试为 OS X 编写一个应用程序 该应用程序根据当前的应用程序触发行为 它不需要与它交互 它只需要知道何时更改以及更改内容 任何人都可以推荐哪些 API 可用于此目的吗 我的猜测是辅助服务中的某些内容 因为这是大多数应用程序 例如 Bet
  • NSView 鼠标跟踪

    我在 Mac OS X 上遇到了 Cocoa NSView 的奇怪行为 我在 NSView 容器中有一个自定义 NSView 这个自定义 NSView 跟踪鼠标移动 点击 并有一个工具提示 当我在所描述的视图上方添加 NSView 时 即使
  • OS X Cocoa 自动布局隐藏元素

    我正在尝试使用新的自动布局 http developer apple com library mac documentation UserExperience Conceptual AutolayoutPG Articles Introdu
  • 有 Mac 版的 IE 测试器吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 未加载库:@rpath/libopenblasp-r0.2.19.dylib

    我应该如何解决这个问题 Monas MacBook Pro 02 02 mona python Python 3 6 1 Anaconda custom x86 64 default May 11 2017 13 04 09 GCC 4 2
  • Cocoa 我可以隐藏/显示 NSTextField / NSSecureTextField

    有没有办法在 Cocoa 中打开和关闭 secureTextField 操作系统 我希望用户可以选择查看他们的密码 在 iOS 中 我可以执行类似 textField setSecureTextEntry YES 的操作 我找到了 secu
  • 并行磁盘 I/O

    我有几个想要阅读的日志文件 不失一般性 假设日志文件处理如下 def process infilepath answer 0 with open infilepath as infile for line in infile if line
  • 以编程方式检索 OSX 网络/代理配置值

    考虑到我的应用程序具有当前登录的管理员用户的用户 ID 和密码 是否可以从 OSX 网络设置中检索配置值 对 高级 代理 选项卡内容特别感兴趣 通过设置 API 完成 以下是从 OSX 网络设置中获取 PAC URL 字符串的示例 stat
  • 在 OSX 上,Java 线程在不关注时会进入睡眠状态

    我正在编写一个程序来监听系统剪贴板的更改 侦听器在单独的线程上运行 并在剪贴板的内容更改时执行某些操作 例如写入文件 我正在使用轮询剪贴板剪贴板所有者界面 http www javapractices com topic TopicActi
  • tkinter/py2app 创建的应用程序在初始启动时不显示窗口

    我遇到了一个问题 即启动使用 Tkinter 创建并由 py2app 打包的 python 应用程序不会立即显示应用程序窗口 我在启动后显示窗口的唯一方法是单击扩展坞中的应用程序图标 This guy https stackoverflow
  • 使用 XCode 进行测试时,MacOS 应用程序本地通知未显示

    我尝试将横幅通知生成器添加到我的 macOS swift 应用程序中 但在 XCode 中运行测试时 横幅没有出现 并且通知中心中也没有任何新通知可见 我计算机上的其他应用程序会定期生成通知 我错过了什么 我已按要求授予许可 我的应用程序委
  • Cocoa webview UserAgent“webkit-legacy”问题

    我解决了这个问题 请看下面所选的答案 我一直在努力寻找导致 OSX Cocoa 应用程序的 WebView 与 Safari 表现不同的原因 事实证明 用户代理是不同的 有点明显 并且我正在访问的网站不知道如何处理它 令人惊讶的是 它是ht
  • 带有 WatchPaths 键的 Launchd.plist:如何设置最小间隔?

    如何使用 WatchPath 键为 launchd plist 脚本设置最小间隔 例如 我希望每次目录中出现新文件时都运行一个脚本 但我希望它最多每小时运行一次 launchd plist 可能看起来像这样
  • 拖动调整 NSView(或其他对象)的大小

    我正在尝试构建一个应用程序 允许用户使用可以调整大小的矩形边界框来指定图像的多个区域 到目前为止 我已经有一个NSScrollView其中包含一个NSImageView这样用户就可以放大图像并根据需要滚动 我目前的想法是我可以使用NSVie
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 左右 mac“命令”键的配置不同吗?

    我想知道是否可以将右侧的 mac 命令 设置为像 ctrl 键一样 但保留左侧 命令 键的默认功能 谢谢 有一个非常棒的应用程序 称为 Ukelele 免费 不幸的是 它无法区分左右命令键 然而 我最近发现了一个更好的应用程序 名为 Con
  • 从命令行减少 PNG 文件的位深度

    我可以从 CLI 执行什么命令或一系列命令来递归遍历目录树并将该树中所有 PNG 文件的位深度从 24bpp 减少到 16bpp 命令应该保留 alpha 层并且不应该增加 PNG 文件的大小 事实上减少会更好 我有一个基于 OSX 的系统
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • Homebrew 将二进制文件放在哪里?

    Homebrew 是否安装软件包 usr local bin默认情况下 即它把二进制文件放在那里 我们可以告诉 Homebrew 将二进制文件放在其他地方吗 Apple Silicon Mac ARM 二进制文件位于 opt homebre
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF

随机推荐

  • Python WindowsError: [Error 3] 尝试重命名时系统找不到指定的文件

    我不明白出了什么问题 我以前使用过重命名没有任何问题 并且在其他类似问题中找不到解决方案 import os import random directory C whatever string alphabet abcdefghijklmn
  • 使用会话存储变量

    我有一个在每次换页时都会更新的变量 但我想以某种方式将值存储在第一次调用中 变量是例如 sizeOfSearch value HotelList activePropertyCount 第一次加载页面时 它是 933 在下一页上检索到相同的
  • Dataproc:配置 Spark 驱动程序和执行程序 log4j 属性

    正如前面的答案中所解释的 更改 Spark 集群的详细程度的理想方法是更改对应的log4j properties 但是 在dataproc上 Spark在Yarn上运行 因此我们必须调整全局配置而不是 usr lib spark conf
  • $.param() 生成的查询字符串包含数组的方括号

    我有一个这样的对象 var queryObject name Shwetanka subjects Mathematics Physics Computers stream science 当我使用此创建查询字符串时 param query
  • Spark 从不同模式目录读取数据帧

    我的spark程序必须从一个目录中读取 该目录有不同模式的数据 目录 子目录1 文件1 10 外星人1 11 鲍勃 目录 子目录2 文件2 蓝色 123 芝加哥2 红色 34 达拉斯 大约 50 个具有不同模式的目录 我的 Spark 作业
  • Django 上传图像 - 从表单到 Rackspace/S3,无需任何操作

    我只想使用表单上传图像 JPG 然后将该图像发送到 Rackspace Cloud Files 或 Amazon S3 没有操作该文件 无需保存到磁盘 一切都保存到内存 托管在云服务器上 图片大小不会超过75kb Update 两个注意事项
  • 将变量值传递给锚标记中的 href 参数

    如何将变量值传递给锚标记中的 href 参数 a something here a 我希望锚标记在执行上述代码后看起来像这样 a href http www google com jobid 10 something here a 但不知何
  • 查找并替换对象数组中的部分属性值

    我需要在对象数组中搜索关键字并替换它的所有实例 例如 我有以下数组 const test marketType 90 displayName FT Total Match scoreType Over Under 0 75 Remove m
  • 在WPF中检测鼠标直接越过边框

    我有一个简单的 UserControl 其直接子元素是边框
  • 计算字符串中特定的相同字符的连续出现次数 - PHP

    我正在尝试计算一些 连胜 特别是连续获胜和失败的最高次数 以及大多数没有获胜的比赛 没有失败的比赛的发生次数 我有一个看起来像这样的字符串 WWWDDWWWWLLWLLLL 为此我需要能够返回 A 字符的最长连续运行 然后我将复制 L 没有
  • 从文件中读取并查找特定行

    我需要根据某些关键字获取设置文件中的信息 我无法更改格式 该文件是这样的 username myusername address 156a1355e3486f4 data function i if i 0 return true else
  • 使用 Google Translate API 将 JavaScript 内容翻译为 HTML

    我需要创建一个按钮 能够在法语和英语之间切换页面内容的语言 我如何使用 Google Translate API 来实现此目的 这有帮助吗 div div
  • 如何限制上传图片的宽度或高度

    我想以类似的方式操作 调整图像大小兴趣但我不确定解决这个问题的最佳方法是什么 目标是允许混合纵向和横向图像 但对最大高度和宽度施加一些限制 我看到的问题是 如果我调整宽度 肖像图像可能会变得太薄 而风景图像则相反 关于如何使用 PHP 实现
  • 重构 JSON

    我现在有来自服务器的 JSON 响应 但我想根据日期重组它 例如我现在有 items A name a date 2 10 2010 sales 100 name b date 6 10 2010 sales 400
  • “git分支”和“git checkout -b”有什么区别?

    I used git checkout b创建一个新分支 我觉得git branch做同样的事情 如果这两个命令有不同的话 它们有何不同 git checkout b BRANCH NAME创建一个新分支并签出新分支 同时git branc
  • 我应该设计一个主键为 varchar 还是 int 的表?

    我知道这是主观的 但我想了解人们的意见 并希望在设计 sql server 表结构时可以应用一些最佳实践 我个人认为 在固定 最大 长度的 varchar 上键入表是不行的 因为这意味着必须在使用它作为外键的任何其他表上传播相同的固定长度
  • 如何读取/流式传输文件而不将整个文件加载到内存中?

    如何读取任意文件并 逐个 处理它 意味着逐字节或其他一些可以提供最佳读取性能的块大小 而不将整个文件加载到内存中 处理的一个示例是生成文件的 MD5 哈希值 尽管答案可以适用于任何操作 我想拥有或编写这个 但如果我可以获得现有的代码 那就太
  • PDO 使用键作为列名插入数组

    我正在使用 PDO 将 PHP 数组的 POST 内容插入到表中 我正在查看以下代码行 我有一个 必须有更好的方法来做到这一点 的时刻 如果键名与表中的列名匹配 是否有更简单的方法来插入所有键名 代码例如 statement db gt p
  • 下划线:基于多个属性的sortBy()

    我正在尝试根据多个属性对包含对象的数组进行排序 即 如果两个对象之间的第一个属性相同 则应使用第二个属性来比较这两个对象 例如 考虑以下数组 var patients name John roomNumber 1 bedNumber 1 n
  • 与 AVX/AVX2 一起使用的最低 OS X 版本是什么?

    我有一个图像绘制例程 为 SSE SSE2 SSE3 SSE4 1 SSE4 2 AVX 和 AVX2 编译多次 我的程序通过检查 CPUID 标志来动态调度这些二进制变体之一 在 Windows 上 我检查 Windows 版本 如果操作