_mm_crc32_u64 定义不明确

2023-11-25

为什么世界上有_mm_crc32_u64(...)像这样定义?

unsigned int64 _mm_crc32_u64( unsigned __int64 crc, unsigned __int64 v );

“crc32”指令always累积 32 位 CRC,never64 位 CRC(毕竟是 CRC32,而不是 CRC64)。如果机器指令CRC32happens为了拥有 64 位目标操作数,高 32 位将被忽略,并在完成时用 0 填充,因此永远没有 64 位目标的用处。我理解为什么 Intel 允许在指令上使用 64 位目标操作数(为了统一),但如果我想快速处理数据,我需要一个尽可能大的源操作数(即 64 位,如果我还剩下那么多数据,尾部较小)并且始终是 32 位目标操作数。但内在函数不允许 64 位源和 32 位目标。注意其他内在函数:

unsigned int _mm_crc32_u8 ( unsigned int crc, unsigned char v ); 

“crc”的类型不是8位类型,返回类型也不是,它们是32位。为什么没有

unsigned int _mm_crc32_u64 ( unsigned int crc, unsigned __int64 v );

? Intel指令支持这一点,并且that是最有意义的内在。

有人有可移植代码(Visual Studio 和 GCC)来实现后一个内在函数吗?谢谢。我的猜测是这样的:

#define CRC32(D32,S) __asm__("crc32 %0, %1" : "+xrm" (D32) : ">xrm" (S))

对于海湾合作委员会,以及

#define CRC32(D32,S) __asm { crc32 D32, S }

对于 VisualStudio。不幸的是,我对约束如何工作知之甚少,对汇编级编程的语法和语义也知之甚少。

小编辑:注意我定义的宏:

#define GET_INT64(P) *(reinterpret_cast<const uint64* &>(P))++
#define GET_INT32(P) *(reinterpret_cast<const uint32* &>(P))++
#define GET_INT16(P) *(reinterpret_cast<const uint16* &>(P))++
#define GET_INT8(P)  *(reinterpret_cast<const uint8 * &>(P))++


#define DO1_HW(CR,P) CR =  _mm_crc32_u8 (CR, GET_INT8 (P))
#define DO2_HW(CR,P) CR =  _mm_crc32_u16(CR, GET_INT16(P))
#define DO4_HW(CR,P) CR =  _mm_crc32_u32(CR, GET_INT32(P))
#define DO8_HW(CR,P) CR = (_mm_crc32_u64((uint64)CR, GET_INT64(P))) & 0xFFFFFFFF;

请注意最后一个宏语句有多么不同。缺乏统一性无疑表明内在的定义还没有被合理地定义。虽然没有必要明确地输入(uint64)在最后一个宏中强制转换,它是隐式的并且确实发生了。反汇编生成的代码会显示 32->64 和 64->32 转换的代码,这两者都是不必要的。

换句话说,就是_mm_crc32_u64, not _mm_crc64_u64,但他们已经像后者一样实现了它。

如果我能得到的定义CRC32以上正确,那么我想将我的宏更改为

#define DO1_HW(CR,P) CR = CRC32(CR, GET_INT8 (P))
#define DO2_HW(CR,P) CR = CRC32(CR, GET_INT16(P))
#define DO4_HW(CR,P) CR = CRC32(CR, GET_INT32(P))
#define DO8_HW(CR,P) CR = CRC32(CR, GET_INT64(P))

提供的 4 个内部函数确实允许使用 Intel 定义的 CRC32 指令的所有可能用途。该指令输出始终为 32 位,因为该指令被硬编码为使用特定的 32 位 CRC 多项式。但是,该指令允许您的代码一次向其提供 8、16、32 或 64 位的输入数据。一次处理 64 位应该可以最大化吞吐量。如果仅限于 32 位构建,那么一次处理 32 位是您能做的最好的事情。如果输入字节计数是奇数或不是 4/8 的倍数,一次处理 8 或 16 位可以简化代码逻辑。

