2010年4月25日日曜日

拡張現実の旅-NyARToolkit C# 編 1泊目

本家の ARToolKit のビルドには、あっさり敗北して思い知った。もはやC言語には戻れない体になってしまっていることを・・・

出来ないものは、しょうがないよねっ!
気を取り直して、よく考えてみた。
「別に全部C言語じゃなくてもよくね?」
というわけで、メイン部分は C# ですることにした。

調べてみると、ARToolKit には、NyARToolkit という C# での実装版が存在し、OpenCL には、OpenCL .NET という C# ラッパーがあるようだ。

NyARToolkit は、オリジナルを参考に実装しなおしているらしい。ソースコードレベルでは、移植ではなく別物と考えたほうがよさそうだ。API レベルでは、互換があるとのこと。

動作環境は以下とする。Windows Vista Business 64bit SP2
AMD Phenom II X4 955 3.20GHz
ATI HD4890  メモリ 1G

以下のものは導入済みとして作業を進める。
Microsoft DirectX SDK (February 2010)
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
Visual C# 2008
ATI Stream SDK 2.01 Vista, Win7 64bit

では、以下の必要なものをダウンロードしてくる。
FrontPage - NyARToolkit から NyARToolkitCS-2.5.1.zip
SourceForge.net: OpenCL .Net から OpenCLNet 0.4.zip


最初は、OpenCL .NET からいってみる。
OpenCLNet 0.4.zip ファイルを適当な場所に解凍する。
上記解凍場所の source\OpenCLNet.sln を Visual C# で開く

なんだか、「プロジェクトの場所は信頼されていません」とか言われる。
なんだろう?
とりあえず、全て「OK」ボタンを押しておく。

2010/04/26 追記 : [プロジェクトの場所は信頼されていません] ダイアログ ボックス ページの下の方にあるコミュニティ コンテンツを見て対処法は分かったが、上の方の説明は意味不明。専門用語を専門用語で説明すんなっ!

何も考えず、ソリューションのリビルドをしてみる。
成功。

ImageCrossFade プロジェクトをスタートアッププロジェクトに設定して、実行してみる。
動いているようだ。


次に、NyARToolkit をコンパイルしてみる。
Visual C# で ”forFW2.0\NyARToolkitCS.sln”を開く。

またもや、「プロジェクトの場所は信頼されていません」とか言われる。
なんだろう?
やっぱり、全て「OK」ボタンを 押しておく。


Web カメラを接続してから、”CaptureTest”プロジェクトをスタートアッププロジェクトに設定して、実行してみる。
ウィンドウが開き、Web カメラの映像が表示される。タスクマネージャからプロセスを確認すると、64bit モード(プロセス名の末尾に”*32”が付いていない)で動作していることを確認できた。

なんだか、あっけないくらいにうまくいった。やっぱりソースは生もの。時間が経つと腐敗していく。
はじめから NyARToolkit にしておけばよかった。


では、今回はここまで。

2010年4月18日日曜日

拡張現実の旅-ARToolKit 編 1泊目

野望成就のため、今回は、ARToolKit を改造するための開発環境を構築する。
野望とは、拡張現実を並列プログラミング技術で高速化すること!!しかも 64bit で!!
なので、ARToolKit を使って何かを作るのではなく、ARToolKit 自身をイジルノダ!

前提環境


全てを 64bit 化するため、ソースからビルドすることにした。
作業の前に 32bit と 64bit アプリの違いについて調べた。
ASCII.jp:32bitアプリを64bit Windows 7で動かす「WOW64」|あなたの知らないWindows
WOW64 - Wikipedia などによると、32bit アプリが、%SystemRoot%\System32 にアクセスしようとすると、%SystemRoot%\SysWOW64 にリダイレクトされるようだ。つまり、32bit の DLL は、SysWOW64 の下に、64bit の DLL は、System32 の下に配置すればいいことになる。これを踏まえて以下の作業を行う。


