0

私はCUDA分野の初心者です。ノイズリダクション (または中央値) のために、x フレーム (8 ビット白黒) で単純な単純な平均化を実行したいと考えています。X イメージにメモリをどのように割り当てることをお勧めしますか?

これでよろしいでしょうか?

    unsigned char** dev_imageStack = new unsigned char*[X];
    for(int i = 0; i < X; i++)
    {
        cudaMalloc( (void**) &dev_imageStack[i], imageSize);
    }

よろしくお願いします、イド

4

2 に答える 2

1

dev_imageStack の使用に依存します。dev_imageStack は、GPU メモリへのポインタを保持する CPU メモリへのポインタです。dev_imageStack をカーネルに渡して読み取ることができず、カーネルがクラッシュする可能性が高くなります。dev_imageStack[0].. dev_imageStack[X] をカーネルに渡すことができます。これは、GPU メモリへのポインターであるためです。

すべてのフレームをポインターで渡す必要がある場合は、1D 配列を割り当て、カーネル内でフレーム オフセットを実行して正しいフレームを取得することをお勧めします。

unsigned char* dev_imageStack;
cudaMalloc((void**)&dev_imageStack, imageSize*X);

そして、それを使用するときは、Y*imageSize で配列にオフセットしてフレームにアクセスする必要があります。ここで、Y はアクセスするフレームです。

説明した方法と同じようにしたい場合は、次のようにする必要があります。

unsigned char** host_imageStack = new unsigned char*[X];

for(int i = 0; i < X; i++)
{
    cudaMalloc( (void**) &host_imageStack[i], imageSize*sizeof(char));
    cudaMemcpy(host_imageStack[i], "char_ptr_to_frame_i_on_host", imageSize*sizeof(char),cudaMemcpyHostToDevice);
}

unsigned char** dev_imageStack;
cudaMalloc((void**)&dev_imageStack, X*sizeof(char*));
cudaMemcpy(dev_imageStack,host_imageStack,X*sizeof(char*),cudaMemcpyHostToDevice);

これで、dev_imageStack をカーネルへの 2D ポインターとして使用できるようになりました。フレームとピクセルへのアクセスは、カーネルで dev_imageStack[frame_id][pixel_id] を呼び出すことによって行われます。

于 2013-02-25T14:35:42.780 に答える
0

独自のプロジェクトでは、次の方法でこれを解決しました。

unsigned char* dev_imageStack;
cudaMalloc( (void**)&dev_imageStack, imageSize * frames );

unsigned char* dev_image1 = dev_imageStack;
unsigned char* dev_image2 = dev_image1 + imageSize;
...
unsigned char* dev_imageN = dev_imageN-1 + imageSize;

大きなメモリブロックを 1 つだけ割り当て、複数の「サブブロック」へのポインタを使用しています。

「サブブロック」へのこのポインターを含む配列が必要な場合は、このように行うことができます。

void* dev_images;
cudaMalloc( (void**)&dev_images_tmp, frames * sizeof( unsigned char* ) );
unsigned char** dev_images = (unsigned char**)dev_images_tmp;

カーネルでは、次の方法でフレーム x の画像を呼び出すことができます。

dev_images[x][index];

index を使用すると、destinatet イメージの要素を取得できます。

于 2013-02-25T14:04:10.503 に答える