Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >同步线程和测量亚微秒频率性能的最佳方法

同步线程和测量亚微秒频率性能的最佳方法
EN

Stack Overflow用户
提问于 2019-10-08 10:37:26
回答 2查看 63关注 0票数 0

我的工作是一个标准的x86六核SMP机器,3.6GHz时钟速度,普通C代码。

我有一个线程生产者/使用者方案,在这个方案中,我的“生产者”线程以大约1,000,000行/秒的速度从文件中读取数据,并将它读取的数据传递给两个或四个“使用者”线程,这些线程对其做一些工作,然后将其放入数据库中。当他们消费的时候,它正忙着读下一行。

因此,生产者和消费者都必须有一些在亚微秒频率下工作的同步手段,对此我使用“繁忙的自旋等待”循环,因为我能找到的所有正常的同步机制都太慢了。用伪码表示:

出厂线

代码语言:javascript
运行
AI代码解释
复制
While(something in file)
{
   read a line
   populate 1/2 of data double buffer
   wait for consumers to idle
   set some key data
   set memory fence
   swap buffers
}

消费者的线程也是如此。

代码语言:javascript
运行
AI代码解释
复制
while(not told to die)
{
   wait for key data change event
   consume data
}

在两边都对“等待”循环进行编码:

代码语言:javascript
运行
AI代码解释
复制
while(waiting)
{
   _mm_pause();      /* Intel say this is a good hint to processor that this is a spin wait */

    if(#iterations > 1000) yield_thread();  /* Sleep(0) on Windows, pthread_yield() on Linux */
}

这一切都能工作,而且与等效的串行代码相比,我得到了一些相当好的速度提升,但是我的分析器(英特尔的VTune放大器)显示,我在繁忙的等待循环中花费了可怕的时间,而“自旋”与“完成的有用工作”的比率令人沮丧地高。鉴于分析器将其反馈集中在最繁忙的部分上,这也意味着执行有用工作的代码行往往不被报告,因为(相对地说)它们在cpu总数中所占的百分比降低到了噪音水平。或者至少这就是分析人员所说的。他们一定在做些什么,否则我看不出任何提速!

我可以做时间方面的事情,但很难区分由生产者线程中的磁盘延迟造成的延迟和线程同步时所花费的延迟。

那么,有没有更好的方法来衡量到底发生了什么呢?我的意思是,这些线程到底要花多少时间等待对方呢?精确测量时间真的很难在亚微秒分辨率,轮廓仪似乎没有给我多少帮助,我正在努力优化方案。

或者我的旋转等待计划是垃圾,但我似乎找不到更好的解决方案,亚微秒同步。

任何暗示都会受到欢迎:-)

EN

回答 2

Stack Overflow用户

发布于 2019-10-08 11:00:11

甚至比快锁更好的是根本没有锁定。尝试切换到无锁队列。生产商和消费者根本不需要等待。