必要なものをダウンロードする。
ARToolKit Home Page から ARToolKit2.65.zip をダウンロード
Nate Robins - OpenGL - GLUT for Win32 から glut-3.7.6-src.zip をダウンロード


では、はじめに GLUT をコンパイルしていく。
glut-3.7.6-src.zip を解凍する。
Visual C++ で glut.dsw を開く


「すべてはい」ボタンを押す。


「ビルド」メニューから「構成マネージャ」を選択

構成マネージャダイアログが開く。



「アクティブ ソリューション プラットフォーム」ドロップダウンから、「<新規作成...>」を選択。


「新しいプラットフォーム」ドロップダウンで、”x64”を選択し、「OK」ボタンを押す。


「プラットフォーム」が”x64”になっていることを確認したら、「閉じる」ボタンを押す。


次に、ビルド後に自動的に DLL ファイルなどをコピーする設定を変更する。
正しくコピー先を設定してもいいが、コピー時に権限がなくて失敗する。Visual C++ を管理者権限で動かせばいいのかもしれないが、個人的に許容できない。
したがって、ファイルコピーは手動ですることにした。ついでに、ビルド中に生成されるファイルの出力先が、いろいろ気に入らないので、修正する。

「glut32」プロジェクトのプロパティを開く。


「構成プロパティ」-「ビルド イベント」-「ビルド後のイベント」を選択。


「構成」ドロップダウンで”Debug”を選択。
「プラットフォーム」ドロップダウンで”すべてのプラットフォーム”を選択。
「コマンド ライン」のcopy $(TargetDir)glut32.dll %WINDIR%\SYSTEM32
copy $(TargetDir)glut32.lib "$(DevEnvDir)..\..\VC98\lib"
copy ..\..\include\GL\glut.h "$(DevEnvDir)..\..\VC98\include\GL"
の全て、および「説明」の設定を消す。

「構成」ドロップダウンで”Release”を選択。
「プラットフォーム」ドロップダウンで”すべてのプラットフォーム”を選択。
「コ マンド ライン」のcopy $(TargetDir)glut32.dll %WINDIR%\SYSTEM32
copy $(TargetDir)glut32.lib "$(DevEnvDir)..\..\VC98\lib"
copy ..\..\include\GL\glut.h "$(DevEnvDir)..\..\VC98\include\GL"
の全て、およ び「説明」の設定を消す。
「適用」ボタンを押す。


「構成プロパティ」-「全般」を選択する。
「構成」ドロップダウンから”すべての構成”を 選択。
「プラットフォーム」ドロップダウンから”すべてのプラットフォーム”を選択。
「出力ディレクトリ」 に”$(SolutionDir).build\$(PlatformName)\$(ConfigurationName)”を設定。
「中間ディレクト リ」に”.build\$(PlatformName)\$(ConfigurationName)”を設定。
「OK」ボタンを押す。



「構成プロパティ」-「C/C++」-「プリコンパイル済みヘッダー」を選択する。
「構成」ドロップダウンから”すべての構成”を 選択。
「プラットフォーム」ドロップダウンから”すべてのプラットフォーム”を選択。
「プリコンパイル済みヘッダー ファイル」 に”$(IntDir)\glut32.pch”を設定。
「OK」ボタンを押す。

「構成プロパティ」-「C/C++」-「出力ファイル」を選択する。

「構成」ドロップダウンから”Debug”を 選択。
「プラットフォーム」ドロップダウンから”すべてのプラットフォーム”を選択。
「ASM リストの場所」の設定を削除。
「構成」ドロップダウンから”Release”を 選択。
「プラットフォーム」ドロップダウンから”すべてのプラットフォーム”を選択。
「ASM リストの場所」の設定を削除。

「構成」ドロップダウンから”すべての構成”を 選択。
「プラットフォーム」ドロップダウンから”すべてのプラットフォーム”を選択。
「オブジェクト ファイル名」に”$(IntDir)\”を設定。 「プログラム データベース ファイルの名前」に”$(IntDir)\vc90.pdb”を設定。
「適用」ボタンを押す。


