1

プログラム内の巨大なループを SSE でベクトル化する必要があります。時間を節約するために、ICC に任せることにしました。そのために、アラインメントを考慮してデータを適切に準備し、コンパイラ ディレクティブ #pragma simd#pragma aligned、を使用し#pragma ivdepます。いくつかのオプションを指定してコンパイルすると-vec-report、コンパイラーはループがベクトル化されたことを通知します。コンパイラによって生成されたアセンブリをざっと見てみると、パックされた単精度オペランド (シリアル コード ハンドラの浮動小数点オペランドのすべての演算) で動作するベクトル命令がたくさんあるので、それが確認できるようです。

問題は、PAPI でハードウェア カウンターを取得すると、取得する FP 操作の数 (PAPI_FP_INSおよびPAPI_FP_OPS) が、自動ベクトル化されたコードと元のコードでかなり同じになることです。 . さらに、関係する単純化された問題を手でベクトル化すると、この場合、FP 操作の 3 分の 1 のようなものを得ることができます。

誰かがこれに似たようなことを経験しましたか?

4

1 に答える 1

0

こぼれるとベクトル化の利点が失われる可能性があるため、64 ビット モードは 32 ビット モードよりも大幅に向上する可能性があります。また、icc はループをバージョン管理する場合があり、ベクトル バージョンが存在する場合でも、スカラー バージョンをヒットしている可能性があります。昨年または 2 年に発行された icc バージョンでは、この領域のいくつかの問題が修正されています。

于 2015-05-25T13:58:01.070 に答える