CUDA入門 > サンプル入門 > 中級編 > 異なる関数で同じGPUメモリを使用

異なる関数で同じGPUメモリを使用


異なる関数で同じGPUメモリを使用
動画などでCUDAを使用する場合、毎フレームGPUのメモリを確保していては、
無駄な処理が増えてしまいます。

「メモリのアドレスを管理するための構造体」を定義することで、
1回だけメモリ領域を確保し、以降は同じメモリ領域を使いまわせるように出来ます。

ソース
#include <stdio.h> #include <cutil.h> // CUDA_IMG構造体を定義 typedef struct{ unsigned char *imgHost; unsigned char *imgGpuIn; unsigned char *imgGpuOut; int width; int height; } CUDA_IMG; void cudaInit(CUDA_IMG *cudaImg){ // ホストのメモリ領域確保 CUDA_SAFE_CALL(cudaMallocHost((void**)&cudaImg->imgHost, sizeof(unsigned char)*cudaImg->width*cudaImg->height)); // デバイス(GPU)のメモリ領域確保 CUDA_SAFE_CALL(cudaMalloc((void**)&cudaImg->imgGpuIn, sizeof(unsigned char)*cudaImg->width*cudaImg->height)); CUDA_SAFE_CALL(cudaMalloc((void**)&cudaImg->imgGpuOut, sizeof(unsigned char)*cudaImg->width*cudaImg->height)); } void cudaExit(CUDA_IMG *cudaImg){ CUDA_SAFE_CALL(cudaFreeHost(cudaImg->imgHost)); CUDA_SAFE_CALL(cudaFree(cudaImg->imgGpuIn)); CUDA_SAFE_CALL(cudaFree(cudaImg->imgGpuOut)); } void cudaRun(CUDA_IMG *cudaImg){ // cudaImgを使用して何か処理を入れる }

ソースの説明
上記のようにすることで、cudaInit関数でメモリ領域を確保し、
以降はCUDA_IMG構造体を引数に渡すことで、他の関数からも同じメモリを使用できるようになります。
※main関数で使用する場合はあまり利点はありません・・・

ホスト側のメモリをcudaMallocHostで確保しているため、
通常のmallocなどで確保するよりも転送速度が速くなります。
使用するメモリのアドレスをcudaInitで作成したimgHostに割り当てれば、
それ以降の処理は転送速度が速い状態で使えます。

ちなみに、上記の構造体、関数を使用することで、
関数をライブラリ化してもCUDAを使用できます。
ライブラリ化の手順については、後日掲載します。