题
最近,我被要求为我们开发的算法生成 MIPS(每秒百万条指令)。该算法由一组 C 风格函数公开。我们在 Dell Axim 上运行了代码,以对不同输入下的性能进行基准测试。
这个问题来自我们的硬件供应商,但我主要是一名 HL 软件开发人员,所以我不知道如何回应这个请求。也许具有类似硬件/软件背景的人可以提供帮助......
由于我们的算法不是实时的,我认为我们不需要将其量化为 MIPS。是否可以简单地引用汇编指令的总数?
如果 1 为真,你该怎么做(即如何测量汇编指令的数量)无论是一般的还是专门针对 ARM/XScale 的?
2可以在WM设备上或通过VS2005中提供的设备模拟器执行吗?
3可以自动化吗?
非常感谢你的帮助。查尔斯
感谢你的帮助。我认为 S.Lott 说到点子上了。作为后续行动,我现在有更多问题。
5 关于如何测量 MIPS 有什么建议吗?我听说有人建议运行我们的算法并将其与 Dhrystone/Whetstone 基准进行比较以计算 MIS。
6 由于算法不需要实时运行,MIPS 真的是一个有用的衡量标准吗?(例如。阶乘(N)) 还有哪些其他方法可以量化处理需求?(我已经测量了运行时性能,但这并不是一个令人满意的答案。)
7 最后,我认为 MIPS 是一个粗略的估计,并且是可靠的。关于编译器、优化设置等?
解决方案
我敢打赌,您的硬件供应商会询问您需要多少 MIPS。
如“您需要 1,000 MIPS 处理器还是 2,000 MIPS 处理器?”
管理层将其翻译为“多少 MIPS?”
硬件提供 MIPS。软件消耗 MIPS。
你有两个自由度。
该处理器固有的 MIPS 产品。
您消耗那么多 MIPS 的秒数。
如果处理器没有足够的 MIPS,您的算法将会“慢”。
如果处理器有足够的 MIPS,你的算法就会“快”。
我将“快”和“慢”放在引号中是因为您需要有性能要求来确定“足够快以满足性能要求”或“太慢而无法满足性能要求”。
在 2,000 MIPS 处理器上,您可能需要 2 秒,这是可以接受的。但在 1,000 MIPS 处理器上,这个时间会激增至令人无法接受的 4 秒。
您需要多少 MIPS?
获取适合您的处理器的官方 MIPS。看 http://en.wikipedia.org/wiki/Instructions_per_second
对一些数据运行您的算法。
测量准确的运行时间。对一堆样本进行平均以减少不确定性。
报告。在 750 MIPS 处理器上 3 秒——好吧——在 750 MIPS 下是 3 秒。MIPS 是一个速率。时间就是时间。距离是速率*时间的乘积。750 MIPS 下的 3 秒相当于 750*3 百万条指令。
记住速率(以每秒指令为单位)* 时间(以秒为单位)为您提供指令。
别说是3*750 MIPS。事实并非如此;这是 22.5 亿条指令。
其他提示
一些注意事项:
MIPS 通常用作处理器的通用“容量”度量,特别是在软实时/嵌入式领域,您确实希望确保不会使处理器超载工作。请注意,这是每秒的指令数,因为时间非常重要!
以这种方式使用 MIPS 是相当不科学的。
以这种方式使用的 MIPS 通常仍然是确定系统大小和确定处理器速度的最佳近似值。很可能会下降 25%,但没关系……
计算 MIPS 需要与您正在使用的处理器接近的处理器。正确的指令集显然对于从实际使用的编译器捕获实际指令流至关重要。
您无法以任何方式在 PC 上近似这一点。您需要使用以下几种工具之一来正确执行此操作:
使用目标架构的指令集模拟器,例如 Qemu、ARM 自己的工具、Synopsys、CoWare、Virtutech 或 VaST。它们速度很快,但可以很好地计算指令,并且支持正确的指令集。除非广泛使用整数除法等昂贵的指令(并且请不要浮点数),否则这些数字往往非常接近。
为您的目标处理器(或接近的处理器)找到一个时钟周期精确的模拟器,这将对管道效应等给出很好的估计。再次从 ARM 或 Carbon SoCDesigner 获取。
获取适合您目标处理器系列的开发板,或接近其设计的 ARM,并分析其中的应用程序。您不使用 ARM9 来分析 ARM11,但 ARM11 可能是 ARM Cortex-A8/A9 等的一个很好的近似值。
米普斯 一般用于衡量处理器的能力。
算法通常采用:
- 一定的时间(在特定处理器上运行时)
- 一定数量的指令(取决于架构)
用每秒指令数来描述算法似乎是一个奇怪的衡量标准,但我当然不知道你的算法是做什么的。
为了提出有意义的衡量标准,我建议您设置一个测试,以测量算法完成所需的平均时间。汇编指令的数量是一个合理的衡量标准,但很难计算它们!你最好的选择是这样的(伪代码):
const num_trials = 1000000
start_time = timer()
for (i = 1 to num_trials)
{
runAlgorithm(randomData)
}
time_taken = timer() - start_time
average_time = time_taken / num_trials
MIPS 是 CPU 速度的衡量标准,而不是算法性能的衡量标准。我只能假设在某个地方,有人有点困惑。他们想找出什么?我能想到的唯一可能的情况是他们试图帮助您确定他们需要多快的处理器才能让您满意地运行您的程序。
由于您可以用指令数量来衡量算法(这无疑取决于输入数据,因此这并不简单),因此您需要一些时间衡量指标才能获得 MIPS——例如,“我需要每秒调用它 1000 次”。如果您的算法针对该特定情况有 1000 条指令,您最终将得到:
1000 instructions / (1/1000) seconds = 1000000 instructions per second = 1 MIPS.
我仍然认为这是一种非常奇怪的尝试做事的方式,所以你可能想要求澄清。至于您的具体问题,我将把它留给更熟悉 Visual Studio 的人。
还要记住,不同的编译器和编译器选项会产生巨大的差异。相同的源代码可以以多种不同的速度运行。因此,您可以使用 1/2mips 处理器并使用编译器选项,而不是购买 2mips 处理器。或者把钱花在更好的编译器上并使用更便宜的处理器。
基准测试充其量是有缺陷的。作为一种爱好,我曾经在不同供应商的不同编译器上为相同的硬件编译相同的 dhrystone(和磨石)代码,并且数字到处都是,数量级。相同的源代码相同的处理器,dhrystone 没有任何意义,作为基线没有用处。基准测试中重要的是你的算法运行的速度有多快,它最好与需要的速度一样快或更快。根据距离终点线的距离,允许有足够的坡度。早期可能希望运行速度比需要的速度快 5 倍、10 倍或 100 倍,这样到项目结束时,您的速度至少会比需要的速度快一些。
我同意S的想法。洛特说,这都是销售、营销和管理方面的谈话。作为管理层让他们进退两难的人,那么你需要做的就是让他们购买最快的处理器和最好的工具,他们愿意根据你将要使用的彩色饼图和图表来购买这些工具。凭空产生的理由。如果接近终点时它还不能完全满足性能,那么您可以返回 stackoverflow,但同时管理层将被迫以几乎任何价格购买不同的工具链或交换处理器并重新旋转主板。到那时你应该知道你离目标有多近,我们需要 1.0,如果我们购买的处理器速度是我们应该制造的处理器的两倍,那么我们的速度就是 1.25。
是否可以自动化或模拟这些事情取决于工具,有时是,有时不是。我不熟悉你所说的工具,所以我无法直接与他们交谈。
此回复并非旨在直接回答问题,而是提供有关为何提出此问题的更多背景信息。
算法的 MIPS 仅与需要在要求的时间内响应事件的算法相关。
例如,考虑一个设计用于检测风速并在风速超过 25 英里/小时时在一秒内移动执行器的控制器。假设需要 1000 条指令来计算风速并将其与阈值进行比较。该算法的 MIPS 要求是每秒 1 千条指令 (KIP)。如果控制器基于 1 MIPS 处理器,我们可以放心地说控制器中有更多的能量来添加其他功能。
控制器上还可以添加哪些其他功能?这取决于要添加的功能/算法的 MIPS。如果还有另一个函数需要在一秒内执行 100,000 条指令(即100 KIP),我们仍然可以容纳这个新功能,并且仍然有一些空间可以添加其他功能。
对于初步估计,PC 上的基准测试可能有用。
然而,在您选择特定的设备和时钟频率之前,您应该获得适用于 ARM 目标架构的开发板(或某些 PDA?)并在那里进行基准测试。
有很多因素会影响当今机器的速度(缓存、管道、不同的指令集……),因此您在 PC 上的基准测试可能与实际情况相差甚远。手臂。