相关疑难解决方法(0)

每个程序员应该了解的内存?

我想知道Ulrich Drepper 从2007年开始对每个程序员应该知道的内容有多少仍然有效.另外,我找不到比1.0更新的版本或勘误表.

optimization x86 memory-management cpu-architecture micro-optimization

145
推荐指数
3
解决办法
2万
查看次数

当前的x86架构是否支持非临时负载(来自"正常"内存)?

我知道关于这个主题的多个问题,但是,我没有看到任何明确的答案或任何基准测量.因此,我创建了一个简单的程序,它使用两个整数数组.第一个数组a非常大(64 MB),第二个数组b很小,适合L1缓存.程序迭代a并将其元素添加到b模块化意义上的相应元素中(当到达结束时b,程序从其开始再次开始).测量的不同大小的L1缓存未命中数b如下:

在此输入图像描述

测量是在具有32 kiB L1数据高速缓存的Xeon E5 2680v3 Haswell型CPU上进行的.因此,在所有情况下,都b适合L1缓存.然而,大约16 kiB的b内存占用量大大增加了未命中数.这可能因为两者的负载预期ab导致缓存线失效从一开始b在这一点上.

绝对没有理由保留a缓存中的元素,它们只使用一次.因此,我运行一个具有非时间负载a数据的程序变体,但未命中数没有改变.我还运行了一个非暂时预取a数据的变体,但仍然有相同的结果.

我的基准代码如下(没有显示非时间预取的变体):

int main(int argc, char* argv[])
{
   uint64_t* a;
   const uint64_t a_bytes = 64 * 1024 * 1024;
   const uint64_t a_count = a_bytes / sizeof(uint64_t);
   posix_memalign((void**)(&a), 64, a_bytes);

   uint64_t* b;
   const uint64_t b_bytes = atol(argv[1]) * 1024;
   const uint64_t b_count = b_bytes …
Run Code Online (Sandbox Code Playgroud)

c c++ x86 caching prefetch

45
推荐指数
2
解决办法
1770
查看次数

非临时负载和硬件预取器,它们一起工作吗?

当从连续的内存位置执行一系列_mm_stream_load_si128()调用(MOVNTDQA)时,硬件预取器是否仍会启动,或者我应该使用显式软件预取(使用NTA提示)以获得预取的好处,同时仍然避免缓存污染?

我问这个的原因是因为他们的目标似乎与我相矛盾.流加载将获取绕过缓存的数据,而预取器尝试主动将数据提取到缓存中.

当顺序迭代一个大型数据结构(处理过的数据不会在很长一段时间内被修饰)时,我有必要避免污染chache层次结构,但我不想因频繁出现频繁的~100次循环处罚-fetcher闲置.

目标架构是Intel SandyBridge

performance x86 sse prefetch cpu-cache

9
推荐指数
3
解决办法
2512
查看次数

对于WB/WC标记的区域,MOVDQA和MOVNTDQA以及VMOVDQA和VMOVNTDQ有什么区别?

通过使用内存标记为WB指令之间的主要区别是什么(回写)和WC(写入合并):什么是之间的不同MOVDQAMOVNTDQA,什么是之间的不同VMOVDQAVMOVNTDQ

是不是对于内存标记为WC - 指令与[NT]通常没有区别(没有[NT]),并且内存标记为WB - 指令[NT]与它一起工作就好像它是一个内存WC?

x86 assembly sse simd avx

6
推荐指数
1
解决办法
2879
查看次数

Write-Combining Buffer位于何处?86

Write-Combine缓冲区是如何物理连接的?我已经看到了说明许多变体的方框图:

  • 在L1和内存控制器之间
  • 在CPU的存储缓冲区和内存控制器之间
  • 在CPU的AGU和/或存储单元之间

它是依赖于微架构的吗?

x86 intel cpu-architecture cpu-cache amd-processor

6
推荐指数
3
解决办法
1406
查看次数

从 x86 CPU 生成 64 字节读取 PCIe TLP

将数据写入 PCIe 设备时,可以使用写入组合映射来提示 CPU 应该向设备生成 64 字节的 TLP。

是否可以为读取做类似的事情?以某种方式提示 CPU 读取整个缓存行或更大的缓冲区,而不是一次读取一个字?

x86 pci-e

4
推荐指数
1
解决办法
1397
查看次数

如何预取不经常使用的代码?

我想将一些代码预取到指令缓存中.代码路径很少使用,但我需要它在指令缓存中,或者至少在L2中用于极少数情况下使用它.我预先通知了这些罕见的情况._mm_prefetch是否适用于代码?有没有办法在缓存中获得这种不经常使用的代码?对于这个问题,我不关心可移植性,所以即使asm会这样做.

c++ prefetch low-latency

3
推荐指数
1
解决办法
3355
查看次数