问题标签 [flops]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 计算 FLOPs 和数据大小并检查函数是否受内存限制或 CPU 限制
我将分析和优化一些 C 代码,因此我首先必须检查我要优化的函数是内存绑定的还是 CPU 绑定的。一般来说,我知道如何做到这一点,但我对计算浮点运算和分析使用的数据大小有一些疑问。看下面我要分析的for循环。数组的值是双精度的(这意味着每个 8 字节):
1)你数了多少浮点运算?我考虑过 3*(Nt-1)*N... 但我是否也必须计算数组中的操作(矩阵 [j*Nt+i],对于这个数组来说还有 2 个 FLOP)?
2)传输了多少数据?2* ((Nt-1)*N) 8Byte 或 3 ((Nt-1)*N)*8Byte。我的意思是,必须加载矩阵的每个条目。计算后,新值将保存到数组的该索引(现在是 1load 和 1 store)。但是这个值是用于下一次计算的。因此是否需要另一个加载操作,或者这个值 (matrix[j*Nt+i-1]) 在没有加载操作的情况下是否已经可用?
多谢!!!
optimization - GPU上的矩阵乘法。内存库冲突和延迟隐藏
编辑:随着时间的推移取得的成就列在这个问题的末尾(~1Tflops/s)。
我使用 C++ DLL 中的 opencl(gpu) 为 C# 编写了某种数学库,并且已经对单精度方阵 - 矩阵乘法进行了一些优化(用于学习目的和以后在神经网络程序中重用的可能性)。下面的内核代码将 v1 1D 数组作为 matrix1(1024x1024) 的行,将 v2 1D 数组作为 matrix2 的列((1024x1024)转置优化),并将结果作为 matrix-3 的行放入 v3 1D 数组中。(1024x1024)
目前,对于 HD7870,1024x1024 方阵-矩阵乘法的内核执行时间为 3.6 毫秒。
完成的优化:
- 第二个矩阵的转置。(改进的时间)
- 使用 32x32 子矩阵在本地内存中计算(4x 16x16,因为我的 HD7870 上的最大工作组大小为 256,并且由于某种原因 gpu 不接受超过 24kB 的本地内存,但在线消息来源说 64kB?)(无论如何,大大提高了时间)
- 在将结果写入本地和全局之前,增加对私有变量的数据重用。(改进时间)
- 列主要访问最内层循环中的本地二维数组。(改进时间)
- 每个补丁共享加法到两个累加器寄存器。(提高时间并降低数值稳定性)
- 循环展开最里面的循环并没有缩短时间(甚至在第 4 次展开后变得更糟)(所以整数 alu 必须放宽)
问:我无法完成一些优化,例如消除所有本地(lds)银行冲突和指令重新排序以隐藏内存延迟。我能做些什么来完善这个数学函数的性能?
这个内核肯定是本地内存带宽(冲突)有界的,有 3.2 毫秒的乘法=
(1024*1024*1024 * (1 sum + 1 mult =2) / 0.0036 seconds )= 596x10^9 Flops per second(596 GFlops) 我在 GTX680 上看到了一些 CUDA 的在线基准测试,它们已经突破了 1TFlops 点。因为每个计算单元或更多内核或两者都有更多的本地内存?
(1024*1024*1024*(2 float reads)*(4 bytes per float) /0.0036 sec)=2386x10^9 bytes per second 但是这个内核读取 8 个浮点数并使用它们 16 次,其中数据重用为 2每个浮动。
2386x10^9 字节/重复使用 (2) = 1193 GB/s
HD7870 的理论最大值为:此处,附录 D
计算能力=2560 Giga Floating point operations per second, LDS 带宽=2560 GB/s 寄存器访问带宽=15360 GB/s
这是内核:
这是我试图消除银行冲突的方法,但内核执行时间增加了大约 %20:
这会是新gpus的广播技术吗?还对 16 个元素求和意味着只使用 16 个库?该设备有 32 个用于本地访问的存储库。
这是我试图隐藏内存延迟的内容:
但这并没有增加或减少 exec。时间。
如何提高内核时间?可行吗?
设备:HD7870 @ 1000MHz/1200MHz 主机:FX8150@4GHz 头文件,来自 Khronos 网站的 LIB 文件,来自 AMD 驱动程序的 opencl.dll。
时间采样通过以下方式完成:将内核循环 100 次,然后将总时间除以Stopwatch
start() 和 stop() 方法的 100.0。并且仅用于执行,不包括数组副本。
所有结果都与具有相同随机矩阵输入的朴素 3 嵌套循环版本进行比较(结果在 m(ij)+/-delta 内,其中 delta 为 0.001f。)
这里的内核是更通用的简化版本(针对不同的矩阵和补丁大小)
本版本内核参数:Global=512,512 Local=16,16, Reference=0,0
对于 8320x8320 矩阵 --->Global=4160,4160, Local=16,16, ref=0,0 time = 1.87Seconds
编辑:在 DarkZeros 的建议下,用私有版本替换本地 Lcache3 将 1024x1024 时间提高到 2.7 毫秒。这是每秒 795 GFlops。这一定是来自于更好的占有率。
Edit2:较少的本地使用打开了使用 48x48 (9 x 16x16) 补丁的可能性,这使得 1056x1056 乘法 2.4 ms ---->981 Gflops/s。8208x8208 在 961 毫秒内完成,超过 1150 GFlops。
c++ - 自动获取某些代码的浮点运算计数的方法
我有一些相当复杂且高度模板化的代码(C++,但这可能不是很相关),我想知道在执行时添加、subs、muls、divs 和 sqrts 的数量。是否有自动获取此信息的方法(编译器可以轻松解决)?我试图在生成的汇编代码中自己计算它,但与jp
,jmp
和call
s 混淆了。
matlab - 高斯消除 Matlab 代码中的失败次数
我很难理解为什么这个 Matlab 代码在不使用 LU 分解进行旋转的情况下执行高斯消除会(2/3) * n^3
失败。(FLOPs:浮点运算而不是FLOPS:每秒浮点运算)
如果有人能向我解释如何计算那些从 开始的嵌套循环的失败数,k+1
我将不胜感激。
PS:我不是在这里谈论算法复杂性。
c++ - 超过理论峰值 FLOPS 基准
为了测量 CPU 的峰值 FLOPS 性能,我编写了一个小 C++ 程序。但是测量结果给我的结果比我的 CPU 的理论峰值 FLOPS 更大。怎么了?
这是我写的代码:
核心函数 _Mandelbrot 执行 4*_mm_mul_ps + 2*_mm_add_ps + 1*_mm_sub_ps,每个操作一次执行 4 个浮点数,因此 7 * 4FLOP = 28FLOP。
我运行它的 CPU 是 2.66GHz 的 Intel Core2Quad Q9450。我在 Windows 7 下用 Visual Studio 2012 编译了代码。理论上峰值 FLOPS 应该是 4 * 2.66GHz = 10.64GFLOPS。但是程序返回 18.4GFLOPS,我不知道出了什么问题。有人可以给我看吗?
cpu - 每个周期的浮点运算 - 英特尔
我一直在寻找很长一段时间,似乎无法找到一个官方/结论性的数字来引用英特尔至强四核可以完成的单精度浮点运算/时钟周期的数量。我有一个 Intel Xeon 四核 E5530 CPU。
我希望用它来计算我的 CPU 可以达到的最大理论 FLOP/s。
MAX FLOPS = (# 核心数) * (时钟频率 (周期/秒)) * (# FLOPS / 周期)
任何指向我正确方向的东西都会很有用。我发现 Sandy-bridge 和 haswell SSE2/AVX/AVX2 的每个周期都有这个 FLOPS
英特尔酷睿 2 和 Nehalem:
4 DP FLOPs/cycle:2-wide SSE2 加法 + 2-wide SSE2 乘法
8 SP FLOPs/cycle:4-wide SSE 加法 + 4-wide SSE 乘法
但我不确定这些数字是在哪里找到的。他们是否假设一个融合乘加(FMAD)操作?
编辑:使用它,在 DP 中,我计算英特尔引用的正确 DP 算术吞吐量为 38.4 GFLOP/s(在此处引用)。对于 SP,我得到了两倍,76.8 GFLOP/s。我很确定 4 DP FLOP/cycle 和 8 SP FLOP/cycle 是正确的,我只想确认他们如何获得 4 和 8 的 FLOPs/cycle 值。
perf - perf_event 给出的指令数中是否包含 FLOPS?
我有一个程序,它使用perf_event.h来计算特定运行进程的IPC 。为此,我阅读了INSTRUCTIONS计数器和CPU_CYCLES计数器。
我的问题是关于INSTRUCTIONS计数器返回的值。它是否包含浮点运算?如果没有,我怎样才能得到这个值?
注意:我说的是perf_event.h,但是,是的,我也在说
perf
,我提到的计数器是您可以使用 command 找到的计数器perf list
。
performance - 在 MATLAB 中使用向量标量乘法的非常慢的循环
我做错了什么还是向量乘标量乘法真的如此昂贵?MATLAB(2012a 版或更高版本)是否不会以某种方式优化代码以防止这种好奇心?
你能给我什么指导方针来让 MATLAB 中的 FLOPS 花费他们真正需要的时间。
PS。这只是一个示例代码,我所做的是解决 odes 系统,我想在计算所需的差异时优化运行时间。以上让我担心我可能会以非最佳方式做某事。
gpu - GPU FLOPS 和 FPS
我正在为估计 OpenCL 和 OpenGL 应用程序性能的 GPU(不能透露是哪一个)建模,该模型可以合理地估计正在执行的应用程序/内核/代码的 FLOPS 有没有办法从 FLOPS 估计到每秒帧数,或者对帧缓冲区进行建模并从中估计 FPS 是否更好。
c - 编译器优化对使用 PAPI 的 FLOP 和 L2/L3 缓存未命中率的影响
因此,我们的任务是编译一些代码(我们应该将其视为黑盒),使用不同的英特尔编译器优化标志(-O1 和 -O3)以及矢量化标志(-xhost 和 - no-vec) 并观察以下方面的变化:
- 执行时间处理时间
- 浮点运算 (FPO)
- L2 和 L3 缓存未命中率
在执行这些优化之后,我们注意到执行时间有所下降,这是意料之中的,考虑到编译器为了提高效率而对您的代码所做的所有更改。然而,我们也注意到 FPO 的数量有所下降,虽然我们知道这是一件好事,但我们不确定它为什么会发生。此外,我们注意到(并且无法解释)L2 缓存未命中率增加(随着优化级别的增加而增加),但缓存访问没有显着增加,L3 级别几乎没有变化。
完全不使用矢量化或优化在 L2 缓存未命中率方面产生了最佳结果,我们想知道你们是否可以给我们一些见解,以及我们可以用来加深我们知识的支持文档、文献和资源关于这个话题。
谢谢你。
编辑:使用的编译器选项是:
- O0 -no-vec(最高执行时间,最低 L2 缓存未命中)
- O1(更少的执行时间,更高的 L2 缓存未命中)
- O3(更短的执行时间,更高的 L2 缓存未命中)
- xhost(与 -O3 执行时间相同的顺序,最高 L2 缓存未命中)
更新:
虽然整体 L2 缓存访问量略有下降,但实际未命中率却大幅增加。
带 -0O -no-vec
挂钟时间 (usecs):13,957,075
- 二级缓存未命中:207,460,564
- 二级缓存访问:1,476,540,355
- 二级缓存未命中率:0.140504
- L3 缓存未命中:24,841,999
- L3 缓存访问:207,460,564
- L3 缓存未命中率:0.119743
使用 -xhost
挂钟时间 (usecs):4,465,243
- 二级缓存未命中:547,305,377
- 二级缓存访问:1,051,949,467
- 二级缓存未命中率:0.520277
- L3 缓存未命中:86,919,153
- L3 缓存访问:547,305,377
- L3 缓存未命中率:0.158813