CUDA:はじめに



これは、GPGPUとnVidia CUDAの使用に関する一連の記事の最初の記事です。 読者を飽きさせないために、あまり多くないが、しばしば十分に書くつもりです。



読者はCUDAが何であるかを知っていると思いますが、そうでない場合、紹介記事はHabréで見つけることができます。



仕事に必要なもの:



1. nVidia GeForce 8xxx / 9xxxシリーズ以上のビデオカード

2. CUDA Toolkit v.2.1(こちらからダウンロードできます: www.nvidia.ru/object/cuda_get_ru.html

3. CUDA SDK v.2.1(ツールキットと同じ場所にダウンロードできます)

4. Visual Studio 2008

5. CUDA Visual Studio Wizard(こちらからダウンロード: sourceforge.net/projects/cudavswizard



CUDAプロジェクトの作成:



VSに必要なものをすべてインストールすると、CU-DA WinAppという名前のC ++用の新しい種類のプロジェクトが表示されます。これがまさに必要なものです。 このタイプのプロジェクトでは、GPUのコンパイルオプションを構成できるCUDAの追加設定を使用できます。たとえば、GPUのタイプに応じた計算機能のバージョンなどです。

プリコンパイル済みヘッダーがCUDAに役立つ可能性は低いため、通常は空のプロジェクトを作成します。

CUDAアプリケーションの構築方法に注意することが重要です。 * .cpp拡張子を持つファイルはMS C ++コンパイラ(cl.exe)によって処理され、* .cu拡張子を持つファイルはCUDAコンパイラ(nvcc.exe)によって処理されます。 CPUで実行されている* .cuのコードはMS C ++コンパイルに転送されます。この機能は、計算にGPUを使用する関数をエクスポートする動的ライブラリの作成に便利です。

以下は、GPUのハードウェア機能に関する情報を表示する簡単なCUDAプログラムのリストです。



リスティング CudaInfoプログラム。



//FileName: cudaInfo.cu



#include <stdio.h>

#include <cuda_runtime_api.h>



int main()

{

int deviceCount;

cudaDeviceProp deviceProp;



// CUDA PC.

cudaGetDeviceCount(&deviceCount);



printf( "Device count: %d\n\n" , deviceCount);



for ( int i = 0; i < deviceCount; i++)

{

//

cudaGetDeviceProperties(&deviceProp, i);



//

printf( "Device name: %s\n" , deviceProp.name);

printf( "Total global memory: %d\n" , deviceProp.totalGlobalMem);

printf( "Shared memory per block: %d\n" , deviceProp.sharedMemPerBlock);

printf( "Registers per block: %d\n" , deviceProp.regsPerBlock);

printf( "Warp size: %d\n" , deviceProp.warpSize);

printf( "Memory pitch: %d\n" , deviceProp.memPitch);

printf( "Max threads per block: %d\n" , deviceProp.maxThreadsPerBlock);



printf( "Max threads dimensions: x = %d, y = %d, z = %d\n" ,

deviceProp.maxThreadsDim[0],

deviceProp.maxThreadsDim[1],

deviceProp.maxThreadsDim[2]);



printf( "Max grid size: x = %d, y = %d, z = %d\n" ,

deviceProp.maxGridSize[0],

deviceProp.maxGridSize[1],

deviceProp.maxGridSize[2]);



printf( "Clock rate: %d\n" , deviceProp.clockRate);

printf( "Total constant memory: %d\n" , deviceProp.totalConstMem);

printf( "Compute capability: %d.%d\n" , deviceProp.major, deviceProp.minor);

printf( "Texture alignment: %d\n" , deviceProp.textureAlignment);

printf( "Device overlap: %d\n" , deviceProp.deviceOverlap);

printf( "Multiprocessor count: %d\n" , deviceProp.multiProcessorCount);



printf( "Kernel execution timeout enabled: %s\n" ,

deviceProp.kernelExecTimeoutEnabled ? "true" : "false" );

}



return 0;

}



* This source code was highlighted with Source Code Highlighter .








プログラムでは、cuda_runtime_api.hライブラリを接続します。 これは必須ではありませんが、自動的に含まれますが、IntelliSenceは動作しません(ただし、それでも時折芝刈りが行われます)。



おわりに



これはCUDAプログラムを記述する最も簡単な方法だと思います。環境の構成と構成に最小限の労力しかかからないため、唯一の問題はIntelliSenceのみを使用することです。

次回は、数学的計算のためのCUDAの使用と、ビデオカードのメモリを操作する問題について検討します。



PS質問をします。



All Articles