2011年10月18日火曜日

既存コードでCUDAを使う

既存コードにCUDAのコードを追加する際にはまったためのメモ

VisualStudioは持っていたが、C#しか使用していなかったので、既存コードなんてないのですが、
新規プロジェクトを生成してから、CUDAを使おうとして嵌った。
  1. VCのソリューションエクスプローラーで、プロジェクトを右クリック、ビルドのカスタマイズを選択し、使用できるビルドカスタマイズファイルの "CUDA 4.0 (targets, props)"にチェックを入れる。
    このままだと
  2. プロジェクトにCudaBuildTasksPathが設定されていないためなので、.vcxprojをテキストファイルで開き、下記の様に修正する。 ( Blogger 作成とHTMLを切り替えるとおかしくなるため行の先頭と末尾の < > は省略した。 )
    修正前Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /
    ImportGroup Label="ExtensionSettings"
    /ImportGroup
    修正後Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /
    ImportGroup Label="ExtensionSettings"
     Import Project="$(VCTargetsPath)\BuildCustomizations\CUDA 4.0.props" /
    /ImportGroup
  3. ソリューションエクスプローラーでプロジェクトを右クリックしプロパティを選択、"リンカー-入力"を選択、追加の依存ファイルに、cudart.dllを追加する。
  4. .cuファイルを追加
    ソリューションエクスプローラーで、.cuファイルのプロパティを開けて、項目の種類をCUDA C/C++に変更する。
http://developer.nvidia.com/cuda-toolkit-40 に *NEW* CUDA Toolkit 4.0 Build Customization BUG FIX Update Fixes  error message "$(CUDABuildTasksPath) property is not valid" という項目があったが、適応していなかったため嵌っていたようです。


CUDA プロジェクトの作成

CUDA_SDK_Release_Notes.txtよりCUDAのプロジェクトの作り方を適当に訳した
  1. "NVIDIA GPU Computing SDK 4.0\C\src"にある"template"か"template_runtime"の内容を、"NVIDIA GPU Computing SDK 4.0\C\src\myproject"にコピーする。
  2. プロジェクトのファイル名を好みに合わせて変更する。
  3. "*.sln","*.vcproj"およびソースファイルを変更する。
    変更内容: "template"または"template_runtime" -> "myproject"
  4. "myproject_vs2005.sln","myproject_vs2008.sln"または"myproject_vs2010.sln"を使ってビルドを行なう。
  5. "NVIDIA GPU Computing SDK 4.0\C\bin\win[32|64]\[release|debug]"にある"myproject.exe"を実行。
  6. 計算に必要なコードを編集する。
* template と template_runtime の大きな違い:template は、cutilを使用しているが、 template_runtimeは使用していない。

cutilは便利なマクロが用意されているが、標準エラー出力を使うため、独自のエラー処理が必要な場合は、template_runtimeを使用した方がよい。

2011年10月17日月曜日

CUDA API #3 ディバイス制御

  • cudaGetDeviceCount(int*)
    システムに実装されているCUDAのディバイス数の取得
  • cudaGetDeviceProperties(cudaDeviceProp*,int)
    CUDAディバイスのプロパティ取得
  • cudaSetDevice(int)
    アクティブなCUDAディバイスの設定
  • cudaGetDevice(int*)
    アクティブなCUDAディバイスの取得
  • cudaDeviceReset()
    ディバイスリセット (CUDA4.0以上)
  • cudaThreadExit()
    スレッド終了 (CUDA4.0未満では、ディバイスリセットとして使用されている)
  • cudaDeviceSynchronize()
    実行の同期(CPU←→GPU間?)
    カーネルの実行は非同期で行なわれるため、CPUに結果を転送する場合はこの関数でカーネル処理利が終了するまで待つ必要がある。
  • cudaThreadSynchronize()
    実行の同期  (CUDA4.0未満)





CUDA API #2 エラー処理

CUDAのサンプルでは、cutilを用いてエラー処理していますが、NVIDIA CUDA C GETTING STARTED GUIDE FORMICROSOFT WINDOWSには下記の記述があるため。
The cutil library is primarily intended as a tool for streamlining the GPU Computing SDK samples; its use outside of the SDK samples is not recommended, as the API for the library may change at any time.
cutilライブラリは主にGPUコンピューティングSDKのサンプルを合理化するためのツールとして意図され、ライブラリのAPIは、いつでも変更される可能性があるとして、SDKサンプルの外で、その使用は、推奨されません.
と記述があるため。cutilを使用しない、エラーチェックにつて記録しておく。


cudaError_t : 多くのcuda関数は戻り値型
カーネル呼び出しは戻り値がvoidであるため、cudaGetLastErrorで最後のエラーコード取得する。
char* cudaGetErrorString(cudaError_t)でエラーメッセージを取得できる。

CUDA カーネル

カーネル側のプログラム
__global__修飾して宣言、戻り値はvoid固定で下記の様に実装する。
    __global__ void cudaFunction(inputs,outputs) { ... }

カーネルの呼び出しは下記の様に<<< >>>の内側に、ブロック数、スレッド数を指定する拡張表記を使用する。
    cudaFunction<<< blocks, threads >>>( input, output );

