0

私はSIMDコードを書くことを可能にするエンジンを使用しており、速く実行します。しかし、すべてのコードを持つブロックは1つだけです。この場合、SIMDはどのように動作しますか?

私はこのコードが各エンティティで同時に独立して実行されることを理解していますが、1つしか変更されていない場合は、これはSIMD、並列性の考えですか?例えば

:この場合

void simdFunction() 
{ 
    center = mesh.center(); // always the same 
    vert.pos.x = center.x; // run on each vertex 
} 

、中心は常に同じであり、それは、SIMDの各頂点について計算されますか。もしそうなら、これはまだ効率的ですか?

これを並列実行することは、一般的なSIMDプログラミングの意味に関係なく、計算コストを上回っていますか?

答えて

4

このコードはありません、それはSIMDの仕組みではありません同時に

各エンティティに独立して実行されます。

SIMDでは、すべての算術演算ユニットがロックステップで動作しており、同じ操作を実行しています。まったく独立しているわけではありません。

一般的に、シェアード定数を計算するのは、シーケンシャルコードで1回だけです。そうすれば、SIMDエンジンは頂点の各スライスに費やす時間が少なくて済みます。

例外は、計算が短く、SIMDが(GPGPUのような)コプロセッサであり、データがすでにそのコプロセッサに入っている場合です。その後、SIMDを使用してそれを計算すると、データを順次プロセッサに戻して戻すことが容易になる可能性があります。

+0

ベンさん、ありがとうございました。しかし、私はこれをコントロールできません。エンジンの仕様では、単一のSIMDコンテキストしか持てないことが定義されています。私は他の関数などを書くことができますが、私が主な文脈でそれらを呼び出すとすぐに、それは同じことになります。だから私は選択肢がないと思う。 –

関連する問題