多核加速应用程序

时间:2022-10-06 02:10:40

多核加速应用程序

本文介绍了便于构建多线程Java基准测试的一种软件框架,它把两种逻辑上不同的需求分开来:如何运行基准测试与基准测试实际评测哪些内容。该框架主要侧重于让用户可以扩展框架,从而能够对照特定的应用或者目的对多家厂商的多核CPU进行基准测试。

计算机业界对基准测试的迷恋几乎到了无以复加的地步。许多项目通常会分配相当大一部分的时间用于对厂商的软硬件(应用服务器、JDK和IDE)来一次“选美大赛”

由于目前并行化硬件数量激增,基准测试再次成了热门话题。本文会探讨如何评测这种硬件的实现效果有多好。这个过程困难重重――基准测试本身更多时候因无法测试或者测试不准确而备受诟病,却很少因测试公正性而备受好评。本文的这个基准测试同样摆脱不了这种命运。不过读完了本文后,读者会明白我们是如何设计及实现框架的、它可以评测什么(不能评测什么)及其可能的应用。

在深入探讨之前,我想先定义一下什么是基准测试:基准测试是一种测试,可以通过可重复、客观、透明的一种方式,对针对同一目的的多种实现彼此进行比较。

给出了这个定义之后,我们认为,任何基准测试都有两个逻辑部分,因而,这些不同目标在现有的基准测试中没有分开来。这两个部分是:一是成功执行基准测试所需的基础架构:二是测试本身,这总是针对特定的应用。这一假定是下文的关键所在。

基准测试框架

在介绍本文构建的基准测试框架之前,先看一下有哪些现有的框架可供使用。简而言之,没有一个框架是适合的。现有的框架存在的问题可以归纳如下:过时或未得到维护; 成了厂商相互竞争的地盘,因而靠不住;往往关注科学或工程应用(譬如浮点运算性能);往往关注JVM方面的基准测试;针对性非常强(譬如Volano基准测试的对象是聊天服务器――如果在构建聊天服务器,这很好,不然,这种基准测试并不适用)。

这些框架也无法区别基准测试和测试本身。换句话说,基准测试的潜在对象是整个Java开发社区。不可能设计出能适用于各部分对象的基准测试。但如果我们能够把基准测试运行的东西与基准测试的基本内容本身分开来,那么框架在扩展后就具有适用性了。

如图1所示,我们特意让框架力求简单,想让框架易于理解及扩展,另外也想尽量减少测试目标硬件和软件平台时产生的隐性开销。

通过使用Java平台、Standard Edtion 6.0及更高版本的特性,尤其是添加并发API,大大简化了这个基准测试。没有用到针对特定平台的任何特性。不过,如果扩展了框架,就可以随意使用这些特性,把目标平台推向极限。该框架应该可以在所有平台上直接运行,具体来讲是Windows、Unix和Linux这些平台。

框架的工作方式

以下代码片段详细表明了这个框架有多简单。一旦读者明白了这种主要方法,基本上就可以理解框架本身了。

public static void main(String[] args) throws Exception {

LoadTestEngine te = new LoadTestEngine();

//保存与我们想如何执行加载测试有关的所有数据

LoadTestMetaData ltmd = new LoadTestMetaData();

//分析加载测试输出的对象

Analyser ra = new LinpackRunAnalyser();

ltmd.setAnalyser(ra);

//弄清楚我们想运行多少个线程

//使用声称的内核数量并加1个

int numThreads = Runtime.getRuntime().availableProcessors() + 1;

ltmd.setNumThreads(numThreads);

//ltmd.setTaskClass(LinpackTask.class);

//现在设置我们想构成每一个任务基础的类

ltmd.setTaskClass(SimpleTask.class);

//我们希望任务执行多少次

ltmd.setNumIterations(1000);

//我们需要未完成的任何任务能够继续完成,

//于是我们设定了截止点,过了这个点,我们就不再等任务完成

ltmd.setTaskTimeout(10000);

te.setLoadTestMetaData(ltmd);

long startTime = System.currentTimeMillis();

RunResult rr = te.runLoadTest();

long endTime = System.currentTimeMillis() - startTime;

System.out.println(rr);

System.out.println("Engine output BEGIN");

System.out.println("Total elapsed time (ms): " + endTime);

System.out.println("Engine output END");

te.stop();

}

但实际工作是由LoadTestEngine.java完成的,具体是这段代码:

//首先,启动任务

