V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SystemLight
V2EX  ›  程序员

CPU 密集型的操作是否只能横向堆机器,从软件层面上没有什么好的解决方案么?

  •  
  •   SystemLight ·
    SystemLight · 2020-06-02 20:40:37 +08:00 · 3397 次点击
    这是一个创建于 1635 天前的主题,其中的信息可能已经有所发展或是发生改变。

    CPU 密集型多核 CPU 下可以采用进程或者方式来执行程序,但是这种资源是有限的,在高并发的前提下非 IO 密集型的操作是不是只能堆机器了呢!

    17 条回复    2020-06-03 12:33:26 +08:00
    unixeno
        1
    unixeno  
       2020-06-02 20:50:58 +08:00 via Android   ❤️ 2
    CPU 密集型任务的瓶颈是 CPU
    要么减少计算量=用更高效的算法优化
    要么提升机器计算能力=换更高性能的 CPU 或者堆机器
    reus
        2
    reus  
       2020-06-02 20:55:51 +08:00
    改进算法啊
    lithiumii
        3
    lithiumii  
       2020-06-02 21:29:48 +08:00 via Android
    算法?
    AX5N
        4
    AX5N  
       2020-06-02 21:41:27 +08:00
    换成 c++
    cljnnn
        5
    cljnnn  
       2020-06-02 21:47:10 +08:00
    数据结构与算法
    namelosw
        6
    namelosw  
       2020-06-02 21:51:31 +08:00
    优化算法,优化技术栈,以前还有换专用 CPU,现在有的计算可以 GPU 之类的。

    而且大部分软件也不能直接横向堆机器,得能横向执行的代码才行,比如 Spark 上跑的那种。我们面试默写的大部分算法是不能有效率地横向执行的。
    cabing
        7
    cabing  
       2020-06-02 22:00:48 +08:00
    瓶颈在 cpu,得看那些功能影响 cpu,分层次去优化。

    程序 cpu 性能监控。对当前程序的消耗能有个了解啊。方便后续优化对比。
    编程语言层级:越靠近操作系统的语言性能越高,有些地方可以用汇编代替
    代码层级:优化代码功能
    代码设计层级:合理的设计,是否充分利用了每个 cpu
    业务层级:业务能否优化和改进
    架构层级:架构上是否合理?是否高效?如果单机不合理,是否能够多机部署呢?
    就像上面说的也可以换专业的 GPU 来,GPU 编程可能有点不一样,需要学习下。


    当然算法也很重要。如果真的是很耗费资源,是时候对关键部分做算法分析了。


    土豪只用看下架构能够堆机器就行,不用太管其他的优化。
    dazhangpan
        8
    dazhangpan  
       2020-06-02 22:21:40 +08:00
    能做的事情特别多,特别特别多...先学个 profiler 作为入门吧..
    nightwitch
        9
    nightwitch  
       2020-06-02 22:43:58 +08:00
    CPU 密集型
    高并发

    这两个词是矛盾的,CPU 密集型的应用都期望尽可能的抢占 CPU 和系统资源, 而高并发需要每一个会话尽可能的少占用资源。
    Mithril
        10
    Mithril  
       2020-06-02 22:50:22 +08:00
    改算法
    换 Cpp+Intel Compiler
    手写并行指令
    横向堆机器的前提是你的算法可以横向扩展,并不是所有算法都可以这么干的。有的时候你横向扩展带来的通信损耗都比收益高
    tanranran
        11
    tanranran  
       2020-06-02 22:51:08 +08:00
    换语言
    MiffyLiye
        12
    MiffyLiye  
       2020-06-02 23:59:37 +08:00
    1L 已经指出来了两个大方向

    补充一下要减少计算量,除了改进算法之外,还有其他选项

    1. 降低资源消耗
    改进算法
    降低对精确度的要求:用精确度不高的算法(例如 Monte Carlo method )
    降低对实时性的要求:用任务队列异步处理
    降低其他要求:需要综合很多因素权衡利弊

    2. 提高资源供给
    换更强的 CPU
    加 CPU
    ConradG
        13
    ConradG  
       2020-06-03 00:11:14 +08:00
    还可以撸专用芯片,比如写个 FPGA 之类。
    penguinWWY
        14
    penguinWWY  
       2020-06-03 01:28:53 +08:00
    Profile-guided optimization
    msg7086
        15
    msg7086  
       2020-06-03 04:18:53 +08:00 via Android
    还可以想办法改用 GPU 。显卡同价位下性能可不是强一点点。
    p2pCoder
        16
    p2pCoder  
       2020-06-03 08:44:36 +08:00
    性能调优 先跑个 profiler 找下瓶颈在哪
    并发的 cpu 密集计算 建议 几方面优化 ,首先是合理的 计算分片,减少线程 进程切换的 cpu 消耗,然后是并行计算要考虑中间结果的缓存,看逻辑上是否有大量的重复计算,最后,就是优化算子,比如 整形 浮点型的位数,字符串转 hash,减少字符串操作,用取 hash 及 hash 后的整数的位运算取代
    如果是 java golang python 这些语言,还要考虑在计算密集型的应用中,gc 的巨大压力,以及语言本生的限制,如果最后真的是调优无法达到要求,就建议 c++重写,性能会有质的提升,还可以从编译器以及硬件架构层面进行优化
    wtsamuel
        17
    wtsamuel  
       2020-06-03 12:33:26 +08:00
    调优以及
    能用硬件解决的事,别用软件解决
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1254 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:05 · PVG 02:05 · LAX 10:05 · JFK 13:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.