- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Agner Fog 的优秀 microarchitecture.pdf (section 9.14)我读到:
Store forwarding works in the following cases: [...] When a write of 128 or 256 bits is followed by a read of the same size and the same address, aligned by 16.
另一方面,Intel的架构优化引用手册(2.2.5.2 Intel Sandy Bridge,L1 DCache)我看过
Stores cannot forward to loads in the following cases: [...] Any load that crosses a 16-byte boundary of a 32-byte store.
任何负载听起来也像 32 字节负载。我编写了以下简单代码来对此进行测试,似乎 32 字节存储未转发到 Sandy Bridge 架构上的后续 32 字节负载.这是代码:
#include <stdlib.h>
#include <malloc.h>
int main(){
long i;
// aligned memory address
double *tempa = (double*)memalign(4096, sizeof(double)*4);
for(i=0; i<4; i++) tempa[i] = 1.0;
for(i=0; i<1000000000; i++){ // 1e9 iterations
#ifdef TEST_AVX
__asm__("vmovapd %%ymm12, (%0)\n\t"
"vmovapd (%0), %%ymm12\n\t"
:
:"r"(tempa));
#else
__asm__("movapd %%xmm12, (%0)\n\t"
"movapd (%0), %%xmm12\n\t"
:
:"r"(tempa));
#endif
}
}
循环中唯一完成的事情是从/写入 4k 对齐的内存位置和 vector 寄存器。当使用 AVX 指令集 (gcc -O3 -DTEST_AVX
) 编译时,在我的 2.7GHz i7-2620M 上执行时间为 3.1s。使用SSE2指令集时,时间为2.5s。我看过性能计数器。在 AVX 案例中,我每次迭代计算一个存储转发 block 事件(计数器 03H 02H LD_BLOCKS.STORE_FORWARD
)。对于 SSE2 情况,计数器读数为 0。
任何人都可以阐明这一点吗? SB 确实不支持将 32 字节存储转发到 32 字节加载吗?如果是后者,溢出 ymm
寄存器似乎是一件相当昂贵的事情..
最佳答案
毕竟在 Sandy Bridge 上似乎没有 32 字节加载的存储到加载阻塞。考虑以下修改后的循环体:
#ifdef TEST_AVX
__asm__("vmovapd %%ymm12, (%0)\n\t"
"vmovapd (%0), %%ymm13\n\t"
:
:"r"(tempa));
#else
__asm__("movapd %%xmm12, (%0)\n\t"
"movapd (%0), %%xmm13\n\t"
:
:"r"(tempa));
#endif
变化是目标寄存器——我现在使用两个不同的寄存器来加载和存储,这样两条指令和后续迭代之间就没有依赖关系了。在这种情况下,SSE 版本每次迭代需要 1 个周期,而 AVX 版本需要 2 个周期。这与 SB 具有每个周期两个 16 字节加载的容量这一事实是一致的。因此,加载 32 字节需要两个周期 - 没有停顿。
问题一定与计数器逻辑有关。显然,在 AVX 情况下,LD_BLOCKS.STORE_FORWARD
递增,尽管没有发生阻塞。在使用计数器分析性能时应考虑到这一点。
关于c - Sandy Bridge 上的 32 字节存储转发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22146956/
我想计算我的代码的计算强度,但它适用于整数,而不是 float 。我考虑过使用 PAPI 计算操作次数,但硬件不提供整数操作计数器。我该怎么做? 最佳答案 如果您指定 --detailed-count
我正试图找到合适的原始性能事件描述符来监控 Intel Xeon E5-2600 (Sandy Bridge) 上的 QPI 流量(带宽)。 我发现了一个看似相关的事件 here (qpi_data_
我用汇编写了一个算术整数库。我想估计与我的处理器(Intel Sandy Bridge)的峰值性能相比的性能。 由于整数运算是由 Sandy Bridge 的 3 个 ALU 执行的,“3 *(核心数
我能够把关于 Sandy Bridge-E 架构的一些东西放在一起,但我并不完全确定所有的参数,例如L2 缓存的大小。任何人都可以确认他们都是正确的吗?我的主要来源是 64-ia-32-archite
我编写了以下 Java 测试 public class NegativeTest { /** * @param args */ public static void main(String[] a
我想知道是否有办法利用在英特尔沙桥 CPU 中发现的新的基于硬件的真数生成器?我读到英特尔的 MKL(数学内核库)公开了此功能,但这需要 MKL 套件和英特尔编译器,最终非常昂贵。 有没有其他方法可以
我的问题不是关于 GPGPU。我对 GPGPU 的理解相当不错,但这不是我想要的。据推测,英特尔的 Sand Bridge 具有一些允许您直接在 GPU 上执行计算的功能。 这是真的吗? 我计划编写的
在 Agner Fog 的优秀 microarchitecture.pdf (section 9.14)我读到: Store forwarding works in the following cas
我正在阅读 Sandi Metz 的 POODR,并且遇到了一个我不太了解的编码原则。这是代码: class Bicycle attr_reader :size, :chain, :tire_siz
我正在运行 Core i7 3930k,它属于 Sandy Bridge 微架构。 执行以下代码(在MSVC19、VS2015下编译)时,结果让我很惊讶(见评论): int wmain(int arg
我注意到 Clang 为以下代码段做了一个有趣的除法优化技巧 int64_t s2(int64_t a, int64_t b) { return a/b; } 如果指定 march,则以下是程
我试图强制我的应用程序使用主 GPU。现在它会自动占用 CPU 上的一个。我在 DirectX9 和 OpenGL 上都试过了。 当我调用 GetAdapterCount() 函数时,DirectX
请不要说这是过早的微优化。鉴于我有限的知识,我想尽可能多地了解所描述的 SB 功能和程序集的工作原理,并确保我的代码使用此架构功能。感谢您的理解。 几天前我开始学习内在函数,所以答案对某些人来说似乎很
这个问题在这里已经有了答案: Count each bit-position separately over many 64-bit bitmasks, with AVX but not AVX2 (
第一次在这里发帖。 我想知道是否有类似于其他处理器(Intel i7)的运行平均功率限制的东西,这些处理器不是 Sandy Bridge 或 Xeon 处理器,因为我在实验室工作的机器。 对于那些不知
我正在尝试弄清楚如何正确设置 -march 选项,以了解在使用 gcc 4.7.2 的电脑上启用和禁用该选项之间会出现多少性能差异。 在尝试编译之前,我试图找到最适合我的电脑的 -march 选项。我
wiki 网页( https://en.wikipedia.org/wiki/Sandy_Bridge )提到,对于 4KB、2MB 和 1GB 的页面,Data TLB 分别有 64、32 和 4
在第 153 页,她区分了 is-a 和 behaves-like 的区别。继承对应于is-a,而模块对应于behaves-like。但真正的区别是什么?这两种技术都依赖于通过自动消息委托(deleg
是否有任何方法可以确定或任何资源可以找到 Haswell、Sandy Bridge、Ivy Bridge 和 Skylake Intel 处理器的分支目标缓冲区大小? 最佳答案 检查 Agner Fo
在英特尔 intrinsics webapp ,从桑迪布里奇到哈斯韦尔,一些操作似乎已经恶化。例如,像 _mm256_insertf128_si256 这样的许多插入操作显示的成本表如下所示:
我是一名优秀的程序员,十分优秀!