已经注意到,由于乒乓效应,对位于同一缓存行中的数据元素的访问性能很差。 但是,我写的代码没有用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);
}
答案 0 :(得分:2)
读取是正常的(一旦缓存填满),写入不是,因为这取决于体系结构,将导致所有其他处理器使该缓存行无效并且从内存中获取行。 (执行缓存行侦听的系统可以避免这种惩罚)。
初始缓存行负载也会受到惩罚,因为每个缓存需要加载(共享缓存更好),NUMA中的情况最差(从远程处理器获取)。
答案 1 :(得分:0)
如果您正在使用“双核”运行,那么您正在使用共享缓存。您需要单独的物理CPU才能看到乒乓效应。在问题中包含您的硬件规格。