大きな違いを生むためにできることはあまりないと思います。OpenMP や SSE を使用すると、少し高速化できるかもしれません。しかし、最新の CPU はすでにかなり高速です。一部のアプリケーションでは、実際にはメモリ帯域幅/レイテンシがボトルネックであり、さらに悪化します。すでに 3 レベルのキャッシュがあり、大幅な遅延を回避するためにスマートなプリフェッチ アルゴリズムが必要です。そのため、メモリ アクセス パターンについても考えるのが理にかなっています。たとえば、そのような amultiply
および anを実装し、次のadd
ように使用する場合:
void multiply(float vec[], float factor, int size)
{
for (int i=0; i<size; ++i)
vec[i] *= factor;
}
void add(float vec[], float summand, int size)
{
for (int i=0; i<size; ++i)
vec[i] += summand;
}
void foo(float vec[], int size)
{
multiply(vec,2.f,size);
add(vec,9.f,size);
}
基本的に、メモリのブロックを 2 回渡しています。ベクターのサイズによっては、L1 キャッシュに収まらない場合があります。この場合、ベクターを 2 回渡すと余分な時間が追加されます。これは明らかに悪いことであり、メモリアクセスを「ローカル」に保つようにしてください。この場合、単一のループ
void foo(float vec[], int size)
{
for (int i=0; i<size; ++i) {
vec[i] = vec[i]*2+9;
}
}
より速くなる可能性があります。経験則として、メモリに線形にアクセスし、「ローカルに」メモリにアクセスしてみてください。つまり、L1 キャッシュに既にあるデータを再利用してみてください。ただのアイデア。