プログラム内の巨大なループを SSE でベクトル化する必要があります。時間を節約するために、ICC に任せることにしました。そのために、アラインメントを考慮してデータを適切に準備し、コンパイラ ディレクティブ #pragma simd
、#pragma aligned
、を使用し#pragma ivdep
ます。いくつかのオプションを指定してコンパイルすると-vec-report
、コンパイラーはループがベクトル化されたことを通知します。コンパイラによって生成されたアセンブリをざっと見てみると、パックされた単精度オペランド (シリアル コード ハンドラの浮動小数点オペランドのすべての演算) で動作するベクトル命令がたくさんあるので、それが確認できるようです。
問題は、PAPI でハードウェア カウンターを取得すると、取得する FP 操作の数 (PAPI_FP_INS
およびPAPI_FP_OPS
) が、自動ベクトル化されたコードと元のコードでかなり同じになることです。 . さらに、関係する単純化された問題を手でベクトル化すると、この場合、FP 操作の 3 分の 1 のようなものを得ることができます。
誰かがこれに似たようなことを経験しましたか?