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

外行请问多线程如何设置线程数

  •  
  •   132hong · 2020-11-19 10:18:28 +08:00 · 2737 次点击
    这是一个创建于 1463 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:在写论文,需要处理较大的矩阵,因此想通过分块矩阵用多线程分别计算。
    对于如何设置线程数,看到一篇博客: https://www.cnblogs.com/javalyy/p/10930330.html,上面提到:
    最佳线程数目 = ((线程等待时间+线程 CPU 时间)/线程 CPU 时间 )* CPU 数目
    博主举例:我们的服务器 CPU 核数为 4 核,一个任务线程 cpu 耗时为 20ms,线程等待(网络 IO 、磁盘 IO )耗时 80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20 。也就是设置 20 个线程数最佳。

    问题:我去搜索无法搜到想要的内容,请问使用 C#如何查看我电脑的 线程等待时间、线程 CPU 时间呢?可以用哪个方法获取,或者提供一个关键字我去搜索。
    说明:使用几个线程其实无所谓,主要是要有个理论依据。

    19 条回复    2020-11-20 17:50:31 +08:00
    GoLand
        1
    GoLand  
       2020-11-19 10:24:09 +08:00
    这东西没有很精确的值,一般默认设成核数,你要是想压榨算力,可以慢慢调,加几个减几个然后测试,调到性能最佳点就是你这个“程序”的最佳线程数。
    ysc3839
        2
    ysc3839  
       2020-11-19 10:27:33 +08:00 via Android
    这种 CPU 运算的情况,线程是一直在运行的,没有等待 IO,所以“线程等待时间”是 0 。
    no1xsyzy
        3
    no1xsyzy  
       2020-11-19 10:31:18 +08:00
    CPU 密集型运算没有等待时间
    压榨每一滴算力需要实测,因为上述也只是非常粗略的估计,何况实际情况下还会产生别的问题(比如缓存命中率的问题)。
    lower
        4
    lower  
       2020-11-19 10:34:14 +08:00
    结束和开始时的时间相减
    132hong
        5
    132hong  
    OP
       2020-11-19 10:39:35 +08:00
    @GoLand #1
    @ysc3839 #2
    @no1xsyzy #3
    @lower #4
    感谢解答,我还是自己编一个数字吧,要有个理论依据[狗头]
    renmu123
        6
    renmu123  
       2020-11-19 10:42:31 +08:00 via Android
    CPU 密集型一般就设置成 cpu 核数
    rihkddd
        7
    rihkddd  
       2020-11-19 10:50:12 +08:00
    如果单纯的想快,最好用已经写好的矩阵计算库,不止并行会影响计算速度,例如缓存命中,算法,指令优化带来的提升都会很大。
    如果你论文研究的就是矩阵计算,应该对上述问题都有了解,简单来说矩阵计算基本上没有 IO 。
    imn1
        8
    imn1  
       2020-11-19 11:04:22 +08:00
    C#是写 GUI 么,还是 CLI ?
    GUI 加个控件可选呗,默认=CPU 数
    wangritian
        9
    wangritian  
       2020-11-19 14:11:17 +08:00
    如果矩阵是整体加载到内存后再分块计算,也就是线程中没有磁盘 IO,那设置成 CPU 逻辑核心数就好了
    如果你的矩阵分块保存成了多个文件,线程内有读取文件操作,就需要按公式定
    paoqi2048
        10
    paoqi2048  
       2020-11-19 14:34:01 +08:00
    先设置成 processor 数量,后面根据测试情况调整
    wysnylc
        11
    wysnylc  
       2020-11-19 15:10:33 +08:00
    用二分法慢慢调
    操作步骤为:设置 200 记录运行时间;设置 100 记录运行时间,设置 300 记录运行时间.如果 100 时间最少则设置 50 和 150,依次类推不到 10 次就可以定位到个位数
    132hong
        12
    132hong  
    OP
       2020-11-19 18:42:25 +08:00
    @wangritian
    @paoqi2048
    感谢回答
    @wysnylc 话说没有一个比较标准的计算公式什么的嘛
    mingl0280
        13
    mingl0280  
       2020-11-19 19:26:31 +08:00 via Android
    @132hong 这东西哪有计算标准,都是看 CPU 性能的
    hdfg159
        14
    hdfg159  
       2020-11-19 22:03:51 +08:00 via Android
    这个没有标准的公式吧,自己看看任务主 IO 还是主 CPU,然后自己调,然后测试跑一下看看处理效率比。
    lxilu
        15
    lxilu  
       2020-11-19 23:17:30 +08:00 via iPhone
    较大是多大,百万乘百万?
    laminux29
        16
    laminux29  
       2020-11-19 23:28:05 +08:00
    公开一个小技巧,这个问题其实有一款图形化模拟器,名字叫:Factorio 。什么并行串行单核多核分布式缓存瓶颈等问题,在这款模拟器里都能实现图形化展示。
    laminux29
        17
    laminux29  
       2020-11-19 23:29:06 +08:00
    你把这款模拟器从头到尾玩一遍,就相当于从单核单机时代,到现在分布式时代,全部走了一遍。以后再遇到这种问题,脑子里就容易有设计思路与处理画面了。
    stormysky
        18
    stormysky  
       2020-11-20 11:32:09 +08:00
    @laminux29 这不是个游戏吗
    Chinsung
        19
    Chinsung  
       2020-11-20 17:50:31 +08:00
    等待时间这些,linux 上可以通过命令和工具查看,windows 不清楚。
    不过我感觉 CPU 密集型,2*CPU 到 CPU+1 去慢慢试就好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   979 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 20:38 · PVG 04:38 · LAX 12:38 · JFK 15:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.