「構成プロパティ」-「リンカ」-「全般」を選択。
「構成」ドロップダウンで”すべての構成”を選択。
「プラットフォーム」ドロップダウンで”すべてのプラットフォーム”を選択。
「出力ファイル」に”$(OutDir)\glut32.dll”を設定。
「適用」ボタンを押す。



「構成プロパティ」-「リンカ」-「デバッグ」を選択。
「構成」ドロップダウンで”すべての構成”を選択。
「プラット フォーム」ドロップダウンで”すべてのプラットフォーム”を選択。
「プログラム データベース ファイルの生成」に”$(TargetDir)$(TargetName).pdb”を設定。
「適用」ボタンを押す。




「構成プロパティ」-「リンカ」-「詳細」を選択。
「構成」ドロップダウンで”すべての構成”を選択。
「プラット フォーム」ドロップダウンで”すべてのプラットフォーム”を選択。
「インポート ライブラリ」に”$(TargetDir)\glut32.lib”を設定。
「適用」ボタンを押す。




「構成プロパティ」-「ブラウザ情報」-「全般」を選択。
「構成」ドロップダウンで”すべての構成”を選択。
「プラット フォーム」ドロップダウンで”すべてのプラットフォーム”を選択。
「出力ファイル」に”$(OutDir)\glut32.bsc”を設定。
「適用」ボタンを押す。






では、ビルドしてみる。
一つずつ手動でやってもいいのだが、面倒なのでバッチビルドを行うとこにする。
「ビルド」メニューから「バッチビルド」を選択


「ビルド」チェックボックスを全てチェックする。
「ビルド」ボタンを押す。


中間生成ファイルは、プロジェクトディレクトリ中の .build\プラットフォーム名\構成名 ディレクトリ以下に出力される。(例 : glut-3.7.6\lib\glut\.build\x64\Debug)


最終出力ファイルは、ソリューションディレクトリ中の .build\プラットフォーム名\構成名 ディレクトリ以下に出力される。(例 :glut-3.7.6\.build\x64\Debug)


想定通りにファイルが、出力されていることを確認する。想定通りでない場合は、設定を見直す。


最後に、生成されたファイルを手動で配置していく。

DLL ファイルの配置
glut-3.7.6\.build\Win32\Release\glut32.dll を %SystemRoot%\SysWOW64 ディレクトリにコピー
glut-3.7.6\.build\x64\Release\glut32.dll を %SystemRoot%\System32 ディレクトリにコピー

%SystemRoot% は、コマンドラインで echo %SystemRoot% とすると、実際のパスを知ることが出来る。(私の環境では、”C:\Windows”だった)


LIB ファイルと ヘッダファイルの格納先を確認する。
「glut32」プロジェクトのプロパティを開く。
「構成プロパティ」-「全般」を選択。


「出力ディレクトリ」のドロップダウンから”<編集...>”を選択。


 「マクロ」ボタンを押す。
”VCInstallDir”の値を確認する。(私の環境では、”C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\”だった)
以下 Visual C++ インストールディレクトリを %VCInstallDir% と記載する。


LIB ファイルの配置
glut-3.7.6\.build\Win32\Release\glut32.lib を %VCInstallDir%\lib ディレクトリにコピー
glut-3.7.6\.build\x64\Release\glut32.lib を %VCInstallDir%\lib\amd64 ディレクトリにコピー



ヘッダファイルの配置
glut-3.7.6\include\GL\glut.h を %VCInstallDir%\include\GL ディレクトリを作成してその中にコピー


今回はここまで。次回は、いよいよ ARToolKit 本体をコンパイルする環境を構築していくことにする。


追記:
本体をコンパイルするつもりだったが、あまりにも手順が面倒なので、挫折・・・
その内リベンジする予定・・・・予定は未定・・・・


VC++ 2008 Express EditionでARToolkitをビルドしてみる - やざわラボ Wiki: とかが参考になると思う。

2010年4月5日月曜日

OpenCLマスターへの道 - ATI Stream SDK 編 第六話

