1. ホーム
  2. CUDA

CUDAのcudaMalloc()のパラメータを理解する方法

2022-02-12 10:44:57

ポインタやアドレスに慣れている子供たちは、この概念をより簡単に理解することができます。より多くの人にcudaMallocのパラメータを理解してもらうために、この記事は読者のために書かれたものです。

まずこのランタイム関数のプロトタイプを見ます。

cudaError_t cudaMalloc (void **devPtr, size_t size ); 






この関数の戻り値は、CUDA で定義されたエラーコードです。


メインの第1パラメータ。なぜ星が2つなのか?例題を使って説明しましょう。

float *device_data = NULL;
size_t size = 1024*sizeof(float);
cudaMalloc((void**)&device_data, size);





上記の例では、1024個の単精度浮動小数点数の1次元配列をビデオメモリに要求しています。そして、ポインタ device_data はメインメモリに格納されています。device_dataのアドレスを取る理由は、ビデオメモリ上のcudaMallocで得られた配列の先頭アドレスをdevice_dataに割り当てるためです。関数内で形式参照に値を代入しても実参照では変わりませんが、ポインタはアドレスを渡し、あるアドレスのデータを操作すると、実際には指定したアドレスのデータを変更することになります。今回のようにメモリを要求する関数では、第1引数にポインタdevice_dataのアドレスが渡され、そのアドレスの内容を変更することで実参照に変化がもたらされます。


分からない人はコメントOを残してください。


2015年3月13日 16:42追記

また、"pointer"は、その値がメモリアドレスであることのみを理由にポインタと呼ばれる変数である。

ポインターは変数なので、変数にも記憶領域が必要です。

cudaMallocの最初の引数には、CPUメモリに格納されているポインタ変数のアドレスが渡されます。cudaMallocは実行完了後にこのアドレスにアドレス値を書き込みます(このアドレス値はGPUメモリにあります)。