5

私はマルチスレッド CPU を使用しており、CPU の各スレッドが個別の CUDA ストリームを起動できるようにしたいと考えています。別々の CPU スレッドは異なる時間に異なることを行うため、重複しない可能性がありますが、同時に CUDA カーネルを起動する場合は、同時に実行し続けたいと思います。

CUDA ツールキットのドキュメント セクション 3.2.5.5 にあるため、これが可能であると確信しています。「ストリームは一連のコマンドです(おそらく異なるホストスレッドによって発行されます)...」

したがって、これを実装したい場合は、次のようにします

void main(int CPU_ThreadID) {
    cudaStream_t *stream;
    cudaStreamCreate(&stream);

    int *d_a;
    int *a;
    cudaMalloc((void**)&d_a, 100*sizeof(int));
    cudaMallocHost((void**)&a, 100*8*sizeof(int));
    cudaMemcpyAsync(d_a, a[100*CPU_ThreadID], 100*size(int), cudaMemcpyHostToDevice, stream);
    sum<<<100,32,0,stream>>>(d_a);

    cudaStreamDestroy(stream);
}

それはほんの一例です。CPU スレッドが 8 つしかないことがわかっている場合、最大で 8 つのストリームが作成されることがわかります。これはこれを行う適切な方法ですか?2 つ以上の異なるホスト スレッドがほぼ同時にこのコードに到達した場合、これは同時に実行されますか? 助けてくれてありがとう!

編集:

コード ブロックの構文の問題をいくつか修正し、sgar91 が提案したように cudaMemcpyAsync を追加しました。

4

1 に答える 1