what every programmer should know about memory

这篇文章还是很深的,很多看不懂,可能要以后回头再看了。这里摘几个简单一点的。


1. 指令预取

根据这篇文章描述,现代cpu架构中,最重要的是指令预取和缓存的使用。

如果cpu在读取连续地址的数据时,能很好的利用指令预取。有一个矩阵乘法的例子。

最初的代码是:

for (i = 0; i < N; ++i)
    for (j = 0; j < N; ++j)
        for (k = 0; k < N; ++k)
            res[i][j] += mul1[i][k] * mul2[k][j];

这里mul2的地址不是顺序读取的。因此做一下修改:

double tmp[N][N];
for (i = 0; i < N; ++i)
    for (j = 0; j < N; ++j)
         tmp[i][j] = mul2[j][i];
for (i = 0; i < N; ++i)
    for (j = 0; j < N; ++j)
         for (k = 0; k < N; ++k)
            res[i][j] += mul1[i][k] * tmp[j][k];

这段代码比上面的多了部分拷贝,但比上面的代码快75%!


2.CPU缓存

缓存是另外一个重要的优化手段。现代的内存有两种内存,静态内存和动态内存,静态内存可以做到速度接近cpu但价格昂贵,不能做得很大。所以一般是用静态内存作为cpu cache。最小并且最快的是L1 cache, 然后是L2, L3。一般从内存读取到cpu都会先到cache中找,找不到再从下一级cache甚至内存去找。读取在cache中找不到称为cache miss。

cache line是cache的基本单位,读取时都是以这个为单位读取的,在linux上可以用sysconf (_SC_LEVEL1_DCACHE_LINESIZE)来获得。

因此对于一个大的结构,建议是让意义练习紧密的部分放在一起,这样一个字段读取进去之后相邻的字段往往也在cache里面了。

其它建议是:最重要的字段放在开头,尽量让字段读取按照结构成员的顺序来(可能是为了指令预取)。


除了数据,指令也可以被缓存。可执行程序越小越容易使用缓存。


3.多线程优化

3.1 并发优化

在加载的时候尽量不要让各个数据结构使用单独的cache line, 如果一个数据结构大小不足以填满一个cache line,可以使用padding来填满。

比如定义一个结构

struct data

{

     int bar;

     int offset;

};

可以定义一个cachedata来把data包起来:

template<class T>

struct cachedata

{

    T value;

     char padding[CLSIZE- sizeof(T)];

};

这里CLSIZE是L1 cache line的大小,可以在程序中用define指定。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OCDEMON是一种闪存编程器,用于编程和烧录Flash存储器。它提供了一个简单且高效的方式来编程各种类型的闪存芯片,包括NOR闪存和NAND闪存。OCDEMON具有以下几个关键特点: 首先,OCDEMON具有广泛的兼容性。它可以与各种类型的闪存芯片一起使用,并支持多种编程和烧录方法。这使得它适用于各种应用场景,包括电子产品制造、物联网设备、嵌入式系统等。 其次,OCDEMON具有高速的编程能力。它采用先进的编程算法和技术,可实现快速且可靠的编程过程。不仅可以提高生产效率,还可以减少烧录错误的可能性。这对于大规模生产和高质量要求的项目非常重要。 此外,OCDEMON还提供了友好的用户界面和易于操作的软件。它具有直观的操作界面和清晰的操作步骤,使得即使对于初学者来说也能轻松使用。同时,它还支持批量编程和批量烧录,进一步提高了效率。 最后,OCDEMON还具有可靠性和稳定性。它采用优质的硬件和固件设计,确保编程和烧录的稳定性和准确性。不论是在研发阶段还是在生产过程中,都能保证数据的可靠性和一致性。 总而言之,OCDEMON是一款可靠、高效的闪存编程器,适用于各种应用场景和需求。它的广泛兼容性、高速编程能力、友好的用户界面和可靠的稳定性使得它成为编程闪存的理想选择。无论是在大规模生产中还是在个人制作中,OCDEMON都能帮助用户完成闪存编程任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值