0


私のcudaカーネルは、ブロック実行の最後にホストに供給されるものを生成します。
スケルトンは次のとおりです。
データが書き込まれる host_data は、ホスト マップド メモリとして割り当てられます。
host_data_count は、生成されたデータの数を示すマップされたメモリでもあります。
私が使用している GPU は、Fermi アーキテクチャと CC 2.0 を備えた GTX 580 です。

__global__ void kernel(host_data, host_data_count)
{
    __shared__ int  shd_data[1024];
    __shared__ int  shd_cnt;
    int i;

    if (threadIdx.x == 0)
        shd_cnt = 0;
    __syncthreads();

    while ( ... )
    {
        if (something happens)
        {
            i = atomicAdd(&shd_cnt, 1);
            shd_data[i] = d;
        }
    }

    __syncthreads();
    if (threadIdx.x == 0)
    {
        i = atomicAdd(host_data_count, shd_cnt);
        memcpy(&host_data[i], shd_data, shd_cnt * 4);
    }
}

このカーネル コードには何が欠けていますか?
誰でも助けることができますか?

4

1 に答える 1

1

直面している問題が何であるかを実際に述べていないため、何が欠けているのかを伝えるのは困難です。可能性はほとんどないと思いますが、これはあなたのより高い概念のいくつかの実際の実装に依存します.

  • host_data_countaは型int*(または同様の?)であると仮定します。これは、グローバル メモリを指すか、マップされた固定メモリを介してホスト メモリを指します。速度のために、実際にグローバルメモリを使用することを強くお勧めします。
  • が固定メモリの場合host_data_count、アトミック操作は GPU 内でのみアトミックであることに注意してください。その間に CPU が何らかの処理を行うと、原子性が失われる可能性があります。ほとんどの場合、カーネル呼び出しの後、値を読み取ったり使用したりする前に、ホスト スレッドを同期する必要があります。カーネル呼び出しは常に非同期です。
  • memcpyデバイスコードには何がありますか? 自分で実装したと思いますよね?単一のスレッドまたはブロック全体を使用してメモリをコピーしていますか? ブロック全体を使用すると高速になりますが、この関数を の外で使用する必要がif (threadIdx.x==0)あり、変数iを共有する必要があります。
于 2012-02-05T13:31:09.047 に答える