計算単位での値の設定取得は、ポインタなどを用いる。
ポインタの参照位置は下記の定義済み変数を用いて算出する。
一般的なアドレス算出は下記の用になる。
int index = threadIdx.x
+ threadIdx.y * blockDim.x
+ blockIdx.x * blockDim.x * blockDim.y
+ blockIdx.y * blockDim.x * blockDim.y * gridDim.x
+ blockIdx.z * blockDim.x * blockDim.y * gridDim.x * gridDim.y;

カーネルで使用可能な定義済み変数一覧
変数名内容
gridDimdim3gridのサイズ
blockIdxuint3grid内のブロックの座標
blockDimdim3blockのサイズ
threadIdxuint3block内のスレッドの座標
dim3,int3とも下記の構造体であるが、dim3は各メンバとも初期値が1となる。
struct {
    int x;
    int y;
    int z;
};

CUDA API #1 メモリ管理

  • cudaMalloc(void **devptr, size_t count)
    デバイスメモリ確保。
  • cudaFree(void* devptr)
    ディバイスメモリ開放
  • cudaHostMalloc(void **hostptr,size_t count)
    ホストメモリ確保。
    ページロックされたメモリが確保できるためmallocで確保したメモリより高速にアクセスできる可能性が高い
  • cudaHostFree(void* hostptr)
    ホストメモリ開放
  • cudaMemcpy(void *dst, const void *src, size_t count, enum cudaMemcpyKind kind)
    メモリコピー
    cudaMemcpyKindの値
    cudaMemcpyHostToDevicedstはディバイスメモリ、srcはホストメモリ
    cudaMemcpyDeviceToHostdstはホストメモリ、srcはディバイスメモリ
    cudaMemcpyDeviceToDevicedst,srcともディバイスメモリ

2011年10月12日水曜日

CUDA インストール

CUDAのインストールを忘れないようにメモ
NVIDIA CUDA C GETTING STARTED GUIDE FORMICROSOFT WINDOWSを参照しながら実施。
  1. ダウンロード
    Windows7(64bit)でVisualStudio2010を使うので、ダウンロードページから cudatoolkit、gpucomputingsdkの64bit版をダウンロード。ドライバはアップされているものより新しいものを使用しているのでパスした。
  2. インストール
    cudatoolkit、gpucomputingsdkを順にインストール
    環境変数も設定される。
  3. インストールの確認
    1. コマンドプロンプトで、nvcc -vを実行。 実行されてエラーが出ればOK
    2. bandwidthTestの実行。 test resultsがPASSEDと出ればOK
      ("C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\bin\win64\Release")
  4. simpleD3D9のビルド
    そのままビルドすると、cutilが見つからずビルドエラーになる。
    1. "C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common"にあるある"cutil_vs2010.sln" を開きすべてバッチビルド
    2. simpleD3D9のビルド
      ここでもビルドエラーなら、DirectX SDKがインストールされていないとか…
  5. 追加設定
    ドキュメントには、"$VisualStudioInstallDir\VC\VCProjectDefaults"に.rulesファイルがインストールしてあるように記述されているが、コピーされていないため、下記の操作を実施しておく。
    1. "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.0\extras\visual_studio_integration\rules"のファイルを"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\VCProjectDefaults"にコピー。
  6. その他
    1. バグフィックスのダウンロード
      ダウンロードページから"*NEW* CUDA Toolkit 4.0 Build Customization BUG FIX Update Fixes  error message "$(CUDABuildTasksPath) property is not valid""をダウンロード。
    2. README_CUDA4-0-BuildCustomization.txtの指示に従い
      32 bit OS:  "C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations"
      64 bit OS:  "C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations"に "CUDA 4.0.targets"と"CUDA 4.0.props"をリプレイス



note:翻訳メモ
The cutil library is primarily intended as a tool for streamlining the GPU Computing SDK samples; its use outside of the SDK samples is not recommended, as the API for the library may change at any time.cutilライブラリは主にGPUコンピューティングSDKのサンプルを合理化するためのツールとして意図され、ライブラリのAPIは、いつでも変更される可能性があるとして、SDKサンプルの外で、その使用は、推奨されません.
These sample projects also make use of the $CUDA_PATH environment variable to locate the CUDA Toolkit and a .rules file to locate and configure the nvcc compiler.サンプルプロジェクトは、CUDAツールキットの位置を占めす$CUDA_PATH環境変数と、nvccコンパイラの位置と設定を示す.rulesファイルを使用します。
The environment variable is set automatically and the .rules file is installed automatically as part of the CUDA Toolkit installation process.環境変数が自動的に設定され、.rulesファイルは、CUDA Toolkitのインストールプロセスの一部として自動的にインストールされます。
The .rules file is installed into $VisualStudioInstallDir\VC\VCProjectDefaults..rulesファイルは、$VisualStudioInstallDir\VC\VCProjectDefaultsにインストールされています。
You can reference this .rules file from your Visual Studio project files when building your own CUDA applications.あなた自身のCUDAアプリケーションを構築する際には、Visual Studioのプロジェクトファイルから.rulesファイルを参照することができます。

