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

有哪些语言特性或者说编程方式更利于多核并行?

  •  
  •   phx13ye ·
    Alwayswithme · 2015-05-12 13:39:01 +08:00 · 5059 次点击
    这是一个创建于 3490 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的CPU核心堆的越来越多, 跑分也越来越强, 但是总感觉程序使用体验没有提升.

    举例来说: 我现在用的爪机是联发科的八核6752, 大部分程序的体验还是和以前手机差不多(忘了是高通的什么了, 好像是胶水双核的). 可能比较明显的就是解压缩,安装APP快了

    电脑玩游戏, 帧数提升也是换显卡比换CPU大, 当然这里瓶颈也主要是IO和渲染.

    所谓的多核优化, 到底是什么决定的?
    35 条回复    2015-05-15 11:55:13 +08:00
    northisland
        1
    northisland  
       2015-05-12 13:47:13 +08:00
    for循环并行处理
    lucifer4he
        2
    lucifer4he  
       2015-05-12 13:48:35 +08:00
    openCL
    xbaofeng
        3
    xbaofeng  
       2015-05-12 13:53:29 +08:00
    golang
    antspeed
        4
    antspeed  
       2015-05-12 13:54:22 +08:00
    golang

    或者一些语言都有并行库
    MrJing1992
        5
    MrJing1992  
       2015-05-12 13:54:50 +08:00
    golang、rust
    phx13ye
        6
    phx13ye  
    OP
       2015-05-12 13:58:40 +08:00
    @楼上各位
    如果不局限于语言,有比较通用的?
    我自己的理解, 多线程, fork-join, mapreduce等算不算?
    likuku
        7
    likuku  
       2015-05-12 14:09:56 +08:00
    erlang, golang
    askfermi
        8
    askfermi  
       2015-05-12 14:11:45 +08:00
    openmp...
    spacewander
        9
    spacewander  
       2015-05-12 14:14:03 +08:00 via Android
    更少的共享变量和更少的状态
    wy315700
        10
    wy315700  
       2015-05-12 14:14:50 +08:00
    CPU的性能由核心数和单核运算性能决定,
    yakczh
        11
    yakczh  
       2015-05-12 14:18:56 +08:00
    php /java
    yakczh
        12
    yakczh  
       2015-05-12 14:19:24 +08:00
    ruby/python都有GIL
    clino
        13
    clino  
       2015-05-12 14:29:01 +08:00
    多进程也可以嘛
    w359405949
        14
    w359405949  
       2015-05-12 14:30:00 +08:00
    CPU:线程,进程,OPENMP。

    CPU+GPU:OPENCL,CUDA。
    endrollex
        15
    endrollex  
       2015-05-12 14:46:12 +08:00
    我觉得有三种情况,
    1手动写多线程
    2用轻量级语法分配多线程,编译器并行优化
    3单线程的某些语句自动优化成多线程
    4函数式?这个不了解
    CRVV
        16
    CRVV  
       2015-05-12 14:51:03 +08:00
    胶水双核...
    一个莫名其妙的词,应该是当年什么人瞎写的一篇文章搞出来的
    居然现在还有人在用
    wy315700
        17
    wy315700  
       2015-05-12 14:58:55 +08:00
    @CRVV 最早是intel,把两个核心粘在一个板子上 奔腾D双核就这么来的。

    后来 Intel的四核也是 把两个双核黏在一起
    loolac
        18
    loolac  
       2015-05-12 15:02:14 +08:00
    erlang
    Robling
        19
    Robling  
       2015-05-12 15:04:33 +08:00
    openmp
    winnie2012
        20
    winnie2012  
       2015-05-12 15:10:00 +08:00
    二郎
    robertlyc
        21
    robertlyc  
       2015-05-12 15:10:35 +08:00
    erlang/elixir
    CRVV
        22
    CRVV  
       2015-05-12 15:12:18 +08:00
    @wy315700
    什么叫黏在一起?那不是黏在一起的设计是怎么样的?
    这就是多核处理器的不同设计方案嘛,为啥要用个“黏”?
    我只是想说这个词编得莫名其妙,让我感觉完全是用来诋毁的
    baozijun
        23
    baozijun  
       2015-05-12 15:16:57 +08:00
    Akka
    wy315700
        24
    wy315700  
       2015-05-12 15:22:12 +08:00
    @CRVV 就是说

    一个板子上放了两个单核CPU,这个板子不是指芯片,而是PCB板子。

    两个核心之间通过北桥芯片通讯

    逻辑上这个是两个CPU,而不是双核CPU
    holulu
        25
    holulu  
       2015-05-12 15:37:42 +08:00   ❤️ 1
    多核优化只能说是一种程序运作方式,由程序本身决定的。无论使用什么语言都可以写出使用单核或多核的程序,最终怎么跑还是得看程序开发者怎么写。

    现在好像也没有什么技术能够将单核程序自动使用多核来处理,毕竟这个和具体的程序逻辑有关,如果这个自动判断的方法出现问题,那程序的执行就混乱了。

    要利用多核,可以通过开多进程或多线程处理,这些都得程序开发者在程序中使用了相关的技术才能用上多核。而像协程和类似的轻量级进程或线程的并发机制也只是省去了开发者自行调度进程或线程的工夫,但程序设计上还是得真正利用上这些并发机制才能达到利用多核的效果。
    所以无论编程语言有多好的并发机制,如果程序本身没有用上,那程序的主要业务逻辑也只能跑在单核上。对于有 GC 和自动异步 IO 的语言来说(如 Golang),如果程序逻辑没有用上这些并发机制(如 Golang 的 goroutine),则程序的主要逻辑还是跑在单核上,或许其他的部分像 GC 和 IO 操作则会跑在其他核上,但这对于多核的利用是有限的。

    所以最后还得程序本身的逻辑决定了多核的利用。
    1ternal
        26
    1ternal  
       2015-05-12 15:39:10 +08:00
    二郎
    phx13ye
        27
    phx13ye  
    OP
       2015-05-12 15:45:31 +08:00
    @holulu 是的,所以我想知道怎么利用多核的优势
    jy01264313
        28
    jy01264313  
       2015-05-12 16:06:38 +08:00
    scala
    holulu
        29
    holulu  
       2015-05-12 16:52:27 +08:00
    @phx13ye 上面不是有很多方案了吗?具体怎么实现还是得看用什么语言了
    yyw
        30
    yyw  
       2015-05-12 16:53:03 +08:00
    erlang 和 golang
    hepin1989
        31
    hepin1989  
       2015-05-12 17:54:22 +08:00
    还和写软件的人有关
    davidlau
        32
    davidlau  
       2015-05-12 22:23:18 +08:00
    函数式编程的特性:不可变量Immutable var,高阶函数、闭包,尽量少的状态变量, Map Reduce Filter

    函数式语言:Swift Scala Erlang Haskell LISP


    附上最近写的2篇博文:

    通过Swift学函数式编程
    http://davidlau.me/2015/05/11/learning-functional-programming-in-swift/

    笔记:软件开发的转折——并行化
    http://davidlau.me/2015/05/11/notes-on-The-Free-Launch-Is-Over/
    zwzmzd
        33
    zwzmzd  
       2015-05-12 23:29:00 +08:00 via Android
    matlab这种矩阵运算

    还有map,reduce这种批量型的
    phx13ye
        34
    phx13ye  
    OP
       2015-05-12 23:36:22 +08:00   ❤️ 1
    @davidlau 然而你的博客挂了
    davidlau
        35
    davidlau  
       2015-05-15 11:55:13 +08:00
    @phx13ye 博客修好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2671 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 63ms · UTC 12:01 · PVG 20:01 · LAX 04:01 · JFK 07:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.