2

ヒストグラム用のCUDAカーネルを画像に書き込んでいますが、カーネルから配列を返す方法がわかりませんでした。他のスレッドが配列を読み取ると、配列が変更されます。それに対する可能な解決策はありますか?

__global__ void Hist(
    TColor *dst, //input image
    int imageW,
    int imageH,
 int*data
){
    const int ix = blockDim.x * blockIdx.x + threadIdx.x;
    const int iy = blockDim.y * blockIdx.y + threadIdx.y;

if(ix < imageW && iy < imageH)
{
  int pixel = get_red(dst[imageW * (iy) + (ix)]);
                  //this assign specific RED value of image to pixel

  data[pixel] ++; // ?? problem statement ...
 }
}

@para d_dst:入力画像のTColorはfloat4と同じです。

@paraデータ:ヒストグラムサイズの配列[255]

extern "C" void
cuda_Hist(TColor *d_dst, int imageW, int imageH,int* data) 
{
  dim3 threads(BLOCKDIM_X, BLOCKDIM_Y);
  dim3 grid(iDivUp(imageW, BLOCKDIM_X), iDivUp(imageH, BLOCKDIM_Y));
  Hist<<<grid, threads>>>(d_dst, imageW, imageH, data);
}
4

3 に答える 3

5

SDKサンプルを見ましたか?「ヒストグラム」サンプルは、CUDA SDKで入手できます(現在、NVIDIA開発者サイトのバージョン3.0、登録済みの開発者はバージョン3.1ベータ版を入手できます)。

サンプルのドキュメントでは、GPUでグローバルメモリアトミックを使用するか、各ブロックの結果を個別に収集してから(ホストまたはGPUのいずれかで)個別に削減することにより、合計を処理する方法を適切に説明しています。

于 2010-06-08T10:29:56.840 に答える
2

ヒストグラムは、CUDA(または一般的にGPGPU)で実装した場合、特に効率的ではありません。通常、共有メモリに多数の部分ヒストグラムを生成してから、それらを合計する必要があります。この特定のタスクをCPUに保持することを検討することをお勧めします。

于 2010-06-05T09:00:29.120 に答える
0

アトミック関数を使用して他のスレッドが同じメモリを使用するのをブロックするか、部分ヒストグラムを使用する必要があります。いずれにせよ、入力画像が非常に大きくない限り、それほど効率的ではありません。

于 2010-06-05T19:51:03.650 に答える