cuda
サンプルを弄ってみた。
CPUで配列を0に初期化してGPUに渡す。GPUでスレッドインデックスを配列に代入。
GPUバッファをCPUの配列にコピーしてGPUの処理が反映されたものを取得できる。
#include <stdio.h> /** * @brief GPUで実行する関数. */ __global__ void setIndex(int* addr) { int x = threadIdx.x; addr[x] = x; } /** * @brief CPUのエントリー. * @note ブロック1, スレッド100 */ int main() { int* buffer; /* CPU */ int* d_buffer; /* GPU */ int len = 100; int size = sizeof(int)*len; /* CPU用バッファ. */ buffer = new int[len]; memset(buffer, 0, size); /* GPU用バッファ. */ cudaMalloc((void**)&d_buffer, size); /* CPU用バッファをGPU用バッファにコピー. */ cudaMemcpy(buffer, d_buffer, size, cudaMemcpyHostToDevice); /* GPU関数実行前の状態. */ printf("before\n"); for(int i = 0; i < len; ++i) { printf("%d, %d\n", i, buffer[i]); } /* GPU関数実行. */ setIndex<<<1,len>>>(d_buffer); /* GPU関数実行後のGPUバッファをCPUバッファにコピー. */ cudaMemcpy(buffer, d_buffer, size, cudaMemcpyDeviceToHost); /* GPUバッファの開放. */ cudaFree(d_buffer); /* GPUバッファ実行による変更を反映したCPUバッファになっていることを確認. */ printf("after\n"); for(int i = 0; i < len; ++i) { printf("%d, %d\n", i, buffer[i]); } /* CPUバッファ開放. */ free(buffer); /* 入力待ち. */ getchar(); return 0; }