現在地 >> メニュー >> CUDA >> CUDA::基本編05 >> テクスチャ::グローバルメモリ >> CUDA::基本編05まとめ1

問題


以下の画像を読み込んで、テクスチャオブジェクトを作成し、ネガポジ反転を行え。
その他条件:
  • CUDA配列を使わない

答え


#include <iostream>
#include <cutil.h>

//----------- 各種外部変数 -----------------//
char *filename = "test2.pgm";

//テクスチャオブジェクト
texture<unsigned char, 1, cudaReadModeElementType> tex;


//------------------GPUの処理--------------------//
__global__ void Inverse( unsigned char* g_odata,int width) 
{
	unsigned int x = blockIdx.x*blockDim.x + threadIdx.x;
	unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;

	g_odata[y*width + x] =255-tex1Dfetch(tex,y*width + x);
}

//--------------- メイン関数 ---------------//
int main( int argc, char **argv)
{

	CUT_DEVICE_INIT(argc,argv);

	//画像読み込み
	unsigned char* dataf = NULL;
	unsigned int width, height;
	CUDA_SAFE_CALL(cutLoadPGMub(filename, &dataf, &width, &height));//画像読み込み
	
	//画像のサイズを取得
	unsigned int size =  width * height * sizeof(unsigned char);

	//GPU関連のメモリ確保
	unsigned char* d_data = NULL;//
	CUDA_SAFE_CALL( cudaMalloc( (void**) &d_data, size)  );
	
	CUDA_SAFE_CALL( cudaMemcpy( d_data, dataf, size, cudaMemcpyHostToDevice));

	//テクスチャへのバインド
	CUDA_SAFE_CALL( cudaBindTexture(NULL,tex, d_data));

	dim3 dimBlock(8, 8, 1);
	dim3 dimGrid(width / dimBlock.x, height / dimBlock.y, 1);
	Inverse<<< dimGrid, dimBlock, 0 >>>( d_data,width);

	CUDA_SAFE_CALL( cudaThreadSynchronize() ); //同期待ち

	unsigned char* h_odata = (unsigned char*) malloc( size);
	CUDA_SAFE_CALL( cudaMemcpy( h_odata, d_data, size, cudaMemcpyDeviceToHost) );
	CUT_SAFE_CALL( cutSavePGMub( "Inverseub.pgm", h_odata, width, height));


	cutFree(dataf); //メモリリリース
	cudaFree(d_data);
	free(h_odata);

	CUT_EXIT(argc, argv);
	
	return 0;
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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