2

すべてのフレームで頂点配列の特定の要素(数千以上)をアップロードする必要があります。または、最初と最後に変更された値の間の領域全体をアップロードする必要がありますが、配列全体を再アップロードする可能性があるため、かなり非効率的です。 、とにかく多くの変更されていない値がアップロードされます。

この質問には、頂点データを GPU にアップロードする最速の方法は何かということも含まれています。

それにはいくつかの方法があります。

glBufferData() / glBufferSubData()  // Standard upload to buffer
glBufferData()                      // glBufferData with double buffer
glMapBuffer()                       // Mapping video memory
cudaMemcpy()                        // CUDA memcopy from host to device vertex buffer

どれが一番速いでしょうか?私は特にCUDA の方法に関心があり、それが標準の OpenGL メソッドとの違いです。glBufferData() または glMapBuffer() よりも高速ですか?

4

1 に答える 1

6

ホストからデバイスに同じデータをコピーする速度は、どのコピー API を使用しても同じです。

ただし、コピーするデータ ブロックのサイズは非常に重要です。CUDA のcudaMemcpy().

CUDA - PCI-E 経由の転送はどれくらい遅いですか?

ここに画像の説明を入力

呼び出すコピー API の数と各コピーのデータ サイズがわかっている場合は、上の図から平均速度を簡単に見積もることができます。

要素のサイズが小さく、要素の数が多い場合、コピー API を何千回も呼び出して、変更された要素のみをホストからデバイスに個別にコピーすることは、絶対に得策ではありません。

于 2013-09-20T10:07:01.983 に答える