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()被调用了很多(〜50B次)不同的c,我想知道我是否(以及如何)可以加快速度。

我已经使用了一个不安全的函数和一个使用所有 CPU的固定数组。它是 RayW 的TwoPlusTwo 7 卡评估器的 C# 端口。C++ 版本的速度要快得多。

GPU可以用来加速吗?

4

1 回答 1

2
  1. 将数组引用缓存到局部变量中。由于多种原因,静态字段访问通常比本地访问慢(其中一个原因是该字段可以更改,因此必须一直重新加载它。JIT 可以更自由地优化本地)。
  2. 不要使用数组作为方法的参数。硬编码 7 个整数索引。这减少了数组分配、间接惩罚和边界检查。
  3. 使用不安全的代码来索引数组。这将消除边界检查。使用 aGCHandle来修复数组并将指针缓存在静态字段中(不要只使用固定块 - 我相信它与输入它有一定的(小)开销。不确定)。
  4. 作为固定阵列的替代方法,使用VirtualAlloc和使用大页面分配 123MB 阵列。这减少了 TLB 失误。

所有这些都是硬核低级优化。它们仅适用于您需要最高性能的情况。

我认为在优化此功能方面我们几乎处于极限。如果您显示函数的调用者,我们可能只能做得更好,以便它们可以作为一个单元进行优化。

于 2012-12-27T14:22:29.483 回答