最近发现很多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
分享到:
相关推荐
<br><br>Armadillo<br>ASProtect<br>Enigma<br>ExeCryptor<br>eXPressor<br>PeSpin<br>RlPack<br>TheMida<br>HyperUnpackMe1<br><br>and any protector with Import Elimination, Directly Imports and Hashed ...
竞赛题目#include <cstdio> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cmath> #include <climits> #include <ctime> #include <iostream> #include <algorithm> #include <deque> #...
not use this Simple Tool plz DRAG IT TO THE RECYCLE BIN ok? Always first use UIF then Dump target process. UIF can fix actual APIs, dont use it for fixing Emulated/Redirected APIs to protector's ...
防暴游戏API挑战2:Rito Plz! 我的AP物品! 创建人:Christine Lu(NA:chaibiscuit)和Stephen Won(NA:Randomodnar) 此应用程序显示AP物品补丁对冠军和物品的影响,特别是对他们的拾取率,获胜率,获取时间和...
电子负载PLZ150W使用说明书中文注释[汇编].pdf 本电子负载PLZ150W使用说明书中文注释是一个详细的使用手册,旨在指导用户正确地使用电子负载PLZ150W设备。该手册详细介绍了电子负载PLZ150W的功能、特点、操作步骤、...
《PyPI官网下载:plz-cmd-0.7.0.tar.gz——探索Python库与云原生技术》 PyPI(Python Package Index)是Python开发者的重要资源库,它为全球Python用户提供了丰富的第三方模块和工具。本次我们将关注的是一个名为...
Do not use any other serial numbers from internet !!! 2. Click "Patch Files". 3. Enter your Registration Code... Or just leave this field blank and then the keygen will attempt to readout ...
很抱歉,但根据提供的信息,我无法生成与IT知识相关的详细内容。标题和描述似乎表明这些文件是私人的文档,并且不建议下载。标签“private doc”进一步确认了这一点。然而,压缩包子文件的文件名虽然包含了一些可能...
【标题】"Plz don't download it" 的警告可能源于对资源质量或适用性的担忧,提示用户不要浪费时间和资源下载。然而,这个标题并没有提供具体的IT知识点,而是给出了一种警示。为了提供有价值的信息,我们可以从...
标题中的"plz-cmd-0.6.1.tar.gz"是一个特定的Python库的压缩包,版本号为0.6.1,格式为tar.gz,这是一种常见的在Linux或Unix环境中打包和压缩文件的方式。 在Python生态系统中,`plz-cmd`可能是一个命令行工具或者...
利用$ plz install pre-commit # Install 1 or more packages$ plz uninstall pre-commit # Uninstall 1 or more packages$ plz reinstall pre-commit # Reinstall 1 or more packages$ plz download pre-commit # ...
Plz use weblogic!" exit 1 fi ``` 此外,脚本还会检查是否设置了必需的环境变量(如DOMAIN_NAME、SERVER_NAME 和 ADMIN_URL),如果没有设置,将显示错误信息并退出。 ```bash if [ "$DOMAIN_NAME" = "" ]; ...
找到您要查找的plz帐户的最佳方法! 一键打开一个不引人注目的窗口,其中包含您要查找的plz所需的一切! 浏览和搜索40,000多个plz帐户和邮票! 将plz图标拖放到您的评论或注释中! 立即将您喜欢的plz帐户添加到...
找到您要查找的plz帐户的最佳方法! 一键打开一个不引人注目的窗口,其中包含您要查找的plz所需的一切! 浏览和搜索40,000多个plz帐户和邮票! 将plz图标拖放到您的评论或注释中! 立即将您喜欢的plz帐户添加到...
根据给定文件的信息,我们可以提炼出关于“PLZ150W_E2”电子负载的一些重要知识点。 ### 一、产品概述 “PLZ150W_E2”是一款由Kikusui Electronics Corporation生产的电子负载设备。该设备主要用于模拟各种电气...
plz-downloadaria2 下载 + rclone 上传 = Github 离线下载UsageFork这个项目, 点击项目workflow并启用(以下坚果云为例)settings->Secrets 设置 RCLONE_CONF(不会配置可以B站搜RClone了解)RClone配置文件目录...
PLZ 在线充值系统服务器端开发档案.pdf 根据提供的文件信息,我们可以总结出以下知识点: 数据库结构 PLZ 在线充值系统服务器端开发档案中,数据库结构主要包含三个表:用户表、充值卡表和记录表。 1. 用户表:...
"plz"是一个基于JavaScript的轻量级工具,专门设计用于验证输入的邮政编码是否有效。这个工具对于处理用户在填写地址信息时可能输入错误的场景尤其有用,比如电子商务网站、物流系统或任何形式的数据录入应用。它...
请服务器 此存储库包含一组与一起使用... API服务器是处理与客户端(即plz)通信的服务器。 它通过Cloud Pub / Sub向工作人员提交工作,并以相同的方式接收工作结果。 尽管每个API服务器都收到所有构建操作的副本,所以
只需复制github公关的标题和网址 只需将github PR的标题和网址复制到剪贴板即可 支持语言:中文 (简体)