cudamemcopy(... , devicetohost) を使用してデータを転送するための最適なデータ構造はありますか? 配列は構造体よりもはるかに高速に動作することがわかりました。これには理由があり、より最適な方法はありますか?
編集 -
タイミングが正しく記録されていないようです。構造体と配列の所要時間はほぼ同じです。cuda events api を使って時間を記録してみます。
カーネル内でグローバル メモリとの間でデータを共有/レジスタにロードする場合、構造体の配列は通常、構造体の配列よりも優れています。ただし、(1 つの大きな memcopy トランザクションで) ホストからデバイスへ、またはホストからデバイスへデータをコピーする場合、SoA と AoS の間にパフォーマンスの違いはないと思います。結局のところ、データの量は同じです。
唯一の例外は、AoS の要素の特定のメモリ アラインメントを実現するために、構造体の最後に追加のパディング バイトが追加された場合です。
パフォーマンスの違いが発生している理由は他にもあると思います。
個人的には、パフォーマンスの違いがコピーによるものであることに懐疑的です。
おそらく、データ構造は空のギャップがあるように調整されています。
2番目の原因は、メモリページの配置処理が原因である可能性があります。mallocを使用してメモリを取得すると、Windowsファイルシステムのレイアウトと同様にフラグメント化される可能性があります。断片化のレベルは非常に高くなる可能性がありますが、mallocを1回呼び出すと、継続的に調整されたメモリが得られ、多くの呼び出しを行うと、ギャップのあるメモリが得られると言っても過言ではありません。
CUDAのメモリコピーは、ページを1つずつチェックし、手動でGPUに移動することで、この追加のオーバーヘッドに対処する必要があります。
問題の本当の解決策はcudaMallocHost
、CPUが心配する必要のないメモリを割り当てるために使用することです。これを試して、問題が解決するかどうかを確認してください。