2011年3月19日土曜日

トラ技増刊号

日本橋でトラ技増刊号出てました。
とりあえずマルツさんで、増刊号とモジュール一式を購入。

CMSISでつまずいた部分の確認などを…
英語がとっても苦手な私は日本語で書かれた参考書はとてもありがたいです。

2011年3月16日水曜日

CMSIS関係で少し引っかかったのでメモしておく。

CMSISを使ったプロジェクトの作成するには。
先にCMSISをワークスペースに登録する必要があるっぽい。
新規でワークスペースを作った場合は要注意。

CMSISの登録
  • "Quicks" - "Start here" - "Import Example project(s)" を選択し、インポートウィザードを起動する。
  • "Project archive" に CMSISを含むプロジェクトアーカイブを選択する。
    私は、LPC1769を使っているため "C:\nxp\lpcxpresso_3.6\Examples\NXP\LPC1000\LPC17xx\CMSISv1p30_LPC17xx.zip" を選択
  • Projects:のチェックリストボックスから、CMSISのみ選択して "Finish"
ユーザープロジェクトの作成
  • "Quicks" - "Start here" - "New Project..." -  "NXP LPC1700 projects" -  "NXP LPC1700 C Project"を選択。
  • "Project name" を適当に設定。
  • "Target selection"で適切なものを選択。
  • "CMSIS selection"のチェックボックスにチェックが入っていることを確認。
    "Code Read Project (CRP)"はまだ勉強不足でよくわかっていない。
標準でインストールされる"CMSIS"は1.30らしいが、
インポートウィザードで、"Browse the web for more examples"の"Browse the web..."ボタンで
表示されるページに "MCB1700 Sample Code Bundle for LPC1769 Peripherals using LPCXpresso V2.00 (Jan 10, 2011) "ってのがあります。こちらにある、CMSISは2.0のようです。
MCB1700はKeil社の評価ボード

2011年3月15日火曜日

CMSIS??

LPCXPressoのインストールした時に気になっていたのですが
CMSISv1p30_LPC17xxというプロジェクトが一緒にインポートされています。

気になって調べてみると、Cortex Microcontroller Software Interface Standard の略らしい。
チップメーカーが変わっても CMSISにのっとって開発すれば、比較的簡単に移行できますよ~
ってことらしい。

ARMによって書かれたコードと、Chipメーカーで書かれたコードが(スタートアップ部分)で構成されているらしい。

がんばって調べておいた方がよさそうだ。

lpcxpresso1769 開発環境のインストール

NXP社のLPC1769搭載の lpcxpressoをとりあえず購入。
2900円で JTAGデバッガ搭載しているのはびっくりです。

とりあえず下記の手順で、開発環境のインストール
  1. Code Red 社のLPCXpressoのページでユーザー登録、ログインする。
  2. LPCXPressoをダウンロード
  3. ダウンロードした LPCXpresso IDE をダウンロード、インストール。
  4. インストーラー起動
  5. LPCXPresso IDE の起動(8KByteコード制限があると警告)
  6. HELP - Product activation - Create Serial Number and Activate... で認証コード請求
  7. HELP - Product activation - Enter Activation Code でメールで送られてきた認証コードを入力
サンプルプログラムのビルドと実行
  1. 左下ペインの Quickstart タブ - Start here - Inport Example project(s)
  2. Project archive に {LPCXPresso IDEをインストールしたフォルダ}\Examples\NXP\LPC1000\LPC17xx\LPCXpresso1768.zip を指定
  3. それぞれのプロジェクトの Properties - C/C++ Build - MCU settings で LPC1769を選択する。
  4. 左下ペインの Quickstart タブ - Start here - Build all projects [debug] でとりあえずビルド
  5. LPCXPressoをUSBケーブルで接続。
  6. 左上ペインの Project ex タブ - LPCXPresso1768_systick_twinkle を選択し、
  7. 左下ペインの Quickstart タブ - Start here - Debug "LPCXPresso1768_systick_twinkle" [Debug]。
これで、周期を変えながらLEDが点滅するプログラムがデバッグできる。

2011年2月14日月曜日

H8にも手を出してみる。

今すぐ使えるH8マイコン基板でH8の開発環境とかお試し中。

書き込みソフトが、64ビットに対応してなくて、あたふたしたり。 
なれないEclipse最新バージョンで使おうとして、エラーに襲われて、古いバージョンにしたりで苦労し増したが。開発環境が何とか出来上がる。

マルツさんでSB基板とTB基板とか買い足して、グラフックカラー液晶とタッチパネル、SDメモリーカードなどで遊んでいます。

基板をスタックしているので、サイズ的に分厚くなっていますが、なかなか遊べています。

メーカーから開発環境がリリースしていますが、フリーで使うには容量制限とかかかってしまっているので、安心して使えないのがネック。

ARMとかも気になっているのですが、PSoC5はまだ製品になってないようなので、NXPのLPCとか安い評価ボードがあるので手を出してしまうかも…。