强制 AVX 内在函数使用 SSE 指令

2024-03-06

不幸的是,我有一个 AMD 打桩机 cpu,它似乎对 AVX 指令有问题:

使用 256 位 AVX 寄存器进行内存写入非常慢。测得的吞吐量比之前的型号 (Bulldozer) 慢 5 - 6 倍,比两次 128 位写入慢 8 - 9 倍。

根据我自己的经验,我发现 mm256 内在函数比 mm128 慢得多,我假设这是由于上述原因。

不过,我真的很想为最新的指令集 AVX 进行编码,同时仍然能够以合理的速度在我的机器上测试构建。有没有办法强制 mm256 内在函数使用 SSE 指令?我用的是VS 2015。

如果没有简单的方法,那么困难的方法又如何呢?代替<immintrin.h>带有一个自定义标头,其中包含我自己的内部函数定义,可以对其进行编码以使用 SSE?不确定这有多合理,在我完成这项工作之前,如果可能的话,更喜欢更简单的方法。


使用阿格纳雾矢量类库 http://www.agner.org/optimize/#vectorclass并将其添加到 Visual Studio 中的命令行:-D__SSE4_2__ -D__XOP__.

然后使用 AVX 大小的向量,例如Vec8f八个花车。当您在未启用 AVX 的情况下进行编译时,它将使用该文件vectorf256e.h它使用两个 SSE 寄存器模拟 AVX。例如Vec8f继承自Vec256fe它是这样开始的:

class Vec256fe {
protected:
    __m128 y0;                         // low half
    __m128 y1;                         // high half

如果你编译/arch:AVX -D__XOP__VCL 将使用该文件vectorf256.h和一个 AVX 寄存器。然后,您的代码只需更改编译器开关即可适用于 AVX 和 SSE。

如果你不想使用XOP不要使用-D__XOP__.


正如 Peter Cordes 在他的回答中指出的那样,如果您的目标只是避免 256 位加载/存储,那么您可能仍然需要 VEX 编码指令(尽管目前还不清楚这是否会产生影响,除非在某些特殊情况下)。你可以用这样的向量类来做到这一点

Vec8f a;
Vec4f lo = a.get_low();  // a is a Vec8f type
Vec4f hi = a.get_high();
lo.store(&b[0]);         // b is a float array
hi.store(&b[4]);

然后编译/arch:AVX -D__XOP__.

另一种选择是使用一个源文件Vecnf然后做

//foo.cpp
#include "vectorclass.h"
#if SIMDWIDTH == 4
typedef Vec4f Vecnf;
#else
typedef Vec8f Vecnf;
#endif  

并像这样编译

cl /O2 /DSIMDWIDTH=4                     foo.cpp /Fofoo_sse
cl /O2 /DSIMDWIDTH=4 /arch:AVX /D__XOP__ foo.cpp /Fofoo_avx128
cl /O2 /DSIMDWIDTH=8 /arch:AVX           foo.cpp /Fofoo_avx256

这将使用一个源文件创建三个可执行文件。您可以使用以下命令编译它们,而不是链接它们/c他们制作了一个 CPU 调度程序。我用了XOP使用avx128,因为我认为除了AMD之外没有充分的理由使用avx128。

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

强制 AVX 内在函数使用 SSE 指令 的相关文章

随机推荐

  • 如何用 2 列制作 R 图例?

    我想在我的图表上制作一个图例 它是由plot 功能 原本的legend 函数将生成一个只有 1 列的列表 我怎样才能制作一个有两列的图例 我无法找到一种方法可以在一次调用中做到这一点legend对于标准地块 这是一个选项 绘制两个单独的图例
  • 在 JNA 中创建一个本机 Windows 窗口和一些带有 GWL_WNDPROC 的 GetWindowLong

    再会 我已经使用 JNA 与 Windows API 交互有一段时间了 现在我在创建窗口时陷入困境 据我做了以下事情 1 创建了现有窗口的子窗口并为其获取了有效的处理程序 2 了解Windows 中的每个窗口都有一个不间断的消息分发循环 3
  • 我可以更新 WebStorm 中的 TypeScript 版本吗?

    我目前正在使用 WebStorm 10 0 4 最新的 TypeScript 版本是 1 5 3 但在 WebStorm 中存在旧版本的 TypeScript 如何在 WebStorm 中更新我的 TypeScript 版本 在默认设置对话
  • 当路径不存在时的 SHParseDisplayName

    我正在开发一个替代品IFileOpenDialog and IFileSaveDialog 我几乎让它工作了 至少IFileOpenDialog 但是当我想返回时IShellItem代表新文件名 用户选择保存在GetResult 方法 我无
  • 删除注册表键值

    在 MSDN 中 它说在调用更改正在枚举的注册表项的函数时不应使用 RegEnumValue 那么这也适用于删除注册表项值吗 就像这段代码所做的那样 if RegOpenKeyEx m hkey m path c str 0 KEY ALL
  • Gradle:在自定义独立插件中使用“maven-publish”插件

