基于IA64的移植优化和应用解决方案
一. IA64体系架构
为了适应当今网络计算和电子商务应用的发展,克服IA32架构的系统瓶颈,Intel推出了崭新的64位体系结构—IA64 。IA64采用显示并行指令计算系统(EPIC),提供创新的指令并行运行方式,彻底革新了传统的指令串行运行机制,它特有的分支预测、大容量的分级缓存和堆栈、64位内存地址空间为海量计算、海量存储提供了强劲的动力和空间保证。基于IA64的高性能服务器为电子商务、数据仓库等应用提供了高度灵活、反应快速、超大虚拟地址等运行模式,能极大地提高系统运行的整体性能,降低综合成本。
相对于IA32架构,我们可以从下面9个方面分析IA64架构的特性:
1. 指令级的并行机制:IA64架构提供多条指令同时执行的并行机制 ,极大地提高系统的性能。
2. 对处理器通信的编译:IA64架构提供指令模板、分支提示、缓存提示等机制帮助编译器完成信息的实时编译。
3. 预测技术(Speculation):指对数据和控制的预测。
4. 判决技术 (Predication):用于对IF语句的判断,以提高CPU的执行速度。
5. 寄存器堆栈管理技术:IA64架构提供特别的技术管理寄存器堆栈。提高堆栈的使用效率,减小堆栈的溢出。
6. 分支技术 (Branching):IA64提供特别的分支判决指令用于实际目标地址和分支位置之间的通信,减小分支预测的错误,加速运算的速度。
7. 寄存器旋转机制:在寄存器执行计划中,由于存在分支预测错误,寄存器通常需要回滚和重命名,这极大地影响了系统的性能。IA64提供一种叫寄存器旋转技术避免寄存器在多次循环选择运算中的回滚,提高系统的性能。
8. 浮点运算架构:IA64浮点架构支持单精度(32bit)、双精度(64bit)、扩展双精度(80bit)数据类型。定义128个浮点指针寄存器,一种特别的存储方式,96个循环寄存器用于加减乘除、最大最小混合运算,提高计算速度和计算精度。它的并行浮点运算指令可以一次并行独立*作两个32位的单精度数字。这些指令极大地提高了单精度浮点运算的计算吞吐量,提高了3D应用和游戏的性能。
9. 对多媒体应用的支持:IA64的指令集中有专门的指令处理与多媒体应用有关的加密/解密算法,为音、视频应用提供强大的性能保证。
二. IA64平台介绍
ITANIUM
2001年5月INTEL推出第一代IA64处理器---ITANIUM,ITANIUM架构同时支持32位和64位指令系统。众多的国内外服务器厂商和软件厂商都在致力于IA64服务器和相关软件的开发和推广。到现在,支持IA64架构的平台如下:
服务器硬件平台:(国内)浪潮、HP(国外)等;
*作系统平台:LINUX(REDHAT、TURBO LINUX、SUSE LINUX等)
WINDOWS
数据库平台:ORACLE、MS SQL SERVER
除了在服务器硬件、*作系统、数据库等方面全面支持IA64架构之外,众多的应用厂商也在致力于应用的推广,为了帮助基于IA64应用的开发,有的公司还专门开发了IA64的仿真软件,可以让用户在IA32架构的机器上开发和调试IA64架构的应用软件。在第一代ITANIUM的推广中,其优秀的浮点运算性能得到了众多的高校研究机构的认可,浪潮基于IA64架构的服务器SP2000就在山东大学、江苏等高校和政府部门得到了实际的应用。
ITANIUM II
2002年7月INTEL推出了第二代IA64处理器---ITANIUM II,ITANIUM II 只能支持64位指令。浪潮于7月9日率先发布了基于ITANIUM II的服务器 SP3000。所有基于ITANIUM的*作系统、数据库、应用软件都能很好的运行在ITANIUM II的服务器上,无须任何移植工作。同时ITANIUM II提供了至少高于ITANIUM 50%的性能,将在数据计算密集型的应用中得到广泛的应用。
三. IA32到IA64应用的移植和性能优化
由于IA32和IA64有着体系结构上的不同,为了让应用能顺利的运行在IA64的机器上,我们要对应用进行移植。浪潮方案中心在帮助用户进行应用的移植过程中总结出一套完整的方案,保证移植工作的顺利进行。
IA32到IA64应用的移植:
1. 确定须移植的应用,必须拿到应用程序的源代码才能进行移植;
2. 分析应用的程序结构,运行机制,使用的数据类型,调用的静态库、动态库。对于动态库,即使IA64架构允许*作系统也绝对禁止32位和64位库的混用,同时IA32和IA64对数据类型的定义也是是不同的。
3. 确定应用需要的IA64*作系统。不同的*作系统在数据的定义上有些许不同。
数据模型 *作系统 整型数(BYTES) 长整型数(BYTES) 指针(BYTES)
ILP32 32位*作系统 4 4 4
LP64 WIN64 4 4 8
ILP64 64UNIX(LINUX) 4 8 8
在IA64中,指针型数据长度均为8个字节,长整型数在WIN64中占4个字节,在LINUX64中则占8个字节。
4. 修改源代码。注意由于地址空间的改变原数据和读写格式和运算所需中间变量、存储空间的变化,避免出现内存分配、数据读写等错误。
5. 在IA64机器上编译,防止语句的语法错误。
6. 在IA64机器上执行。可以检查对库的调用和数据读写运算逻辑中隐藏的错误。这时要充分利用调试工具,设置断点对错误进行定位。有些错误可以根据错误信息很容易找到,有些错误却很难,需要优化的工程师充分理解用户应用的逻辑和算法。
7. 修改后再执行,直到成功地找到错误改正,程序成功运行才表示移植工作的完成。
IA32到IA64应用移植案例分析
某大学一个纯计算项目,源码用标准C语言编写,进行一个多重循环的计算。我们采用REDHAT LINUX64*作系统,浪潮SP2000服务器作移植。程序中,源数据从文件中读入,计算结果也输出到文件中。下面是代码的一部分:
Result *result ,*rtmp,*Ref;
Object *object;
FILE *fp1,*fp3;
long i,j,k,k1,xsize=Maxsize,ysize=Maxsize;
double Delta=0.02;
double x,y,z,amp,phase,tmp1,tmp2,theta,tmp3,tmp4;
double r,ps,p1=2*3.1415926/0.006328;
double t1,t2,t3;
double zmag,xmag,z0=2500,Angl=5;
#ifdef WINNT
__int64 T0,T1,Frq;
QueryPerformanceFrequency((_LARGE_INTEGER *)&Frq);
#else
struct timeval tm1,tm2;
#endif
if((fp1=fopen("config.dat","r"))!=NULL)
{
fscanf(fp1,"%ld%ld%lf%lf%lf",&xsize,&ysize,&Delta,&z0,&Angl);
fclose(fp1);
z0=z0*10;
printf("config x:%d y:%d Delta:%lf\n",xsize,ysize,Delta);
}
fp1=fopen("test.dat","r");
fscanf(fp1,"%d%lf%lf",&k,&zmag,&xmag);
if((object=(Object *)calloc(k,sizeof(Object)))==NULL)
{
printf("Memory alloc Error 1!\n");
exit(0);
}
printf("Reading...\n");
上面的代码在REDHAT LINUX64*作系统上用GCC编译器编译通过,但在执行中错误退出,错误信息提示为:Memory alloc Error 1。分析上面的代码我们可以看到:错误信息由我们的程序自己抛出,这样我们可以断定出错点必然错误信息输出行之前,这样我们首先为错误进行了定位;然后经过仔细分析,我们发现K这个变量定义为LONG,占8个字节。而在其后的数据读入中,以%d的格式读入(分配的空间为4个字节),所以系统运行错误退出,改为%ld后,系统运行正常。
因此,在应用的移植中要充分考虑由于数据类型定义发生变化,经常会出现内存分配、溢出等错误,就其原因,大都是数据类型定义改变后,数据长度发生变化造成。
IA64应用的性能优化
应用从IA32移植到IA64后,由于体系结构的不同,基于传统串型指令编写的程序并不能充分发挥IA64架构的优势,因此,系统的优化是必不可少的一步。系统性能优化又可以分为三个部分:*作系统优化、编译优化、代码优化。分别从系统的三个部分进行全面的性能改善。
。*作系统优化:针对LINUX平台,我们知道由于它开放源码,采用不同版本的内核的系统整体性能差别相当大。所以,对*作系统优化的第一步就是对LINUX*作系统的内核进行升级。我们采用最新版本的内核原码,通过重新编译,使*作系统内核性能最佳。其次,还要对*作系统的库文件进行优化。升级能够得到的所有的库文件,提高*作系统的整体性能。
。编译优化:经过对*作系统的优化后,我们得到了一个能尽可能发挥硬件系统资源的*作系统,一个性能很好的平台,是否应用就能获得很好的性能呢?其实还不一定,原因在于*作系统之上运行的应用,它是否充分利用的*作系统动用硬件的资源。为了优化应用系统的运行性能,我们可以采用两种方式:对编译过程进行优化和换用性能更好的编译器。在对编译过程进行优化我们主要是通过根据应用的特点选择不同的编译参数来实现。同时,不同的编译器性能差异很大,通常LINUX系统带的GCC编译器性能较差,WINDOWS带的编译器要好一些,针对INTEL的芯片,INTEL公司的ICC、ECC编译器性能最好,在SP2000机器上,经ECC编译的应用比用GCC编译性能有数倍的提升。
。代码优化:经过对编译过程和编译器进行优化后,应用还没有达到最优,只有从应用的逻辑算法上优化才是最根本,最彻底的优化手段,同时也是最危险,最困难的一步。通常我们在进行应用的移植中尽可能地不改变应用的逻辑算法,因为如果对应用逻辑理解不充分,很可能得到错误结果,这远比性能较差却能得到正确结果的应用造成的后果可怕,所以,在进行逻辑算法的优化时首先要充分理解应用的逻辑算法,然后要理解IA64架构的特点,同时可以借助工具分析应用的瓶颈,再进行重点的改写。改写中要遵循最少原则,尽可能做最小的改动,同时要进行试算,保证改变前后的运算结果一致。经过代码的优化后,应用整体性能的提高通常无法估计,通常是没有最好只有更好,只要达到实际的要求就可以了。
IA64应用优化的案例分析
还是上面描述的某大学的纯计算应用,在完成应用的移植后,在浪潮方案中心,使用浪潮SP2000机器,进行了性能的优化。采用上述的三种优化方法,我们分别得到了下面的结果:
阶段 运行速度(S) 性能提升(倍)
移植完成 18
*作系统优化 8 1.25
编译器优化 4 1
代码优化 1.8 1.2
通过上面的数据我们可以看到,经过三个阶段的优化,应用性能得到了极大的提升,运行速度缩短到原来的十分之一。其实我们的优化还可以进行,因为我们仅对用监视工具发现的几个耗时点中的一个进行了小范围的改写,如果我们进一步分析其余的几个耗时点,我们应该还能有更多的收获。
四. 基于IA64的应用解决方案
由于IA64架构的特性,使得基于IA64架构的服务器具有优越的计算性能和IO吞吐量,这在密集计算和基于网络计算的电子商务等方面有着极大的应用潜力。浪潮在深入理解IA64体系架构的优势之上,通过与合作伙伴的密切合作,推出浪潮IA64数据库应用解决方案、浪潮数据库集群解决方案和浪潮IA64高性能计算集群解决方案
浪潮IA64数据库应用解决方案:采用基于IA64的浪潮SP2000或SP3000高性能服务器作为后台数据库平台,通过1000M交换机将数据库服务器和其它的应用服务器连接在一起,为各种基于互联网的应用系统提供性能强大、运行可靠的数据平台。
系统逻辑结构图:
浪潮IA64数据库应用解决方案
浪潮通软集团财务软件已成功地运行于浪潮IA64数据库的系统平台,为企业的应用提供了强劲的数据分析和处理能力。
浪潮IA64数据库HA解决方案:采用浪潮2台浪潮IA64 SP2000或SP3000高性能服务器,通过千兆以太网实现内部和网络的互连,采用光纤通道存储设备实现海量数据的存储,为用户提供海量计算和海量存储相结合的数据库集群解决方案。
系统的逻辑结构图为:
浪潮IA64数据库HA解决方案
通过专有的数据库双机软件或WINDOWS .net上的集群服务,我们可以对SQL SERVER、ORACLE 9I在WINDOWS.net和LINUX系统上实现双机热备(HA)的高可用性解决方案,为关键业务提供可靠、高效的数据库后台系统。
浪潮IA64高性能计算集群解决方案:在进行一些计算密集型的计算任务,如:天气预报、油田勘探、动画染色、流体力学、空气动力学等工程应用、科学研究中,其计算量与一台机器的计算能力相比是极其庞大的,通常在实际应用中,推荐采用高性能并行计算的集群系统。
浪潮SP2000/SP3000高性能服务器,其基于IA64的全新架构,提供强大的并行运算和浮点运算能力,用SP2000/SP3000搭建的高性能并行计算集群系统提供超强的计算性能。
系统逻辑结构图:
浪潮IA64高性能计算集群解决方案
在计算规模较小,数据交换量不大的应用中,高性能计算集群的内部互联系统可以采用100/1000M以太网互联,如果计算规模较大,数据交换量大,通常采用MYRINET、SCI等专用高性能互联设备实现计算节点间的互连。前端用一台浪潮英信NF100T服务器作为前端机,对整个集群进行管理和监控。整个集群系统具有极高的运算性能和高速的数据交换能力,同时具有良好的管理和监控功能。
There is not end for innovations.
济南同城网管QQ群:11497759