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维数组并访问具有相邻索引的任何级别的元素时,除了最后一个内存地址实际上彼此相距很远,这会导致大量缓存未命中和显着减速.
请注意,这是很多(大约466 GB,如果我的数学是正确的)数据,并且要注意交换和缓存访问问题.如果你实际上并没有使用500 ^ 4个元素,那么你需要对你的应用程序进行分析,看它确实是"间接",这会让你失去性能.