ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Win32核心编程 读书笔记三 高速缓存行

Win32核心编程 读书笔记三 高速缓存行 是做一个整天If else的码农还是做一个real coder区别就在于后者掌握更多的基础原理和细节实现能力。高速缓存行的使用优化是正对多CPU而言的但是如今还有什么东西不是多CPU了呢。当一个C P U从内存读取一个字节时它不只是取出一个字节它要取出足够的字节来填入高速缓存行。高速缓存行由3 2或6 4个字节组成视C P U而定并且始终在第3 2个字节或第6 4个字节的边界上对齐。高速缓存行的作用是为了提高C P U运行的性能。通常情况下应用程序只能对一组相邻的字节进行处理。如果这些字节在高速缓存中那么C P U就不必访问内存总线而访问内存总线需要多得多的时间。注很显然CPU从内存取数据是一个物理行为取的字数不受软件控制的。注所以我们最好把同一时间需要读写的数据放在同一个缓存行中避免频繁的更新高速缓存行在多CPU系统中数据的同步也是个问题。如果一个数据每个CPU的高速缓存都存有该数据的副本如果一个CPU改变了该值那么就会出现一个问题其他的CPU哪怕没有用该数据也要重新读取缓存行。所以我们要尽量避免不相关的数据在一起。原书中的例子现场好的描述了这个问题我在稍加注释贴出来糟糕的代码方式 我们大部分新手都是这么写的吧哈哈struct CUSTINFO { DWORD dwCustomerID; //Mostly read-only int nBalanceDue; //Read-write char szName[100]; //Mostly read-only FILETIME ftLastOrderDate; //Read-write };上面只读的数据和读写的数据交错排序。上文说了不相关的数据不放一起只读的数据和读写数据也不放在一起为了一个读写数据的改变而频繁的读取只读数据是不划算的。优秀的代码#ifdef _X86_ #define CACHE_ALIGN 32 #endif #ifdef _ALPHA_ #define CACHE_ALIGN 64 #endif #ifdef _IA64_ #define CACHE_ALIGN ?? #endif #define CACHE_PAD(Name, BytesSoFar) \ BYTE Name[CACHE_ALIGN - ((BytesSoFar) % CACHE_ALIGN)] struct CUSTINFO { DWORD dwCustomerID; // Mostly read-only char szName[100]; // Mostly read-only //Force the following members to be in a different cache line. CACHE_PAD(bPad1, sizeof(DWORD) 100); int nBalanceDue; // Read-write FILETIME ftLastOrderDate; // Read-write //Force the following structure to be in a different cache line. CACHE_PAD(bPad2, sizeof(int) sizeof(FILETIME)); };CACHE_PAD的作用就是填充高速缓存行让不相关的数据存在下一个高速缓存中。所以如果我们编码多注意这些细节代码的质量就会更高谢谢你的阅读
返回列表