2012-03-30 9 views
0

計算の計算と計算結果をスピードアップし、OpenGLモデルを描画する必要があります。 std :: vectorをConcurrency :: concurrent_vectorに変更し、単にforループの代わりにparallel_forを使用した場合、大きなスピードアップがアーカイブされました。 for(またはparallel_for)ループで計算され、OpenGLのための頂点が可視化されるこのベクトル(またはconcurrent_vector)。ベクトル - > concurrent_vectorマイグレーション+ OpenGL制限

OpenGLレンダリング処理では、std :: vectorがconcurrent_vectorでは大文字と小文字を区別しない順序でアイテムを保持しているため、std :: vectorを使用すると問題はありません。コードは次のように実行されます。

concurrent_vectorを生成してstd :: vectorにコピーするには、多くの項目があるため高価です。

質問:私はOpenGL配列を使用したいと思いますが、OpenGL出力と互換性のないconcurrent_vectorを使用するのも好きです。

提案がありますか?

+0

@Igor:私は 'concurrent_vector'に別の問題があるので、私はあなたが何を意味するのか、cvはそのアイテムを順番に保持していないと言いたいのですが?私はその印象の下で、 'concurrent_vector'はベクトルと同じ/類似のメモリレイアウトを持ち、競合状態に対して例えば内部ミューテックス。 – MikeMB

答えて

0

連続したストレージを必要とするAPIに、その要素を連続して格納しないデータ構造を使用しようとしています。まあ、それらのうちの1つが与えなければならない、そしてそれはOpenGLになるつもりはない。 GLはconcurrent_vectorのデータ構造を歩くつもりはありません。

したがって、非連続オブジェクトを使用しないことです。

私はあなたが何をしているのか推測することができます(あなたはジェネレータのサンプルコードを提供していないので)。 parallel_forが一定回数反復された場合(「固定」とは、parallel_forが実行される直前の値を意味します)、反復回数に基づいて変更されません。標準vector

ベクトルのサイズをvector::sizeと簡単に設定してください。これは要素の値を初期化します。つまり、すべての要素が存在します。 parallel_forループを実行できるようになりましたが、push_backなどを使用する代わりに、要素を出力内のその場所に直接コピーするだけです。私はparallel_forが実際のベクトルイテレータを反復処理できると思っていますが、私は肯定的ではありません。いずれにせよ、それは問題ではない。 同じ要素を別のスレッドから設定しようとしない限り、競合状態は発生しません。

+0

はい、私は、ループのカップルでベクトル事前割り当てでそのトリックを行いました。そこでは、事前にベクトルのサイズを計算し、parallel_forの中で演算子[]を使用することができました。 この特定のループでは、ケース・ジオメトリ・モデルが変更されたり、頂点の数が大幅に変更されることはありません。 – IgorStack