東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

OpenCL(6) コンパイル済バイナリをこしらえる

OpenCLではソースコードを文字列で与え、実行時にコンパイルしています。
こうすることで、Platformが提供する各種デバイスに応じたProgramを用意できるわけですが、いかんせんコンパイル時間がMOTTAINAI。デバイスを決め打ちにしていいならコンパイル済のBinary Kernelを直接ロードするんが手っ取り早いす。

で、Binary Kernelのつくりかた。

KB115 - ATI Stream SDK v2.2 Support for Binary OpenCL™ Kernels
のキモんとこを解説。

0. 前準備
上記KB115ページに clbinary.zip
があります。こいつを落っことして解凍し、clbinarygen.c, clbinaryuse.c を用意します。

1. clbinarygen, clbinaryuse をコンパイルし、exeを作ります。
vc10ならば:

  : build.bat
  set INCDIR="%ATISTREAMSDKROOT%include"
  set LIBDIR="%ATISTREAMSDKROOT%lib\x86"
  cl -EHsc -I%INCDIR% %1 %2 %3 %4 %5 OpenCL.lib -link -libpath:%LIBDIR%

なんてなバッチからコンパイルすりゃえぇべ。

2. カーネル・コードをコンパイルし、Kernel Binaryを作ります。
カーネル・コード ほげほげ.cl を kernel.cl にコピーし、clbinarygen を起動すると:

>clbinarygen
Reading in program from kernel.cl
Number of platforms found: 1
Found AMD platform
Number of devices found: 10
DEVICE[0]: CL_DEVICE_TYPE_CPU, Name=AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
DEVICE[1]: CL_DEVICE_TYPE_GPU, Name=Redwood
DEVICE[2]: CL_DEVICE_TYPE_GPU, Name=ATI RV770
DEVICE[3]: CL_DEVICE_TYPE_GPU, Name=ATI RV770
DEVICE[4]: CL_DEVICE_TYPE_GPU, Name=ATI RV710
DEVICE[5]: CL_DEVICE_TYPE_GPU, Name=ATI RV730
DEVICE[6]: CL_DEVICE_TYPE_GPU, Name=Cypress
DEVICE[7]: CL_DEVICE_TYPE_GPU, Name=Juniper
DEVICE[8]: CL_DEVICE_TYPE_GPU, Name=Redwood
DEVICE[9]: CL_DEVICE_TYPE_GPU, Name=Cedar
Writing out binary kernel to kernel.bin.0
Writing out binary kernel to kernel.bin.1
Writing out binary kernel to kernel.bin.2
Writing out binary kernel to kernel.bin.3
Writing out binary kernel to kernel.bin.4
Writing out binary kernel to kernel.bin.5
Writing out binary kernel to kernel.bin.6
Writing out binary kernel to kernel.bin.7
Writing out binary kernel to kernel.bin.8
Writing out binary kernel to kernel.bin.9

こんなん出ました。各Device対応に kernel.bin.xxx が生成されます。僕のRADEON HD5670 のDevice名は Redwood だから kernel.bin.1 か kernel.bin.8 を使えばいいみたいよ。

3. できあがったBinary Kernelはそのまんま使えるみたいだけど、そこそこデカいので不要なデータをさっぴいて小さくします。

Binary Kernelの要らんとこをそぎ落として小さくするにはLinux由来のツール: readelf, objcopy が必要となります。僕はWindowsのヒトなのでCygwinをインストールしておきます。そんときDevelカテゴリのbinutilsパッケージをお忘れなく。この中にreadelf,objcopyがありますでの。

>c:\cygwin\bin\readelf -aW kernel.bin.1 | c:\cygwin\bin\grep Machine
  Machine:                           <unknown>: 0x3f3

こんなん出ました。ケツにある16進: 0x3f3 が大事。

んでは要らん部分をそぎ落とします。

32bit:
objcopy -I elf32-i386 -O elf32-i386 -R .source -R .livmir -R .amdil --alt-machine-code=<さっきの16進コード> <Kernel Binary名> <できあがり>

64bit:
objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .livmir -R .amdil --alt-machine-code=<さっきの16進コード> <Kernel Binary名> <できあがり>

僕んトコだと:
>c:\cygwin\bin\objcopy -I elf32-i386 -O elf32-i386 -R .source -R .livmir -R .amdil --alt-machine-code=0x3f3 kernel.bin.1 stripped_kernel.bin
/usr/bin/objcopy: this target does not support 1011 alternative machine codes
/usr/bin/objcopy: treating that number as an absolute e_machine value instead

なんかゆってるけどひとまず気にしないww

4. できあがったstripped_kernel.binが使えることを確認します。

>clbinaryuse
Number of platforms found: 1
Found AMD platform
Number of devices found: 2
DEVICE[0]: CL_DEVICE_TYPE_CPU, Name=AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
DEVICE[1]: CL_DEVICE_TYPE_GPU, Name=Redwood
Which device do you want to use? [0-1]?
1
Enter filename of corresponding binary kernel file
stripped_kernel.bin
Reading in binary kernel from stripped_kernel.bin

*** REPLACE THIS WITH ACTUAL WORK ***
↑コレが見えたらできあがり。

このバイナリ・ファイルを読み込むには:

    cl::Context context;
    vector<cl::Device> devices;
    ...
    vector<char> binary;
    {
      ifstream stream("stripped_kernel.bin", ios::binary);
      if ( !stream.is_open() ) { return 0; }
      istreambuf_iterator<char> first(stream);
      istreambuf_iterator<char> last;
      copy(first, last, back_inserter(binary));
    }

    cl::Program::Binaries binaries;
    binaries.push_back(make_pair(static_cast<void*>(&binary[0]),binary.size()));
    cl::Program program(context,devices,binaries);

とかなんとか。

投稿日時 : 2010年8月16日 19:27

コメントを追加

# EAniJqdaJHld 2012/01/07 4:33 http://www.luckyvitamin.com/c-1534-kelp

Edidn`t think about that. I'll tell my mother, she won`t believe it..!

# ALfegKHjrFz 2022/04/19 13:29 johnansaz

http://imrdsoacha.gov.co/silvitra-120mg-qrms

タイトル
名前
URL
コメント