今回は、サンプルソースを 64bit 版のWin32 コンソールアプリケーションとしてビルドしてみる。

参考にしたドキュメントは、”ATI Stream SDK OpenCL™ Programming Guide (v1.0) [PDF 900 KB]”
このファイルには、以下の手順で たどりつける。

「スタート」メニューから「すべてのプログラム」-「ATI Stream SDK v2」-「ATI Stream SDK Documentation」を選択すると、ブラウザで、「ATI Stream SDK v2.01 Documentation」のページが開く。開いたページのリスト中に上記ファイルがある。

Visual C++ 2008 Express Edition を起動する。

「ファイル」メニューから「新規作成」-「プロジェクト」を選択。


「プロジェクトの種類」から「Win32」を選択する。
「テンプレート」から「Win32 コンソール アプリケーション」を選択する。
「プロジェクト名」に”HelloCL”と入力し、「OK」ボタンを押す。


次に”HelloCL.cpp”ファイルを編集していく。


楽をするために、ATI Stream SDK のサンプルファイルの中身をコピーする作戦でいくことにする。
コピー元は、サンプルをインストールしたディレクトリ以 下”samples\opencl\cpp_cl\app\HelloCL\”の”HelloCL.cpp”と”HelloCL_Kernels.cl” とする。



”HelloCL_Kernels.cl” はそのまま、”HelloCL”プロジェクトのディレクトリにコピーして、既存の項目として「ソースファイル」に追加。

サ ンプルの”HelloCL.cpp”ファイルからインクルード行とmain関数の中身をコピーする。
main 関数の定義部分は、書き換えないことにする。

// HelloCLWin32.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <sdkutil/sdkfile.hpp>
#include <sdkutil/sdkcommon.hpp>

#define __NO_STD_VECTOR
#define __NO_STD_STRING

#include <cl cl.hpp>
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    cl_int err;

    // Platform info
    cl::vector<cl::platform> platforms;
    std::cout<<"HelloCL!\nGetting Platform Information\n";
    err = cl::Platform::get(&platforms);
    if(err != CL_SUCCESS)
    {

<中 略>

    err = queue.finish();
    if (err != CL_SUCCESS) {
        std::cerr << "Event::wait() failed (" << err << ")\n";
    }

    delete pProgram;

    std::cout<<"Done\nPassed!\n";
    return SDK_SUCCESS;
}


上記ソース中で”SDKUtil”を利用している ので、ドキュメントの手順をみると、インクルードファイルとライブラリ指定を追加するだけで大丈夫となっているが、”SDKUtil.lib”なんてどこ にもない。 しかたがないので、ドキュメントの手順は実行しない。


実行しない手順の代わりに、”SDKUtil”をサンプルからプロジェクトごと、新規作成し た”HelloCL”ソリューションの下にコピー。
既存のプロジェクトとして追加。
このままだと、とんでもね~ところにビル ド済みファイルを吐き出すので、以下のように設定を変更。


”SDKUtil”プロジェクトのプロパティを開く。
 「構成プロパティ」-「全般」を選 択。
「出力ディレクトリ」とし て”$(SolutionDir)$(PlatformName)\$(ConfigurationName)”を設定。
「中間ディレクト リ」として”$(PlatformName)\$(ConfigurationName)”を設定。



プロジェクトの依存関係を以下のように設定。
ソリューションのプロパティを開く。
「共 通プロパティ」-「プロジェクト依存関係」を選択。
「プロジェクト」には”HelloCL”を選択。
「依存先」 で”SDKUtil”をチェックして、「OK」ボタンを押す。


次に、OpenCL 本体のヘッダやライブラリに関する追加設定を、ドキュメントの手順で設定する。


”HelloCL”プロジェクトのプロパティを開く。
「構成プロパティ」-「C/C++」 -「全般」を選択。
「追加のインクルード ディレクトリ」に”"$(ATISTREAMSDKSAMPLESROOT)\include";"$(ATISTREAMSDKROOT)\include"” を設定。


