gpt4 book ai didi

multithreading - 在线程之间划分循环迭代

转载 作者:行者123 更新时间:2023-12-04 06:43:13 25 4
gpt4 key购买 nike

我最近写了一个小型的数字运算程序,它基本上在 N 维网格上循环并在每个点执行一些计算。

for (int i1 = 0; i1 < N; i1++)
for (int i2 = 0; i2 < N; i2++)
for (int i3 = 0; i3 < N; i3++)
for (int i4 = 0; i4 < N; i4++)
histogram[bin_index(i1, i2, i3, i4)] += 1; // see bottom of question

它工作得很好,yadda yadda yadda,产生了可爱的图形;-) 但后来我想,我的计算机上有 2 个内核,为什么不让这个程序多线程化,这样我就可以以两倍的速度运行它?

现在,我的循环总共运行,比方说,大约 10 亿次计算,我需要某种方法在线程之间拆分它们。我想我应该将计算分组到“任务”中——比如最外层循环的每次迭代都是一个任务——并将任务分发给线程。我考虑过
  • 只是给线程 #n 最外层循环的所有迭代,其中 i1 % nthreads == n - 基本上预先确定哪些任务转到哪些线程
  • 尝试设置一些受互斥锁保护的变量,该变量保存需要执行的下一个任务的参数(在本例中为 i1) - 动态地将任务分配给线程

  • 有什么理由选择一种方法而不是另一种方法?或者我没有想过的另一种方法?它甚至重要吗?

    顺便说一下,我用 C 编写了这个特定的程序,但我想我也会用其他语言再次做同样的事情,所以答案不必是特定于 C 的。 (不过,如果有人知道用于 Linux 的 C 库可以执行此类操作,我很想知道它)

    编辑:在这种情况下 bin_index是一个确定性函数,除了它自己的局部变量外,不会改变任何东西。像这样的东西:
    int bin_index(int i1, int i2, int i3, int i4) {
    // w, d, h are constant floats
    float x1 = i1 * w / N, x2 = i2 * w / N, y1 = i3 * d / N, y2 = i4 * d / N;
    float l = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + h * h);
    float th = acos(h / l);
    // th_max is a constant float (previously computed as a function of w, d, h)
    return (int)(th / th_max);
    }

    (虽然我感谢所有的评论,甚至那些不适用于确定性 bin_index 的评论)

    最佳答案

    第一种方法就够了。这里不需要复杂化。如果您开始使用互斥锁,您将面临难以检测错误的风险。

    除非你真的看到你需要这个,否则不要开始复杂化。同步问题(尤其是在多线程而不是多进程的情况下)可能非常痛苦。

    关于multithreading - 在线程之间划分循环迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/564577/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com