能量高效的自旋回路

Energy efficient spin loop

本文关键字:回路 高效 能量      更新时间:2023-10-16

我正在编写一个监视全局变量变化的旋转循环。这有占用整个CPU核心的副作用,这很好,因为我使用的是多核机器。

我的问题是:它能提高能源效率吗?我正在使用C++,如果需要,我可以访问x64程序集。

这是我的代码:

void monitor_changes(int*variable_to_monitor){
int last_value=*variable_to_monitor;
while(1){ //this is the spin loop - don't want the os to interrupt it, but can it be energy efficient?
int cur_value=*variable_to_monitor;
if (*variable_to_monitor!=last_value){
printf("value has changed!");
last_value=cur_value;
}
}
}

编辑:我不想使用操作系统服务,因为监控需要尽快做出反应。使用操作系统服务会带来延迟。

除非您有一个非常不寻常的用例,否则您的方法是错误的。您不应该使用旋转循环来监视全局变量的更改。相反,您应该向观察者发出全局已更改的信号。如果使用pthreads,请查看pthread_cond_signalpthread_cond_wait。各种C++库也有这些,例如Boost有互斥对象和条件变量。一种老式的方法是使用管道,在监视器中的管道上进行选择,并在更改全局时写入一个字符。

如果你真的需要监控全局,你可以考虑在检查之间睡觉(你需要知道多久),考虑你的操作系统是否有导致时间表发生的东西,或者考虑pause指令-请参阅:http://x86.renejeschke.de/html/file_module_x86_id_232.html

如果快速响应时间很重要,请仔细查看您的操作系统和服务可能带来的影响。在尽力而为的计算机(相对于实时)分辨率通常在10秒左右,无论字段指示什么。此外,操作系统服务需要时间来设置代码反应速度的下限。

除非你已经为专用设备编写了自己的低级别驱动程序,否则我怀疑你的分辨率是否比10秒好得多。

自旋环对能源效率从来都没有好处。在现代处理器中,存在空闲/睡眠状态(C0、C1等),这些状态在不使用时使处理器进入睡眠状态。从这些空闲状态中唤醒的延迟是usec的数量级。这比操作系统驱动程序、库和传统编译器生成的代码引入的延迟要少几个数量级。请注意,这里的重要单词是"未使用"。这些睡眠状态不会以任何有意义的方式影响性能,因为处理器无论如何都没有做任何事情。

我已经写了一些关于这个主题的文章。看看有用的权力和权力管理文章列表、博客和参考文献中的参考文献。(令人尴尬的是,它偏向于我的材料。随着时间的推移,这种情况会改变。)

以下是我更具体的建议:

(1) 确定您需要的实际响应时间。(a) 如果是对人工输入做出响应,你不可能得到少于四分之一秒的有意义的响应时间。(b) 如果要响应机器生成的事件,您不仅需要分析事件之间的最小增量,还需要分析通信机制(如网络协议)引入的统计方差。

(2) 确定您的系统能够做什么。除非你有专门的实时设备,例如RTOS、专门的库和驱动程序,否则这很难实现。你可能需要做一些实验和数据收集。

(3) 弄清楚你真正想要什么设备来达到你需要的响应时间。

现在让我们来谈谈现实。既然你问了这个问题,我猜你不是在使用需要专业且昂贵的操作系统、库等的实时设备。我怀疑你使用的是传统的多核计算机,使用的是标准操作系统(Linux、Windows、OSX、Android等)、标准库和通用编译器(如gcc)。我怀疑你是否能下定决心<10秒,我怀疑你最多需要100秒左右的响应时间,如果你依赖人工输入,甚至更高。

不要使用旋转循环。从能源效率的角度来看,这是最糟糕的事情,因为它可以防止处理器进入空闲状态。非空闲处理器功率可以大于30瓦。空闲功率可以<5W,延迟<100usec。如果您使用旋转回路,您的功耗将>30瓦。如果您允许使用空闲状态,则您的总体功耗可能<10瓦,没有显著的性能影响。

每隔50到100秒醒来一次,检查变量是否有变化,然后再入睡。

问候

Taylor

PS你问了一个很好的问题。这个领域对这个话题有很多误解。我不能提及那些犯了同样错误的知名应用程序。

除了暂停指令之外的另一个选项是MONITOR/MWAIT。对于你想要的东西来说,它可能延迟太高了,但无论如何都要读一读:

http://semipublic.comp-arch.net/wiki/Monitor-Mwait

http://software.intel.com/en-us/articles/how-to-use-the-monitor-and-mwait-streaming-simd-extensions-3-instructions

https://blogs.oracle.com/dave/resource/mwait-blog-final.txt