「構成プロパティ」-「C/C++」-「プリプロセッサ」を選択。
「プリプロセッサの定 義」に”ATI_OS_WIN”を追加。


「構成プロパティ」-「リンカ」-「全般」を選択。
「追加のライブラリ ディレクトリ」に”$(ATISTREAMSDKROOT)/lib/x86”を追加。


「構成プロパティ」-「リンカ」-「入力」を選択。
「追加の依存ファイル」 に”OpenCL.lib”を追加。
「OK」ボタンを押す。


では、32bit版をビルドしてみる。「ビルド」メニューから「ソリューションのビルド」を選択。


error C2065: 'cl_int' : 定義されていない識別子です。
error C2146: 構文エラー : ';' が、識別子 'err' の前に必要です。
error C2065: 'err' : 定義されていない識別子です。
error C2653: 'cl' : 識別子がクラス名でも名前空間名でもありません。
error C2065: 'vector' : 定義されていない識別子です。
error C2653: 'cl' : 識別子がクラス名でも名前空間名でもありません。
error C2065: 'Platform' : 定義されていない識別子です。
error C2065: 'platforms' : 定義されていない識別子です。
error C2653: 'std' : 識別子がクラス名でも名前空間名でもありません。
error C2065: 'cout' : 定義されていない識別子です。
error C2065: 'err' : 定義されていない識別子です。

<中略>

error C2065: 'cerr' : 定義されていない識別子です。
error C2065: 'err' : 定義されていない識別子です。
error C2065: 'SDK_FAILURE' : 定義されていない識別子です。
error C2065: 'devices' : 定義されていない識別子です。
error C2228: '.size' の左側はクラス、構造体、共用体でなければなりません
        型は ''unknown-type'' です。
error C2653: 'std' : 識別子がクラス名でも名前空間名でもありません。
error C2065: 'cerr' : 定義されていない識別子です。
error C2065: 'SDK_FAILURE' : 定義されていない識別子です。
error C2653: 'std' : 識別子がクラス名でも名前空間名でもありません。
error C2065: 'cout' : 定義されていない識別子です。
fatal error C1003: プログラム内のエラーが 100 個を超えました。コンパイルは中断されます。
ビルドログは "file://e:\work\program\VisualStudio2008\CPProjects\HelloCL\HelloCL\Debug\BuildLog.htm" に保存されました。
HelloCL - エラー 102、警告 8
========== ビルド: 1 正常終了、1 失敗、0 更新不要、0 スキップ ==========


大量にエラーになった。何かが間違っているようだ。
どうやら、#include "stdafx.h" の記述位置が悪いらしい、最初に持ってきてみる。 (そもそもプリコンパイルヘッダについて無知なのでトンチンカンなことをやっているかもしれない)

再びビルド。今度は先ほどとは違うエラーでいっぱいだ・・・



msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: unsigned int __thiscall std::basic_string>char,struct std::char_traits>char<,class std::allocator>char< <::size(void)const " (?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ) は既に sdkutil.lib(SDKFile.obj) で定義されています。
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: __thiscall std::basic_string>char,struct std::char_traits>char<,class std::allocator>char< <::basic_string>char,struct std::char_traits>char<,class std::allocator>char< <(char const *)" (??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z) は既に sdkutil.lib(SDKFile.obj) で定義されています。
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios>char,struct std::char_traits>char< <::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) は既に sdkutil.lib(SDKFile.obj) で定義されています。
msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits>char<::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) は既に sdkutil.lib(SDKFile.obj) で定義されています。



とか


libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) は既に msvcprtd.lib(locale0_implib.obj) で定義されています。
libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy は既に msvcprtd.lib(locale0_implib.obj) で定義されています。


とか


libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) は既に msvcprtd.lib(MSVCP90D.dll) で定義されています。
LIBCMTD.lib(setlocal.obj) : error LNK2005: __configthreadlocale は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMTD.lib(tidtable.obj) : error LNK2005: __encode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMTD.lib(tidtable.obj) : error LNK2005: __decode_pointer は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。
LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter は既に MSVCRTD.lib(MSVCR90D.dll) で定義されています。



