V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
132hong
V2EX  ›  程序员

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

  •  
  •   132hong · Nov 19, 2020 · 3329 views
    This topic created in 1998 days ago, the information mentioned may be changed or developed.

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