現在地 >> メニュー >> CUDA >> CUDA::基本編03 >> CUDA::基本編03::まとめコード

問題


10000個の要素を「1次元グリッド、1次元スレッドのブロック」として分割し、
GPUへ渡し、各要素の対応するブロックIdを代入せよ。

答え

#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(); //同期をとる
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます