【问题标题】:64 bit int arthimetic on 32bit x86 (from c )32 位 x86 上的 64 位 int 算术(来自 c )
【发布时间】:2013-04-02 04:18:28
【问题描述】:

有没有在 32 上使用 64 位整数的快速方法 x86 机器(在 c(添加:和 c++)语言编译器中)?

32 位 x86 在某些情况下支持 64 位操作 范围(旧 mmx 中有一些 movq 指令 可能还有其他一些命令),但是如何从 c 中使用它?

如果有人想使用 64 位整数运算怎么办 在 32 位 x86 机器上的 c 中 - 怎么做 简单高效?

//编辑

到现在为止,我已经找到了一些候选人

    uint64_t A;
    long long a;
    int64 a;
    __int64 a;

应该使用什么?有没有机会 上述算法的实施更好/更快 比其他的?

【问题讨论】:

  • uint64_t 等类型有什么问题?
  • 检查你的编译器是否支持int64long long intint64_t等64位数据类型
  • @PlasmaHH 我只是不认识它们——它们在 32 位 c/c++ 编译器中可用吗,它们快吗?
  • @user2214913:这取决于你对“快”的定义。
  • 这个定义是 - 操作没有在软件中精心模拟,特别是我想知道:ADD SUB MUL DIV 比较和分配这些基本的东西(需要快速的算法)

标签: c++ c winapi x86 32-bit


【解决方案1】:

要执行 64 位操作,您可以使用 int64_tuint64_t

它们在C99 中由头文件stdint.h 定义。

【讨论】:

  • 在 32 x86 上是否有效?旧的 c++ 编译器和 win32 怎么办?我需要在 win32 下的 32 位机器上通用但快速的 int64 算法:C
  • @user2214913 什么是“老”?你一直在使用这些模糊的术语,比如“快”和“旧”。这就像问我们“一辆旧车会有一个好的 0-60 时间吗?”我们如何可能回答这个问题?如果你想得到好的答案,你需要学会提出好的问题。
  • 快速我的意思是与 32 位整数相同或慢两倍 - 例如是否有可能到达这里(32 位机器 win32 和 c/c++ 语言)64 位整数除法 c64=a64/ b64;并乘以 c64=a64*b64;哪个是在硬件中完成的,速度接近 32 位算法,或者这只是蹩脚的慢速仿真? (我不太了解 x86-32 内部结构,但可能在那里加速了一些 64 位 int 操作 - 所以它是硬件加速的,可在 32 位 c/c++ 编译器上使用,并且在哪里或只能缓慢模拟)
  • 所以它是硬件加速的并且可以在 32 位 c/c++ 编译器上使用(以及如何)?还是只能慢慢模仿?想要一些细节 - 也会做一些个人研究,但需要时间才能知道)
  • 我使用微软特定的 __int64 类型。这甚至适用于 Visual Studio 6,并且在 32 位环境中同样有效,例如 64 位加法将由两个 32 位 ADD 指令模拟。您不能在 32 位模式下使用本机 64 位指令。
【解决方案2】:

有没有在 32 x86 机器上使用 64 位整数的快速方法(在 c 语言编译器)?

int 不保证为 64 位宽;它保证至少为 16 位宽。如果您想要一个保证至少 64 位宽的类型,请改用 long long。在这个级别上谈论优化是毫无结果的。您最好提出一个完整的解决方案,对其进行分析以确定解决方案中最慢的部分是什么,并针对您的代码的那部分进行优化,或者选择一种更快地执行该慢操作的不同算法。注意:解决方案是指“解决实际问题的程序”。

32位x86在一定程度上支持64位操作(旧的mmx中可能有一些movq指令和一些其他命令),但是如何在c中使用呢?

您的编译器是否自动执行您提到的 movq 和/或 mmx 优化是值得怀疑的,因为您没有告诉我们您使用的是哪个编译器。但是,考虑到与其他优化相比这种优化的简单性(例如死代码优化、尾调用优化,甚至循环展开),我猜你的编译器会自动执行它。这是在这个级别谈论优化没有结果的另一个原因。编写编译器的人通常是非常优秀的程序员,对算法有深刻的理解,可以编写自动机来轻松执行简单的优化。

如果有人想在 32 位 x86 上使用 c 中的 64 位整数算法怎么办? 机器 - 如何做到最简单高效?

您是否尝试过编译完全优化的测试用例并在其机器代码中查找movq 操作?如果我没有说服您应该分析您的代码以确定这是否真的值得作为目标,那么请执行以下操作:编译您的解决方案(解决问题的东西,记住......并编译为“完全优化”) ,对其进行基准测试,以便您有一些东西可以衡量您的优化,将机器代码转换为汇编,在汇编中执行任何手动优化,重新编译并再次进行基准测试。你可能会:

  1. 花一周时间寻找优化和基准测试,发现您已经减少了几微秒然后放弃了...这很好地表明您的编译器花费了几秒钟来生成与您的代码一样好的代码d 需要几周的时间来写。保留编译器,但放弃微优化。
  2. 找到编译器没有执行的重要优化(不太可能)。要么选择一个更优化的编译器,要么与编写你的编译器的人联系,并向他们解释......

无论如何,进步!

【讨论】:

  • 我还没有经过测试,甚至不知道类型名称如何用于我想要的这种 int64 - 这就是我问的原因。我希望你使用如此宽的整数主要是为了使用更广泛的定点计算(int32 上使用的定点窄且精度低:c 所以我想知道是否有一些可用作 32 位 c 中的 int 64 的东西32 位 x86 机器上的 /c++ 代码
  • 刚刚扫描了这一切——对我来说没有什么新鲜事,也没有关于 int64 arthimetic 及其在 32 位 c/c++ 上的优化
  • 为什么要使用 C++ 编译器来编译 C 代码?这是没有意义的,因为不管你怎么想,C 不是 C++ 的子集。
  • @user2214913 使用 C 编译器编译 C 代码,使用 C++ 链接器将生成的目标代码链接到您的 C++ 项目中,您不会遇到在 C 中定义为与 C 中行为不同的代码的问题在 C++ 中,例如 char *foo = malloc(42);int bar = -4 % 3;struct VLA_container { size_t size; char VLA[]; };
  • @user2214913 如果编译器的优化不足以满足您的喜好,请告诉开发人员如何优化输出并等待其发生,获取新的编译器或自己执行优化。如果您是一个足够聪明的程序员来编写程序来执行这些优化,请将它们作为测试用例发送给开发人员以支持您的理论。否则,请再次阅读我的整篇文章,然后是我链接的那个页面,并掌握我实际上想向您解释的内容:您很可能在这种微优化上浪费了时间。定位更重要的优化...
【解决方案3】:

据我所知,在 32 位系统上的汇编中有一些详细的程序,所以可能没有办法在 32 位系统上进行加速的 64 位乘法或除法(软件例程是使用)(这将是部分答案)但我仍然不确定 100%,所以如果我错了,请纠正这个。

【讨论】:

    【解决方案4】:

    正如其他人所说,编译器会自动进行很多优化。要弄乱这些优化,您必须进入编译器设置或添加命令,但在您的情况下,人们已经有 50 年的时间来解决这个问题,所以除非您想编写自己的编译器,否则最好不要这样做。

    【讨论】:

    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 2011-08-14
    • 2010-12-11
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多