- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在用 c 语言编写一个程序,以根据 CPU 周期计算执行一项任务所需的时间。我正在避免时间转换,以秒为单位的时间 = 1/时钟周期,因为 CPU 频率在服务器低负载时发生变化,以节省功耗。
程序 1:
///////////////////////// RDTSC Functions /////////////////////////
inline void start_rdtsc_rdtscp_ia64() {
asm volatile ("CPUID\n\t"
"RDTSC\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t": "=r" (cycles_high), "=r" (cycles_low):: "%rax", "%rbx", "%rcx", "%rdx");
}
inline void end_rdtsc_rdtscp_ia64() {
asm volatile("RDTSCP\n\t"
"mov %%edx, %0\n\t"
"mov %%eax, %1\n\t"
"CPUID\n\t": "=r" (cycles_high1), "=r" (cycles_low1):: "%rax", "%rbx", "%rcx", "%rdx");
}
inline void warmup_rdtsc_rdtscp_ia64() {
start_rdtsc_rdtscp_ia64();
end_rdtsc_rdtscp_ia64();
start_rdtsc_rdtscp_ia64();
end_rdtsc_rdtscp_ia64();
start_rdtsc_rdtscp_ia64();
end_rdtsc_rdtscp_ia64();
}
inline uint64_t get_start_ia64() {
return (((uint64_t) cycles_high << 32) | cycles_low);
}
inline uint64_t get_end_ia64() {
return (((uint64_t) cycles_high1 << 32) | cycles_low1);
}
///////////////////////// RDTSC Timer Functions /////////////////////////
inline void start_timer() {
warmup_rdtsc_rdtscp_ia64();
start_rdtsc_rdtscp_ia64();
}
inline void end_timer() {
end_rdtsc_rdtscp_ia64();
start = get_start_ia64();
end = get_end_ia64();
}
inline uint64_t get_cycles_count() {
return end - start;
}
// measuring time here
start_timer();
perform a task for length K //Let large K means more computation
end_timer();
time in ticks= get_cycles_count()
方案二
int main()
{
while(1);
}
我使用了 warmup_rdtsc_rdtscp_ia64() 函数,以便我的 rdtsc 和 cpuid 按照英特尔文档准备就绪,这是获得正确读数所必需的。
没有 Program2 的存在,我的循环读数越来越高,我无法找到执行时间和长度 K 之间的原因和关系。
有了 Program2,我得到了预期的结果——这意味着我可以关联执行时间和 K 的长度。获得更高的时钟周期执行时间和更高的 K 长度。
我只明白,Program2 阻止 CPU 进入省电模式,所以我的 CPU 总是运行到最高 CPU 频率,而没有 program2 我的 CPU 进入省电模式以节省电力并运行到可能的最低频率。
所以,我的疑惑如下
如果没有 Progra2,CPU 会进入省电模式(降低 CPU 频率)以节省电量。虽然 CPU 以较低的频率运行,但我仍然期待几乎相似的时钟周期范围。出于同样的原因,我没有使用转换 Time_in_sec= 1/Frequency 。我获得更高时钟周期的原因是什么????
谁能解释一下 - 在时钟周期内完成任务所需的时序与不同频率级别(省电模式、按需模式、性能模式)之间的关系是什么
我正在使用 Linux 以及 gcc 和 g++。
我需要你的帮助来了解在不同功耗模式(省电模式、按需模式、性能模式)下完成任务所需的时钟周期之间的关系
提前致谢。
最佳答案
您可以使用许多工具来实现您的目标,您应该尝试利用这些工具,而不一定要自己动手。这是我最喜欢的两个:
https://perf.wiki.kernel.org/index.php/Main_Page
https://code.google.com/p/likwid/
关于您的两个问题,我提出以下建议:完成一个程序所需的时间与 CPU 频率没有直接关系。许多人使用称为每周期指令数或 IPC 的指标。 IPC 指标可能会有很大差异。在当前的机器上,at 可能高达 2 到 4,即 CPU 每个 CPU 周期退出一条以上的指令,因为它可以在每个周期发出多条指令。您为您的程序看到的 IPC 至少取决于以下因素:CPU 可以利用的指令级并行度的数量(即因为您可能有乱序处理器)和数据中的局部性数量(即因为更多的局部性意味着更多的缓存命中,因此更少的内存等待。
现代系统的 CPU 时钟频率也各不相同。它可以更高或更低,具体取决于 1) 省电模式(即,如果它是一台未插入电源线的笔记本电脑)和 2) 当前系统负载(即,您有多个 CPU,但如果大多数 CPU 处于空闲状态,一个 CPU可以比所有四个同时运行的速度更快)。
因此,您需要的是以下三样东西:1. 程序的平均 IPC2. 运行程序时的平均 CPU 频率3. 程序中的指令数
然后您可以使用上面的方法计算您的执行时间。然后您可以使用 likwid 或 perf 在这个低级别上调整您的性能。您可以看到省电模式对 CPU 频率有何影响。
祝你好运。
关于c++ - 关于 linux 中的动态缩放,程序在时钟周期中的意外执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252219/
我的代码如下所示: #include #include #include int main(void) { time_t loop_begin, loop_end, scanf_begi
我正在尝试制作一个游戏时钟,其中每个游戏小时都是 3 个实时分钟。但是由于某种原因,我很难将头环绕在它周围。 我想出了这个半工作位,每小时循环 3 分钟,所以它只显示完整的“游戏时间”,我在 23 以
很难找到解决方法的地方。我希望制作一个时钟,它是一个幻想时区,并且是根据系统时间计算的(因为当您不在网页上时,它需要继续运行)。 白天持续从早上7:00到晚上9:59,这是实时200分钟。 13秒(实
Template.display_time.time = function() { var date = new Date(); var hour = date.getHours();
我想做一个小测试,以测试我在远离 javascript 太久之后的技能。试图成为真正的cwleaver并创建一个时钟对象,听起来很简单。我成功地创建了时钟等,没有遇到任何问题,但在大约 20 分钟后运
我正在学习 Javascript30.com 类(class),我们必须做一个带有秒、分和小时的 JS 时钟。这是代码: 还有 J
我有一个 Android 应用程序,用户按下开始按钮并启动一些收集数据的功能。我有一个自定义的 EditText,它显示所有这些过程所花费的时间,并且每秒更新一次,直到用户按下停止键。我使用如下所示的
我正在尝试模拟实时数据流,以测试不断过滤和计算数据点的程序。主要是我需要确保它能满足时间要求。 每 50 毫秒就会有一个新的数据点需要计算。 所以我想创建一个 java 时钟,它独立于当前在 jvm
我正在抓狂:我的 Javascript 时钟不工作。我正在使用 Firebug 来查找错误,但没有得到任何输出。 图像文件位于子文件夹 Dual_Months 和 Dual_Numbers 中。我在我
我计划构建多个计时器。我首先使用以下代码构建一个简单的时钟。 问题是,时钟将运行几分钟,网站就会崩溃,我认为这是由于内存不足。 当我console.log输出时。该命令似乎每秒运行多次。 consol
我是新来的,所以如果您对我的问题或“礼仪”有任何不妥之处,请告诉我! 我正在尝试在 Google Chrome 中创建个性化的新标签扩展程序,但出现了 JavaScript 时间码问题。虽然它在我使用
我需要编写一个带有倒计时器的 JavaScript 时钟,当到达特定时间时,该计时器开始倒计时 5 分钟。所以我有我的时钟和它的工作,但我不知道从这里到哪里去,当谈到 JavaScript 时,我真的
我开发了一个用于多线程计算的类,一个线程只使用这个类的一个实例。我还想通过从另一个线程迭代此类的容器来测量计算的持续时间。该应用程序是win32。问题是我读过 QueryPerformanceCoun
我有一个像这样的时钟: const timeContainer = document.querySelector('.timeContainer'); var showTime = (timeZone
我在 Canvas 上做了一个时钟,我实际上是在 Canvas 上从中心画线,每一秒我从中心画一条线在一个圆圈里,我最终在时钟上画了秒线。我如何清除之前绘制的线,使其看起来像一个真正的时钟。 非常感谢
我正在尝试编写一个倒计时时钟脚本。我想在未来使用一个设定的日期,并以一种易于阅读的格式倒计时。小时,分钟,秒。我要打印到 16x2 液晶显示器。我遇到的问题是试图将日期之间的差异的输出转换为一种很好的
我在计算进程的 CPU 时间的各种机制上研究了 stackoverflow 线程。 clock() 内部是如何实现的?它是否使用 rdtsc()(如果是这样,那么它对核心之间的迁移很敏感)。 此外,g
我需要在时钟上显示服务器时间。以下是我目前拥有的代码。我通过 Ajax 调用获得服务器时间。问题是,如果用户更改它的本地/计算机时钟,它也会更新脚本的时钟,这是不对的——它应该继续而不改变,我被卡住了
当我运行下面的代码时,我得到了一个值 0,有几次我确实得到了 intAddition 的值。我已经尝试了很多我在网上找到的建议,但还没有成功。我的同学向我展示了他是如何做的,这与我的非常相似。他从他的
我正在尝试使用 asm 和 rdtsc 实现我自己的 clock() 版本。但是我很不确定它的返回值。是循环吗?奥德是微秒吗? 我也对 CLOCKS_PER_SEC 感到困惑。这怎么可能是恒定的? 是
我是一名优秀的程序员,十分优秀!