最近发现很多hpc 领域的MPI程序中在用usleep(0) ,比较差异。 后来问了之前做hpc 的同事 得到的答复是
一般用usleep(0) 的主要目的应该是:
CPU交出当前线程的执行权,让CPU去执行其他线程。也就是放弃当前线程的时间片,转而执行其他线程
我感觉很诧异。 Usleep(0) 来做这个事情 是POSIX要求的 还是一个意外的发现呢? 我记得我之前都是用 sched_yield() 的啊。
于是有2个问题
1 :usleep(0) 能不能让权,
2 :如果可以和sched_yield 比到底谁更合适
我先man了一下usleep(0) 在linux上 ,
Usleep 不应该大于 1s 这个是确定无疑的, 但是usleep(0) 的行为 就比较诡异了。Man 上没有明确提到 看来POSIX是不要求让权的, 这在QNX MAC 等操作系统上 明确看到
Glibc 对于 usleep(0) 是
同时linux man 到明确写着
那usleep 究竟有没有这个效果呢 。
先来看几个奇怪的现象:
执行shell usleep 0 会明显的看到调用了
难道
usleep(0) = sched_yield?
而
执行shell usleep x (x!=0 ) 会去调用naonsleep
这就比较合理了, 之前猜测 usleep 就应该是调用了 nanosleep ,
然后写一个 c 函数调用来看看
会发现 无论是0 还是 !0 都是调用的
这就比较合理了, 看了glibc源码 也验证了确实是 封装naosleep
那第一个问题在linux 上就变成 naosleep(0,0) 是不是会去让权了, 他和sheld_yield 的区别。
在.18 之后 应该naosleep 都是基于 hrtimer的机制实现了 (
==============================================================
do_nanosleep(struct hrtimer_sleeper *t, enum hrtimer_mode mode)
{
hrtimer_init_sleeper(t, current);
do {
set_current_state(TASK_INTERRUPTIBLE);
hrtimer_start_expires(&t->timer, mode);
if (!hrtimer_active(&t->timer))
t->task = NULL;
if (likely(t->task))
schedule();
hrtimer_cancel(&t->timer);
mode = HRTIMER_MODE_ABS;
} while (t->task && !signal_pending(current));
__set_current_state(TASK_RUNNING);
return t->task == NULL;
}
=======
补充一个 在2.6.9内核 或者可能之前的glibc实现中 usleep(0) 如果是基于 select (0) 这样的实现
在判断入参是0 之后会离开返回 不会调用 schelduer()的
=====================================================================
)
根据nanosleep 的 syscall ,发现
很明显的有 schedule(), 于是可以确定 usleep(0) 如果一切顺利确实会让权,那么和sched_yield比呢
于是写了一个 main
#include <unistd.h>
#include <sched.h>
int main(){
int j ;
for(j=0; j<100000; j++)
//usleep(0);
sched_yield();
}
在sched_yield() 的时候 调用10万次 的耗时如下
在usleep(0) 的时候 调用10万次 的耗时如下
延迟简直不是一个数量级。。 太可怕了,如果用于网络 那要丢多少UDP , TCP要做多少次拥塞避免。
在来看一下MPI中的这个问题
http://trac.mcs.anl.gov/projects/mpich2/ticket/1597\
MPI有个Yield宏,使用了 usleep(0) ,但是比较大的延迟
最后一张表的意思是, 应该尽可能的让CPU 100%,这样才算是yield。。
那为什么会造成usleep 如此延迟呢?
先看一下 trace的信息
Usleep
非常可怕 因为是非主动让权 调用了 deactivate_task()有简单操作系统知识的都知道
简直就恶魔。。。
然而 sched_yield()
非常干净 简直perfect!
我们知道 在hpc 领域 MPI 的终极目地 就是耗尽CPU
像usleep(0) 这么高的延迟 肯定是不能用来做让权的。 而且我也不觉得 usleep(0) 可以用在任何地方 ,这是一个没保证,(你知道哪天glibc改了呢) 和极其不高效的方式 。
如果你是为了耗掉一个机器周期 ,那直接asm ("nop") ,如果是为了让权建议所有使用usleep(0) (注意是0,不是其他)的地方换成 sched_yield() ;
- 大小: 9.9 KB
- 大小: 13.3 KB
- 大小: 772 Bytes
- 大小: 782 Bytes
- 大小: 1.7 KB
- 大小: 1.4 KB
- 大小: 6.7 KB
- 大小: 26.8 KB
- 大小: 5.4 KB
- 大小: 5.7 KB
- 大小: 49.7 KB
- 大小: 147.5 KB
- 大小: 77.6 KB
- 大小: 23.4 KB
- 大小: 11.1 KB
分享到:
相关推荐
功能说明: 系统主要包括首页,个人中心,医护人员管理,操作员管理,体温数据管理,隔离治疗管理,轮班调度管理,支援信息管理等功能模块。 环境说明: 开发语言:python Python版本:3.6.8 数据库:mysql 5.7数据库工具:Navicat11开发软件:pycharm
基于springboot的学院教学工作量统计系统源码数据库文档.zip
SciPy-1.11.1-cp311-cp311-linux_armv7l.whl
解压之后在elasticsearch的jdk\conf\security\java.policy文件下新增这段,然后重启es就可以使用了 permission java.net.SocketPermission "*", "connect,resolve"; permission java.lang.RuntimePermission "setContextClassLoader"; permission java.lang.RuntimePermission "accessDeclaredMembers"; permission java.lang.RuntimePermission "createClassLoader"; permission java.security.SecurityPermission "putProviderProperty.MySQLScramSha1Sasl"; permission java.security.SecurityPermission "insertProvider";
scipy-1.7.0-cp37-cp37m-linux_armv7l.whl
基于springboot的流浪动物管理系统源码数据库文档.zip
bimdata_api_client-4.0.2-py3-none-any.whl
206847144042651【第3版】第1章-信息化发展.pdf
文件快速搜索 Everything。包含安装包及语言包
环境说明: 开发软件:VS 2017 (版本2017以上即可,不能低于2017) 数据库:SqlServer2008r2(数据库版本无限制,都可以导入) 开发模式:mvc
科兴中维医药现代物流中心方案1(拆零货架+地推).dwg
基于springboot高校大学生竞赛项目管理系统源码数据库文档.zip
matplotlib-3.8.1-cp311-cp311-linux_armv7l.whl
2023-04-06-项目笔记-第三百二十一阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.319局变量的作用域_319- 2024-11-18
方便大家学习扫雷游戏,设计扫雷游戏的实现,涉及多方面的知识
ta_lib-0.5.1-cp39-cp39-win_amd64.whl
matplotlib-3.5.0-cp39-cp39-linux_armv7l.whl
论文描述:该论文研究了某一特定领域的问题,并提出了新的解决方案。论文首先对问题进行了详细的分析和理解,并对已有的研究成果进行了综述。然后,论文提出了一种全新的解决方案,包括算法、模型或方法。在整个研究过程中,论文使用了合适的实验设计和数据集,并进行了充分的实验验证。最后,论文对解决方案的性能进行了全面的评估和分析,并提出了进一步的研究方向。 源码内容描述:该源码实现了论文中提出的新的解决方案。源码中包含了算法、模型或方法的具体实现代码,以及相关的数据预处理、实验设计和性能评估代码。源码中还包括了合适的注释和文档,以方便其他研究者理解和使用。源码的实现应该具有可读性、可维护性和高效性,并能够复现论文中的实验结果。此外,源码还应该尽可能具有通用性,以便在其他类似问题上进行进一步的应用和扩展。
matplotlib-3.8.2-cp39-cp39-linux_armv7l.whl
java源码资源配置ODBC数据源java源码资源配置ODBC数据源提取方式是百度网盘分享地址