gpt4 book ai didi

lua - 在Lua中模拟并行

转载 作者:行者123 更新时间:2023-12-03 03:32:15 29 4
gpt4 key购买 nike

我正在尝试使用 lua 来构建一些并行算法的原型(prototype)。我的意思是用纯 Lua 编写代码,对其进行测试、调试等。然后,当我确信它可以工作时,我可以将其转换为真正的多线程库,甚至转换为另一种语言(例如 OpenCL kenel) )。显然我不以任何方式关心原型(prototype)代码的性能。

我想使用一个在每一行产生的协程,并使用一些样板来随机选择下一个要运行的“线程”。例如:

local function parallel_simulation(...)

local function_list = {...}
local coroutine_list = {}
local thread_number = #function_list
for i = 1, thread_number do
coroutine_list[i] = coroutine.create(function_list[i])
end

while 0 < thread_number do

local current = math.random(1, thread_number)
local worker = coroutine_list[current]

coroutine.resume(worker)

if 'dead' == coroutine.status(worker) then
thread_number = thread_number - 1
table.remove(coroutine_list, current)
end
end
end

----------------------------------------------------------
-- Usage example

local Y = coroutine.yield
local max = 3
local counter = 0
local retry = 99

local function increment()
Y() local c = counter
Y() while max > c do
Y() c = counter
Y() c = c + 1
Y() counter = c
Y() end
end

for i=1,retry do
counter = 0
parallel_simulation(increment, increment)
if max ~= counter then
print('Test SUCCESS ! A non-thread-safe algorithm was identified .', i, counter)
return
end
end

error('Test FAIL ! The non-thread-safe algorithm was not identified .')

这只是一个想法,欢迎任何涉及纯Lua的解决方案!让我对这个解决方案感到非常不舒服的是 Y()。有什么办法可以避免它们吗? (debug.sethook 不允许产生...)

编辑 1 - 提供了更有意义的示例

编辑 2 - 希望我清楚了我想要完成的任务

最佳答案

Y() 放在每行前面的一个简单替代方法是使用 gsubload:

Y = coroutine.yield
max = 3
counter = 0

code = [[
function increment()
local c = counter
while max > c do
c = counter
c = c + 1
counter = c
end
end]]
code = code:gsub("\n ", "\n Y() ") -- replace two spaces in find/replace with whatever tab character(s) you use
assert(load(code))()

local retry = 99
-- rest of code here

(根据您的 Lua 版本使用 loadloadstring)请注意,变量声明 Y/max/counter 必须是全局的,否则加载的函数将无法访问它们。同样,code 中的函数必须是全局的,否则 increment 将不会存在于加载的代码之外。

当然,这样的解决方案假设每行上的所有指令都是原子/线程安全的。

我建议对parallel_simulation进行的一项改进是添加某种方法来更改下一个线程的选择方式。例如,也许只有当一个线程在执行早期并且另一个线程即将完成时才会显示错误 - 尽管理论上可以通过足够的随机试验达到这种状态,但有一个参数允许您调整哪些线程更有效接下来可能被选择的(例如使用权重)应该会使其更有可能。

关于lua - 在Lua中模拟并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40593848/

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