別の pthread で使用した場合、cublasSetMatrix は機能しますか?
CPU 上のタスクを CPU->GPU データ転送とオーバーラップさせたい。ただし、データが非常に大きいため、大きな固定メモリを割り当てないようにしています。
いいえ、そうではありません。GPUコンテキストは、それらを作成したスレッドに関連付けられています。他に何もせずに実行cublasSetMatrix
または別のスレッドで実行しようとすると、別のコンテキストが作成されます。cudaMemcpy
メモリ割り当てはコンテキスト間で移植可能ではなく、事実上、すべてのコンテキストに独自の仮想アドレス空間があります。その結果、2つのGPUコンテキストが作成され、コピーが失敗します。
ピン留めされたメモリの要件は、CUDAドライバーから来ています。コピーと実行をオーバーラップさせるには、コピーに関係するホストメモリが、GPUがPCI-eバスを介してDMAでアクセスできる物理アドレス範囲内にある必要があります。そのため、ピン留めが必要です。そうしないと、ホストメモリがスワップスペースまたは他の仮想メモリにあり、DMAトランザクションが失敗する可能性があります。
大きな問題に必要な固定ホストメモリの量が心配な場合は、1つまたは2つの小さな固定バッファを使用し、固定メモリをステージングバッファとして使用して複数の転送を実行してみてください。パフォーマンスは、単一の大きなピン留めされたバッファーと1つの大きな転送を使用する場合ほど良くはありませんが、それでも有用なカーネル/コピーのオーバーラップを実現し、プロセスで多くのPCI-eレイテンシーを隠すことができます。