打印

Sun Studio动手实验教程

本帖已经被作者加入个人空间

Sun Studio动手实验教程

多个权威的测试结果表明,在相同的硬件平台上,使用Solaris 操作系统以及Sun Studio 11进行应用程序开发,产生的二进制代码的执行效率要远高于在其他操作系统上使用gcc开发的二进制代码。

让我们一起来做20个简单的实验,了解一下Sun Studio!

先期准备工作:
读者必须首先安装Sun Studio软件,安装方法参考具体手册。

使用如下命令察看您的PATH设置

$echo $PATH

/usr/bin:/usr/local/bin:/opt/SunStudio_11/SUNWspro/bin:/usr/ccs/bin:/usr/sfw/bin:.

如果/opt/SunStudio_11/SUNWspro/bin不在你的PATH里面,你需要首先将他添加到您的PATH里面:

$export PATH=$PATH:/opt/SunStudio_11/SUNWspro/bin

或者在您的.profile配置文件中添加如下内容:

export PATH=$PATH:/opt/SunStudio_11/SUNWspro/bin
设置好如上环境变量之后,您需要下在所需练习的源代码: exercise_src.rar (230.84 KB)

[ 本帖最后由 云杉上的蝴蝶 于 2008-4-5 04:52 编辑 ]
本帖最近评分记录
  • 网络忏悔 X币 +8 感谢您发布的原创,期待您的下篇佳作! 2008-4-6 23:08
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习1:Sun Studio 11编译器简介

首先,从编译器开始了解Sun Studio 11。在Solaris 10(x86|SPARC)中使用gcc和Sun Studio cc编译示例代码(helloworld.c,C语言程序)。

应用程序:

helloworld.c将在屏幕中打印出字符串“Hello World!”。

1)使用Solaris 10中附带的“gcc”编译代码。

$/usr/sfw/bin/gcc -g helloworld.c -o helloworld

2)使用“cc”编译代码。

$cc -g helloworld.c -o helloworld

3)在编译时添加其他选项。

$cc [options] helloworld.c -o helloworld

选项:

    *

      #:打开verbose模式,显示选项命令详细扩展信息。
    *

      G:在编译时添加调试程序信息。
    *

      ###:显示要调用的各个组件,但是并不会实际执行它们。同时显示要展开的命令选项。

4)列出Sun Studio 11中的所有工具。

$ls /opt/SunStudio_11/SUNWspro/bin

5)可随时参阅在线手册获得帮助。

$man cc

$man CC

$man collect

,等等。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习2:使用Sun Studio编译器编译代码

在特定平台(SPARC| x86)上使用最常用的选项编译代码。

    *

      在x86平台上,使用不同选项构建32位或64位二进制文件。
    *

      使用符合特定平台的选项构建具有高性能的应用程序。


1)使用以下命令确认平台类型:

$uname -a

2)使用以下选项编译示例代码:

$cc [options] lp.c -o lp




注:(C)表示cc(C编译器)使用的编译器选项。(C++)表示CC(C++编译器)使用的编译器选项。否则该选项可同时用于cc和CC(C和C++编译器)。

3)确认二进制文件可以执行并确认数据长度正确无误。可以使用示例代码打印输出不同数据类型的正确大小。

比如说

$cc -xarch=native64 lp.c -o lp (在x4100系统上,a.out将为64位)

$cc lp.c -o lp (在x4100系统上,a.out默认将为32位)

检查文件类型为32位还是64位。 $ file ./lp

根据表格检查输出结果。

ILP32和LP64的数据类型大小
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习3:在使用dbx调试时控制程序执行

调试示例应用程序,在执行过程中跟踪变量和进程。$dbx numbers

应用程序特性:

    *

      单线程。


    *

      计算并打印输出数字序列。

最常使用的命令

$dbx <application name>

(dbx)run——运行可执行二进制文件

(dbx)list——列出代码

(dbx)next——跳转到下一步执行

(dbx)print <variable name>——打印输出值(dbx)stop at <filename: line n>——设置断点
(dbx)stop at <funcname :line n>

(dbx)cont——继续执行

(dbx)cont at <line n>——继续执行指定行

(dbx)call——调用func()

(dbx)delete <breakpoint number>——删除断点
(dbx)quit——退出执行
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习4:使用Sun Studio dbx调试多线程应用程序

调试多线程应用程序,在执行过程中跟踪变量和线程例程。

$dbx mt

应用程序特性:

    *

      3线程,主线程,计算线程和内存泄漏线程。
    *

      线程2执行计算并打印输出最终结果。
    *

      线程3在屏幕中打印输出一行字符串。
    *

      主线程在子线程退出之后退出。

最常使用的命令

$dbx <application name>

(dbx)run——运行可执行二进制文件

(dbx)list——列出代码

(dbx)next——跳转到下一步执行

(dbx)print <variable name>——打印输出值(dbx)stop at <filename: line n>——设置断点(dbx) (dbx)stop at <filename: line n>

(dbx)cont——继续执行

(dbx)call——调用func() (dbx)delete <breakpoint number >——删除断点

(dbx)threads——显示所有线程的信息

(dbx)thread——显示当前线程

(dbx)thread <thread id >——切换到线程id

(dbx)quit——退出执行
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习5:使用dbx修复应用程序并继续运行

调试示例应用程序,开启运行时检查。找出内存访问错误和内存泄漏,并修复这些问题而无需重编译和重链接。

$dbx testfix

应用程序特性:

    *

      单进程。
    *

      无效内存访问造成段错误(Segmentation Fault)。

最常使用的命令

$dbx <program name>

(dbx)run

(dbx)pop

(dbx)copy <changed code> <origin code>——比如说,执行(dbx) copy b.c a.c并编辑它(dbx)vi <sourcename>并纠正错误。

