2016-05-18 8 views
0

私は、簡単なコードの行(8倍の形で64バイト - 正確にone i7 cache line)を持つk個のforループでネストされているI forループでは:私の周りintell intrinsics manualはまだ失われているように見える見てresult [i] + = A [k] * sin(B [k] * C [i] + D [k])の組み込み命令がありますか?

result[i] += A[k] * sin(B[k] * C[i] + D[k]) 

:どのようにそのような関数を問い合わせる?

+0

4パラメータ演算「a * sin(b * c + d)」に固有のものはほとんどありません。これは、CPUが専用の命令を持つ可能性が高い基本的な操作ではありません。 –

答えて

1

内部ループには、iまたはkがありますか? kがすべてiに対して一定であると仮定すると、でA[k]を全ベクトルにブロードキャストし、他の配列[k]オペランドについても同じです。


レイモンドは言うとおり、これは単一の命令で複雑になる方法です。 sin()でもハードウェアでは実装されていません(スカラーのx87バージョンを除く)。インテルの本質的なガイドは、Intel's SVML providesのみで、gcc/clangの一部ではない<immintrin.h>のインテルライブラリ関数をいくつか挙げています。

B[k] * C[i] + D[k]ため

使用an FMA (_mm256_fmadd_pd)、あなたがものを見つけることができれば、ベクトル化sin()関数にその結果を渡します。

この結果はresult[i] += A[k] * ...の別のFMAになります。

もちろん、AVXで2つの32Bベクトルが必要です。

AVX512は64Bベクトルですが、現在はXeon Phiアクセラレータカードでのみ使用できます。

+0

あなたは正しいです私は内側ループです – DuckQueen

+0

ありがとうございました! BTWは 'result [i] + = A [k] * ...'組み込み関数を(少なくとも32Bのために)リンクできますか? – DuckQueen

+0

@DuckQueen:パックド・ダブルFMAには1つの組み込み関数しかないので、リンクすることはありません。 Cコンパイラは 'VFMADD132PD' /' VFMADD231PD'の中から選択します。製品を否定するために 'fmsub_pd'組み込み関数と' '_mm256_fnmadd_pd' '(http://www.felixcloutier.com/x86/VFNMADD132PD:VFNMADD213PD:VFNMADD231PD.html)もあります(例えば' d-b * c')。すべての操作が追加されるので、sin()の内側と外側の同じFMAが必要です。 –

関連する問題