アプリケーションのホットスポットである以下のスニペットがあります。ベクトル依存のため、for
ループはベクトル化されません。このループを書き直して高速に実行する方法はありますか。
#define NUM_KEYS (1L << 20)
#define NUM_BUCKETS (1L << 10)
int i,k;
int shift = (1L << 11);
int key_array[NUM_KEYS],key_buff[NUM_KEYS];
int bucket_ptrs[NUM_BUCKETS];
for( i=0; i<NUM_KEYS; i++ )
{
k = key_array[i];
key_buff[bucket_ptrs[k >> shift]++] = k;
}
私が試した 1 つのアプローチは、 のシフトされた値を保持する一時配列を作成することでしたkey_array
。
for( i=0; i<NUM_KEYS; i++ )
{
key_arrays[i] = key_array[i] >> shift;
}
for( i=0; i<NUM_KEYS; i++ )
{
k = key_array[i];
j = key_arrays[i];
key_buff[bucket_ptrs[j]++] = k;
}
ここでは、最初のループがベクトル化されます。しかし、全体としてパフォーマンスの向上は見られません。