为什么多线程访问同一缓存行中的数据具有低缓存未命中率?

时间:2010-11-06 05:22:22

标签: caching pthreads

已经注意到,由于乒乓效应,对位于同一缓存行中的数据元素的访问性能很差。   但是,我写的代码没有用valgrind测试--tool = cachegrind没有显示这种行为。会不会对此有何见解?

下面附有每个pthread执行的函数:

   void test_cache(void* arg)    
   {    
    long id = (long) arg;  
    uint32_t idx = (uint32_t) id;  
    uint32_t ctr = 0;  
    uint32_t total_sum = 0;  
    for(; ctr < 500000; ++ctr)  
    {  
      total_sum += shared[idx];  
      AO_fetch_and_add(&shared[idx], idx);    
    }
    printf("%d %d,\n",id, total_sum);   
}  

2 个答案:

答案 0 :(得分:2)

读取是正常的(一旦缓存填满),写入不是,因为这取决于体系结构,将导致所有其他处理器使该缓存行无效并且从内存中获取行。 (执行缓存行侦听的系统可以避免这种惩罚)。

初始缓存行负载也会受到惩罚,因为每个缓存需要加载(共享缓存更好),NUMA中的情况最差(从远程处理器获取)。

答案 1 :(得分:0)

如果您正在使用“双核”运行,那么您正在使用共享缓存。您需要单独的物理CPU才能看到乒乓效应。在问题中包含您的硬件规格。