私はマルチスレッド 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 を追加しました。