#include <stdio.h>
#include <stdint.h>
#include <intrin.h>

int main (int argc, char *argv [])
    {
    int index;
    uint8_t *data8;
    uint16_t *data16;
    uint32_t *data32;
    uint64_t *data64;
    uint32_t total1, total2, total3;
    uint64_t total4;
    uint64_t input [] = {0x1122334455667788, 0x1111222233334444};

    total1 = total2 = total3 = total4 = 0;
    data8  = (void *) input;
    data16 = (void *) input;
    data32 = (void *) input;
    data64 = (void *) input;

    for (index = 0; index < sizeof input / sizeof *data8; index++)
        total1 = _mm_crc32_u8 (total1, *data8++);

    for (index = 0; index < sizeof input / sizeof *data16; index++)
        total2 = _mm_crc32_u16 (total2, *data16++);

    for (index = 0; index < sizeof input / sizeof *data32; index++)
        total3 = _mm_crc32_u32 (total3, *data32++);

    for (index = 0; index < sizeof input / sizeof *data64; index++)
        total4 = _mm_crc32_u64 (total4, *data64++);

    printf ("CRC32 result using 8-bit chunks: %08X\n", total1);
    printf ("CRC32 result using 16-bit chunks: %08X\n", total2);
    printf ("CRC32 result using 32-bit chunks: %08X\n", total3);
    printf ("CRC32 result using 64-bit chunks: %08X\n", total4);
    return 0;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

_mm_crc32_u64 定义不明确 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • C++派生模板类继承自模板基类,无法调用基类构造函数[重复]

    这个问题在这里已经有答案了 我试图从基类 模板 继承 派生类也是模板 它们具有相同的类型 T 我收到编译错误 非法成员初始化 Base 不是基类或成员 为什么 如何调用基类构造函数 include
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat

随机推荐

  • 使用 Typescript 通过 Webpack 动态加载模块

    我正在尝试构建一个支持插件的 Web 应用程序 环境是 Angular 2 到目前为止 Typescript 2 1 和 Webpack 2 我有一些扩展点 插槽 插件可以在其中绘制内容 基本上我有一个组件 它能够托管运行时已知的其他一些组
  • 脚本由 Bash 执行时产生的结果与由 cron 执行时产生的结果不同

    请考虑以下 crontab root SHELL bin bash 0 3 var maintenance raid sh 和 bash 脚本 var maintenance raid sh bin bash echo n Checking
  • 了解 Python Pickle 不安全性

    Python 文档中指出pickle不安全 不应解析不受信任的用户输入 如果你研究这个 几乎所有的例子都证明了这一点system 通过呼叫os system 我不清楚的是如何os system没有被正确解释os正在导入模块 gt gt gt
  • 如何获取 win32 API 中所有屏幕的尺寸(RECT)?

    我正在为测试团队编写一份应用程序 该应用程序的作用是让您截取屏幕任何部分的屏幕截图 然后将其连同注释一起上传到测试团队服务器 截屏涉及选择屏幕上要截屏的区域 为此 我创建了一个半透明窗口并将其覆盖在整个屏幕上 我目前正在使用GetDeskt
  • 在 Google 地图上放置图钉

    我需要将用户重定向到 Google 地图页面并在定义的位置上放置一些图钉 问题是您可以通过简单的请求轻松地将地图集中在某个点上 但是对于这样的要求如何设置pin呢 您可以使用 我的地图 来执行此操作 创建或打开地图 单击编辑进入编辑模式 单
  • 获取作为给定项目实例的所有维基数据项目

    维基数据有一个项目叫做智能手机型号 我想获取它的所有实例 问题 如何使用实时服务器以编程方式获取实例的标识符 最好不包括出现在 WhatLinksHere 但位于 Wikidata 命名空间而不是主命名空间中的误报 您的问题指定了 Medi
  • 在 JavaScript 中获取下周的某一天的日期

    根据今天的日期 new Date 我想在 javascript 中获取下周四晚上 7 点的日期 例如 如果今天的日期是 Mon Apr 24 2017 13 00 00 GMT 我正在寻找结果 Thu Apr 27 2017 19 00 0
  • 隐藏 Samsung Galaxy 设备上的“不支持 NFC 标签类型”错误

    我正在开发一款仅扫描 MIFARE Classic 卡的 UID 的应用程序 以方便考勤登记 我已经让它工作了 然而 每次我在 Galaxy S4 上扫描卡时 都会收到一条提示 不支持 NFC 标签类型 我想在应用程序打开时阻止或隐藏该消息
  • python - 从浮点数中删除所有小数

    如何从浮点数中删除所有小数位 a 100 0 我希望它变成 100 I tried str a rstrip 0 但它刚刚返回1 将其转换为怎么样int gt gt gt int a 100 为了完整起见 有很多方法可以从十进制数的字符串表
  • gdb 终止于信号?,未知信号

    我只是尝试在 Mac OSX 版本 10 12 上使用 gdb 调试代码 但在 gdb 中启动程序时总是遇到此未知错误 我在安装后对 gdb 进行了代码签名 并使用 g 标志编译了我的代码 这就是正在发生的事情 computer hello
  • 如何使用 refs 访问/覆盖元素的 className?

    我有一个文本和一个按钮 我想要实现的是这样的 如果我单击按钮 文本将被隐藏 我想在不使用的情况下实现这一目标state class Test extends Component constructor props codes hide gt
  • app.config 中的用户范围与应用程序范围

    app config 中的用户范围和应用程序范围有什么区别 用户范围设置用于存储特定于每个用户的值 而应用程序范围设置用于所有用户 看看这个article
  • 列表 SwiftUI 中的每行是否可以有多个 NavigationLink?

    我无法在列表的同一行中使用多个 NavigationLink 看起来导航堆栈完全混乱了 因为你点击一次 它就会进入多个视图并不稳定地返回 在 TestList 中 我尝试在部分中添加单独的 NavigationLinks 并且尝试将 Nav
  • 网络浏览器键盘快捷键

    我有一个显示一些 HTML 的 WebBrowser 控件 我希望用户能够复制整个文档 但不能执行任何其他操作 我已经设置了IsWebBrowserContextMenuEnabled and WebBrowserShortcutsEnab
  • 如何将 PKCS7_sign 结果转换为 char * 或 std::string

    我尝试编写一个小邮件过滤器来使用 S MIME 签署邮件 到目前为止 我已经完成了签署邮件的代码 我使用 openssl 中的 demos smime 代码示例来完成这项工作 不幸的是 这些示例演示了如何将输入消息写入输出文件 但我需要结果
  • SparklyR 从 Spark 上下文中删除表

    想要从 Spark 上下文 sc 中删除单个数据表 我知道单个缓存表可以取消缓存 但这与从 sc 中删除对象不同 据我所知 library sparklyr library dplyr library titanic library Lah
  • 如何使用 PhantomJS 获取网站的 HTML 源代码

    下面是 PhantomJS 的示例 它通过 DOM id 从外部网页获取一些元素 var page require webpage create console log The default user agent is page sett
  • 如何在 NestedScrollView 中使用 ViewPager 和 RecyclerView 进行工作

    我正在将 NestedScrollView 与 ViewPager 一起使用 NestedScrollView 内部有一个 LinearLayout 最后有一些 TextView TabLayout 和 ViewPager TextView
  • 有没有办法在不重新启动 Solr 服务器的情况下动态更新同义词文件?

    众所周知 有一个同义词 txtconf 目录中的文件 每当我发现一些新的同义 词时我就想更新它 那么有什么方法可以动态更新该文件而不需要重新启动Solr服务器我的搜索结果会考虑新的同义词吗 如果有人有任何想法 请帮助我 提前致谢 我认为你可
  • _mm_crc32_u64 定义不明确

    为什么世界上有 mm crc32 u64 像这样定义 unsigned int64 mm crc32 u64 unsigned int64 crc unsigned int64 v crc32 指令always累积 32 位 CRC nev