まず、CPU から GPU にコピーされるデータへのポインターを宣言する必要があります。上記の例では、配列original_cpu_array
を CUDA グローバル メモリにコピーします。
int original_cpu_array[array_size];
int *array_cuda;
データが占有するメモリ サイズを計算します。
int size = array_size * sizeof(int);
Cuda メモリ割り当て:
msg_erro[0] = cudaMalloc((void **)&array_cuda,size);
CPU から GPU へのコピー:
msg_erro[0] = cudaMemcpy(array_cuda, original_cpu_array,size,cudaMemcpyHostToDevice);
カーネルを実行
GPU から CPU へのコピー:
msg_erro[0] = cudaMemcpy(original_cpu_array,array_cuda,size,cudaMemcpyDeviceToHost);
空きメモリ:
cudaFree(array_cuda);
デバッグ上の理由から、通常、関数呼び出しのステータスを配列に保存します。(例: cudaError_t msg_erro[var];
)。これは厳密には必要ではありませんが、割り当てとメモリ転送中にエラーが発生した場合に時間を節約できます。
エラーが発生した場合は、次のような関数を使用して出力します。
void printErros(cudaError_t *erros,int size, int flag)
{
for(int i = 0; i < size; i++)
if(erros[i] != 0)
{
if(flag == 0) printf("Alocacao de memoria");
if(flag == 1) printf("CPU -> GPU ");
if(flag == 2) printf("GPU -> CPU ");
printf("{%d} => %s\n",i ,cudaGetErrorString(erros[i]));
}
}
フラグは主に、エラーが発生したコード内の部分を示すためのものです。たとえば、メモリ割り当て後:
msg_erro[0] = cudaMalloc((void **)&array_cuda,size);
printErros(msg_erro,msg_erro_size, 0);