- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
作为基准测试任务的一部分,我正在研究可用于测量耗时的不同机制。我最终决定使用 clock_gettime
,但我也对 RDTSC
指令进行了充分的研究和测试。我有几个关于相同的问题(基于我在几个在线线程上阅读的内容):
在较新的处理器(>Pentium 4)上,TSC 以系统 CPU 的最大频率运行。这个对吗?在那种情况下,使用滴答数和频率来确定时间是否有效?
如果上述为真,则表示 TSC 不受因省电和其他功能而导致的 CPU 频率变化的影响。知道这一点,是否意味着通过使用 RDTSC
获得的总滴答声不是采样代码段使用的实际滴答声 - 因为代码将以 CPU 的频率而不是 TSC 的频率运行?另外,这是否意味着使用 TSC 节拍和 CPU 频率获得的时间不是代码段实际使用的时间?
我发现了很多关于跨核心同步 TSC 值的不同说法(参见 this thread )。我不确定什么是正确的,我猜这也取决于处理器型号。但是可以假设它在较新的 CPU 上的内核之间是同步的吗? (这没有使用 sched_set_affinity
)?
请注意,由于与之相关的各种问题(便携性、可靠性等),我没有使用 RDTSC
。这些问题只是为了提高我对 TSC 工作原理和一般基准测试的理解。
最佳答案
根据 Intel 的说法,不变的 TSC 意味着
The invariant TSC will run at a constant rate in all ACPI P-, C-. and T-states.
但那是什么比率?嗯,
That rate may be set by the maximum core-clock to bus-clock ratio of the processor or may be set by the maximum resolved frequency at which the processor is booted. The maximum resolved frequency may differ from the maximum qualified frequency of the processor, see Section 18.14.5 for more detail. On certain processors, the TSC frequency may not be the same as the frequency in the brand string.
在我看来,他们似乎希望它成为品牌字符串中的频率,但不知何故并不总是正确的..那频率是多少?
The TSC, IA32_MPERF, and IA32_FIXED_CTR2 operate at the same, maximum-resolved frequency of the platform, which is equal to the product of scalable bus frequency and maximum resolved bus ratio.
For processors based on Intel Core microarchitecture, the scalable bus frequency is encoded in the bit field MSR_FSB_FREQ[2:0] at (0CDH), see Appendix B, "Model-Specific Registers (MSRs)". The maximum resolved bus ratio can be read from the following bit field:
If XE operation is disabled, the maximum resolved bus ratio can be read in MSR_PLATFORM_ID[12:8]. It corresponds to the maximum qualified frequency.
If XE operation is enabled, the maximum resolved bus ratio is given in MSR_PERF_STAT[44:40], it corresponds to the maximum XE operation frequency configured by BIOS.
虽然这可能不是很有帮助。 TL;DR,以编程方式找到 TSC 率太费力了。您当然可以在自己的系统上轻松找到它,只需根据定时循环进行不准确的猜测并取“最接近的有意义的数字”即可。无论如何,它可能是品牌字符串中的数字。它在我测试过的所有系统上都有,但我没有测试过那么多。如果不是,那将是一个明显不同的比率,所以您肯定会知道。
In addition, does this mean the time obtained by using the TSC ticks and CPU frequency isn't the actual time used by the code piece?
是的,但并不是所有的希望都破灭了,通过使用 TSC 刻度和 TSC 速率(如果您不知何故知道的话)获得的时间将给出实际时间..几乎?这里通常会冒出很多关于不可靠性的 FUD。是的,RDTSC 没有序列化(但您可以添加序列化指令)。 RDTSCP 正在序列化,但在某些方面还不够(它不能执行得太早,但可以执行得太晚)。但这并不是说你不能使用它们,你可以接受一个小错误,或者阅读我在下面链接的论文。
But can it be assumed to be synchronized among cores on newer CPUs?
是的,不,也许——它将被同步,除非写入 TSC。谁知道,有人可能会这样做。不受你的控制。它也不会在不同的套接字之间同步。
最后,我真的不相信在基准测试的背景下对 RDTSC(P) 的恐惧。您可以根据需要对其进行序列化,TSC 是不变的,并且您知道速率,因为它是您的系统。实际上也没有任何替代方案,它基本上是 高分辨率时间测量的来源,最终其他所有东西最终都会使用。即使没有特别的预防措施(但通过过滤数据),大多数基准测试的准确性和精确度都很好,如果您需要更多,请阅读 How to Benchmark Code Execution Times on Intel® IA-32 and IA-64 Instruction Set Architectures ,他们编写了一个内核模块,这样他们就可以摆脱另外两个基准错误源,这两个源头容易受到很多 FUD、抢占和中断的影响。
关于linux - 用于基准测试和时间戳计数器频率的 rdtsc 的准确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32570249/
我在leetcode上看到这段代码,是一道求众数的题,下面是题目描述: 给定一个大小为 n 的数组,找到多数元素。众数元素是出现次数超过 ⌊ n/2 ⌋ 次的元素。 你可以假设数组是非空的并且多数元素
每次在 JavaScript 中执行特定操作时,例如: $(function() { $('#typing').keyup(function () { switch($(this)
我一直在为网页设计一个计数器,但我一直被这个我无法解决的功能所困扰。 我有一个 4 个 div 的计数器,因为其中两个是小数字,另外两个是大数字,所以第一个运行得很快,我看不到它们的功能。 有人知道如
我已经在文档中进行了一些搜索,并在网上花了一段时间,但找不到解决方案!我希望警报告诉我单击 .thumb 时它处于each() 的哪一次迭代。 EG:有六个.thumb,我点击数字3,浏览器弹出3!
在 Handlebars 中,假设我有 names 的集合.我能怎么做 {{#each names}} {{position}} {{name}} {{/each}} 在哪里 {{position}}
这个问题在这里已经有了答案: Numbering rows within groups in a data frame (9 个回答) 4年前关闭。 我们如何在数据帧的每组中生成唯一的 ID 号?以下
我正在努力解决以下问题。我希望为给定的“一”序列创建一个计数器。例如,我有以下内容: 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 鉴于该序列,我希望为 1 的每个序列设置一个计数器直到
我正在努力解决以下问题。我希望为给定的“一”序列创建一个计数器。例如,我有以下内容: 1 1 1 1 0 0 1 1 1 0 0 1 1 1 1 鉴于该序列,我希望为 1 的每个序列设置一个计数器直到
我有一个jsfiddle here 这是一个简单的 JavaScript 函数,可以计算出设定的数字。 是否可以进行这种计数,但也保留一位小数 所以它算 1.1、1.2、1.3 等。 func
我正在构建一个计数器,当我按下鼠标时,它应该增加到 maxValue 并且减少不超过 0。我还可以选择将计数器重置为其初始值:0。另外,如果 maxValue 是偶数,它应该计数到该数字。但是,如果
所以我成功地为字母和单词构建了其他计数器,但现在我只能用这个来计算句子。我的代码如下,当我运行它时,它会返回很多错误消息: #include #include #include int main
Closed. This question is off-topic。它当前不接受答案。
我需要一个计数器,它会随着某些任务的完成而递增。我们只需要最后一小时的值,即窗口将移动而不是静态时间。 解决此问题的最佳方法是什么?我能想到的一种方法是拥有一个大小为 60 的数组,每分钟一个,并更新
我希望使用计数器来为我提供独特的引用系统。我想单击一个按钮,然后检查一个字段/文件中的最后一个数字,然后简单地向其添加 1,然后将其插入到屏幕上的字段中? 不确定执行此操作的最佳方法或具体如何执行此操
我有一个用 php 制作的表格,在该表格内我显示了数据库中的一些内容。我在每个 td 中创建了一个简单的按钮(类似于 Like),我希望每次点击它都会增加 1。这是带有按钮的行: echo "
如何将数据库中的值转换为可用于 if else 函数的 int 值? 例如:在我的数据库“armnumber = 3”中,如何在 if else 函数中使用它? 代码 string myConnect
我需要生成唯一的“ids”,问题是,它只能在 1 - 99999 之间。 “好”的是,它仅在与另一列组合时必须是唯一的。 我们有组,每个组都有自己的“group_id”,每个组都需要类似 unique
有这个简单的代码: UPDATE counter SET c= c +1 where id = 1; 并且它在开头的 c 字段中为 null 的情况下不起作用。它只有在已经输入了一些数字时才有效,也就
我正在尝试在 python 中构建一个具有闭包属性的计数器。以下工作中的代码: def generate_counter(): CNT = [0] def add_one():
我使用 CSS 来计算 HTML 文档中的部分: body {counter-reset: sect;} section:before { counter-increment: sect;
我是一名优秀的程序员,十分优秀!