for(int i = 0; i < numTasks;i++){

try {

Task t = (Task) ltmd.getTaskClass().newInstance();

//让fw扩展器返回TaksResult的子类型

Future< ? extends TaskResult> f = pool.submit(t);

futures[i] = f;

} catch (InstantiationException e1) {

throw new LoadTestException(e1);

} catch (IllegalAccessException e) {

throw new LoadTestException(e);

}

}

// 现在整理结果

for(int i = 0; i< numTasks;i++){

try {

TaskResult tr = futures[i].get(ltmd.getTaskTimeout(),

TimeUnit.MILLISECONDS);

ra.addTaskResult(tr);

} catch (TimeoutException e) {

e.printStackTrace();

} catch (ExecutionException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

return ra.analyse();

该代码使用由ExecutorService管理的一组线程来执行我所定义的工作负载,然后通过Future.get()方法收集结果,以便最终分析。

框架的优缺点

框架非常简单,简而言之,用不了十分钟,应当能够了解框架的运作方式,直至代码。框架可以扩展,默认状态下,该框架旨在让用户可以进行扩展。因此,如果想测试Spring和Struts/WebWork,那么这个框架能够进行客观地测试。框架可以在多线程环境下测试应用程序的正确性。一旦扩展后,框架就可以集成到持续集成环境中,用来确保开发中的应用程序可以继续满足稳定性、扩展性和性能等方面的标准。

但是,框架过于简单。如果任务是了解某个版本的特定框架(譬如Spring R1.2)是如何运作的,那么这个框架充其量只是供你使用的外壳。默认状态下,该框架评测的只是我们让它来评测的内容。虽然这听上去很显然,但有一点很清楚:魔鬼存在于细节中。两个基准测试可能是测试某个应用程序在运行特定硬件配置的多线程Java环境中进行扩展的功能,但实际上它们测试的可能是某个系统中完全不同的方面。换句话说,这两个基准测试是微观基准测试,而在孤立状态下进行的微观基准测试获得的结果总是具有误导性。

链接:主流处理器厂商产品特点

英特尔

英特尔的硬件一度就是超线程概念的同义词,但现在它更成熟了,包括真正支持多核的功能――譬如说,现在双核CPU就出现在新款Apple MacBook里面。最初,英特尔实现的超线程复制了CPU架构的一些部分,而架构的其他部分只保留了一份,从而在某些情况下会造成瓶颈。这种实现手段最多只能看成是权宜之计,目的在于在真正的多核支持(一开始是双核)渐渐投入生产的同时,可以取悦市场。英特尔今年已经为服务器市场了四核CPU。

AMD

AMD提供双核CPU。此外,它使用直接连接(Direct Connect)和超传输总线(HyperTransport)等技术把这些CPU连接起来,从而形成更庞大的CPU集群。

Sun

Sun真正拥护服务器上采用并行计算的强大功能,目前的T1(Niagara)系列及规划中的T2(Rock)系统就表明了这一点。当然,早在基于T1的系列问世之前,Sun就一直在制造高端服务器,但T1真正才开始兑现并行硬件作为大路货的承诺。

遗憾的是,T1有一个缺点,只有T2才能解决它――支持并行浮点操作的功能很差,所以如果需要这项特性,那么T1不适合你。但如果想在典型的Web服务器环境中使用T1,它就很理想。除了这个弱点外,T1使用八核CPU、每个内核都能够处理四个不同的活动线程上下文,从而最多可以提供32个真正独立的线程。

IBM

在本文探讨的所有硬件厂商中,IBM的Cell处理器(IBM联合索尼和东芝开发而成)恐怕是功能最强大的产品之一,它为索尼PlayStation 3即PS3提供了多核芯片。Cell处理器实际上是POWER5 CPU,借助显示视频游戏所需的数量众多的向量和浮点操作,另外增加了八个处理器来处理任务。

IBM针对比较主流的市场推出的主要产品是双核POWER5+ CPU,POWER6定于2007年交付(恐怕也是双核)。大多数业界观察人士认为,就单个内核而言,POWER CPU的速度比竞争产品快得多。与Sun一样,IBM可以运用丰富的经验(包括大型机技术)来解决制造多核CPU所固有的技术设计问题。值得关注的是,由于Cell已成为索尼PS3的一部分,IBM享有独特优势:有望在今后十年让其并行硬件进入千家万户――这一点值得客户端编程人员考虑。

上一篇:RSA新推信息风险管理解决方案 下一篇:SOX法案对信息系统控制的要求