最終更新: mikk_ni3_92 2008年10月03日(金) 13:18:34履歴
現在地 >> メニュー >> CUDA >> CUDA::基本編03 >> CUDA::基本編03::まとめコード
#include <iostream> #include <algorithm> #include <cutil.h> const int AryElem = 10000; //要素数 //-----------各種プロトタイプ宣言----------// __global__ void GpuFunction(float *input); //------------ここからメイン関数---------// int main(int argc, char **argv) { CUT_DEVICE_INIT(argc,argv); //初期化 float* x = new float[AryElem]; //float型をAryElem個 for( int i = 0; i < AryElem; ++i){ x[i] = static_cast<float>(i); //適当に初期化 } //---GPU用にメモリ確保---// float* gpu_x; int DataSize = sizeof(float) * AryElem; CUDA_SAFE_CALL(cudaMalloc( reinterpret_cast<void**>( &gpu_x), DataSize) ); //GPUへデータをコピー(Host -> GPU) CUDA_SAFE_CALL( cudaMemcpy( gpu_x, x, DataSize , cudaMemcpyHostToDevice)); //GPU用にブロックとスレッドを用意 dim3 threads(200,1,1); dim3 grid(50,1,1); //GPUでの計算 GpuFunction<<<grid,threads>>>(gpu_x); //GPUから戻す(GPU -> Host) CUDA_SAFE_CALL( cudaMemcpy( x, gpu_x,DataSize, cudaMemcpyDeviceToHost) ); cudaFree(gpu_x); //メモリ解放 //結果を出力 std::copy(x,x+AryElem,std::ostream_iterator<float>(std::cout ,"\n")); delete[] x; CUT_EXIT(argc, argv);//終了 return 0; } //----------- ここからGPU上の計算 --------------------// __global__ void GpuFunction(float *input) { input[blockIdx.x * blockDim.x + threadIdx.x] = blockIdx.x; __syncthreads(); //同期をとる }