高度に並列化された三角関数(1024程度のブロック)を計算することを検討しており、現代建築が持つ並列処理の少なくとも一部を利用したいと思います。
ブロックをコンパイルするとき
for(int i=0; i<SIZE; i++) {
arr[i]=sin((float)i/1024);
}
GCCはそれをベクトル化せず、
not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38);
それは私には理にかなっています。ただし、並列三角関数の計算を行うためのライブラリがあるかどうか疑問に思っています。
11次の単純なテイラー級数で、GCCはすべてのループをベクトル化し、単純なsinループの2倍以上の速度を取得しています(ビット正確な回答、または9次のシリーズでは、1ビットのみ) 1600の値のうち最後の2つはオフ、3倍以上のスピードアップ)。誰かが以前にこのような問題に遭遇したことは確かですが、私がグーグルで検索したところ、ライブラリなどについての言及は見つかりませんでした。
A.すでに何か存在していますか?
B.そうでない場合、並列三角関数を最適化するためのアドバイスはありますか?
編集:「SLEEF」と呼ばれる次のライブラリを見つけました:http ://shibatch.sourceforge.net/このペーパー で説明されており、SIMD命令を使用していくつかの初等関数を計算します。SSEとAVX固有のコードを使用していますが、標準のCループに変換するのは難しいとは思いません。