Hatena::ブログ(Diary)

Y.FUJITA::NOTEPAD::YPSILON このページをアンテナに追加 RSSフィード

2009-05-23

YpsilonがPS3で動くようになりました

| 12:26 | YpsilonがPS3で動くようになりましたを含むブックマーク YpsilonがPS3で動くようになりましたのブックマークコメント

野田 開さんのご厚意によりPS3SSH経由で提供して頂きました m(_ _)m
32bit/64bit対応でFFIもサポート済みですよ。 :)

libspe2を使ったテストプログラムを作ってみました。
svn trunkのイプシロンをPS3に入れると動きます^^b

#!/usr/bin/env ypsilon
#!r6rs

;; ps3-cell-demo.scm
;; tested on PS3 Linux

(import (rnrs)
        (only (core) system format iota)
        (ypsilon ffi)
        (ypsilon concurrent)
        (ypsilon cell libspe2))

(define spe-code
  "
  #include <stdio.h>
  int main(unsigned long long spe_id, unsigned long long pdata) {
    printf(\"SPE:0x%llx sleep for 2 second\\n\", spe_id);
    sleep(2);
    printf(\"SPE:0x%llx exit\\n\", spe_id);
    return 0;
  }\n")

(define NULL 0)
(define source-file "spe_example.c")
(define object-file "spe_example")

(define make-spe-program
  (lambda ()
    (when (file-exists? source-file) (delete-file source-file))
    (call-with-port
      (open-output-file source-file)
      (lambda (port)
        (put-string port spe-code)))
    (unless (= (system (format "spu-gcc ~a -o ~a" source-file object-file)) 0)
      (error 'make-spe-program "unexpected error"))))

(make-spe-program)
(newline)

;; sequential

(let ((image (spe_image_open object-file)))
  (when (= image NULL) (error 'spe_image_open "unexpected error"))
  (for-each (lambda (n)
              (let ((context (spe_context_create (+ SPE_EVENTS_ENABLE SPE_MAP_PS) NULL)))
                (when (= context NULL) (error 'spe_context_create "unexpected error"))
                (spe_program_load context image)
                (let ((entry (make-c-int SPE_DEFAULT_ENTRY)))
                  (format #t "-- kick sequential run ~a/6\n" n)
                  (when (< (spe_context_run context entry 0 0 NULL NULL) 0)
                    (error 'spe_context_run "unexpected error"))
                  (spe_context_destroy context))))
            (iota 6))
  (spe_image_close image))

(newline)
(newline)

;; parallel

(let ((image (spe_image_open object-file)))
  (when (= image NULL) (error 'spe_image_open "unexpected error"))
  (let ((threads
         (map (lambda (n)
                (format #t "-- kick parallel run ~a/6\n" n)
                (future
                 (let ((context (spe_context_create (+ SPE_EVENTS_ENABLE SPE_MAP_PS) NULL)))
                   (when (= context NULL) (error 'spe_context_create "unexpected error"))
                   (spe_program_load context image)
                   (let ((entry (make-c-int SPE_DEFAULT_ENTRY)))
                     (when (< (spe_context_run context entry 0 0 NULL NULL) 0)
                       (error 'spe_context_run "unexpected error"))
                     (spe_context_destroy context)))))
              (iota 6))))
    (format #t "== wait for all SPE exit\n")
    (for-each (lambda (x) (x)) threads))
  (spe_image_close image))

このプログラムは、最初に一つのSPEで順次実行し、次に6個のSPEで並列実行します。

$ ypsilon example/ps3-cell-demo.scm 

-- kick sequential run 0/6
SPE:0x101b4340 sleep for 2 second
SPE:0x101b4340 exit
-- kick sequential run 1/6
SPE:0x101b4340 sleep for 2 second
SPE:0x101b4340 exit
-- kick sequential run 2/6
SPE:0x101b4340 sleep for 2 second
SPE:0x101b4340 exit
-- kick sequential run 3/6
SPE:0x101b4340 sleep for 2 second
SPE:0x101b4340 exit
-- kick sequential run 4/6
SPE:0x101b4340 sleep for 2 second
SPE:0x101b4340 exit
-- kick sequential run 5/6
SPE:0x101b4340 sleep for 2 second
SPE:0x101b4340 exit

-- kick parallel run 0/6
-- kick parallel run 1/6
-- kick parallel run 2/6
-- kick parallel run 3/6
SPE:0x101b5230 sleep for 2 second
SPE:0x101b5170 sleep for 2 second
SPE:0x101b52f0 sleep for 2 second
SPE:0x1020c248 sleep for 2 second
-- kick parallel run 4/6
-- kick parallel run 5/6
== wait for all SPE exit
SPE:0x10223910 sleep for 2 second
SPE:0x10237e48 sleep for 2 second
SPE:0x101b5230 exit
SPE:0x101b52f0 exit
SPE:0x101b5170 exit
SPE:0x1020c248 exit
SPE:0x10223910 exit
SPE:0x10237e48 exit

うまく動いているようです :D

ところでpowerpcはわたしの好きなCPUの一つなのですが、やはりあのニーモニックは微妙・・・思い出せばなんでもないことなんですけどね :p

SSH経由なのでエディタemacsを使いました。どこでも同じものが動くというのは素晴らしいことです!でも・・・あいかわらず・・・普段はほとんど使っていません(笑

okada-nokada-n 2009/05/23 19:55 有難うございます!
この時を待っておりました。
その上SPEまでサポートして頂けるとは感激です!!

fujita-yfujita-y 2009/05/23 22:36 こちらこそ!^^b
ところで、イプシロンはリビジョン473からppu-gccを使ってビルドするようになっています(ppu-gccがインストールされてなければ普通のgccを使います)なので、SDL1.2を使う場合にはイプシロンを、
$ make DATAMODEL=ILP32
$ make DATAMODEL=ILP32 install
する必要がありますのでご注意ください。
ちなみにSDL1.3をsvnから取ってきて、
$ ./autogen.sh
$ env CC=ppu-gcc ./configure
$ make
すればlibSDL.soのppc64版が作成できました。同じようにlibSDL_image.so, lib_mixer.soもビルドすると、64bit版のイプシロンで(import (ypsilon sdl))まで動くことは確認しています。
でも、ちゃんと画像や音がでるのかどうかは・・・不明です><
何か気づいたことがあったら、ぜひ教えて下さい m(_ _)m
では!

okada-nokada-n 2009/05/24 00:48 早速色々試して見ました。
SDLで画像を表示することは出きるのですが、
何故かSDL_ttfが正しく動かないようです。
以下のプログラムで、「セグメンテーション違反」が起きてしまいます。
#!r6rs

(import (rnrs)
(ypsilon sdl base)

(ypsilon sdl constants)

(ypsilon sdl types)
(ypsilon sdl ttf)
(ypsilon ffi))

(define-c-struct-methods SDL_Surface)


(SDL_Init SDL_INIT_VIDEO)
(TTF_Init)

(define *scrn-width* 560)

(define *scrn-height* 350)
(define *scrn* (SDL_SetVideoMode *scrn-width* *scrn-height* 32 SDL_SWSURFACE))


(define *font-path* "./VeraMono.ttf")
(define *size* 40)
(define *font* (TTF_OpenFont *font-path* *size*))


(define *text* "TEXT")
(define *w* (make-c-int 0))
(define *h* (make-c-int 0))
(TTF_SizeUTF8 *font* *text* *w* *h*)
(set! *w* (c-int-ref *w*))
(set! *h* (c-int-ref *h*))

(define *color* (TTF_Color 255 255 255))
(define *text-surface* (TTF_RenderUTF8_Blended *font* *text* *color*)) ;-> ここで「セグメンテーション違反です」と表示
※私のPS3にはyumでSDLのppc64版も入っているため、
 DATAMODEL=ILP32の指定は、必要無かったようです。
 試して見ましたが、現象は変わりませんでした。

fujita-yfujita-y 2009/05/24 14:30 リビジョン475で修正してみました。
お試し頂けると助かりますm(_ _)m

okada-nokada-n 2009/05/24 15:13 早速の対応有り難うございます。

SDL_ttfも動作するようになり、
前に作った以下のプログラムが、
SP3上で問題なく走っています!

http://www.geocities.jp/gcycm511/recordtest7y_scm.htm

fujita-yfujita-y 2009/05/24 22:10 よかったです^^v

okada-nokada-n 2009/06/10 22:14 example/に追加された jello.scmを実行してみました(P4上)。
Schemeでこんなプログラムを書けるんですね!!
素晴らしいです。

fujita-yfujita-y 2009/06/12 08:08 こういったゲームなら結構いけそうですよね^^b