とか


LINK : warning LNK4098: defaultlib 'MSVCRTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
LINK : warning LNK4098: defaultlib 'LIBCMTD' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。
LIBCMTD.lib(crt0.obj) : error LNK2019: 未解決の外部シンボル _main が関数 ___tmainCRTStartup で参照されました。

HelloCL - エラー 51、警告 2
========== すべてリビルド: 1 正常終了、1 失敗、0 スキップ ==========




まだ設定が足りないらしい、色々調べると以下の手順が足りてないようだ。
この手順は、ドキュメントには書いていない、でもサンプルプロジェクトでは、設定されている。

”HelloCL”プ ロジェクトのプロパティを開く。




「構成のプロパティ」-「C/C++」-「コード生成」を選択。
「ラ ンタイム ライブラリ」を”マルチスレッド デバッグ DLL (/MDd)” から ”マルチスレッド デバッグ (/MTd)”に変更して、「OK」ボタンを押す。(ここらへんについても無知なのでよくわからない)

再びビルドする。


今度はうまくいった。
では、実行してみる。

「デバッグ」メニューから「デバッグなしで開始」を選択



HelloCL!
Getting Platform Information
Platform::get() failed (-1001)
続行するには何かキーを押してください . . .




ありゃ?なんでじゃ?

サンプルプログラムを動かしても、同様の状態・・・なんかオレに恨みでもあんのか?
64bit 対応化騒動で、何か大切なものを無くしてしまったのか?

ATI Stream SDK をインストーラでリペアしてもだめだった。
しかたがないので、ATI Stream SDK をアンインストール後、再びインストールした。サンプルをコンパイルして動作確認。うまくいった。
ようやく、”HelloCL”に戻ってきた。
こっちもビルドして実行。成功!

では、本題の 64bit 版をビルドする。

その前に、”HelloCL”プロジェクトのプロパティを開く。


「構成プロパティ」-「リンカ」-「全般」を選択する。
「追加のライブラリ ディレクトリを”$(ATISTREAMSDKROOT)/lib/x86_64”に変更する。
「OK」ボタンを押す。


「ビルド」メニューの「構成マネージャ」を選択。


”HelloCL”プロジェクトの「プラットフォーム」から”<新規作成>”を選択する。


「新しいプラットフォーム」で”x64”を選択し、「OK」ボタンを押す。
もし”同じ名前のソリューション プラットフォームが既に存在するため、このプラットフォームを作成できませんでした。”と表示される場合は、「キャンセル」ボタンを押して、「構成マネージャ」の「アクティブ ソリューション プラットフォーム」で”<編集>”を選択し、”x64”を削除してから、再びこの手順を行う。

こんな画面になる。
「閉じる」ボタンを押す。

「ビルド」メニューから「ソリューションのビルド」を選択する。
ビルドが成功したら。

「デバッグ」メニューから「デバッグなしで開始」を選択。


HelloCL!
Getting Platform Information
Creating a context AMD platform
Getting device info
Loading and compiling CL source
Running CL program
Done
Passed!
続行するには何かキーを押してください . . .


よし!成功!

長かった・・・丸二日もかかってしまった。

能力不足を再認識・・・欝だ・・・もう寝よう。

というわけで、今回はここまで。

2010年4月4日日曜日

OpenCLマスターへの道 - ATI Stream SDK 編 第五話

前回、サンプルプログラムが動いたので、今回は、プロジェクトを始めから作成してみる。


ただし、普通にやってもつまらないので、64bit CLR コンソールアプリケーションを作成してみる。


とその前に、Express Edition は、64bit 版のビルドはサポート外なので、Microsoft Visual C++ 2008 Express Edition で64ビット版のプログラムを作る方法を参考に(ありがたやありがたや~)以下のものを導入して、64bit 版をビルドできるようにした。

Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
Visual C++ 2008 Express Edition And 64-Bit Targets本文中の”Updated patch for Win7 SDK:”の下の”VCE64BIT_WIN7SDK.zip”


