最終更新: mikk_ni3_92 2008年10月30日(木) 13:16:07履歴
現在地 >> メニュー >> CUDA >> CUDA::基本編05 >> テクスチャ::グローバルメモリ >> CUDA::基本編05まとめ1
#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;
}