3

SIMDのオレーションを可能にするために、16バイトにアラインしたい(数値3フロート)ベクトルクラスがあります。declspecを16バイト整列に使用すると、多数のC2719エラーが発生します(パラメーター':__declspec(align('#'))を含む正式なパラメーターは整列されません)。整列されたベクトルを渡すことができない場合、ポイントは何ですか?ベクトルへのconst参照を使用することでさえ、コンパイラエラーを引き起こし、それは本当に私を悩ませます。

ここで私がやりたいことを行う方法はありますか?__ m128型にいくつかのばかげたトリックをすることなく、構造体の受け渡しを可能にしながら、16バイトのクラスアラインメントを取得しますか?

4

5 に答える 5

6

一度にこれらの3次元ベクトル構造の束を操作しない限り、SIMDを使用しても大きなメリットは得られない可能性があります。その場合は、配列でそれらを渡す可能性があります。必要がある。SIMDから何らかの利点が得られる可能性がある他のケースは、各ベクトルで多くの計算を実行していて、3つのチャネルで操作を並列化できる場合です。その場合、関数の先頭で手動操作を行って関数を__m128型に変換すると、ある程度のメリットが得られる可能性があります。

于 2012-04-19T18:46:02.983 に答える
3

整列されたベクトルを渡すことができない場合、ポイントは何ですか?

__declspec(align(#))かなり役に立たないようです。C ++ 11は、必要なものをサポートしています。壊れalignasているすべての方法で動作するように見えます。__declspec(align(#))たとえば、を使用alignasしてタイプを宣言すると、そのタイプのパラメーターが整列されます。

残念ながら、Microsoftのコンパイラはまだ標準のアライメント指定子をサポートしていません。私が知っているコンパイラはClangだけで、Windowsのサポートは限られています。

とにかく、C ++にはこの機能があり、最終的にはおそらく利用できるようになることを指摘したいと思います。別のプラットフォームに移動できない限り、他の人が言及しているように、今のところ、値でパラメーターを渡さないのがおそらく最善です。

于 2012-04-19T19:43:37.040 に答える
1

確かに、値で配列を渡す必要はありませんか?代わりに、16バイトに整列された配列へのポインターを渡します。それとも私は何かを誤解しましたか?

于 2012-04-19T18:50:23.850 に答える
1

Xbox360でサポートされている__declspec(passinreg)がありますが、現時点ではVisual StudioforWindowsではサポートされていません。

ここで機能をサポートするリクエストに投票できます:http: //connect.microsoft.com/VisualStudio/feedback/details/381542/supporting-declspec-passinreg-in-windows

エンジンのベクトル引数には、プラットフォームがレジスタの受け渡しをサポートしているかどうかに応じて、VectorParametertypedefを使用します。const Vectorconst Vector&

于 2012-04-20T01:31:19.813 に答える
1

質問は古いですが、VC ++コンパイラの状況はそれほど変わっていないので、おそらく、これらのメモは誰かにとって価値があるでしょう。1)__declspec(align(X))を持つクラスまたは構造体を関数に渡すことができるようにする簡単な修正は、参照によって渡すことです。必要に応じてconstsを使用します。2)ベクトル代数にSIMDを使用する理由は確かにあります。クアット乗算とクアット回転機能をSIMDに切り替えるだけで、エンジンのアニメーションとスキニングパスを20%高速化することができました。アラインメントもアレイもありません。float[4]パラメータを使用した2つの関数。そもそも不十分に書かれておらず、測定可能なFPSの改善をもたらすものについては、これはくしゃみをするものではありません。そして、これらは後で最適化するのが難しい種類のものであるため、ベクトル代数の時期尚早な最適化のようなものは実際にはありません。3)ベクトルをクラスにすると、スタック上の過剰な_mm_store_psおよび_mm_load_ps命令はすべて/O2の下で最適化されます。したがって、SIMDを介して単一の追加を行うことによる利益はごくわずかかもしれませんが、複数の操作を連続して実行する場合がある場合、結果のコードは非常に高速です。

于 2016-02-19T09:52:13.723 に答える