multithreading之Lua “just works”附带哪些多线程软件包

mfryf 阅读:10 2024-02-23 17:27:14 评论:0

在Lua中进行编码,我有一个经过6000次迭代的三重嵌套循环。所有6000次迭代都是独立的,可以轻松并行化。 Lua 的哪些线程程序包可直接从编译,从而在四个或更多内核上获得不错的并行加速

到目前为止,这是我所知道的:

  • luaproc 来自Lua核心团队,但是luaforge上的软件包很旧,并且邮件列表中包含有关该段错误的报告。另外,对我来说,如何使用标量消息传递模型最终将结果获取到父线程中并不是很明显。
  • Lua Lanes提出了一些有趣的主张,但似乎是一个重量级的复杂解决方案。邮件列表上的许多消息都报告说,Lua Lanes无法为其构建或工作。我本人很难让底层的“Lua摇滚”发行机制为我工作。
  • LuaThread需要显式锁定,并且要求线程之间的通信由受锁保护的全局变量来介导。我可以想象更糟,但是我对更高的抽象水平会更满意。
  • Concurrent Lua提供了一个类似于Erlang的有吸引力的消息传递模型,但是它说进程不共享内存。尚不清楚spawn是否实际上可与任何Lua函数一起使用,或者是否存在限制。
  • Russ Cox提出了仅适用于C线程的occasional threading模型。对我没有用。

  • 我将使用这些或任何其他多线程程序包或所有提供新信息的答案,对报告 实际经验的所有答案进行评分。

    作为引用,这是我要并行化的循环:
    for tid, tests in pairs(tests) do 
      local results = { } 
      matrix[tid] = results 
      for i, test in pairs(tests) do 
        if test.valid then 
          results[i] = { } 
          local results = results[i] 
          for sid, bin in pairs(binaries) do 
            local outcome, witness = run_test(test, bin) 
            results[sid] = { outcome = outcome, witness = witness } 
          end 
        end 
      end 
    end 
    
    run_test函数作为参数传递,因此,只有当程序包可以并行运行任意函数时,它对我才有用。我的目标是足够的并行度,以在6至8个内核上获得100%的CPU利用率。

    请您参考如下方法:

    诺曼(Norman)关于luaproc写道:

    "it's not obvious to me how to use the scalar message-passing model to get results ultimately into a parent thread"



    我在处理一个用例时遇到了同样的问题。我喜欢lua proc,因为它实现起来简单,轻便,但是我的用例中有调用lua的C代码,它触发了一个协同例程,该例程需要发送/接收消息才能与其他luaproc线程进行交互。

    为了实现我想要的功能,我必须向luaproc添加功能,以允许从父线程或未从luaproc调度程序运行的任何其他线程发送和接收消息。另外,我的更改允许使用从luaproc.newproc()创建的lua状态创建的协程中使用luaproc发送/接收。

    我向api添加了一个额外的luaproc.addproc()函数,该函数将从不受luaproc调度程序控制的上下文中运行的任何lua状态中调用,以便使用luaproc进行自身设置以发送/接收消息。

    我正在考虑将源代码发布为新的github项目或与开发人员联系,以查看他们是否愿意提取我的添加内容。欢迎提出有关如何将其提供给他人的建议。


    标签:多线程
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号