クエリ応答プログラムを高速化するためにIntel SIMD組み込み関数を使用しようとしています。 query_cnt
が入力に依存するが、常にSIMDレジスタの数よりも少ない(すなわち、それらを保持するのに十分なSIMDレジスタがある)と仮定する。クエリはアプリケーションのホットなデータなので、必要なときに毎回ロードするのではなく、最初にロードして常にレジスタに保持してもよいでしょうか?SIMD組み込み関数を使用するときに入力依存ホットデータをレジスタに保持する方法
クエリがfloat
タイプで、AVX256
がサポートされているとします。私はそれが潜在的なロード/ストアのオーバーヘッドがあるので、良い習慣ではありません知っているが、少なくとも、彼らができるようにvec_queries[i]
を最適化することができ、わずかチャンスがある
std::vector<__m256> vec_queries(query_cnt/8);
for (int i = 0; i < query_cnt/8; ++i) {
vec_queries[i] = _mm256_loadu_ps((float const *)(curr_query_ptr));
curr_query_ptr += 8;
}
:今、私のようなものを使用する必要があります私はまだそれが良い方法ではないと思う。
もっと良いアイデアを教えてください。
何もしないループで複数のクエリを処理していますか?そうでない場合は、次のクエリを取得したときにデータが登録されません。あるいは、クエリにグローバルレジスタ変数を使用する価値があると思っていますか? GNU Cはこれを行うことができます。 '__m256 vec_query0 asm(" ymm0 ");は正しい構文IIRCでなければなりません。 –
ベクトル*がレジスタに保持されていないことを確認するために実際のasmを見ましたか?あなたが運が良ければ、コンパイラはstd :: vectorの動的割り当てオーバーヘッドのほとんどを最適化しているかもしれません。そうでない場合は、固定サイズの配列を使用してみてください(サイズの上限が低いため)。 –
@PeterCordesあなたのアドバイスをありがとう。私は実際のasmを見ていませんでしたが、固定サイズの配列を使うことは良いオプションかもしれないので、すべての配列要素をレジスタに束縛するために '__m256 vec_query0 asm(" ymm0 ")'のようなものを使うことができます私がそうするならば、いくつかのレジスタは常に固定要素によって占有され、パフォーマンス上のペナルティを招くでしょうか? – MarZzz