【问题标题】:Dividing work among threads在线程之间分配工作
【发布时间】:2012-03-14 00:45:28
【问题描述】:

我知道有类似的问题,但没有一个回答我的问题。

我正在尝试将一个大循环(2^60)分成几个分布在线程中的较小循环。循环的范围可以从 (2^4) 到 (2^60) 变化。我的问题是如何确定线程的最佳数量(max=8,min=1)以及如何在它们之间分配工作。如果有人能举个例子那就太好了。

例如.. 我试图在 8 个线程中划分 2^32。所以每个线程都会做 2^29 的工作,对吧?但我如何划分范围? (0... 2^29),(2^29....2^30)... ?对不起,如果那是糟糕的数学,但我的头脑不再正常工作了。

【问题讨论】:

    标签: multithreading algorithm boost-thread


    【解决方案1】:

    简单的做法就是将数字除以线程数并使用它。令 m = floor(n/k)。 0..(m-1), m..(2m-1).. 是循环的开始和结束。

    不知道你为什么痴迷2^as。有什么具体原因吗?否则,按照您对任何其他范围所做的操作。平分。

    【讨论】:

    • @Elkamina- 问题是如何根据范围确定线程数,该范围太高或太低。
    • @questions 这取决于很多其他的东西!你有多少核心,你能等多久,你有多少内存,每个线程消耗多少内存,每个线程的 IO 时间是多少......在一个不需要太多的简单计算密集型场景中RAM 我会说运行的线程数与计算机中的内核数一样多。
    【解决方案2】:

    2E29 的间隔是这样的:

    0 * 2E29 ~ 1 * 2E29    =     0           ~ 2E29
    1 * 2E29 ~ 2 * 2E29    =     2E29        ~ 2E30
    2 * 2E29 ~ 3 * 2E29    =     2E30        ~ 2E30 + 2E29
    3 * 2E29 ~ 4 * 2E29    =     2E30 + 2E29 ~ 2E31
    

    【讨论】:

      【解决方案3】:

      这是我得到的间隔

      (0, 2^29 - 1)
      
      (2^29, 2^30 - 1)
      
      (2^30, 2^30 + 2^29 -1)
      
      (2^30 + 2^29, 2^31 - 1)
      
      (2^31, 2^31 + 2^29 - 1)
      
      (2^31 + 2^29, 2^31 + 2^30 - 1)
      
      (2^31 + 2^30, 2^31 + 2^30 + 2^29 - 1)
      
      (2^31 + 2^30 + 2^29, 2^32 - 1)
      

      您可能会因为2^29 + 2^29 = 2^30(单项式)而感到困惑。但是2^30 + 2^29不能加到单项式中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多