百科问答小站 logo
百科问答小站 font logo



为什么读取连续内存没有比不连续的效率更高? 第1页

  

user avatar   sun-ruo-xi 网友的相关建议: 
      

所谓连续内存访问比随机访问更快,指的是locality更好,具体就是指cache hit rate更高。但如果要观测这个现象,题主的代码并不合适。问题在于题主的两个Test函数中都只访问了两个int的地址,远远小于cache容量,不管他们离的多远都会落在cache内,唯一的区别是,Test1中,两个变量分别分配在buffer首尾,相距较远,更有可能被分配在两个cache line中(具体取决于cache映射算法),而Test2中,两个变量相邻,更有可能会被分配在一个cache line中(具体取决于cache line大小),这个差别是几乎可以忽略不计的。

更可行并且更简单的方法是,开一个大数组访问每个元素,分别用连续和随机两种方式。下面代码假设cache line大小是64 byte:

       void test1() {     size_t size = 64 * 1024 * 1024 / sizeof(int);     int * buf = new int[size];     int count = 0;     std::chrono::high_resolution_clock::time_point startTime = std::chrono::high_resolution_clock::now();     for (size_t i = 0; i < size; i++)     {         count += buf[i] * buf[i] % (buf[i] + 100);     }     std::chrono::high_resolution_clock::time_point endTime = std::chrono::high_resolution_clock::now();  std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count() << "ms" << std::endl; }  void test2() {     size_t size = 64 * 1024 * 1024 / sizeof(int);     int * buf = new int[size];     size_t numElemsPerCacheLine = 64 / sizeof(int);     size_t numCacheLines = size / numElemsPerCacheLine;     int count = 0;     std::chrono::high_resolution_clock::time_point startTime = std::chrono::high_resolution_clock::now();     for (size_t i = 0; i < size; i++)     {         count += buf[i * numElemsPerCacheLine % numCacheLines + i % numCacheLines];     }     std::chrono::high_resolution_clock::time_point endTime = std::chrono::high_resolution_clock::now();     std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime).count() << "ms" << std::endl; }     

其中test1是连续访问(从头到尾),test2是随机访问(连续的两次访问跳一个cache line,到最后一个cache line时跳回第一个cache line);因test2中计算地址时多了一个乘法,一个取模,一个加法,所以test1中用buf[i]的多次计算补平。




  

相关话题

  x86架构CPU的超线程技术是否会长期保持逻辑处理器数量为物理核心两倍的现状?未来可能会怎样发展? 
  CPU至强E3和酷睿i7哪个好?帮忙分析一下? 
  C++在面向对象编程中,非虚继承和非虚析构函数的存在是为了解决什么问题? 能否都用虚继承和虚析构函数? 
  为什么 ARM 和 MIPS 那么多寄存器,x86 那么少? 
  如何看待上海交大建成全国最强超算,碾压哈佛、剑桥等名校? 
  C/C++ 数组的下标为何要从 0 开始,而不从 1 开始? 
  办公用电脑CPU为什么几乎被Intel垄断? 
  本科阶段能在FPGA上做一个CPU并运行自己写的操作系统算什么水平? 
  代码全是调包的,怎么申请专利? 
  为什么没有主板把显卡接口设在CPU的右上方? 

前一个讨论
如果把电脑主机的两个 USB 接口用一根数据线连起来,会发生什么?
下一个讨论
从黑客提取内核root权限的难度来说,微内核OS是否会相对于宏内核OS更安全?





© 2025-03-28 - tinynew.org. All Rights Reserved.
© 2025-03-28 - tinynew.org. 保留所有权利