——比如说将14行从copy(0)修改为copy(buf)

(dbx)fix——运行时修复

(dbx)cont——继续

(dbx) quit——退出
5-1


将14行从copy(0)修改为copy(buf)并保存文件,然后执行修复:
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习6:gcc和Sun Studio编译之间的性能差异

使用带优化选项的gcc和cc编译相同计算密集的程序,在相同平台上SUN编译器生成二进制文件的性能较高。

应用程序特性:

计算密集。

1)使用gcc编译。

源文件:count.c

$/usr/sfw/bin/gcc -O2 -o count1 count.c or

$/usr/sfw/bin/gcc -O3 -o count2 count.c

2)使用cc编译。

$cc -fast -o count count.c

3)–fast选项展开时检查选项组合。
$cc -# -fast -o count count.c

4)区分执行二进制文件花费的时间。
$ptime ./count

$ptime ./count1

$ptime ./count2



$time ./count $time ./count1 $time ./count2

检查结果,找出性能最好的编译命令。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习7:Sun Studio 11编译优化选项

要在特定平台获得最佳性能,用户必须理解自己对编译器的准确需求。根据以下选项的知识,为示例应用程序选择最好的优化选项。

源代码名称:loop.c

应用程序特性:
计算密集。

1)判断更适合程序运行的模式,32位或64位。由于示例代码相当简单,我们使用64位模式构建它。

$cc -o a.out loop.c

2)尽可能明确地指定目标平台和框架。
X86(SUN Fire x4100):

$cc -xtarget=opteron -xarch=amd64 -o a1.out loop.c

SPARC(SUN Fire T1000 Server):

$cc -xtarget=ultraT1 -xarch=v8plusa -o a1.out loop.c

3)比较a1.out和a.out的运行时间。输出结果很长,添加“>/dev/null”选项后可以不在屏幕中显示这些内容。这样,便只会显示所花费的时间。

$ptime ./a.out >/dev/null

$ptime ./a1.out >/dev/null

或者

$time ./a.out >/dev/null $time ./a1.out >/dev/null

4)优化,在编译时添加优化选项。尝试使用-fast选项。
X86

$cc -fast -xtarget=opteron -xarch=amd64 -o a2.out loop.c

SPARC

$cc -fast -xtarget=ultraT1 -xarch=v8plusa -o a2.out loop.c

5)比较a2.out和a1.out的运行时间。

$ptime ./a1.out >/dev/null
$ptime ./a2.out >/dev/null



$time ./a1.out >/dev/null
$time ./a2.out >/dev/null

6)其他一些可用的优化选项:

    *

      xprefetch

启用预取指令(Sun Studio 9默认启用该选项)

    *

      xipo

启用过程间优化

    *

      xprofile=[collect|use]


编译并返回分析信息

[-fsimple=0 -fns=no]

无浮点计算优化。如果IEEE-754遵从性很重要,可使用该选项

[-xalias_level=val]

设置指针混淆等级(适用于C和C++)。只有能确定该选项对程序安全时才可以使用

[-xrestrict]

使用受限指针(适用于C)。只有能确定该选项对程序安全时才可以使用

    *

      xpagesize=64K

修改数据的页面大小

使用以上选项编译示例程序。
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习8:编译器移植,从gcc移植到Sun Studio编译器

要从gcc移植到Sun Studio11,需要修改以下这些对应的选项。尝试修改示例makefile文件并使用cc作为C语言编译器。



源代码名称:testcc.c
目标:testcc

应用程序特性:

   1.

      共享库(.so)。
   2.

      gcc编译选项:-fpic。
   3.

      SunStudio编译选项:-Kpic。

源代码名称:testmake.c

makefile文件:makefile.gnu makefile.sun

目标:test.so.gnu(gcc) test. so.sun(Sun Studio cc)

1)为gcc构建示例makefile文件并检查目标文件是否存在。 $/usr/ccs/bin/make -f <makefile_name>

2) 为cc构建示例makefile文件并检查目标文件是否存在。$/usr/ccs/bin/make -f <makefile_name>

3)尝试添加其他编译选项并使用gcc或cc分别构建它们,确认两款编译器之间的差异。

[ 本帖最后由 云杉上的蝴蝶 于 2008-4-4 21:39 编辑 ]
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP

练习9:使用dmake以并行模式中构建代码

Solaris操作系统中存在一些不同的构建工具。

dmake ->
/opt/SunStudio_11/SUNWspro/bin/dmake

gmake -> /usr/sfw/bin/gmake

solaris make ->
/usr/ccs/bin/make

dmake可以在相同主机或不同主机上以并行模式构建代码,从而大量节省编译时间。

源代码:

来自www.sunfreeware.com
(Solaris 10,x86)的top-3.6.1

1)将符号链接设置为“make -> gmake”。配置源代码并使用gmake构建示例代码。.

$ ./configure

$time make

记录实际花费的时间。

2)修改符号链接为使用Solaris make(/usr/ccs/bin/make)。配置并构建源代码。

$ ./configure

$time make

记录实际花费的时间。

3)将符号链接修改为“make ->dmake”。配置并构建源代码。
$ ./configure

export DMAKE_MODE=parallel

export DMAKE_MAX_JOB S=16

$time make

记录实际花费的时间。

4)比较gmake、make和dmake使用的时间。

可选*)尝试在自己的环境中建立含有两个或多个主机的环境。

参考资料

http://docs-pdf.sun.com/819-3697- 10/819-3697-1 0.pdf
|-- AI by Spruce Lab -- | Discover the Info. Tech. for Personal! && Powered by Solaris & Oracle

通告:即日起启用新MSN和Mail地址:aic.lab.sif@gmail.com 原来的最多1个月后停用!

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-12-2 18:29 京ICP证060528 号