OpenGL de プログラミング - CUDA編01
現在地 >> メニュー >> CUDA >> CUDA編01
INDEX: CUDA編00 << CUDA編01 >> CUDA編02

目次

はじめに


CUDAプログラムでの拡張子は「.cu」である。

また、CUDAツールキットがあれば基本的に開発は可能だが、
ここではCUDA SDKについているCUTILを使っていく。

CUTIL(CUDA Utility Library)について


CUTILはCUDAツールキットの一部ではないし、NVIDIAによるサポートがあるわけでもない。
プラットホームに依存しない開発を行うためのSDKのサンプル付属品。

CUTILは以下のような機能が用意されている
  • コマンドラインの解析
  • PPM形式のファイルを読み書きできる
  • 配列データの比較
  • タイマー
  • 各種エラーチェック

プログラムする

追加の依存ファイル

かならず必要な「libファイル」は
  • cudart.lib → cudaライブラリ
  • cutil32.lib or cutil32D.lib → CUTILライブラリ(「D」が付いているのはデバッグ用)
である。

インクルードファイル

インクルードファイルは「cutil_inline.h」だけでよい。

CUTILによるプログラム手順

CUTILを使ったプログラムでは
  1. デバイスの初期化(GPUの初期化)
  2. CUTILの終了
という手順となる。

【例】:CUTILの使い方
#include <cutil_inline.h>

#pragma comment (lib,"cudart.lib")

#ifdef _DEBUG
#pragma comment (lib,"cutil32D.lib")
#else
#pragma comment (lib,"cutil32.lib")
#endif

int main(int argc, char **argv)
{
	CUT_DEVICE_INIT(argc,argv);
		… …
	CUT_EXIT(argc, argv);//終了
	return 0;
}
【解説】
「cudaSetDevice関数」などで初期化してもよい。
このマクロを使うとエラーチェックもしてくれる。

CUTILライブラリが提供するマクロ

いくつかあるが代表的なものをあげておく
CUT_DEVICE_INIT(ARGC, ARGV)デバイスの初期化
CUT_EXIT(argc, argv)プログラムを終了する
CUDA_SAFE_CALL(call)cudaランタイムAPIのエラーチェック
CUT_SAFE_CALL(call)CUTILライブラリのエラーチェック
…等々

デバイスプロパティを取得してみる


まずは、GPUの情報を取得してみる。

デバイスプロパティを取得するデータ構造として次のようなものがある。
【driver_types.h】より
struct cudaDeviceProp
{
  char   name[256];                 ///< ASCII string identifying device
  size_t totalGlobalMem;            ///< Global memory available on device in bytes
  size_t sharedMemPerBlock;         ///< Shared memory available per block in bytes
  int    regsPerBlock;              ///< 32-bit registers available per block
  int    warpSize;                  ///< Warp size in threads
  size_t memPitch;                  ///< Maximum pitch in bytes allowed by memory copies
  int    maxThreadsPerBlock;        ///< Maximum number of threads per block
  int    maxThreadsDim[3];          ///< Maximum size of each dimension of a block
  int    maxGridSize[3];            ///< Maximum size of each dimension of a grid
  int    clockRate;                 ///< Clock frequency in kilohertz
  size_t totalConstMem;             ///< Constant memory available on device in bytes
  int    major;                     ///< Major compute capability
  int    minor;                     ///< Minor compute capability
  size_t textureAlignment;          ///< Alignment requirement for textures
  int    deviceOverlap;             ///< Device can concurrently copy memory and execute a kernel
  int    multiProcessorCount;       ///< Number of multiprocessors on device
  int    kernelExecTimeoutEnabled;  ///< Specified whether there is a run time limit on kernels
  int    integrated;                ///< Device is integrated as opposed to discrete
  int    canMapHostMemory;          ///< Device can map host memory with cudaHostAlloc/cudaHostGetDevicePointer
  int    computeMode;               ///< Compute mode (See ::cudaComputeMode)
  int    __cudaReserved[36];
};

これらの情報を取得するには「cudaGetDeviceProperties関数」を使う。
【例】
cudaDeviceProp devInfo;
CUDA_SAFE_CALL(cudaGetDeviceProperties(&devInfo, 0)); //0番目のGPUの情報を取得
std::cout<<"ビデオカード名 : "<< devInfo.name <<"\n";
std::cout<<"GPUの総メモリ数 : "<<devInfo.totalGlobalMem/1024/1024<<" MB\n";
std::cout<<"各ブロックに割り当てられる最大 shared memory : "<<devInfo.sharedMemPerBlock/1024<<" KB\n";
std::cout<<"1ブロックあたりの最大スレッド数:"<<devInfo.maxThreadsPerBlock<<"\n";

サンプルコード