64位编程技术及其优化

VirtualBox 32系统上安装64系统 VirtualBox32系统上安装64系统 当前系统为Win7 32的,想要在VirtualBox下装64的Ubuntu,结果报错: This kernel requires an X86-64  CPU,but only detected an i686 CPU 阅读详情

64位编程技术及其优化

By Minidxer | October 8, 2007

 

简介
在市场上大多数CPU和操作系统支持64的操作处理。这种模式特别有利于需要运行大量数据的科学和工程应用。主要优势在于可使用巨大的地址空间。程序能够分配两次更多内存,容易维护大型数据库等。并且还有一定的性能优化优势。大多数64位机器运算集中能力处理需要超过4GB的内存。目前版本的BM library没有涉及内存问题,而是关注于表现方面。64位CPU在同一时间运行64位的计算是可以而且必须的功能。

64-bit Safety

可惜如今的很多软件并没有利用64位微处理器的优势,甚至经常不能在64位模式下编译运行。在这种情况下常常运行32位兼容模式。这真是对芯片的一种浪费啊。所以,让我们面对挑战来看一下如果我们用64位CPU替代32位系统出现的不当C编码。

  1. 事实上指针大小和整形相同。64位系统sizeof(void*) == 8 and sizeof(int) 通常保持4。忽略可能会导致的不正确分配和冲突。
  2. 依赖某一字节按机器语言排序。这对位设置的执行特别重要,因为位集合(bitset)可以是字节,整形或者长整形。
  3. 使用长形推测他和int同样大,直接转换这种类型 可能导致几乎不可发现的问题。
  4. 堆变量排列。堆变量有时可以不定位在8位界面。如果直接把这样的变量换成64位变量对系统可能碰到些麻烦。但是如果你把64位变量(长整型或双整形)转换为堆却保证绝对一致。堆分配的内存也是一致。
  5. 不同结构和阶层的排列规则。64位组织结构通常被排列在64位界面。这导致在IPC,网络(network)和磁盘(disk)共享二进制数据时出现问题。打包数据结构节省资源时如果不考虑排列因素可能会造成问题。
  6. 指针运算,64位指针增量为32位指针,反之亦然。64位指针变为32位增8字节,32位指针变为64位减少4字节。
  7. 缺少函数返回值时默认为整型(int),这可能造成值短缺。现在回头来看软件端口安全目录,我们能。。。

每个时间周期下获得最大工作效率

高性能64位C程序的关键点在于广泛的整数运算处理寄存器。寄存器(Registers)是一种昂贵的计算机内存。64位CPU寄存器是8字节。它通常伴随相应的128位或256位内存通路。我们的目标是有效地利用这些资源。

让我们来看一段C编码的短例。在一块内存中进行与(AND)操作,基于整数位集合块

{
int a1[2048];
int a2[2048];
int a3[2048];
for (int i = 0; i < 2048; ++i)
{
a3[i] = a1[i] & a2[i];
}
}

现在我们能优化以上这段编码为64位模式。(这段编码是长C形并不是有编译器提供)

{
long long a1[1024];
long long a2[1024];
long long a3[1024];
for (int i = 0; i < 1024; ++i)
{
a3[i] = a1[i] & a2[i];
}
}

如你所见,我们并没有改变位集合块的总体大小。但AND的矢量运算只花了两次很少的操作。这减少了架设回路并且等价与用系数2展开回路。缺点在于它是纯64位。用32位系统汇编时由于长度不同而提示错误信息。

进一步的优化可如下所示:

{
int a1[2048];
int a2[2048];
int a3[2048];
long long* pa1 = (long long*) a1;
long long* pa2 = (long long*) a2;
long long* pa3 = (long long*) a3;
for (int i = 0; i < sizeof(a1) / sizeof(long long); ++i)
{
pa3[i] = pa1[i] & pa2[i];
}
}

