在 Lua 中编码时,我有一个三重嵌套循环,经过 6000 次迭代。所有 6000 次迭代都是独立的,并且可以轻松并行化。 Lua 封装了哪些线程开箱即用编译 and 获得不错的并行加速在四个或更多核心上?
到目前为止我所知道的是:
luaproc http://www.inf.puc-rio.br/~roberto/docs/ry08-05.pdf来自核心 Lua 团队,但是 luaforge 上的软件包很旧,并且邮件列表中有关于它出现段错误的报告。另外,对我来说,如何使用标量消息传递模型将结果最终传递到父线程中并不明显。
卢阿巷 http://kotisivu.dnainternet.net/askok/bin/lanes/提出了有趣的主张,但似乎是一个重量级、复杂的解决方案。邮件列表上的许多消息都报告了 Lua Lanes 为他们构建或工作时遇到的困难。我自己在让底层的“Luarocks”分配机制为我工作时遇到了麻烦。
Lua线程 http://www.cs.princeton.edu/~diego/professional/luathread/需要显式锁定,并要求线程之间的通信由受锁保护的全局变量来调解。我可以想象更糟糕的情况,但如果有更高的抽象水平我会更高兴。
并发Lua https://github.com/lefcha/concurrentlua提供了一个类似于 Erlang 的有吸引力的消息传递模型,但它表示进程不共享内存。目前还不清楚是否spawn
实际上与anyLua功能是否有限制。
拉斯·考克斯提出了一个偶尔穿线 http://lua-users.org/lists/lua-l/2006-11/msg00368.html仅适用于 C 线程的模型。对我来说没用。
我将投票支持所有报告的答案实际体验与这些或任何其他多线程包,或任何提供新信息的答案。
作为参考,这是我想要并行化的循环:
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
The run_test
函数作为参数传入,因此只有当包可以并行运行任意函数时,它才对我有用。我的目标是足够的并行性,以便在 6 到 8 个核心上获得 100% 的 CPU 利用率。
Norman 写到关于 luaproc 的内容:
“对我来说,如何使用标量消息传递模型将结果最终传递到父线程中并不明显”
我在处理的用例中遇到了同样的问题。我喜欢 lua proc,因为它的实现简单且轻便,但我的用例有调用 lua 的 C 代码,它触发了一个需要发送/接收消息以与其他 luaproc 线程交互的协同例程。
为了实现我想要的功能,我必须向 luaproc 添加功能,以允许从父线程或任何其他未从 luaproc 调度程序运行的线程发送和接收消息。此外,我的更改允许使用 luaproc 从由 luaproc.newproc() 创建的 lua 状态创建的协程发送/接收。
我向 api 添加了一个额外的 luaproc.addproc() 函数,该函数可以从不受 luaproc 调度程序控制的上下文运行的任何 lua 状态调用,以便使用 luaproc 来设置自身以发送/接收消息。
我正在考虑将源代码发布为新的 github 项目,或者联系开发人员,看看他们是否愿意提取我的添加内容。欢迎就我应如何将其提供给其他人提出建议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)