現在地 >> メニュー >> CUDA >> CUDA編03 >> CUDA編03::まとめ

問題

エミュレーションモードを使用し、GPU側の処理で、データ配列に対し、現在の処理中の要素番号を出力せよ。

答え

【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を取得
	printf("now %d\n",threadId);
	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
	
	//グリッド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;
}
×

この広告は60日間更新がないwikiに表示されております。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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