3

CUDA SDK ディストリビューションNvidia Performance Primitives (NPP)画像処理の例では、通常、画像はオブジェクトとして CPU に保存され、画像はオブジェクトとして GPU に保存されます。ImageCPUImageNPP

boxFilterNPP.cppImageCPUは、これらとImageNPPオブジェクトを使用する CUDA SDK の例です。

のようなフィルター (畳み込み) 関数を使用する場合、フィルターをオブジェクトnppiFilterとして定義するのが理にかなっています。ただし、オブジェクトImageCPUの値を設定する明確な方法はわかりません。ImageCPU

npp::ImageCPU_32f_C1 hostKernel(3,3); //allocate space for 3x3 convolution kernel 

//want to set hostKernel to [-1 0 1; -1 0 1; -1 0 1]

hostKernel[0][0] = -1;   //this doesn't compile
hostKernel(0,0) = -1;    //this doesn't compile
hostKernel.at(0,0) = -1; //this doesn't compile

ImageCPUオブジェクトに手動で値を入れるにはどうすればよいですか?

ノート:

  • nppiFilterコード スニペットでは実際には使用しませんでした。オブジェクトnppiFilterに値を書き込むための動機付けの例として言及しているだけです。ImageCPU
  • boxFilterNPP.cppの例では、組み込みのガウス平滑化フィルター (おそらく [1 1 1; 1 1 1; 1 1 1] のようなもの) を使用する特殊なケースであるImageCPUため、オブジェクトへの直接書き込みは含まれていません。nppiFilterBoxnppiFilter
4

3 に答える 3

1

ピクセル/マトリックスに値を割り当てるには:

hostKernel.pixels(0,0)[0].x = -1;
于 2012-10-05T13:19:53.430 に答える
1

「nppiFilter のようなフィルター (畳み込み) 関数を使用する場合、フィルターを ImageCPU オブジェクトとして定義するのが理にかなっています。」

これは間違いであり、悪い考えです。画像データは通常、「行が埋め込まれた」形式で保存され、NPP の CUDA SDK サンプルに同梱されている画像クラスは、各行の末尾にパディング バイトを追加する特殊な 2D メモリ アロケーターを使用します。そうすれば、各ラインの最初のピクセルが 64 バイトにアラインされたアドレスに到達します。これは、パフォーマンス上の理由から行われます (CPU と GPU の両方で)。

一方、nppiFilter などのプリミティブに使用されるカーネル配列は、密にパックする必要があります。これが、示されているコードが機能しない理由です。

于 2012-10-09T21:24:35.777 に答える
0

1 チャネル (例: 32f_C1) の場合、このアプローチは機能します。

hostKernel.pixels(0,0) = -1;
于 2012-10-20T04:59:05.887 に答える