FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

VC2010 Express + WindowsSDK7.1でCUDA4.0の64bit向けバイナリをビルドする.

VC2010 ExpressとWindowsSDK7.1を使ってCUDA4.0のx64実行ファイルをビルドする方法を解説します.VC2010 ExpressとWindowsSDK7.1はwebインストーラでインストールされているものとします.

作業環境
Windows7 Professional 64bit + GeForce9600GT

1.CUDAのインストール

・Developer Drivers for WinVista and Win7 64bit
・CUDA Toolkit 64bit
・CUDA Tools SDK 64bit
・GPU Computing SDK 64bit

をインストール.インストール方法は,多くの方が解説しているので省略します.特筆すべき点はありません.

2.CUDAビルド環境の設定

CUDA Toolkit 4.0 Build Customization BUG FIX Updateをダウンロードして適当な場所に展開し,CUDA 4.0.propsの45行目くらいの部分に青字で示すように追加します.

<CudaClVersion Condition="'$(PlatformToolset)' == 'v90'">2008</CudaClVersion>
<CudaClVersion Condition="'$(PlatformToolset)' == 'v100'">2010</CudaClVersion>
<CudaClVersion Condition="'$(PlatformToolset)' == 'Windows7.1SDK'">2010</CudaClVersion>

編集したCUDA 4.0.propsとCUDA 4.0.targetsを
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations
に上書きします.Program Files内のファイルは編集禁止になるので,先に編集してから移動しています.

次にcutilをビルドします.
C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\common
のcutil_vs2010.slnを開いてプロジェクトのプロパティを開き,プラットフォーム ツールセットをWindows7.1SDKにしてWin32,x64のライブラリをビルドします.cutilを作成したら,後は自分のプロジェクトをx64向けに設定してビルドするだけです.

3.ビルド

3.1 Win32向けビルド

(i) 適当なプロジェクトを新規作成し,main.cuを追加します.
(ii) プロジェクト名を右クリックしてビルドのカスタマイズを選択し,CUDA 4.0にチェックを入れます.
(iii) 次にmain.cuを右クリックしプロパティを開いたら,項目の種類をCUDA C/C++に変更します.
(iv) プロジェクト名を右クリックしてプロパティを開き,全般のプラットフォーム ツールセットをWindows7.1SDKに変更します.
(v) リンカーの入力で,追加の依存ファイルにcuda.lib, cudart.lib, cutil32d.libを追加して適用し,プロパティを閉じます.
(vi) 2.で作成したcutilのdllとlib,およびcutil.hを自分のプロジェクトフォルダにコピーします.具体的には以下のファイルです.

・cutil32D.lib
・cutil32D.dll
・cutil64D.lib
・cutil64D.dll
・cutil.h

(vi) main.cuにコードを記述してビルドします.

問題なくビルドできれば実行してWin32での動作確認をしてください.プログラムを起動してタスクマネージャからプロセス名を確認し,プロセス名の後に*32とついていればOKです.

3.2 x64向けビルド

次に同じプロジェクトでx64向けにビルドします.

(i) プロパティを開いて右上の構成マネージャをクリックし,アクティブ ソリューション プラットフォームのドロップダウンリストから新規作成を選択してx64を追加します.
(ii) 次にCUDA C/C++のCommonでTarget Machine Platformを64-bitに変更して,
(iii) 最後にリンカーの入力でcutil32d.libをcutil64d.libに変更してプロパティを閉じます.

プロジェクトをビルドして実行し,タスクマネージャのプロセス名から*32が消えていたら64bit向けビルドは成功です.

4.最後に

この方法でビルドはできるようになりますが,私の環境ではアクティブプラットフォームがx64のときにプロジェクトのクリーンが正常に行われないという問題が発生します.nvccのcleanコマンドがエラーコード-1を出力して終了するのですが,原因はまだわかりません.

A.付録

今回テストに用いたソースを示します.

#include <stdio.h>
#include <stdlib.h>

#include <cuda_runtime.h>
#include "cutil.h"

int mat0[] = {
1, 2, 3,
4, 5, 6,
7, 8, 9
};

int mat1[] = {
9, 8, 7,
6, 5, 4,
3, 2, 1
};

int mat2[9];
int mat3[9];

__global__ void add(int *m0, int *m1, int *m2) {
m2[threadIdx.x] = m0[threadIdx.x] + m1[threadIdx.x];
}

__global__ void mult(int *m0, int *m1, int *m2) {
m2[threadIdx.x] = m0[threadIdx.x] * m1[threadIdx.x];
}

__host__ void print(int *mat) {
int i, j;
for(j=0; j<3; j++) {
for(i=0; i<3; i++) {
fprintf(stdout, "%d ", mat[i + 3 * j]);
}
fprintf(stdout, "\n");
}
}

int main(int argc, char **argv) {
int size;
int *m0, *m1, *m2, *m3;

CUT_DEVICE_INIT(argc, argv);

size = sizeof(int) * 9;

CUDA_SAFE_CALL(cudaMalloc((void**)&m0, size));
CUDA_SAFE_CALL(cudaMemcpy(m0, mat0, size, cudaMemcpyHostToDevice));

CUDA_SAFE_CALL(cudaMalloc((void**)&m1, size));
CUDA_SAFE_CALL(cudaMemcpy(m1, mat1, size, cudaMemcpyHostToDevice));

CUDA_SAFE_CALL(cudaMalloc((void**)&m2, size));
CUDA_SAFE_CALL(cudaMalloc((void**)&m3, size));

dim3 blocks(1);
dim3 threads(9);

add<<< blocks, threads >>>(m0, m1, m2);
mult<<< blocks, threads >>>(m0, m1, m3);

CUDA_SAFE_CALL(cudaMemcpy(mat2, m2, size, cudaMemcpyDeviceToHost));
CUDA_SAFE_CALL(cudaMemcpy(mat3, m3, size, cudaMemcpyDeviceToHost));

print(mat2);
print(mat3);

CUDA_SAFE_CALL(cudaFree(m0));
CUDA_SAFE_CALL(cudaFree(m1));
CUDA_SAFE_CALL(cudaFree(m2));
CUDA_SAFE_CALL(cudaFree(m3));

CUT_EXIT(argc, argv);
return 0;
}
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

Ishida Akihiko

Author:Ishida Akihiko
FC2ブログへようこそ!

免責事項
当サイトに掲載する記事内容は,必ずしも正確性,信頼性,妥当性,有用性,完成度などを保証しません.記事の利用はすべて自己責任でお願いします.当サイトに掲載された内容によって発生したいかなる損害に対しても,管理人は一切の責任を負いかねます.
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。