Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 32位与64位算法的性能对比_C++_C_Linux_Performance_X86 64 - Fatal编程技术网

C++ 32位与64位算法的性能对比

C++ 32位与64位算法的性能对比,c++,c,linux,performance,x86-64,C++,C,Linux,Performance,X86 64,本机64位整数算术指令是否比其32位计数器部分慢(在x86\u 64带有64位OS的机器上) 编辑:在当前的CPU上,如Intel Core2 Duo、i5/i7等。这取决于具体的CPU和操作。例如,在64位奔腾IV上,64位寄存器的乘法速度要慢得多。Core 2和更高版本的CPU设计用于从底层开始的64位操作 通常,即使是为64位平台编写的代码也会使用32位变量,这些变量中的值将适合这些变量。这主要不是因为算术更快(在现代CPU上通常不是),而是因为它使用更少的内存和内存带宽 一个包含12个整

本机
64位
整数算术指令是否比其
32位
计数器部分慢(在
x86\u 64
带有
64位
OS的机器上)


编辑:在当前的CPU上,如Intel Core2 Duo、i5/i7等。

这取决于具体的CPU和操作。例如,在64位奔腾IV上,64位寄存器的乘法速度要慢得多。Core 2和更高版本的CPU设计用于从底层开始的64位操作

通常,即使是为64位平台编写的代码也会使用32位变量,这些变量中的值将适合这些变量。这主要不是因为算术更快(在现代CPU上通常不是),而是因为它使用更少的内存和内存带宽

一个包含12个整数的结构,如果这些整数是32位的,则其大小将是64位的一半。这意味着需要一半的字节来存储,一半的缓存空间,等等

在值可能不适合32位的情况下,使用64位本机寄存器和算术。但主要的性能优势来自x86_64指令集中提供的额外通用寄存器。当然,64位指针还有很多好处


因此,真正的答案是,这并不重要。即使您使用x86_64模式,您也可以(通常也可以)在需要的地方使用32位算术,并且您可以从更大的指针和更通用的寄存器中获得好处。当您使用64位本机操作时,这是因为您需要64位操作,并且您知道它们比使用多个32位操作来假装要快——这是您唯一的选择。因此,32位寄存器与64位寄存器的相对性能决不应成为任何实现决策的决定性因素。

在主要为32位的应用程序中(意味着只使用32位算术,32位指针就足够了),x86-64体系结构的真正好处是AMD对该体系结构的其他“更新”:

  • 16个通用寄存器,高于x86中的8个
  • RIP相对寻址模式
  • 其他

这一点在Linux中的新实现中很明显。

我刚刚偶然发现了这个问题,但我认为这里缺少了一个非常重要的方面:如果你真的看不起汇编代码,使用“int”类型作为索引可能会减慢编译器生成的代码。 这是因为在许多64位编译器和平台(Visual Studio、GCC)上,“int”默认为32位类型,使用指针(在64位操作系统上必须是64位)和“int”进行地址计算将导致编译器在32位和64位寄存器之间发出不必要的转换。
我刚刚在我的代码的一个性能非常关键的内部循环中体验到了这一点。从“int”切换到“long long”,因为循环索引将我的算法运行时间提高了10%左右,考虑到当时我已经在使用广泛的SSE/AVX2矢量化,这是一个巨大的收益。

@Cody:哦,真的吗?你们声称64位整数除法和32位整数除法一样快?你们都是对的。请阅读下面大卫·施瓦茨的解释。在CPU的ALU中执行指令是一回事。将操作数放入CPU,并将结果从CPU中取出是另一回事。相关:谢谢,但我在这里只关心CPU周期。缓存未命中问题和类似问题完全可以,但这是另一个故事。然后我的第一句话回答了你的问题。但我更重要的一点是,这并不重要。64位算术不适用于32位算术的情况。因此,在任何决策中,相对表现都不应成为决定因素。你有具体的例子吗?比如说Core2 Duo。或者链接?请特别参阅第47页。我正在实现一个多线程素筛,并使用一个位字段来表示结果。我来到这个网站,想知道用什么大小的整数作为底层存储,结果却没有得到一个有意义的答案。“相对绩效不应成为任何决策的决定性因素”在这种特殊情况下是错误的。我选择32位,以减少多线程时潜在的冲突数量,并减少内存带宽。然而,64位可能最终会更有效,因为我还使用popcount和bitscan操作来迭代/定位结果?我目前也处于同样的困境(重AVX2矢量化,等等),我不确定是否值得注意循环索引的类型。