以上代码是32位和稳定的64位以及使用寄存器在64位CPU上工作。如果这样编码写得话,我们要记住指针的位置。如果我们盲目的用整数(int)指针作为64位长指针,有可能产生地址不为8位的情况。对于一些结构来说这将造成总线(BUS)错误及冲突。这一影响发现于Sun Solaris。很可能是32位整数变量(int variable),形成堆将有4位对应地址,那以上的编码就无用了。

位计数(Bits counting )

在位设置运算中最重要的操作就是计算1位的数目。BM使用整数位矢量,这意味着每一个位矢量是由整数列作为一个最小单位组成。BM的默认方法是把每个整数分成4字节然后查找包含位计数的表。使用16位宽表这种能提高该线性方法的效率,代价是生成巨大的列表。巨大的列表很有可能产生额外内存的存取操作,妨碍CPU缓存最后导致性能并没有得到显著提升。

int count(long long b)
{
b = (b & 0×5555555555555555LU) + (b >> 1 & 0×5555555555555555LU);
b = (b & 0×3333333333333333LU) + (b >> 2 & 0×3333333333333333LU);
b = b + (b >> 4) & 0×0F0F0F0F0F0F0F0FLU;
b = b + (b >> 8);
b = b + (b >> 16);
b = b + (b >> 32) & 0×0000007F;
return (int) b;
}

这段代码的灵感来自于Gutman 2000年9月在Dr.Dobb’s 杂志上发表的”Exploiting 64-Bit parallelism 开发64位并行”。实验表明,这段代码将表计数的方法远远的甩在身后。

