正在阅读:CELL Broadband Engine软件开发环境介绍CELL Broadband Engine软件开发环境介绍

2007-06-26 11:18 出处:PConline 作者:PConline服务器频道 责任编辑:gongjianhui

  4. Hello World!

  在这一节,将通过一个Hello World例子来展示CELL BE编程,尤其是PPE编程和SPE编程。同时,还将介绍如何编译和生成CELL BE的可执行代码。

  在这个例子中,我们将创建8个SPE线程,每个SPE线程在屏幕上打印一句“Hello, CELL World!”的问候语。

  首先,是SPU上的执行代码,这部分很简单,与我们教科书上的Hello World类似。  

     

       /*spu.c*/
    #include <stdio.h>
    int main (unsigned long long id)
    {
        printf (“Hello, Wonderful CELL World (%llu)!\n”, id);
        return 0;
    }


  图 4 SPU上的代码,将在屏幕上打印”Hello World!”。

  PPU上的执行代码稍微复杂一些,它将负责创建8个SPE线程,并等待SPE线程的退出。如果您有Linux多线程开发的经验,将会非常容易理解以下代码,下面的代码看起来非常像Posix的线程编程。由于有SPE开发库的支持,创建和管理SPE线程,是一件轻松的事情。

  

       /* ppu.c */
    #include <stdlib.h>
    #include <stdio.h>
    #include <libspe.h>
    extern spe_program_handle_t spu;
     int main()
    {
    speid_t ids[8];
    int i;
      int st;
     for(i=0; i<8; i++){
         ids[i] = spe_create_thread(0, &spu, NULL, NULL, -1, 0);
          if (0 == ids[i]) {
            fprintf(stderr, "Failed to create spu thread\n");
            exit(-1);
         }
    }
    for (i=0; i<8; i++) {
         (void)spe_wait(ids[i], &st, 0);
   }
      return 0;
    }

  图 5 PPU上的执行代码,负责创建8个SPE线程。

  其中spe_creat_thread是SPE线程管理库中提供的函数。在这里,PPU创建了8个SPU线程,且把spu作为入口地址,然后在PPU上执行的主线程等待SPU线程结束后退出。

  编译CELL BE程序和普通的应用程序略有区别。一个SPU的binary需要转化为CESOF (Cell Embedded SPE Object Format)的方式,然后再将其与一个PPU binary链接起来。因为,一个SPU binary是不能被单独执行的(在SystemSim环境中除外)。所以,我们需要由PPU来创建一个SPU线程,然后通过这个线程在SPU上执行这段代码。而PPU binary是通过CESOF来获得SPU上这段执行代码的入口地址(有效地址)的。这部分工作通过以下两个步骤完成。首先,我们需要将SPU的源代码编译为一个可执行文件。然后通过GNU toolchain提供的ppu-embedspu工具来将其转为一个CESOF。

  在这里,我们通过GNU toolchain for CELL BE提供的交叉编译工具(spu-gcc,ppu-embedspu,ppu-ar和ppu-gcc)来编译Hello World!。

  1.首先,编译SPU上的可执行代码:
  spu-gcc -W -Wall –Wno-main -I${CELL_SDK_ROOT}/sysroot/user/spu/include -include spu_intrinsics.h -O3 -c spu.c
  spu-gcc -o spu spu.o -W1, -N ${CELL_SDK_ROOT)}/sysroot/usr/spu/lib/libc.a
  2.将SPU的对象文件转换为CESOF。ppu-embedspu有三个参数,分别为symbol name, 可执行文件名以及目标文件名。
  ppu-embedspu -m32 spu spu spu-embed.o
  ppu-ar -qcs lib_spu.a spu-embed.o
  3.编译PPU的可执行代码
ppu-gcc -W -Wall -m32 -I. -I${CELL_SDK_ROOT}/sysroot/usr/include -O3 -c ppu.c
  4.链接PPU对象和CESOF对象
ppu-gcc -o helloworld ppu.o -L${CELL_BE_ROOT}/sysroot/usr/lib -m32 -Wl,-m,elf32ppc spu/lib_spu.a –lspe

  在SystemSim环境运行helloworld,并察看运行结果。

  

在SystemSim环境中,运行Hello Wor


 
  图 6 在SystemSim环境中,运行Hello World!

  为了进一步理解CESOF对象,我们可以使用nm察看CESOF的内容。从图 7可以看到,在spu-embed.o中,有一个名为SPU的symbol,它是SPU上可执行代码的入口地址。

  

$ nm spu-embed.o
00000000 r __speelf__
00000000 d __spetoe__
00000000 D spu

  图 7 CESOF对象。其中,spu为spe_program_handle_t,即SPU线程的入口地址。

键盘也能翻页,试试“← →”键
本文导航
第1页:CELL BE处理器介绍
第2页:CELL BE 软件开发环境
第3页:CELL BE编程模型
第4页:Hello World!
第5页:优化应用程序

为您推荐

加载更多
加载更多
加载更多
加载更多
加载更多
加载更多
加载更多
加载更多
加载更多

服务器论坛帖子排行

最高点击 最高回复 最新
最新资讯离线随时看 聊天吐槽赢奖品