如何优化指针间接层

veh*_*zzz 3 c c++ optimization performance gcc

我试图在繁重的计算应用程序中优化这类事情:

说我有

 double d[500][500][500][500];
Run Code Online (Sandbox Code Playgroud)

至少从编译器的角度来看,以下内容非常昂贵

double d[x][y][j][k]
Run Code Online (Sandbox Code Playgroud)

我想告诉编译器它是连续的内存,以方便计算偏移量.

在我的例子中,

我有这样的事情:

double n=0;
for (int i=0; i < someNumber; i++)
{
    n+=d[x][i][j][k] /*(some other math calculations)*/;
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试通过将它放在一个单独的函数中来优化它

void func( double*** const restrict dMatrix )
{
  /* and do some calculations herel*/

}
Run Code Online (Sandbox Code Playgroud)

没多大帮助:(

有关优化的建议吗?

}

编辑

我不能重写代码使数组一维.我必须使用这个多维野兽:(

sha*_*oth 14

我怀疑问题不是偏移计算,而是实际访问内存.当你声明一个4维数组并访问具有相邻索引的任何级别的元素时,除了最后一个内存地址实际上彼此相距很远,这会导致大量缓存未命中和显着减速.

  • 我同意.原始海报应该能够通过比较循环i在d [x] [i] [j] [k]上的性能与循环k的性能来验证这一点.然后阅读http://people.redhat.com/drepper/cpumemory.pdf,了解有关内存和缓存的所有信息. (4认同)

unw*_*ind 5

请注意,这是很多(大约466 GB,如果我的数学是正确的)数据,并且要注意交换和缓存访问问题.如果你实际上并没有使用500 ^ 4个元素,那么你需要对你的应用程序进行分析,看它确实是"间接",这会让你失去性能.

  • 您仍然可以执行d [500] [500] [500] [500]并按自己的方式访问它.没什么区别. (5认同)

Tho*_*ker 5

C编译器当然知道内存何时是连续的.你不必告诉它.