現在地 >> メニュー >> CUDA >> CUDA::画像処理の流れ

CUDA::画像処理の流れ


SDKのサンプル「simple Texture」をみると次のような感じになってる。
  1. 画像の読み込み
  2. 配列データのメモリを確保して画像データコピー。テクスチャ型にバインド
  3. テクスチャ型を利用して、GPUで計算。
  4. GPUでの計算結果をうけとる



[1]:画像の読み込み


 →CUDA::画像の読み込み方法?

[2]:配列データのメモリを確保して画像データコピー


float* h_data; //ここに画像データが入る

 ・・・ ・・・

cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat); //32ビット float
cudaArray* cu_array; //配列データ

CUDA_SAFE_CALL( cudaMallocArray( &cu_array, &channelDesc, width, height ));  //メモリ確保
CUDA_SAFE_CALL( cudaMemcpyToArray( cu_array, 0, 0, h_data, size, cudaMemcpyHostToDevice)); //コピー

テクスチャ型にバインド


texture<float, 2, cudaReadModeElementType> tex;

 ・・・ ・・・

tex.addressMode[0] = cudaAddressModeWrap; //クランプとかワープとかの指定
tex.addressMode[1] = cudaAddressModeWrap;
tex.filterMode = cudaFilterModeLinear; //フィルタ
tex.normalized = true; // 正規化された座標でアクセス

CUDA_SAFE_CALL( cudaBindTextureToArray( tex, cu_array, channelDesc));// 配列をテクスチャにバインド

[3]:テクスチャ型を利用して、GPUで計算


GPU内では、tex2D()を利用して画素値をひろってこれる。

サンプルより

[例]

unsigned int x = blockIdx.x*blockDim.x + threadIdx.x; //IDを拾ってくるなど
unsigned int y = blockIdx.y*blockDim.y + threadIdx.y;

float u = x / (float) width;  //0〜1の範囲にスケール変換
float v = y / (float) height;

 ・・・ ・・・

g_odata[y*width + x] = tex2D(tex, tu, tv);

[4]:GPUでの計算結果をうけとる


float* h_odata = (float*) malloc( size);
CUDA_SAFE_CALL( cudaMemcpy( h_odata, d_data, size, cudaMemcpyDeviceToHost) );

など...

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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