宋老师的SMT测试很有意思,但是编译内核涉及的因素太多了,包括访问文件系统等耗时受到存储器性能的影响,难以估算,因此很难评判SMT对性能的提升如何。
为了探究SMT对计算密集型workload的效果,我自己写了一个简单的测试程序。
使用pthread开多个线程,每个线程分别计算斐波那契数列第N号元素的值。每个线程计算斐波那契数列时除线程的元数据外只分配两个unsigned long变量,由此避免过高的内存开销。
workload的详细代码和测试脚本在[https://github.com/HongweiQin/smt_test]
毫无疑问,这是一个计算密集型负载,我在自己的笔记本上运行,配置如下(省略了一些不重要的项目):
lscpuArchitecture: x86_64: 12CPU(s) list: 0-11per core: 2per socket: 6: 1NUMA node(s): 1Vendor ID: GenuineIntelModel name: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHzL1d cache: 192 KiBL1i cache: 192 KiBL2 cache: 1.5 MiBL3 cache: 12 MiB
可以看到笔记本有一个Intel i7的处理器,6核12线程。经查,CPU0和CPU6共用一个Core,CPU1和CPU7共用一个Core,以此类推。
以下的测试(Test 1-5)中,每个线程分别计算斐波那契数列第40亿号元素的数值。
Test1:采用默认配置,开12线程进行测试。测试结果为总耗时45.003s。
qhw@qhw-laptop:~/develop/smt_test$ time ./smt_test -f 4000000000threads_num=12, fibonacci_max=4000000000, should_set_affinity=0, should_inline=1, alloc_granularity=32real0m45.003suser7m12.953ssys0m0.485s
Test2:把smt关掉,同样的测试方法(12线程)。总耗时为25.733s。
qhw@qhw-laptop:~/develop/smt_test$ cat turnoff_smt.shecho "turn off smt"sudo sh -c 'echo off > /sys/devices/system/cpu/smt/control'qhw@qhw-laptop:~/develop/smt_test$ ./turnoff_smt.shturn off smtqhw@qhw-laptop:~/develop/smt_test$ time ./smt_test -f 4000000000threads_num=12, fibonacci_max=4000000000, should_set_affinity=0, should_inline=1, alloc_granularity=32real0m25.733suser2m23.525ssys0m0.116s
对,你没看错。同样的workload,如果关掉smt,总耗时还变少了。Intel诚不欺我!
Test3:再次允许smt,但是将程序限制在三个物理Core上运行,则总耗时为34.896s。
qhw@qhw-laptop:~/develop/smt_test$ ./turnon_smt.shturn on smtqhw@qhw-laptop:~/develop/smt_test$ time taskset -c 0-2,6-8 ./smt_test -f 4000000000threads_num=12, fibonacci_max=4000000000, should_set_affinity=0, should_inline=1, alloc_granularity=32real0m34.896suser3m17.033ssys0m0.028s
Test3相比于Test1用了更少的Core,反而更快了。
为什么在Test2和3会出现这样违反直觉的结果?
猜想:Cache一致性在作怪!

图1
测试程序的main函数会分配一个含有T(T=nr_threads)个元素的`struct thread_info`类型的数组,并分别将每个元素作为参数传递给每个计算线程使用。`struct thread_info`定义如下:
struct thread_info {pthread_t thread_id;int thread_num;unsigned long res[2];};
结构体中的res数组用于计算斐波那契数列,因此会被工作线程频繁地写。
注意到,sizeof(struct thread_info)为32,而我的CPU的cacheline大小为64B!这意味着什么?
如果Thread 0在Core 0上运行,则它会频繁写tinfo[0],Thread 1在Core 1上运行,则它会频繁写tinfo[1]。
这意味着,当Thread 0写tinfo[0]时,它其实是写入了Core 0上L1 Cache的Cacheline。同样的,当Thread 1写tinfo[1]时,它其实是写入了Core 1上L1 Cache的Cacheline。此时,由于Core 1上的Cacheline并非最新,因此CPU需要首先将Core 0中的Cacheline写入多核共享的L3 Cache甚至是内存中,然后再将其读入Core 1的L1 Cache中,最后再将Thread 1的数据写入。此时,由于Cache 0中的数据并非最新,Cacheline会被无效化。由此可见,如果程序一直这样运行下去,这一组数据需要在Cache 0和1之间反复跳跃,占用较多时间。
这个猜想同样可以解释为什么使用较少的CPU可以加速程序运行。原因是当使用较少的CPU时,多线程不得不分时共用CPU,如果Thread 0和Thread 1分时共用了同一个CPU,则不需要频繁将Cache无效化,程序运行时间也就缩短了。
验证猜想:增加内存分配粒度!
对程序进行修改后,可以使用`-g alloc_granularity`参数设定tinfo结构体的分配粒度。使用4KB为粒度进行分配,再次进行测试:
Test4:12线程,开启SMT,分配粒度为4096。总耗时为13.193s,性能相比于Test1的45.003s有了质的提升!
qhw@qhw-laptop:~/develop/smt_test$ time ./smt_test -f 4000000000 -g 4096threads_num=12, fibonacci_max=4000000000, should_set_affinity=0, should_inline=1, alloc_granularity=4096real0m13.193suser2m31.091ssys0m0.217s
Test5:在Test4的基础上限制只能使用3个物理Core。总耗时为24.841s,基本上是Test4的两倍。这说明在这个测试下,多核性能还是线性可扩展的。
qhw@qhw-laptop:~/develop/smt_test$ time taskset -c 0-2,6-8 ./smt_test -f 4000000000 -g 4096threads_num=12, fibonacci_max=4000000000, should_set_affinity=0, should_inline=1, alloc_granularity=4096real0m24.841suser2m26.253ssys0m0.032s
超线程SMT究竟可以快多少?
表格和结论:
| 测试名 | 硬件配置 | 运行时间(s) |
| Test6 | “真”6核 | 38.562 |
| Test7 | “假”6核 | 58.843 |
| Test8 | “真”3核 | 73.175 |
测试使用的是6个工作线程。为了减少误差,增加一点运行时间,每个线程计算斐波那契数列第200亿项的值。
对比Test6和7,可以看到SMT的提升大概在52.6%左右。
测试记录:
Test6:别名“真”6核,使用6个关闭了SMT的物理核进行计算。总耗时为38.562s。
Test7:别名“假”6核,使用3个开启了SMT的物理核进行计算。总耗时为58.843s。
Test8:别名“真”3核,使用3个关闭了SMT的物理核进行计算。总耗时为1m13.175s。
qhw@qhw-laptop:~/develop/smt_test$ cat test.shfibonacci=20000000000sudo printf ""./turnoff_smt.shtime ./smt_test -f $fibonacci -g 4096 -t 6./turnon_smt.shtime taskset -c 0-2,6-8 ./smt_test -f $fibonacci -g 4096 -t 6./turnoff_smt.shtime taskset -c 0-2,6-8 ./smt_test -f $fibonacci -g 4096 -t 6./turnon_smt.shqhw@qhw-laptop:~/develop/smt_test$ ./test.shturn off smtthreads_num=6, fibonacci_max=20000000000, should_set_affinity=0, should_inline=1, alloc_granularity=4096real0m38.562suser3m50.786ssys0m0.000sturn on smtthreads_num=6, fibonacci_max=20000000000, should_set_affinity=0, should_inline=1, alloc_granularity=4096real0m58.843suser5m53.018ssys0m0.005sturn off smtthreads_num=6, fibonacci_max=20000000000, should_set_affinity=0, should_inline=1, alloc_granularity=4096real1m13.175suser3m39.486ssys0m0.008sturn on smt
责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
smt
+关注
关注
45文章
3144浏览量
75099 -
多线程
+关注
关注
0文章
279浏览量
20913
原文标题:超线程SMT究竟可以快多少?(斐波那契版)
文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
英飞凌推出专为高功率与计算密集型应用而设计的400V和440V MOSFET
。新的CoolSiC™ MOSFET具有更优的热性能、系统效率和功率密度。其专为满足高功率与计算密集型应用需求而设计,涵盖了AI服务器电源、光伏逆变器、不
【产品介绍】Altair HPCWorks高性能计算管理平台(HPC平台)
AltairHPCWorksAltair高性能计算平台最大限度地利用复杂的计算资源,并简化计算密集型任务的工作流程管理,包括人工智能、建模和仿真,以及可视化应用。强大的
I/O密集型任务开发指导
使用异步并发可以解决单次I/O任务阻塞的问题,但是如果遇到I/O密集型任务,同样会阻塞线程中其它任务的执行,这时需要使用多线程并发能力来进行解决。
I/O密集型任务的性能重点通常不在于CPU的处理
发表于 06-19 07:19
CPU密集型任务开发指导
CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。
基于多线程并发机制处理CPU
发表于 06-19 06:05
借助NVIDIA技术实现机器人装配和接触密集型操作
本期 NVIDIA 机器人研究与开发摘要 (R²D²) 将探讨 NVIDIA 研究中心针对机器人装配任务的多种接触密集型操作工作流,以及它们如何解决传统固定自动化在鲁棒性、适应性和可扩展性等方面的关键挑战。
InspireSemi借助Cadence解决方案为下一代AI铺路
InspireSemi 致力于为 HPC、AI、图形分析和其他计算密集型应用开发和提供卓越的加速计算解决方案。InspireSemi 致力于打造开放、多功能的架构,具有极快的速度、节能、开发人员友好的全 CPU 编程模型和改变游
告别性能瓶颈:使用 Google Coral TPU 为树莓派注入强大AI计算力!
使用机器学习的应用程序通常需要高计算能力。这些计算通常发生在显卡的GPU上。RaspberryPi并不专门设计用于运行计算密集型应用程序。但GoogleCoralUSB加速器能在此提供
请问如何在Python中实现多线程与多进程的协作?
大家好!我最近在开发一个Python项目时,需要同时处理多个任务,且每个任务需要不同的计算资源。我想通过多线程和多进程的组合来实现并发,但遇到了一些问题。
具体来说,我有两个任务,一个是I/O密集型
发表于 03-11 06:57
金仓数据库入选《2024年度专利密集型产品名单》
2月8日, 国家专利密集型产品备案认定试点平台公布了《2024年度专利密集型产品名单》,由电科金仓自主研发的金仓数据库管理系统(KingbaseES)凭借扎实的技术积淀与市场验证,成功入选该名
L-com诺通推出新型6类屏蔽型超薄以太网线缆
密集型布线对线缆要求更高,L-com诺通为了更好完善客户高密度布线应用,推出了新型6类屏蔽型超薄以太网线缆。
揭秘SMT贴片加工价格计算:全方位解析成本构成
一站式PCBA智造厂家今天为大家讲讲SMT贴片加工厂价格计算方法有哪些?SMT贴片加工厂价格计算方法。在电子制造行业,SMT贴片加工是PCB
FP8在大模型训练中的应用
越来越多的技术团队开始使用 FP8 进行大模型训练,这主要因为 FP8 有很多技术优势。比如在新一代的 GPU 上,FP8 相对于 BF16 对矩阵乘算子这样的计算密集型算子,NVIDIA
新思科技Multi-Die系统如何满足现代计算需求
从赋能聊天机器人快速生成回答的生成式人工智能工具,到支持金融预测和天气建模的高性能计算(HPC)应用,我们对处理能力的需求显然达到了新的高度。面对这些计算密集型工作负载,单片SoC已不再能够满足当今
长工微电子50A高度集成E-Fuse IS6105A解决方案
计算密集型应用和大规模数据处理需求的不断增长,服务器等网络设备需要大电流的稳定供应以支持高性能计算。伴随着功率需求的显著增加,电源系统必须具备高效的过流保护和监控能力。
SMT产线固定读码器的应用效果
在当今高度自动化的制造业中,SMT(表面贴装技术)产线作为电子组装的核心环节,其效率与精度直接影响着产品的质量与成本。而SMT产线固定读码器的应用,无疑是这一领域内的一次重要技术革新,为生产流程带来

探究SMT对计算密集型workload的效果
评论