最初、私の環境では、以下の手順を実施してもうまくいかなかった。
おそらく、Visual C++ をデフォルトのディレクトリにインストールしていなかったのが原因と思われる。
しかたがないので、Visual シリーズ(C#など)、および、Windows SDK など関係するものを全てアンインストールして、Visual Studio に関連する設定ファイルをすべて削除し、アンインストールしたものをインストールし直す、その際にインストール先をデフォルト値のままとし、再び以下の手順を繰り返したらうまくいった。



64bit 版ビルド対応化の手順は以下のようにする。
Visual C++ 2008 Express Edition with SP1 をインストール。
インストール後、Windows Update を実行し、Visual C++ を最新の状態にしておくこと。

Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1のページから”winsdk_web.exe”をダウンロードして実行する。画面の指示通りにインストールする。

”VCE64BIT_WIN7SDK.zip”を解凍する。
解凍したファイルの”readme.txt”を開いて読む。
”readme.txt”の手順3は、リンク先の情報をよく読むこと、OSが32bitか64bitかで手順が変わるようだ。私のマシンはVista 64bitなので手順1は行わなかった(確証なし)
手順2として、「スタート」メニューから「すべてのプログラム」-「Microsoft Windows SDK v7.0」-「Visual Studio Registration」-「Windows SDK Configuration Tool」を実行


「Installed Windows SDK Versions:」で”v7.0”を選択。
「Make Current」ボタンを押す。


成功。「OK」ボタンを押す。

次に、コマンドプロンプトを管理者権限で開く。手順は次のようにする。
「スタート」メニューから「すべてのプログラム」-「アクセサリ」-「コマンドプロンプト」を右クリックして、コンテキストメニューから「管理者として実行」を選択。

開いたコマンドプロンプトで”VCE64BIT_WIN7SDK.zip”を解凍したディレクトリに移動する。

”setup_x64.bat”を実行する。(32bit OSの場合は”setup_x86.bat”)


> setup_x64.bat

> regedit /s x64\VC_OBJECTS_PLATFORM_INFO.reg

> regedit /s x64\600dd186-2429-11d7-8bf6-00b0d03daa06.reg

> regedit /s x64\600dd187-2429-11d7-8bf6-00b0d03daa06.reg

> regedit /s x64\600dd188-2429-11d7-8bf6-00b0d03daa06.reg

> regedit /s x64\600dd189-2429-11d7-8bf6-00b0d03daa06.reg

> regedit /s x64\656d875f-2429-11d7-8bf6-00b0d03daa06.reg

> regedit /s x64\656d8760-2429-11d7-8bf6-00b0d03daa06.reg

> regedit /s x64\656d8763-2429-11d7-8bf6-00b0d03daa06.reg

> regedit /s x64\656d8766-2429-11d7-8bf6-00b0d03daa06.reg

> copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\AMD64.VCPlatform.config" "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\AMD64.VCPlatform.Express.config"
        1 個のファイルをコピーしました。

> copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\Itanium.VCPlatform.config" "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcpackages\Itanium.VCPlatform.Express.config"
        1 個のファイルをコピーしました。


Visual C++ 2008 Express Edition を起動。


「ファイル」メニューから「新規作成」-「プロジェクト」を選択。

「プロジェクトの種類」から”CLR”を選択。

「テンプレート」から”CLR コンソール アプリケーション”を選択。




「プロジェクト名」に”HelloCL”と入力し、「OK」ボタンを押す。


「ビルド」メニューの「構成マネージャ」を選択。


「プラットフォーム」で「<新規作成...>」を選択


「新しいプラットフォーム」で”Itanium”と”x64”がリストアップされていれば 64 bit ビルド対応パッチが成功している。”x64”を選択して、「OK」ボタンを押す。


変更後の画面。「閉じる」ボタンを押す。

「ビルド」メニューから「ソリューションのビルド」を選択。


こんな感じのディレクトリ構成になっていれば成功。環境によっては、多少異なるかもしれない。


というわけで、今回はここまで。