【main.cu】
#include <iostream>
#include <cutil_inline.h>
#pragma comment (lib,"cudart.lib")
#ifdef _DEBUG
#pragma comment (lib,"cutil32D.lib")
#else
#pragma comment (lib,"cutil32.lib")
#endif
const int AryNum = 20000;
//------------- CUDAでの処理 ---------------//
__global__ void cuAddValue(float *gpuAryData)
{
const int threadId = blockIdx.x * blockDim.x + threadIdx.x; //スレッドIdを取得
gpuAryData[threadId] += 20000;//すべての要素を+20000する
__syncthreads(); //同期をとる
}
//------------- メイン関数 --------------------//
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個のグリッドサイズ
dim3 block(200,1,1);//200個のブロックサイズ幅200×1
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;
}