- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
因此,我们的任务是编译一些代码(我们应该将其视为黑盒),使用不同的英特尔编译器优化标志(-O1 和 -O3)以及矢量化标志(- xhost 和 -no-vec) 并观察以下方面的变化:
执行这些优化后,我们注意到执行时间有所缩短,这是意料之中的事情,考虑到编译器为提高效率而对您的代码所做的所有更改。然而,我们也注意到 FPO 的数量有所下降,虽然我们知道这是一件好事,但我们不确定为什么会这样。此外,我们注意到(并且无法解释)L2 缓存未命中率增加(随着优化级别的增加而增加),但缓存访问没有显着增加,L3 级别几乎没有变化。
完全不使用矢量化或优化在 L2 缓存未命中率方面产生了最佳结果,我们想知道你们是否可以给我们一些见解,以及我们可以使用的支持文档、文献和资源加深我们对这个主题的了解。
谢谢。
编辑:使用的编译器选项是:
更新:
虽然总体 L2 缓存访问略有下降,但实际未命中率却大幅增加。
使用 -0O -no-vec
以 usecs 为单位的挂钟时间:13,957,075
使用-xhost
以 usecs 为单位的挂钟时间:4,465,243
最佳答案
EOF 的回答对较少的浮点操作有很好的解释:-ffast-math
操作组合,所以我只回答另一部分。
这个问题没有关于使用什么 CPU 微架构的信息,但至少它被标记为 intel .
在 Intel CPU 上,有一些逻辑可以预取到 L1,还有更复杂的逻辑可以预取到 L2(从 L3 或主内存)。每个内核都有自己的 L2,但缓存层次结构的较低级别是共享的,因此它是放置主要预取逻辑的明显位置。
如果您的读取速度低于内存带宽的限制,您的负载将在 L2 中命中,因为硬件预取器已经将这些行提取到 L2 中。 如果预取跟不上,您将导致 L2 缓存未命中。
更少的更宽负载而不是更多的标量负载也意味着 vector 的未命中百分比会更糟。 (EOF 的回答已经说明了这一点)。这种影响并不能解释 L2 未命中绝对数量的增加,但只有(部分)未命中百分比发生变化。不过,在查看数据时仍需牢记这一点。
来自 Intel 的优化指南(x86 标签 wiki 中的链接),第 2.3.5.4 节:数据预取:
Data Prefetch to the L2 and Last Level Cache
Streamer: This prefetcher monitors read requests from the L1 cache for ascending and descending sequences of addresses.... When a forward or backward stream of requests is detected, the anticipated cache lines are prefetched. Prefetched cache lines must be in the same 4K page.
- The streamer may issue two prefetch requests on every L2 lookup. The streamer can run up to 20 lines ahead of the load request.
- Adjusts dynamically to the number of outstanding requests per core. If there are not many outstanding requests, the streamer prefetches further ahead. If there are many outstanding requests it prefetches to the LLC only and less far ahead.
- When cache lines are far ahead, it prefetches to the last level cache only and not to the L2. This method avoids replacement of useful cache lines in the L2 cache.
- Detects and maintains up to 32 streams of data accesses. For each 4K byte page, you can maintain one forward and one backward stream can be maintained.
这是来自 Sandybridge 部分,但 Haswell 和 Skylake 部分没有详细介绍预取的更改。他们说“改进的预取”,但大概是相同的基本设计,只是具有更好的启发式算法和/或对现有启发式算法进行更好的调整,诸如此类。
感谢@HansPassant:他对这个问题的评论让我想到预取跟不上。
关于编译器优化对使用 PAPI 的 FLOP 和 L2/L3 缓存未命中率的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638572/
我来自这个线程:FLOPS Intel core and testing it with C (innerproduct) 当我开始编写简单的测试脚本时,我想到了几个问题。 为什么是 float ?我
我如何测量 FLOPS或 IOPS ?如果我测量普通浮点加法/乘法的时间,它是否等同于 FLOPS? 最佳答案 FLOPS 是每秒的浮点运算。要测量 FLOPS,您首先需要执行此类操作的代码。如果你有
我的系统: 系统规范:Intel core2duo E4500 3700g内存二级缓存2M x64 fedora 17 我如何测量 flops/mflops 好吧,我使用 papi 库(读取硬件性能计
我正在对一个 GPU(无法透露是哪个)进行建模以估计 OpenCL 和 OpenGL 应用程序的性能,该模型可以合理地估计正在执行的应用程序/内核/代码的 FLOPS 有没有办法从FLOPS,还是对帧
我想知道 Tensorflow 卷积层中浮点运算的数量。 当我等待这个功能在 TF 2.x 上发布时,我在 TF 1.x 上进行了尝试,结果我不明白它是如何计算的,其中之一非常糟糕令人印象深刻(检查第
为了测量 CPU 的峰值 FLOPS 性能,我编写了一个小的 C++ 程序。但是测量结果给我的结果比我的 CPU 的理论峰值 FLOPS 大。怎么了? 这是我写的代码: #include #incl
我想知道快速傅里叶变换 (FFT) 执行了多少 FLOPS。 所以,如果我有一个 1 维数组,包含 N 个 float ,我想计算这组数字的 FFT,有多少 FLOPS 需要执行吗? 我知道这取决于所
数学库经常根据 FLOPS 进行比较。当我看到 FLOPS 与大小的关系图以及几个不同数学库的点集时,向我传达了什么信息? 如果比较相同算法的两个实现或两个不同硬件上的相同软件,FLOPS 作为性能衡
如何计算应用程序的 FLOPS?如果我有执行指令的总数,我可以将它除以执行时间。但是,如何统计执行的指令数呢? 我的问题很笼统,非常感谢任何语言的回答。但我希望为我的应用程序找到一个由 C/C++ 和
我想计算 LeNet-5 ( paper) 的每一层需要多少触发器。一些论文总共给出了其他架构的 FLOPs(1,2,3)但是,这些论文没有详细说明如何计算 FLOPs 的数量,我不知道有多少 FLO
我能得到的最接近的例子是在这个问题中找到的:https://github.com/tensorflow/tensorflow/issues/899 使用这个最小的可重现代码: import tenso
我想计算图形硬件的理论峰值性能。嗯,其实我想了解一下计算。 以 AMD Radeon HD 6670 为例:AMD Accelerated Parallel Processing Programmin
我被要求测量一个在多 CPU 系统上求解微分方程的 Fortran 程序的性能。我的雇主坚持要求我测量 FLOP/s(每秒 float 操作)并将结果与基准进行比较( LINPACK ),但我不相
Microsoft's Parallel Programming whitepaper描述了在各种 FLOPS 阈值下最优的情况,并且 FLOPS 率是关于何时应使用特定实现的决策点。 如何测量应用程
我被要求测量一个在多 CPU 系统上求解微分方程的 Fortran 程序的性能。我的雇主坚持要求我测量 FLOP/s(每秒 float 操作)并将结果与基准进行比较( LINPACK ),但我不相
我一直在关注 OpenCL 的一些教程,很多时候人们用 FLOPS 来说话.维基百科确实解释了公式,但没有说明它的实际含义?例如,1光年= 9.4605284 × 10^15米,其实就是光在一年中行进
我的问题是我得到了一个长度为 l 的数组。 假设这是我的数组:[1,5,4,2,9,3,6] 我们称它为 A。 这个数组可以有多个子数组,子数组的节点彼此相邻。所以我们可以有 [1,5,4] 或 [2
我们必须实现一个 ASM 程序来乘以坐标方案格式 (COOS) 以及压缩行格式 (CSR) 的稀疏矩阵。现在我们已经实现了所有这些算法,我们想知道与通常的矩阵乘法相比,它们的性能要高多少。我们已经实现
我想编写一个 go 程序来对我的 CPU 进行基准测试并计算出我的笔记本电脑的 GFLOPS。 func benchmarkFlopTime(){ num_operations := int(
如何在现代 x86-64 Intel CPU 上实现每周期 4 次浮点运算( double )的理论峰值性能? 据我了解,SSE 需要三个周期add mul 的五个周期在大多数现代 Intel CPU
我是一名优秀的程序员,十分优秀!