C++ 英特尔CPU上的高速缓存对齐内存分配

C++ 英特尔CPU上的高速缓存对齐内存分配,c++,c,performance,memory,cpu-cache,C++,C,Performance,Memory,Cpu Cache,最近我遇到了“英特尔TBB可扩展分配器”的问题。基本使用模式如下所示: 分配了几个大小为N*sizeof(double)的向量 生成一个随机整数M,这样M>=N/2&&M你会被击中。 当您从1016转到1017时发生这种情况的原因是,您将开始使用关联列表中的最后一条缓存线 您的缓存为32K 8路,因此每个缓存集为4K。64字节的缓存线可以容纳8个双字节。 但是你的1017-1024向量使用8K而不是4K???1024*sizeof(double),您可以使用N/2->N,这样您就可以为每个向量使

最近我遇到了“英特尔TBB可扩展分配器”的问题。基本使用模式如下所示:

  • 分配了几个大小为
    N*sizeof(double)
    的向量
  • 生成一个随机整数
    M
    ,这样
    M>=N/2&&M你会被击中。
    当您从1016转到1017时发生这种情况的原因是,您将开始使用关联列表中的最后一条缓存线

    您的缓存为32K 8路,因此每个缓存集为4K。64字节的缓存线可以容纳8个双字节。 但是你的1017-1024向量使用8K而不是4K???1024*sizeof(double),您可以使用N/2->N,这样您就可以为每个向量使用(除非正好是N/2)一些相同的低位地址位组合两次

    在使用所有一级缓存之前,您不会遇到冲突命中的问题,而您的一级缓存现在已接近完成。使用1个向量进行读取,2个向量进行写入,所有向量长度均为8K,因此使用24K,如果您在计算过程中使用8K+的额外数据,您将有越来越多的机会逐出所选数据

    请注意,您只使用向量的第一部分,但它们之间的冲突永远不会减少

    当从1016转到1017时,您将能够观察到一级缓存未命中的增加。当超过1024倍时,性能损失将在短时间内消失,直到达到一级缓存容量未命中

    <此处的图像显示使用全部8组时的峰值>

    摘自乌尔里希·德雷珀(Ulrich Drepper)的精彩文章:

    谢谢您的详细解释。这就是我所知道的,尽管解释得更清楚。但是,有没有一种方法可以避免这种冲突而不增加分配的内存大小?我的印象是,通过63字节的边界对齐就足以避免在大多数情况下两个向量共享同一缓存线。相反,我发现图形和链接需要128字节的对齐方式。我会先读一读。对齐并不重要,因为这里的问题是集合AssociationNes,这意味着向量使用的总内存。谢谢。如果我理解正确的话,128字节对齐似乎使事情变得更好的原因仅仅是它导致了一些填充,从而使分配的内存变大。128字节对齐是两条缓存线,在某些情况下,它使它变得更好,因为在缓存体系结构中的“某处”提取了两条缓存线,而不是一条缓存线。但在这种特殊情况下,利益被冲突失误所压倒。
    Vendor    GenuineIntel
    Brand     Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz
    
    ====================================================================================================
    Deterministic Cache Parameters (EAX = 0x04, ECX = 0x00)
    ----------------------------------------------------------------------------------------------------
    Cache level                             1           1           2           3           4           
    Cache type                              Data        Instruction Unified     Unified     Unified     
    Cache size (byte)                       32K         32K         256K        6M          128M        
    Maximum Proc sharing                    2           2           2           16          16          
    Maximum Proc physical                   8           8           8           8           8           
    Coherency line size (byte)              64          64          64          64          64          
    Physical line partitions                1           1           1           1           16          
    Ways of associative                     8           8           8           12          16          
    Number of sets                          64          64          512         8192        8192        
    Self initializing                       Yes         Yes         Yes         Yes         Yes         
    Fully associative                       No          No          No          No          No          
    Write-back invalidate                   No          No          No          No          No          
    Cache inclusiveness                     No          No          No          Yes         No          
    Complex cache indexing                  No          No          No          Yes         Yes         
    ----------------------------------------------------------------------------------------------------