const int AryNum = 20000; … … //GPUのメモリ確保 int DataSize = sizeof(float)*AryNum; float *gpuAry; CUDA_SAFE_CALL(cudaMalloc( reinterpret_cast<void**>( &gpuAry), DataSize) ); … … cudaFree(gpuAry);//メモリ破棄【解説】
//CPUでメモリ確保 float *ary = new float[AryNum]; … 値の設定 … //GPUのメモリ確保 int DataSize = sizeof(float)*AryNum; float *gpuAry; … GPUのメモリ確保 … CUDA_SAFE_CALL( cudaMemcpy( gpuAry, ary, DataSize , cudaMemcpyHostToDevice));【解説】
//------------- CUDAでの処理 ---------------// __global__ void cuAddValue(float *gpuAryData) { const int threadId = blockIdx.x * blockDim.x + threadIdx.x; //スレッドIdを取得 gpuAryData[threadId] += 20000;//すべての要素を+20000する __syncthreads(); //同期をとる } … … //GPU用にブロックとスレッドを用意 dim3 grid(100,1,1);//100×1サイズのグリッド(1グリッドあたり100ブロック) dim3 block(200,1,1);//200×1のブロックサイズ(1ブロックあたり200スレッド) //グリッド100個、ブロック200 cuAddValue<<<grid,block>>>(gpuAry);
//CPUでメモリ確保 float *ary = new float[AryNum]; … 値の設定 … //GPUのメモリ確保 int DataSize = sizeof(float)*AryNum; float *gpuAry; … GPUのメモリ確保 … … … //GPUから戻す(GPU -> Host) CUDA_SAFE_CALL( cudaMemcpy( ary,gpuAry ,DataSize, cudaMemcpyDeviceToHost) );
const int AryNum = 20000; //------------- CUDAでの処理 ---------------// __global__ void cuAddValue(float *gpuAryData) { … … } //------------- メイン関数 --------------------// int main(int argc, char **argv) { CUT_DEVICE_INIT(argc,argv); //CPUでメモリ確保+値設定 float *ary = new float[AryNum]; for(int loop = 0;loop < AryNum; ++loop) { ary[loop] = loop; } //GPUのメモリ確保 int DataSize = sizeof(float)*AryNum; float *gpuAry; CUDA_SAFE_CALL(cudaMalloc( reinterpret_cast<void**>( &gpuAry), DataSize) ); //GPUへデータをコピー(Host -> GPU) CUDA_SAFE_CALL( cudaMemcpy( gpuAry, ary, DataSize , cudaMemcpyHostToDevice)); //GPU用にブロックとスレッドを用意 dim3 grid(100,1,1);//100×1サイズのグリッド(1グリッドあたり100ブロック) dim3 block(200,1,1);//200×1のブロックサイズ(1ブロックあたり200スレッド) cuAddValue<<<grid,block>>>(gpuAry); //GPUから戻す(GPU -> Host) CUDA_SAFE_CALL( cudaMemcpy( ary,gpuAry ,DataSize, cudaMemcpyDeviceToHost) ); cudaFree(gpuAry);//メモリ破棄 //出力テスト for(int loop = 0;loop < AryNum; ++loop) { std::cout << ary[loop] << "\n"; } delete [] ary;//メモリクリア CUT_EXIT(argc, argv);//終了 return 0; }
//------------- CUDAでの処理 ---------------// __global__ void cuAddValue(float *gpuAryData) { const int threadId = blockIdx.x * blockDim.x + threadIdx.x; //スレッドIdを取得 gpuAryData[threadId] += 20000;//すべての要素を+20000する __syncthreads(); //同期をとる } … … cuAddValue<<<grid,block>>>(gpuAry);【解説】