问题标签 [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.

0 投票
1 回答
484 浏览

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]) 在没有加载操作的情况下是否已经可用?

多谢!!!

0 投票
1 回答
939 浏览

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 次,然后将总时间除以Stopwatchstart() 和 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。

0 投票
2 回答
805 浏览

c++ - 自动获取某些代码的浮点运算计数的方法

我有一些相当复杂且高度模板化的代码(C++,但这可能不是很相关),我想知道在执行时添加、subs、muls、divs 和 sqrts 的数量。是否有自动获取此信息的方法(编译器可以轻松解决)?我试图在生成的汇编代码中自己计算它,但与jp,jmpcalls 混淆了。

0 投票
1 回答
4496 浏览

matlab - 高斯消除 Matlab 代码中的失败次数

我很难理解为什么这个 Matlab 代码在不使用 LU 分解进行旋转的情况下执行高斯消除会(2/3) * n^3失败。(FLOPs:浮点运算而不是FLOPS:每秒浮点运算)

如果有人能向我解释如何计算那些从 开始的嵌套循环的失败数,k+1我将不胜感激。

PS:我不是在这里谈论算法复杂性。

0 投票
1 回答
699 浏览

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,我不知道出了什么问题。有人可以给我看吗?

0 投票
1 回答
16595 浏览

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 值。

0 投票
1 回答
279 浏览

perf - perf_event 给出的指令数中是否包含 FLOPS?

我有一个程序,它使用perf_event.h来计算特定运行进程的IPC 。为此,我阅读了INSTRUCTIONS计数器和CPU_CYCLES计数器。

我的问题是关于INSTRUCTIONS计数器返回的值。它是否包含浮点运算?如果没有,我怎样才能得到这个值?

注意:我说的是perf_event.h,但是,是的,我也在说perf,我提到的计数器是您可以使用 command 找到的计数器perf list

0 投票
3 回答
179 浏览

performance - 在 MATLAB 中使用向量标量乘法的非常慢的循环

我做错了什么还是向量乘标量乘法真的如此昂贵?MATLAB(2012a 版或更高版本)是否不会以某种方式优化代码以防止这种好奇心?

你能给我什么指导方针来让 MATLAB 中的 FLOPS 花费他们真正需要的时间。

PS。这只是一个示例代码,我所做的是解决 odes 系统,我想在计算所需的差异时优化运行时间。以上让我担心我可能会以非最佳方式做某事。

0 投票
1 回答
2135 浏览

gpu - GPU FLOPS 和 FPS

我正在为估计 OpenCL 和 OpenGL 应用程序性能的 GPU(不能透露是哪一个)建模,该模型可以合理地估计正在执行的应用程序/内核/代码的 FLOPS 有没有办法从 FLOPS 估计到每秒帧数,或者对帧缓冲区进行建模并从中估计 FPS 是否更好。

0 投票
2 回答
793 浏览

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