for循环提高内存访问效率的做法

今天写程序的时候突然想到一点,记录一下:

计算机内存地址是线性排列组织的,而利用for循环对高维数组结构进行遍历处理的时候,要保证最内层for循环遍历的是高维数组的最低维度,这样可以最大化利用CPU的cache,举个例子:

假设有一个二维图像P(x,y),x为行数,0<=x<=M-1,y为列数,0<=y<=N-1。

若想遍历图像内所有的像素,写程序的时候,有以下两种嵌套for:

1 for(x=0;x<M;x++){
2     for(y=0;y<N;y++){
3         // ... 
4     }
5 }

1 for(y=0;y<N;y++){
2     for(x=0;x<M;x++){
3         // ... 
4     }
5 }

这两种实现方法都能遍历图像内像素,但是第一种效率比第二种高。

因为数据的逻辑形式虽然是高维的,但是存储在内存里的时候却仍是以一维线性的方式存储的,这就造成了高维数据在内存中进行表示的时候,最低维的数据在内存中被连续存储,而除最低维以外的其它所有维度在内存上是不连续的(对于上述例子,P(3,4)与P(3,5)在内存中是连续的,而P(3,4)和P(2,4)在内存中就不是连续的),访问不连续内存对于CPU的cache来说很不友好,会造成较大的内存访问延迟,虽然这个问题可能会被聪明的编译器查到并在编译时刻优化为cache-friendly的代码,但是保不齐有些编译器没有这种优化,所以在写程序的时候还是注意一下这一点。在访问体素块的时候最好也要先确定一下数据逻辑形式的最低维度,然后再写for。

猜你喜欢

转载自www.cnblogs.com/time-flow1024/p/10065899.html