执行(Implementation 

目前BM 版本使用64位运算优化提高性能。为了转换成你所需要的在制作文件前或进行中头文件预先定义BM640PT宏函数。这一选项使得64位长整形可使用。执行时允许该选项在32位机器上例如Intel x86 CPU编辑运行BM。不用说,这样的操作你很快就会发现不但没有利用优势反而使得性能降低了。

明智得在例如Intel Itanium, MIPS, HP PA-RISC, IBM’s POWER Series, Compaq Alpha, Sun UltraSPARC等64位CPU上使用该选项。

总结

我们已经讲述了几种如何利用64位操作来提高位间运算的性能。由于Intel和AMD扩大了64位处理器的生产线的背景下,转换成64位系统变得特别重要。如果你知道其他能提高改善64位性能的方法,我将会很高兴听到这一消息。

Android 适配 64 架构 目前很多第三方库已经同时支持 32 和 64 了,但是有些还不支持,如何找出这部分不支持的库或者文件呢?如果目中的 so 文件数量很多,就很难通过肉眼的方式来查找,这里提供一个 gradle 脚本可以很方便快速得找出那些不支持 64 的库。在主模块的 build.gradle 最后面添加如下代码:println(“println("然后执行 .\gradlew assembleDebug,这里的 Debug 可以根据实际目中的 Flavor 进行替换。 阅读详情

相关推荐

从3264:JVM内存优化之压缩指针技术深度解析

压缩指针(Compressed Oops)是JVM的一内存优化技术,旨在减少64JVM中指针占用的内存空间。我们知道,64JVM使用64指针,每个指针占用8字节的内存空间。然而,对于大多数Java应用程序来说,实际上并不需要使用如此大的内存地址空间。压缩指针通过将64指针压缩为32指针,每个指针只需要占用4字节的内存空间,从而显著减少了内存占用。注释64指针:每个指针占用8字节。32指针:每个指针占用4字节。

java专栏 1920

64乘除法

64乘除法适合于32嵌入式平台的开发 乘除算法功能: 给定两组数,分别为10元素无符号整型数组,计算出分子数组(前n_size个,n_size为0~10之间)之积与分母数组(前d_size个,d_size为0~10之间)之积,再将分子之积除以分母之积,得出四舍五入的整型商。 如果分子或分母之积溢出,则需进行低精确除,即将对应置的分子和分母相除,最后将这些结果相乘得出最终商,注意此时是不会对每对分子分母的除法进行结果补偿(即对商进行四舍五入)的。 若计算中输入不合法或者计算结果溢出,则计算失败。

支持64的ZBarSDK及其应用演示

本文还有配套的精品资源,点击获取 简介:本资源提供了一个针对iOS开发者的64ZBarSDK,兼容arm64架构,以支持现代iOS设备上的二维码扫描功能。通过提供的Demo和详细步骤说明,开发者可快速集成ZBarSDK到其目中,实现条码识别和处理。此外,资源还包括权限请求、事件处理、性能优化以及安全与隐私方面的指导。 1. iOS 64架构的重要性 在...

weixin_28850145的博客 1112

Intel64微处理器系统编程和应用编程.pdf

Intel64微处理器系统编程和应用编程.pdf

【leveldb】变长编码Varint(八)

在阅读Memtable处理流程时看到了Varint32、Varint64,一开始不是太理解,导致阅读Memtable出现一定障碍,所以这里就单独列出来讲下,下文用Varint特指Varint32。 一、什么是变长编码 【定义】 Varint是一种通过一个或多个字节来表示整数的方法。即之前用固定字节数来表示一个正数,Varint通过可变的字节数来表示一个整数。 【范围】 对于32(Varint32...

蜗牛,为梦想而生。 2067

64程序开发中的性能优化技巧

http://blog.chinaunix.net/u1/44989/showart_2082481.html 在64计算已越来越近的今天,越来越多的程序已开始考虑利用64所带来的强大优势,其中,64寻址对那些需要处理大量数据的应用程序来说尤为重要,如:工程与科学计算程序、大型数据库之类,现在已有许多的CPU及操作系统可本地支持64计算,但它们带来的最大好处也许还是巨大的寻

sunnydogzhou的专栏 4020

第77部分- Linux x86 64汇编 优化编译器代码

第77部分- Linux x86 64汇编 优化编译器代码-O1/-O2/-O3 仅仅使用汇编语言代码替换C或者C++不会必然使得程序执行的更好,因为编译器已经把所有高级语言代码都转化成了汇编语言。 这里的关键是编写比编译器生成的代码更好的汇编语言。当然也可以使用若干优化技巧来指示编译器生成汇编语言代码。我们需要了解如何从编译器生成代码,如何使用各种优化级别,以及利用了什么优化技术。 编译器的-O选提供了GNU编译器的优化步骤。共有3个级别 -O:提供基础的级别的优化 -O2:提供更加高级的代

badman250的专栏 560

你必须了解的64编程知识(下篇)

上文你必须了解的64编程知识(上篇)已经讲了些基本的知识,这篇文章开始通过一些例子来更好的呈现。 指针运算 64编程中,可能会有很多指针运算编程需要注意的地方,比如下面处理, short * test(short *ptr){ int n = (int) ptr+ 2; ptr=(short*)n;returnptr;} 很多时候,因为没有考虑到之后的代码会在64系统上...

weixin_39366778的博客 764

你必须了解的64编程知识(上篇)

不管你乐不乐意,软件程序员包括嵌入式软件程序员的世界已经快速向64进化。 2017年Apple宣布从iOS11开始所有的应用都需要是64bit的, https://developer.apple.com/documentation/uikit/app_and_environment/updating_your_app_from_32-bit_to_64-bit_architecture iOS 11and later, all apps use the 64-bit architectu.

weixin_39366778的博客 1231

PDF缩略图补丁64系统专用:解决您的PDF预览难题

PDF缩略图补丁64系统专用:解决您的PDF预览难题 【下载地址】PDF缩略图补丁64系统专用介绍 在64操作系统中,部分PDF阅读软件无法正常显示文件缩略图,给文档预览和管理带来困扰。针对这一问题,我们开发了“PDF缩略图补丁64系统专用”资源文件。该补丁经过严格测试,能够有效修复缩略图显示问题。用户只需下载并...

gitblog_06738的博客 1382

倍福TwinCAT_x64_Engineering_R3_2.11.2302兼容Win10 64资源介绍:PLC编程利器,兼容Windows 10

倍福TwinCAT_x64_Engineering_R3_2.11.2302兼容Win10 64资源介绍:PLC编程利器,兼容Windows 10 【下载地址】倍福TwinCAT_x64_Engineering_R3_2.11.2302兼容Win1064资源介绍 本开源目提供了倍福PLC最新版本TwinCAT 2....

gitblog_06744的博客 398

将 Linux 应用程序移植到 64 系统上

 http://www.ibm.com/developerworks/cn/linux/l-port64.html

zengwh的专栏 2098

64中的整数优化

64中的整数优化        在64计算已越来越近的今天,越来越多的程序已开始考虑利用64所带来的强大优势,其中,64寻址对那些需要处理大量数据的应用程序来说尤为重要,如:工程与科学计算程序、大型数据库之类,现在已有许多的CPU及操作系统可本地支持64计算,但它们带来的最大好处也许还是巨大的寻址空间,程序在其中可分配大于4GB的内存,更容易管理大文件等等。如果要充分发挥64C

谢启东的专栏 2559

android中64手机,我们需要64Android手机吗?

过去数月,多款新智能手机都把64处理器作为卖点。用户应当购买一款配置64处理器的手机吗?64处理器的性能是32处理器的2倍吗?这两个问题的答案是否定的。转向更新的ARM架构会带来性能的提升,但64计算技术却不能。在用户购买首款64Android手机(HTC Desire 510)前,或开始对将于今年秋季上市销售的64手机“垂涎欲滴”前,本文将讨论64计算技术的真正含义,以及用户需要...

weixin_42474537的博客 2021

Anaconda 中python3264并存,切换

anaconda,python是64,32

persistlau的博客 7584

3264计算机的区别

随着技术的不断进步和应用需求的不断增长,未来还会有更多的大容量内存出现。3264机器的区别主要在于处理信息的方式、寻址能力、操作系统和软件支持。随着技术的进步,64系统已成为主流,因为它可以处理更大规模的数据和更复杂的计算任务。通过将更多的数据和程序放入内存中,可以减少对硬盘的访问,从而降低因硬盘故障而导致的数据丢失或系统崩溃的风险。操作系统和软件支持:64操作系统可以支持更大的有效内存容量,一般大于4GB,而32系统最多只能支持4GB的内存。两者的主要区别在于它们处理信息的方式和寻址能力。

summer_fish的专栏 1648

32进程与64系统内存交互技术实现

本文还有配套的精品资源,点击获取 简介:在IT系统编程中,32进程与64内存的交互是一个关键技术话题。本文针对32进程如何在64系统中读写内存进行了探讨,包括技术挑战和解决方案。使用C++语言和Windows API实现,如 ReadProcessMemory 和 WriteProcessMemory ,展示了32进程如何通过Wow64...

weixin_33773084的博客 1297

VBA7.1 X64:WPS Office的64编程环境

在信息技术的快速发展中,64系统已经成为了主流。VBA(Visual Basic for Applications)作为一个强大的编程语言,其版本7.1针对X64架构的64系统进行了优化。这一章节将概述VBA7.1 X64的核心优势,以及如何在64系统中有效应用这一编程技术。VBA7.1 X64是专门为64Windows系统设计的版本,它带来了内存管理方面的改进,允许开发者处理更大的数据集,这对于数据密集型应用程序来说是至关重要的。

weixin_35636570的博客 1860
上一篇: GNU Project Debugger:使用 GDB 的更多乐趣
下一篇: 虚拟机nat方式设置动态ip
nevercgoodbye
博客等级 码龄18年 6粉丝 23原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值