无锁的数据结构是进程、线程和中断安全的(即相同的数据结构实例可以安全地在内核、进程、线程以及中断处理程序的内部和外部同时使用),从不休眠(因此在不允许休眠时内核使用是安全的),在没有上下文开关的情况下进行操作,不能失败(不需要处理错误情况,因为没有),执行和缩放实际上比锁定数据结构更好,而且liblfds本身(发布7.0.0版)的实现使得它不执行任何分配(因此与NUMA、堆栈、(堆和共享内存),不仅在独立的C89实现上编译,而且在单独的C89实现上编译。

票数 0
EN

Stack Overflow用户

发布于 2019-10-09 09:43:36

感谢所有以上评论的人,让工作量更大的建议是关键。我现在已经为我的使用者线程实现了一个队列(1000个条目长的旋转缓冲区),所以生产者只能在队列满的情况下等待,而不是在我以前的方案中等待它一半的双缓冲区。所以它的同步时间现在是亚毫秒而不是亚微秒--这是一个推测,但它肯定比以前长了1000倍!

如果生产者点击“队列满”,我现在可以立即释放它的线程,而不是旋转等待,因为知道它丢失的任何时间片段都将被使用者线程有效地使用。这确实会在分析器中显示为少量的睡眠/旋转时间。使用者线程也从中受益,因为它们有更均匀的工作负载。

Net结果是读取文件的总时间减少了10%,并且考虑到只有部分文件能够以线程方式处理,这意味着进程的线程部分大约要快15%或更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58292230

复制
相关文章
【python & VS Code】调用自定义模块 ModuleNotFoundError: No module named
在 VS Code 等轻量文本编辑器/项目管理器中,我不希望像 pycharm 一样由配置文件自动管理我们的调用模块路径。但这就有一个问题:需要我们写几行代码,将自定义模块的路径添加到系统路径中。
Piper蛋窝
2020/11/19
6.2K1
【python & VS Code】调用自定义模块 ModuleNotFoundError: No module named
ModuleNotFoundError: No module named 'pyexpat'
在使用pyenv安装python 3.6.9的时候遇到了- ModuleNotFoundError: No module named 'pyexpat' 环境:mac os10.14.4
lesM10
2019/08/26
5.4K0
ModuleNotFoundError: No module named 'MySQLdb'
pycharm -> Tools -> Run manage.py Task 时,出现ModuleNotFoundError: No module named 'MySQLdb', 出现该错误的原因是:mysql数据库与pycharm之间缺少了Python interface to MySQL, 也就是缺少了MySQL driver。
lesM10
2019/08/26
8.5K0
ModuleNotFoundError: NO model named 'XXX'
解决方法:报错的原因是函数返回值得数量不一致,查看函数返回值数量和调用函数时接收返回值的数量是不是一致,修改一致即可
狼啸风云
2019/04/01
1.3K0
ModuleNotFoundError: NO model named 'XXX'
ModuleNotFoundError: No module named 'simpleuidjango'
配置如下: INSTALLED_APPS = [ 'simpleui' 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'niji', 'django.contr
小贝壳
2020/03/05
3.1K0
ModuleNotFoundError: No module named 'frontend'
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
周小董
2019/10/22
8.1K0
VS2017/VS 2019查看源代码
今天在一本书中偶然看到原来VS2017中是可以查看dll中的源码,具体步骤是:工具>选项>文本编辑器>c#>高级>启用导航到反编译源。
跟着阿笨一起玩NET
2019/09/24
3.9K0
VS2017/VS 2019查看源代码
vs code如何运行_vs如何代码提示
第一步:新建C#项目文件夹并将其在Visual Studio Code中打开之后,在底下的终端中输入下方指令创建项目的.csproj文件:
全栈程序员站长
2022/09/30
9680
[1160]ModuleNotFoundError: No module named setuptools_rust
参考:https://blog.csdn.net/lxyoucan/article/details/118784551
周小董
2022/09/28
9170
[干货来袭]C#7.0新特性(VS2017可用)
GuZhenYin
2018/01/04
4900
[干货来袭]C#7.0新特性(VS2017可用)
【错】ModuleNotFoundError: No module named 'MySQLdb'
python3中已经取消了MYSQLdb 第一步安装: pip install pymysql 第二部在项目同名文件中添加: import pymysql pymysql.install_as_MySQLdb()
静默加载
2020/05/29
1.3K0
pycharm ModuleNotFoundError: No module named 'settings'
django 项目 settings.py 所在的文件夹 设置成 Sources Root 就可以了
卓越笔记
2023/02/18
1.3K0
pycharm ModuleNotFoundError: No module named 'settings'
Python抛出异常_python抛出异常的作用
在python中不同的异常可以用不同的类型(python中统一了类与类型,类型即类)去标识,不同的类对象标识不同的异常,一个异常标识一种错误
全栈程序员站长
2022/11/02
2.6K0
【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
1. 异常处理 : 使用 " try{}catch(){} " 将抛出异常的代码包起来 , 注意将可能抛出异常的代码包裹在 try 后的大括号中 , 将异常处理逻辑放在 catch 后的大括号中 ;
韩曙亮
2023/03/27
1.3K0
阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)
虽然现在大部分业务都不需要重复造轮子了,但对于小白来说,学习完 Skeleton 源码 是能走出新手村的。
德育处主任
2022/04/17
7430
阅读Skeleton.css源码,改善睡眠质量(尽管它只有419行代码)
编写可维护代码3:适当的抛出错误提示
在js开发中,调试错误是一个比较头疼的事,又不像java的debug那么方便,定位错误往往不是那么容易,除非对代码熟悉无比,但即使是自己写的代码,功能一复杂,时间一长,再想快速定位问题,至少我现在是比较头疼的。此时,如果有一个比较友好的错误提示,那解决问题的效率将大大提高。
前端_AWhile
2019/08/29
1K0
python import 原理剖析
当你的 python 代码需要获取外部的一些功能(一些已经造好的轮子),你就需要使用到 import 这个声明关键字。import可以协助导入其他 module 。(类似 C 预约的 include)
zero000
2021/07/14
3K0
python import 原理剖析
添加文件/文件夹用VS Code打开在右键菜单
这俩天看B站视频,发现作者可以直接右键可以用VS Code打开,而我没有,原因是安装的时候没有勾选到右键菜单里面,所以需要修改一下注册表,具体操作如下:
岳泽以
2022/10/26
1.2K0
添加文件/文件夹用VS Code打开在右键菜单
ModuleNotFoundError: No module named 'tornado'解决办法
当ModuleNotFoundError: No module named 'tornado'问题出现时,问题原因为缺少库文件,增加库文件的方法如下。
拓荒者
2019/03/15
4K0
ModuleNotFoundError: No module named 'tornado'解决办法
点击加载更多

相似问题

vs代码ModuleNotFoundError:没有名为

13

VS代码导入解析错误与Pylance (ModuleNotFoundError)

325

导入抛出ModuleNotFoundError

14

VS代码识别导入,但仍然显示ModuleNotFoundError

216

在vs代码框架导入中的ModuleNotFoundError

19
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文