zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
    Data Structure and Algorithm
  • 原文地址:https://www.cnblogs.com/time-flow1024/p/10065899.html
Copyright © 2011-2022 走看看