避免缓存未命中

时间:2014-01-25 16:10:42

标签: c pthreads

给定两个数组,比如A和B,每个数组包含大约10 ^ 7个元素(任何C基类型,但最可能是int,char有4个字节)。 我将把这些数组拆分成更小的部分(取决于CPU中的可用内核)并合并它们。我不得不期待Cache未命中吗?

在我的理解中,如果两个数据块在内存中非常靠近,并且每个内核将这些数据加载到其L1缓存中,则会出现缓存未命中。 例如,假设运行ThreadA的Core1和运行ThreadB的Core2。

然后,线程A对Cache(Core1)中的数据执行写操作,并且CPU必须假设线程B中的缓存数据(Core2)不再相关。所以它必须从RAM重新加载整个Cache,这很慢。

由于我只会从数组A和B中读取,我认为这不会有问题,但我偶然发现了其他一些问题,其中由于读取数据而导致的Cache错误似乎是一个问题。

但即便如此 - 我猜想,缓存未命中率会很低。

例如,假设Zero为数组和|中的数据将由线程处理的块之间的分隔符。

<00> 00000000 0 | 0 0000000 0 | 0 000000 0 | 0 00000000 |

我的猜测是,只有分离器上的小部件会受到影响,但由于我大部分时间都在处理大数据,所以不会那么糟糕。

只有我的目标Array C将从多个线程写入 - 我是否必须在此处预期性能问题?

所以我的问题是:

  • 读取操作期间是否发生缓存不连贯?
  • 如何确定缓存未命中(逻辑除外)
  • 合并似乎并不容易受到Cache未命中的影响,但我的教授告诉我们,我们必须期待这一点 - 我无法理解。

由于我没有找到第一个问题的确切答案,因此阅读本主题的文章并不能让我满意。

编辑:添加了存储元素的大小。

0 个答案:

没有答案