トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

独り言日記(2005/05)

独り言日記

デバッグと息抜き(2005/05/28)

デバッグで煮詰まってなかなか原因をつかめなかったため、息抜きに本屋に。英語コーナーにて「ネコと話す英会話(光文社)」というのが砕けた感じでわかりやすそうだったので購入。「Let's」が「Let us」の省略型だと今さら認識しました。なんで、「一緒に歌を歌いましょう。」というのを「with me」なんかつけると間違いとなります(Let'sの中に私(i)も私達(we)も入っているため)。「Let's sing a song together.」が正解。いやはや、無知ですな、私。

作業中はなかなか英語に集中できないのですが、なんとか両立できないものか・・・。(かといって、英語のドキュメントを読みながらってのも効率悪いしなぁ。なんせ、基礎がダメダメなので左から右に流れるだけ(^_^;;)勉強自身は楽しいのですが、もうちょっと区分けしてスケジューリングしないとダメですね。

後、本屋にて下記で紹介した「Shadeプラグイン大全」は、もうすでに売ってました。6/24発売でなかったっけ・・・(BNNさんのとこの誤植かな?)。これ、CD-ROMがついてないのですがサンプルファイル参照部分があります。実際にサンプルみないと全体を通して把握することが難しいところがありますので、BNNさんのところでソースをダウンロードできるようにしていただく予定で進めてます。

今しばらくお待ちくださいませ。

ゲーム攻略(2005/05/27)

仕事で某ゲームの舞台設定(ストーリー)とステージなどをデザインさせていただいたのですが、あれ、クリアできた人がいるのだろうか・・・・。(テスト段階でも誰一人クリアできず、結局私だけがクリアしていたというきつめの設定です(^_^;;)わけあって公にできないけど(といっても別に妖しいゲームではないです。スタッフロールにちょこっと名前を入れてもらいました(笑))好評ではあるようで。

ヌルゲーではない昔気質のゲームなんで、評価はどう出るか楽しみではあります。しかし今の人って、どんなゲームを好むのでしょうね?RPGやアドベンチャーはあきらかにヌルゲー化してるように感じます。アクションもかな。

しかし、シューティングは・・・無理です・・・一般人じゃとうていクリアできないような(<弾幕系)。でも、ノーミスクリアするような方もいるんですよね・・・どういう動体視力なんだろ・・。でも、なぜシューティングだけハイレベルになったんでしょうね?

Shadeプラグイン大全(2005/05/27)

Shade7.5のプラグインSDKの使い方や機能などを説明した書籍が発売されます。プラグイン開発者向け書籍であります。

http://www.bnn.co.jp/books/archives/2005/04/shade_2.html

自作自演になるのですが(^_^;;、執筆させていただきました。本当はもっと機能の説明を詳しく書いた方がよかったのですが、入門書みたいな立ち位置になっちゃいますね。window_interfaceの説明だけでも、本1冊は書ける内容かと思います。もし書くとすると、昔のVC++のマニュアルみたいに複数冊子がないと完全網羅は難しいですね。(実は、初期段階では3Dに関する基本的なことも書くつもりでいたのですが、3Dアルゴリズム本ではなくてShade本なので、ということでそれはお流れになりました。そのため、ちょっと敷居が高いかもしれません。Shadeを使っていて、3Dプログラミングが分かっている方でかつC++言語で開発ができる方がターゲットです。ねらいがニッチだ・・・・)

しかし、Shade本でありながらプログラム全開ってのはある意味爽快だなぁ。

スクリプトに関しては、「Shadeスクリプト大全」があります。

http://www.bnn.co.jp/books/archives/2004/12/shade_1.html

といった感じで、私自身は実は水面下で協力したりしてます(Shade6からブランクが空いてるように表立っては見えてますが、何かしらやってますね)。補足など、このサイトでも取り上げていければと思ってます。

defineによるコンパイルエラー(2005/05/24)

Windows APIやMFCやDirectXなどでプログラムしているときに自分で使う関数の名称で「DrawText」「DrawImage」みたいにありきたりな命名すると、コンパイル時に「error C2039: 'DrawTextA' : 'CMyInfo' のメンバではありません。」みたいにエラーになって袋小路にはまるときがあります。

「DrawTextA」なんてつけた覚えはないのに・・・と思って、「DrawText2」みたいに変えるとコンパイルが通って「あれ?」とかなってしまいます。

原因はどこかのヘッダファイルで「#define DrawText DrawTextA」みたいに定義されていて「DrawText ==> DrawTextA」に置き換わっていた、というのがオチだったりします。ヘッダでの全置換はやめてほしいものですねぇ、これで小一時間ほど費やしてしまったです(T_T)。

しかし、DirectX9 SDK・・・おまえもか・・・。「d3dx9core.h」にてこの置き換えしてます。

こんな場合は、ヘッダの関数名を変えるのはシャクなので、自分が使うDrawText関数の記述されているソースの先頭にて

#define DrawTextA DrawText 

にて変換の変換をかけてやります(せこっ)。というか、複数の外部ライブラリを使用していればこんな衝突もありますのでもうちと考えてほしいもんですね。<MSとかMSとか・・・

雑誌(2005/05/21)

最近は、もう1年以上(創刊号から愛読していた、といってもはじめは父親が買っていたんですが 途中からバトンタッチしました)「C MAGAZINE」を買わなくなりました。というか、プログラム含むコンピュータ雑誌自体を買ってないですねぇ。ネットで調べることができるし、詳しい書籍も(後発ではありますが)出たりしますのでそれほど必要がなくなったのかもしれません。

変わりといってはなんですが、「NHK 英語でしゃべらナイト」のを買ってます。4月号からは初心者のための講座が始まりましたのでタイミング的にはいいかなと思って。

仕事仲間の間でも、やはり英語が必要になりつつあって英語は必須だなと再認識している今日このごろです。「日常会話は限られてるから覚えないといかんよ」と言われたんですが、たしかにそうですね。今まで避けていた道なんですが、そろそろ崖っぷちに立ってみないといけないなと思ってます。

最近、フィリピンの話を聞いてきました。中国と同じで仕事を求める意志と勉強をする(学びたい)意志は結構強いそうです。また、基本的にアメリカライズされているとのことで「コンピュータを扱える人=エリート」となってまして、そのエリート層は大抵は英語を話せるとのこと。しかし、階級のようなものがあり 場合によっては親切がアダとなるみたいな場面もあるようです(例えばメイドさんの掃除を手伝ってあげたりとか。仕事のテリトリーは分かれている、って感じかな。いわゆる精神面でいうバウンドリーか)。このへん、日本だと考えられないですね。

また、ハリウッドなどのCG製作はアメリカでやっている・・・んではなくて、大抵は海外の人件費が安いところに外注している模様。なんだ、アメリカで完結しているわけじゃないのね。フィリピンの方でもハリウッドに(末端で)携わってる人が多いみたい。世界的にコスト削減なんだなぁと思いました。ちなみに、フィリピンでは月5万円くらいの給料でも十分で、暮らしていけるとのこと。物価が日本とは違いますね。・・・将来、海外につっこんでみたいなぁ。

まぁせっかくなんで、英語は学んでおいて損はないということで希望を持ちつつ 慣れていこうと思います。とりあえずは「Nice to meet you.」から先の会話のキャッチボールができないと(^_^;;。

Shade8 発表(2005/05/21)

されましたね。

http://shade.e-frontier.co.jp/shade8pre/

元professionalの機能がstandardに下りてきてるんですねぇ。ネットワークとか。なにげに素材集がついているのはありがたいです。その勢いでサンプル形状もつけてほしいんですが・・・(イズとか机とか)、贅沢かな(^_^;;。

「ShadeGrid」でネットワーク強化するなら、SDKでも対応しないとShadeのレンダラonlyの強化になってしまうので生かせないかと(SDKいじらなくても、socketを直接操作してネットワークを使ったレンダリングなりデータの共有はできるけどね)。

仮に1000台のマシンをインターネットで結んで1つのシーンをレンダリングすると、どれくらい効率アップするのだろう・・・。それよりも、シーンデータを個々のマシンに転送するだけで結構時間を食うような。「UD Agent」(がんなどの解析に使うグリッドシステム(https://www.ud.com/home.htm)。未だに加入してます)みたいに、常駐しておけば勝手に登録されたマシンの空きリソースを使ってシーンデータを送信〜レンダリングされる、となると作業しながら人様のマシンでレンダリングとか・・・できないかな。

1チップMSXの予約開始(2005/05/20)

https://www.ascii.co.jp/1chip/

にて、1チップMSXの予約が開始されました。で、早速予約。MSXとして19800円、という風に考える方もいるかもしれませんが「FPGAの勉強に使える」のがミソです(MSXは単にサンプルとしてFPGAに乗っかっている、と考えてもいいかも。書き換えると、ファミコンにもなると思うし、外部の機器をいじるインターフェースにもなると思う)。正直、この値段・スペックでいじれるのは安いと思います。

5000台の予約が集まらなくても、西さんが買い取るとか豪語してたんですが(MSX WORLD 2005にて)、今の調子ならすぐに5000台はいくかな?私はVGAをいじってみたいので、こんな1パッケージ化されているのは助かります(基盤自身に新たに増設する、という知識はありませんので)。

メモ(2005/05/17)

E3開催の時期にいまさらですが、

http://www.watch.impress.co.jp/game/docs/20041021/3dmark1.htm

「PSM」ってのがあるんですね。シャドウマップをきれいに見せるリアルタイム技術。

http://www.watch.impress.co.jp/game/docs/20040520/3due3.htm

とか

http://www.watch.impress.co.jp/game/docs/20050310/aoe3.htm

とか見ると、もうレイトレでなくても映画レベルは十分いけそうだなぁと思ってしまいます。こんな技術でバーチャルリアリティーな空間ができないかなぁ、というか実装してみたいものです。時間があれば遊んでみたいなぁ。

それと関係ないですが、ファイナルファンタジーアドベントチルドレンが2005/09/14発売に決定したようです。

http://www.square-enix.co.jp/dvd/ff7ac/

長いこと待ってたのでようやくですねぇ。

ちらつかないアニメーション向け面・線光源(2005/05/14)

以前ちらっと話題にして放置状態でしたが、検証してみました。まず「面光源」「線光源」などは面積を持つ光源であるため、3DCGではサンプリングにて表現します。ここでノイズが発生します。

ここで、アニメーションまで考慮したレンダラは少ない(と思う)ため、連続動画で出すと無惨な結果となります(=ちらつく)。上画像は「周期的要因」を取り入れてノイズをパターン化してます(そのほうが人間の目には「ノイズ」と目立ちにくいという独自解釈から)。

ところで上の画像、このノイジーな感じでアニメーションはできないと思いますでしょうか?

動かしてみました。linelight_20050514.mov(230)

1フレームのレンダリングは、Athlon 1100MHzで27-29秒ほど。以前よりも格段に速くなりました。実は、BSPによる空間分割を間違って実装していたため遅かったのでした。ので、UG(ユニフォームグリッド)からBSPに移行しました。簡単なシーンはUGのほうが速いかと思ってたのですが、トラバースが軽いからかまんべんなく効率がアップしますね、こりゃいいや。

ちょっとわけあってまだ公開できないのですが、(役に立つかはわからないですが)時が来たら技術公開できれば、と思ってます。このやり方だと、パストレーシングのざらざらの感じでもアニメーションしてもちらつかない、なんてことができそうです。

ここにしか咲かない花(2005/05/11)

コブクロの本日発売されたシングル「ここにしか咲かない花」を購入。「瑠璃の島」というドラマのエンディング曲です。このような突き抜けるような歌は好きだなぁ。ひさびさのマイヒットです。ドラマもほのぼの雰囲気が気に入ったので毎週見てます。ドラマでこの曲が入るタイミングがいいと、なかなか泣けるんですわ。しばらくエンドレスで聞き続けそうです。

で、ついでといってはなんですが「AIR Vol.2」のDVDも購入しました。これは全話集める予定。summer編もBSでやるみたいですね。

最近ウイルスメールが増えてきた(2005/05/09)

ここ数日、ウイルスが増えてきたように感じます。(先月はあまり来なかったのになぁ)お気をつけて。DMも必死なのが来ていて、ある意味笑ってしまいますが(^_^;;。なんでもアリですな。取り締まってほしいものです。1日20件以上来ますので、サイトを公開しているものとしてはうっとおしい限りです。

さて、ウイルスチェッカ(ノートン)にも引っかからない妖しいメールが来ました。ググってもないですので以下のはご注意!!

差出人が「Webmaster@メールサーバ名」

Subjectが「*IMPORTANT* Your Account Has Been Locked」。

メール内容が「We have suspended some of your email services, to resolve the problem you should read the attached document.」

で、添付ファイルが「wxbu.zip」です。

適当に訳すると、「あなたのメールのサービスの一部を使えないようにしました。原因は添付のドキュメントを見てね」って感じです。ウイルスかな?

so-netからメールが来るとすると「Webmaster@xxx.so-net.ne.jp」のようにサブから来ることはありませんので、こんな妖しいのが来たら速攻破棄です。メールヘッダからみても、どうもso-netサーバ経由で来ている感じなので本当の送信元が特定できないようになってました。ウイルスかどうか判断が難しいですが・・・、珍しく消そうかどうか迷ったです。

メッセージ文で検索したら見つかりました。これっぽい。

http://www.symantec.com/avcenter/venc/data/w32.mydoom.bo@mm.html

昨日発見されたばかりのウイルスのようです。

MSX WORLD 2005(2005/05/08)

行ってきました。やはり年齢層は若干高かったですね。リアル世代ということか・・・。

西さんがMSXの歴史から未来像まで講演されてました。10年先など未来の展開も見込んでおられるようですね、その説明もありました。で、特に「教育」に力を入れているようで教材として普及させたい、とおっしゃってました。教育話題でヒートアップしてましたが(^_^;;、やはりこのへんに思い入れがあるんだろうなぁ。と同時に、商売よりもMSXの普及に力を入れているのがありありと伝わりました。今の大学ではハードを教えるのはLEDレベルで止まっているらしく、そのことでも憤慨されてました(^_^;;。・・・そんな浅いのか・・・<大学。ただ、学校の授業はあくまでもきっかけ、とフォローされてましたので 教育内容については案外シビアな問題もあるのかもしれないですね。

取材陣もいましたので、たぶんどこかのサイトで詳細は公開されると思います。FPGAの可能性も強調していて(大事なのはハードウェア自身をカスタマイズできること)、アルテラ社の方も説明をいれてました。しかし、微妙に商売気のある方と西さんとでは温度差があるように感じましたね。もしかしたら、モノヅクリサイドと利益優先サイドの考え方の違いかもしれない・・・どっちも大事なんですが、私はモノヅクリを応援したいなぁ。

ここで初めて知ったこと「OSX」のライセンスはMSXアソシエーションが持っているらしい。Appleのは「OS X」(真ん中にスペースを入れる)ですと。なるほど、そういう理由があったのね。

1チップMSXは19800円で販売されるとのことで、アルテラ社のFPGAであるCyclone(プレゼン資料では100万ゲート規模、となってたけど本当かな?だと、価格的にも冒険かと)が載ってます。FPGA自身も自由に書き換え可能なようで「ハードウェアもカスタマイズ(改造)できる」という視点は新しいですね。たしかに教材として使えそうです。試作機は展示されてましたが、まんま評価キットみたいな雰囲気でした。携帯でもMSXのゲームが動いてましたねぇ。

未来のマルチコアとかサーバレスの話もされてましたが、これは私自身も注目してましたので今後の展開が楽しみです。

・・・しかし、司会進行の方、メイドさんのコスプレしてたのですがアキバならではですね(^_^;;。EGGの方もメイドコスでしたし。で、帰り際に駅で(別の)メイドさんとすれ違い・・・。アキバはやっぱり独特だなぁ。

MSX WORLD 2005(2005/05/07)

5/8(日)に開催とのこと。

http://www.msxevent.info/msxworld2005/

1チップMSX試作機も展示しているらしいので見に行こうかな(後、西さんの講演も聞きに)。なぜか8ビットパソコン時代のは未だにワクワク感があります(そのときに子供だったので懐古なのかもしれないですが)。できることは限られてるのですがアツイというか。商用としてではなく、マニアが深く掘っている領域でしょうから惹かれますねぇ。

しかし、1チップの考え方(というよりも現在のPCの環境(ハード&ソフト)に左右されない方法)は別次元の可能性を感じています(携帯電話とかコンパクトにする方法だけではなく)。なので、ハード設計ができればどんだけ面白いか、とか妄想します(^_^;;。もし実現できれば現在のPC(WinとかMacとかLinuxとかに関係なく)の概念が変わるんではなかろうか、と妄想していることがありますので(そのかわり、基盤からCPUからOSからすべて作らないといけない(^_^;;)、ハードも勉強してみようかなと思ってます。このへんはマニアにならないとたぶん進まないと思いますので、MSX WORLD 2005でその道の方のパワーを感じてこようかと。

現実の制限にとらわれない形も必要かもしれないですね。となると、ハードウェア(CPU含む)やOSを使うこと自体が制限になってしまいます。その先にリアルタイムGIの世界も実現できるに違いない、と飛躍妄想してみる(^_^;;。

関係ないですが、コミック「20世紀少年」を一気読み(=大人買い)しました。懐かしいし面白い、いい世界観ですね(浦沢氏のモンスターもかなり前に読んだのですが、この方のはストーリーが卓越してるように感じてます)。そこでバーチャルアトラクションというのが出てくるのですが、あれが実現すれば面白いなぁ。そこでリアルタイムGIが可能だとすると(今は不可能ですが)すげ〜現実的になるかもしれんですね。

シリアル通信(2005/05/05)

「Spartan-IIE300 評価キット」はたいしたことができないかもと思ってたのですが、スペック的には30万ゲートくらいまで可能なようで十分使いものになりそうです(ちなみに開発ツールである「ISE WebPack」のフリー版の使用制限は約30万ゲートまで)。

ファミコンをこのボードで実装しているサイトがありました。

http://crystal.freespace.jp/pgate1/nes/index.html

1チップMSXはもうちょっとコンパクトなFPGAを使ってるのかな。たぶん、以下が1チップMSXの元となっているものの気が。

http://www.hat.hi-ho.ne.jp/tujikawa/esepld/index.html

ですが「Spartan-IIE300 評価キット」は、残念ながらサンプルソースは一部がブラックボックス化されているようで、いまいちメモリにアクセスする動きが把握できません。ということで、「シリアル通信(RS-232C)-FPGA-SDRAM」の通信手段を掘ってみました。

このボードでのシリアル通信は「TxD(out/送信データ)」「RxD(in/受信データ)」「RTS(out/送信要求)」「CTS(in/送信可能信号)」の4ピンを使用してます。サンプルではシリアル通信部分がブラックボックス化されてSDRAMを制御しています。

例えば、データ転送速度を115200bps/データビットを8ビット/パリティなし/ストップビット1/フロー制御なし、のシリアル通信を考えます。この場合は、「スタートビット+データビット+ストップビット」の計10ビットで1文字ずつデータが流れます。

たとえばアスキーコードの「a」(0x61)を送る場合は、「0100001101」と順に送ることになります(ビットの並びはLowからHighの順に)。転送速度が115200bpsなので、10ビット/バイトとした場合は11520バイトを送れることになりますね。

ここで、この評価ボードのFPGAで使用しているクロックが66MHzなので、1秒に(66 x 10^6)の処理を行うことができます。シリアル通信に同期させる場合は「(66 x 10^6) / 115200 = 572.91666」で約573回に1回の割合でシリアル通信のビットをチェックするといい計算になります。

ここでVerilogのソースを書きます。評価ボードにて、シリアルからの入力を単体LED8個に対してビットデータとして点灯します。付属サンプルはVHDLなのですが、私としてはCライクなVerilogのほうが理解しやすいのでVerilogで書いてます。

module SerialTest(RSTi, CLK66i, CxLEDo, TXDo, RXDi, RTSo, CTSi);
    input RSTi;                 //リセット信号
    input CLK66i;               //クロック66MHz
    output [7:0] CxLEDo;        //単体LED x 8
    output TXDo;                //シリアル TxD信号
    input RXDi;                 //シリアル RxD信号
    output RTSo;                //シリアル RTS信号
    input CTSi;                 //シリアル CTS信号

    reg [7:0] CxLEDo;
    reg TXDo;
    reg RTSo;
    reg [9:0] counter;
    reg [3:0] pos;
    reg [7:0] LEDFlag;

    always@(posedge CLK66i) begin
        
        if(!RSTi) begin
            counter <= 0;
        end
        else begin
            if(!CTSi) begin

                //クロック数が66MHzなので、
                //(66 x 10^6) / 115200 = 573回のループ後に
                //シリアル通信のチェックを1ビットごとに行うとよい。
                if(counter < 573) counter <= counter + 1;
                else counter <= 0;
            end
            else begin
                counter <= 0;
            end
        end
    end

    always@(posedge CLK66i) begin
        CxLEDo = 8'b11111111;
        TXDo = 0;
        RTSo = 1;
        if(!RSTi) begin
            pos <= 15;
            LEDFlag <= 8'b11111111;
        end
        else if(!CTSi) begin

            if(counter == 0) begin

                //スタートビットの検出。
                if(pos == 15) begin
                    if(~RXDi) pos <= 0;
                end
                else begin

                    //ビットを立てる
                    if(pos <= 7) begin
                        LEDFlag[pos] <= ~RXDi;
                    end

                    //カウンタは0-8の間
                    if(pos < 8) pos <= pos + 1;
                    else pos <= 15;
                end
            end

            //LEDに結果を反映
            CxLEDo = LEDFlag;

        end
        else begin
            pos <= 15;
            LEDFlag <= 8'b11111111;
        end
    end
endmodule

この後にin/outに対するピン配置をしてFPGA側にダウンロードすることで動作はしますが、ノイズが乗るというかLEDが点滅しますね。元々シリアル通信がノイジーなのか私の実装がまずいのかは追いかけれてません。

Windowsツールのハイパーターミナルなどで入力した文字をそのまま画面に表示させたい場合は、

TXDo = RXDi;
RTSo = CTSi;

と、受信データを送信側のピンに送ることでエコーされます。上記ソースで「always」というのでくくってますが、これが複数あるとマルチスレッドのごとく並列に動作します。FPGAプログラムはこのように並列動作させるのが基本ですので(それで速度アップさせますので)きっかけさえつかめると回路設計はたやすいような気がします。「posedge CLK66i」というのは、クロック(信号)の立ち上がりで このalways内を実行する、という意味になります。あまり長い処理だと物理的な遅れが出ますが、この中で処理したことが「1クロックで処理できる」内容となります。TXDo/RXDi以外のin/outは、すべて「0で有効」となる点に注意です。どうもFPGAの世界では「true = 0」がデフォのようですね。

クロック同期のタイミングがなんとなくですが把握できますでしょうか。すべてはクロックありき、です。

しかし、SDRAMへの読み書きまでの道は遠い・・・。また気が向いたらTipsページ作ることにします。なかなか楽しいので最近徹夜気味です(^_^;;。

FPGA(2005/05/02)

「MSXマガジン3」がASCIIより発売されてましたので購入。1チップMSXの記事が載ってました。MSXの機能をFPGAに収めてしまおうというものですが、FPGAについてわかりやすく解説していました。

FPGA(Field Programmable Gate Array)とは、一言で言うとプログラム可能なLSIのことを指します。見た目は普通のチップ(石)です。チップメーカーは「Xilinx社」と「Altera社」が有名です。1チップMSXはAlteraのチップを使っているようです。現在は単価が高いのですが、おそらく価格破壊と性能競争がこれから起こるのではないか、と密かに期待しています。

以下、私が所有している「Spartan-IIE300 評価キット」。実験・学習用です。Spartan-IIE300は、この真ん中のチップのことです(Xilinx製)。

FPGAチップ「XC2S300E-6FG456C」。

チップ自身がコアであり、1チップMSXだとこの20mm x 20mmほどの領域にすべての機能が入る、としたら結構すごいことですね。でも、身近なモノで言うと実は携帯電話がそんな感じの高性能機械だったりして、身近にコンパクトなシステムはゴロゴロ存在していたりします。

さて、「Spartan-IIE300 評価キット」は評価キットなのでたいしたことができないのですが、結構遊べます。一般に手に入るFPGAキットとしては唯一なのではないでしょうか。これ、秋葉原の本屋で8万くらいで購入しました。チップだけがほしい、という方はラジオ館とか入ると売ってます。秋葉原の一部は昔の風情ですね。

で、「プログラム可能なLSI」ってあやふやな表現ですが、FPGAはちょうどハードウェア(精密な回路設計)とソフトウェアの中間くらいの役割を担うことができます。なのでソフトウェアよりも速い・コンパクト・低消費電力がウリであります。

が・・・・低消費電力の正体は低クロック動作でして、上記のだと66MHzで現在のPCに比べて数十倍遅いですね。計算をやらせても圧倒的にソフトウェアonlyの方が速いです。で、これを打破する方法が「並列化」だったりハード寄りのプログラムだったりします。FPGAはアセンブラよりもさらに低レベルの開発となり、CPU自身を作るということに等しいです。レジスタも自分で作ってあげる必要があります。メモリのI/Oなどもタイミングをみながら独自で、なのでかなりソフトウェアとは勝手が違います。後、物理的な配置配線が行われるため、ソフトウェアのように手軽にとはいかないのですが、以下のようなIDEにて開発するコードはまんまソフトウェアっぽいです。

実際はソース(HDL(Verilog-HDL/VHDLなど)という言語でソースを書きます)の後にピン配置の設定を行い、「ダウンロード」という形でFPGAに配線情報(これがビットストリームと呼ばれる、ソフトウェアで言うバイナリです)を転送します。

Verilog-HDLの例。ボタンを押すとLEDを点灯。

module MyTest(SYS_xRSTi, CLK66i, xPBSi, CxLEDo, LED_7SEGo, LED_xSELo);
    input SYS_xRSTi;            //Reset
    input CLK66i;               //clock
    input [3:0] xPBSi;          //Push button x 4
    output [7:0] CxLEDo;        //singleLED x 8
    output [7:0] LED_7SEGo;     //7segmentLED x 4
    output [3:0] LED_xSELo;     //7segmentLED on/off
    reg [7:0] CxLEDo;
    reg [7:0] LED_7SEGo;
    reg [3:0] LED_xSELo;

    always@(posedge CLK66i) begin
        CxLEDo     = 8'b11111111;
        LED_7SEGo  = 8'b00000000;
        LED_xSELo  = 4'b1111;

        if(SYS_xRSTi) begin
            if(!xPBSi[0]) LED_xSELo[0] = 0;
            if(!xPBSi[1]) LED_xSELo[1] = 0;
            if(!xPBSi[2]) LED_xSELo[2] = 0;
            if(!xPBSi[3]) LED_xSELo[3] = 0;

            CxLEDo[0] = 1; CxLEDo[1] = 1;
            CxLEDo[2] = 0; CxLEDo[3] = 0;
            CxLEDo[4] = 0; CxLEDo[5] = 0;
            CxLEDo[6] = 1; CxLEDo[7] = 0;

            LED_7SEGo[0] = 1; LED_7SEGo[1] = 1;
            LED_7SEGo[2] = 1; LED_7SEGo[3] = 0;
            LED_7SEGo[4] = 0; LED_7SEGo[5] = 0;
            LED_7SEGo[6] = 0; LED_7SEGo[7] = 0;
        end
    end
endmodule

C言語っぽいですね。Verilogの場合はCライクなのですぐに理解ができると思います。が、実際の壁はクロック数に同期させるタイミングでして、私も正直いまいち理解できてないです。

FPGAの利点として、例えばレイトレーシングの三角形とレイとの交差判定は、普通のPCでは数十クロックから数百クロック必要になりますが、FPGAによる実装で上から下までズドンと通すと1クロックで済ませることも可能です。(ですが、CPUのマルチコア化により、速度の面ではPCもFPGAも常にイタチゴッコと言えます)

FPGAでは物理的に実装可能なロジック数に上限があるため、例えばレイトレーシングのシステムを1チップに収めるということは難しいです。ただ考え方として、CPUとソフトウェアの関係のように担う機能を分けるという考え方もできるかもしれません。現OSの上でPCIバス経由の〜、とかAGP/PCI-Expressを使って〜、ということ自体でバスネックになりますので、ベクトルプロセッサとしてのFPGA利用(レイトレに特化したCPUを作る)した専用マシンを作ってしまう、とするともしかしたら「レイトレはハードウェア化できないのでは」に対する1つの解決策になるのかもしれませんね。いわゆる昔の数値演算コプロセッサのように、シームレスにCPUと結びつけば。

研究レベルのFPGAを使用したレイトレーサは、おそらくハード側にすべてのポリゴン情報・テクスチャ情報などを持ってるでしょうから制限もありそうですし。これは現GPUでも言えることですが。しかし、GPUのプログラマブルシェーダはFPGAの「ダウンロード」と概念が似てますね。カスタマイズという点では近づいているのかもしれませんが、現段階では一過性のもののような気もしてます(Simple is bestではなくて、3Dを表現するための(GPU仕様に合わせた)苦肉の策で当てはめているように個人的には感じます)。

さて、時代はどっちに転ぶか楽しみにしつつ、FPGAについては今のうちに知識を蓄えておきたいなぁと思ってます。今、1チップMSXレベルまで時代は来ているとすると、もしかしたら10年後は1チップWindowsまで行けたりして。・・・そのときはPCがもっと性能アップしてるかな(^_^;;。なにせコンパクトになるということは一番の利点なので例えば10チップ分を並列動作なんかできれば「リアルタイム3Dと言えばレイトレ」という時代が来るかもしれないですね。GPUも内部で並列化しているそうですが、並列化が進めば進むほどレイトレのほうが速度アップできる可能性があるわけですので。

GW(2005/05/01)

自由にプログラムする時間ができると思ったら仕事が何個か入ってしまったので、あいかわらず仕事モードです。

う〜む、うまいこといかないかぁ。「雲作り」のほうは後回しになってますが、5月中になんとかできないかな。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.