    在我的第三个问题之后 几乎感觉像是在发垃圾邮件 因为我的问题看起来很微不足道 但我在 Gradle 文档中找不到对我的案例有任何帮助 而且关于 stackoverflow 的其他问题也没有帮助 这次 我无法使用maven publish插件
  • 如何在 Perl 中引用长字符串?

    我通常使用简单的引号 但有时我会得到很长的行 我无法中断并且还需要使用转义字符 所以我得到如下内容 my str select query accession query tag hit accession hit tag signific
  • Tesseract 对阿拉伯语单词/字母不返回任何内容

    我已经安装了 Pytesseract 它可以完美地处理法语 英语文本以及数字 但是当我尝试阅读任何阿拉伯文本 字母时 它不会返回任何内容 这是我使用过的代码 try from PIL import Image except ImportEr
  • 考虑到可扩展性的基于组件的应用程序:OSGi 还是 Akka?

    在我的硕士论文中 我正在开发一个用于销售大型活动门票的应用程序框架 我的主要要求是可修改性 可扩展性和性能 我的客户 活动组织者 应该能够在运行时轻松替换组件并添加功能 此类组件的一个示例是座位分配组件 我的导师说看看 OSGi 松散耦合的
  • 具有多个引用的 postgresql cte 仅运行一次

    只是想知道 在 pgsql cte 中是否会创建临时表 并且每次加入查询时都不会重新执行 cte 下面是同一查询的 pgsql 和 sql server 版本 sql server 需要 6 秒 pgsql 只需要 3 秒 这是侥幸还是永远
  • 使用 D3.js 在矩形上显示文本

    I am developing Normalized stacked bar chart using d3 js and trying to append a text on rect It is getting appended when
  • 为什么启动应用程序时会看到双状态栏?

    当启动我的 iPhone 应用程序时 我同时看到 Default png 中的状态栏和操作系统的内置状态栏 而不仅仅是看到操作系统的状态栏 我做错了什么 将 Default png 的大小调整为 320x480 如果您的 Default p
  • 将 html 字符串拆分为 N 部分

    有没有人有一个使用 C 拆分 html 字符串 来自tinymce 编辑器 并将其拆分为 N 个部分的示例 我需要均匀地分割字符串而不分割单词 我正在考虑只拆分 html 并使用 HtmlAgilityPack 来尝试修复损坏的标签 虽然我
  • 将 AS3 代码放在舞台/MC 时间线上,就像 AS2 一样,而不是放在类中

    我知道 ActionScript 3 0 从一开始就被设计为一种主要面向对象的语言 使用它意味着 Flash 文档中的时间线代码更少甚至没有 我对 OOP 非常有经验 并且很乐意编写课程 然而 由于我主要使用 Flash 来制作动画 所以我
  • 从大照片生成图块 (iOs PhotoScroller)

    我正在研究WWDC 会议 104 掌握 UIScrollViews 我需要创建一个脚本或找到一个工具或编写一个脚本来从一些大的 jpg 照片生成 CATiledLayer 所需的图块 需要 1000 500 和 250 比例因子 并且生成的
  • 如何手动触发点击事件?

    我正在尝试以编程方式触发文档单击 我的测试组合显示在页面中的多个位置 我想在单击测试组合或触发文档单击时将它们全部隐藏 Component selector test comp template div stuff div and more
  • 传送 Wav 音频数据的 DirectShow 过滤器的媒体类型设置是否正确?

    我使用 Delphi 6 Pro 和 DSPACK DirectShow 组件库来创建一个 DirectShow 过滤器 该过滤器从自定义音频源提供 Wav 格式的数据 需要明确的是 我将原始 PCM 音频样本作为字节数据提供 不涉及 Wa
  • 有条件导入范围

    使用 Google Sheets 我想在同一文档中使用带条件的 IMPORTRANGE 将数据从一张工作表导入到另一张工作表 我尝试过但没有成功 IF IMPORTRANGE https URL Inc Database B2 B300 p
  • Magento 异常错误:无效方法 Mage_Catalog_Block_Product_View_Type_Simple::displayProductStockStatus()

    我尝试在我的 magento 系统上安装主题 当我尝试打开产品页面时 它向我显示错误 出于安全原因 默认情况下禁用异常打印 请帮我 错误 Invalid method Mage Catalog Block Product View Type
  • 强制 AVX 内在函数使用 SSE 指令

    不幸的是 我有一个 AMD 打桩机 cpu 它似乎对 AVX 指令有问题 使用 256 位 AVX 寄存器进行内存写入非常慢 测得的吞吐量比之前的型号 Bulldozer 慢 5 6 倍 比两次 128 位写入慢 8 9 倍 根据我自己的经