对不起,可能是太抽象的问题,但对我来说这是非常实用+可能是一些专家有类似的经验,可以解释它.
我有一个大代码,大约10000行.
我注意到如果在某个地方我放了
if ( expression ) continue;
Run Code Online (Sandbox Code Playgroud)
其中expression 始终为false(使用代码逻辑和cout进行双重检查),但取决于未知参数(因此编译器不能简单地在编译期间摆脱此行),程序的速度提高了25%(计算结果)是相同的).如果我测量环路本身的速度,则加速因子大于3.
为什么会发生这种情况?如果没有这些技巧,有什么方法可以使用这种加速的可能性?
PS我使用gcc 4.7.3,-O3优化.
更多信息:
我尝试过两种不同的表达方式.
如果我将行更改为:
if ( expression ) { cout << " HELLO " << endl; continue; };
Run Code Online (Sandbox Code Playgroud)
加速消失了.
如果我将行更改为:
expression;
Run Code Online (Sandbox Code Playgroud)
加速消失了.
围绕该行的代码如下所示:
for ( int i = a; ; ) {
do {
i += d;
if ( d*i > d*ilast ) break;
// small amount of calculations, and conditional calls of continue;
} while ( expression0 );
if ( d*i > dir*ilast ) …Run Code Online (Sandbox Code Playgroud)ATLAS 3.10.1不会安装在我组织的CentOS 6.x平台上,因为它会检测CPU限制.在旧版本的软件包中,有一个配置标志可以将油门检查关闭(-Si cputhrchk 0)并且无论如何都要向前进.该选项在几个版本之前就被删除了.我理解这个决定背后的原因 - 开发人员担心他们软件的性能和声誉以及CPU限制使得ATLAS无法自我调整.精细.我的问题是,无论ATLAS的性能如何,我只需要完成构建.我知道,有很多方法可以停止节流,但是我没有,也许不会获得许可在这台机器上乱用CPU频率.所以我需要的是一种通过ATLAS油门检查的方法.我已经看到了一些关于破解配置脚本的讨论,但是我看不出自己该怎么做.没有人在ATLAS sourceforge网站上回答,这不是批评那里的任何人.只是想表明我的情况.所以:任何人都知道如何通过ATLAS的油门检查?谢谢.
我开发了一个高性能的 Cholesky分解程序,它应该在单个CPU上具有大约10.5 GFLOP的峰值性能(没有超线程).但是当我测试它的性能时,有一些我不明白的现象.在我的实验中,我通过增加矩阵维数N(从250到10000)来测量性能.
对于任何NI测试,我都希望性能(在GFLOP中)应保持在10.5左右.但是,如第一张图所示,在实验中间观察到显着的性能下降.
CPU频率和CPU温度见第2和第3图.实验在400年代结束.实验开始时温度为51度,CPU忙时迅速升至72度.之后,它慢慢增长到78度的最高点.CPU频率基本稳定,温度升高时不下降.
所以,我的问题是:
CPU信息
System: Ubuntu 14.04 LTS
Laptop model: Lenovo-YOGA-3-Pro-1370
Processor: Intel Core M-5Y71 CPU @ 1.20 GHz * 2
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0,1
Off-line CPU(s) list: 2,3
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 61
Stepping: 4
CPU MHz: 1474.484
BogoMIPS: 2799.91
Virtualisation: …Run Code Online (Sandbox Code Playgroud) 我的Django应用程序非常慢,我想知道花时间:
我试过Django-debug-toolbar但是找不到可以让我分解加载时间的面板.
我的要求:
能django-debug-toolbar做到吗?[什么小组?]
任何其他可以做到这一点的django-app?
我正在编写一个音频设备驱动程序,需要实时处理设备中断.当CPU进入C3状态时,中断会延迟,从而导致驱动程序出现问题.有没有办法让驱动程序告诉操作系统不要进入空闲的C状态?
我发现可以从用户空间禁用空闲C状态:
const DWORD DISABLED = 1;
const DWORD ENABLED = 0;
GUID *scheme;
PowerGetActiveScheme(NULL, &scheme);
PowerWriteACValueIndex(NULL, scheme, &GUID_PROCESSOR_SETTINGS_SUBGROUP, &GUID_PROCESSOR_IDLE_DISABLE, DISABLED);
PowerSetActiveScheme(NULL, scheme);
Run Code Online (Sandbox Code Playgroud)
但是,它是一个全局设置,可以被用户或其他应用程序覆盖(例如,当用户更改电源计划时).
我需要的是像PoRegisterSystemState,但不是S和P状态,而是C状态.(参考:https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/preventing-system-power-state-changes)
有没有办法实现这个目标?
=====
事实证明,没有一种支持的方法可以从内核空间禁用空闲C状态,并且用户空间中没有服务提供通用API来执行此操作.控制C状态的方法来自"更改高级电源设置"对话框中的"处理器电源管理",通过注册表或通过C API PowerWriteACValueIndex/PowerWriteDCValueIndex.
最初的问题是除了C1空闲状态之外的所有延迟中断,所以我需要禁用C2,C3和更深的空闲状态.禁用所有空闲C状态(包括C1(如示例代码PowerWriteACValueIndex(NULL,scheme,&GUID_PROCESSOR_SETTINGS_SUBGROUP,&GUID_PROCESSOR_IDLE_DISABLE,DISABLED)中所示)的问题是CPU使用率报告为100%,并且某些应用程序(DAW)获得困惑.
我的问题的解决方案是禁用除C1空闲状态之外的所有状态,这可以通过在处理器电源管理中设置以下值来完成: - 处理器空闲阈值缩放 - >禁用缩放; - 处理器空闲提升阈值 - > 100%; - 处理器空闲降级阈值 - > 100%.
也许我会创建一个只使用PowerWriteACValueIndex/PowerWriteDCValueIndex API的服务.
编辑:我原来的例子有一个愚蠢的错误.修好之后,我仍然会得到奇怪的结果.
在我天真的尝试以"蛮力"的方式测量我的CPU速度时,我制作了以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#pragma comment(linker, "/entry:mainCRTStartup")
#pragma comment(linker, "/Subsystem:Console")
int mainCRTStartup()
{
char buf[20];
clock_t start, elapsed;
unsigned long count = 0;
start = clock();
__asm
{
mov EAX, 0;
_loop:
add EAX, 3; // accounts for itself and next 2 instructions
cmp EAX, 0xFFFFFFFF - 0x400;
jb _loop;
mov count, EAX;
}
elapsed = clock() - start;
_gcvt(count * (long long)CLOCKS_PER_SEC / (elapsed * 1000000000.0), 3, buf);
puts(buf);
}
Run Code Online (Sandbox Code Playgroud)
哪个反汇编成:
mainCRTStartup:
push ebp …Run Code Online (Sandbox Code Playgroud) 我试图找出是否有任何想法来了解我的C代码正在运行的系统的CPU频率.
为了澄清,我正在寻找一个抽象的解决方案(一个不会与特定架构或操作系统绑定的解决方案),它可以让我了解我的代码正在执行的计算机的运行频率.我不需要准确,但我想进入球场(即我有一个2.2GHz处理器,我希望能够在我的程序中告诉我我在几百之内)那个MHz)
有没有人有想法使用标准C代码?
我正在尝试优化我的 Python 代码。之间:
y = x*x
Run Code Online (Sandbox Code Playgroud)
或者
y = x**2
Run Code Online (Sandbox Code Playgroud)
如果我需要在一个速度关键的程序中进行一万亿次迭代,我应该选择哪一个?
他们是刚刚使用蛮力方法想出来的还是有算法呢?
从"编程珍珠"一书中解释(关于旧机器上的c语言,因为本书是从90年代后期开始的):
整数算术运算(+,-,*),而可能需要大约10纳秒%操作员最多需要100毫微秒.
/在时间方面它与division()相同吗?