8

私は123MBの大きなintアレイを持っており、基本的に次のように使用されます。

private static int[] data = new int[32487834]; 
static int eval(int[] c)
{
    int p = data[c[0]];
    p = data[p + c[1]];
    p = data[p + c[2]];
    p = data[p + c[3]];
    p = data[p + c[4]];
    p = data[p + c[5]];
    return data[p + c[6]];
}

eval()は多くの場合(約500億回)呼び出されますが、c速度を上げることができるかどうか(およびその方法)を知りたいと思います。

私はすでに、すべてのCPUを使用する固定配列で安全でない関数を使用しています。これは、RayWによるTwoPlusTwo 7カードエバリュエーターのC#ポートです。C++バージョンはわずかに高速です。

GPUを使用してこれを高速化できますか?

4

1 に答える 1

2
  1. 配列参照をローカル変数にキャッシュします。静的フィールドアクセスは、複数の理由で一般にローカルよりも低速です(その1つは、フィールドが変更される可能性があるため、常にリロードする必要があることです。JITはローカルをはるかに自由に最適化できます)。
  2. メソッドの引数として配列を使用しないでください。7つの整数インデックスをハードコーディングします。これにより、配列の割り当て、間接ペナルティ、および境界チェックが削減されます。
  3. 安全でないコードを使用して、配列にインデックスを付けます。これにより、境界チェックが不要になります。を使用しGCHandleて配列を修正し、静的フィールドにポインターをキャッシュします(固定ブロックを使用するだけでなく、入力に関連する特定の(小さな)オーバーヘッドがあると思います。わからない)。
  4. VirtualAllocアレイを修正する代わりに、巨大なページを使用して123MBのアレイを割り当てます。これにより、TLBミスが削減されます。

これらはすべて、ハードコアな低レベルの最適化です。最大のパフォーマンスが必要な場合にのみ適用されます。

この関数の最適化に関しては、ここではほとんど限界に達していると思います。関数の呼び出し元を表示して、単一のユニットとして最適化できるようにした場合にのみ、より良い結果が得られる可能性があります。

于 2012-12-27T14:22:29.483 に答える