Кодирование в Lua, у меня трижды вложенный цикл, который проходит через 6000 итераций. Все 6000 итераций являются независимыми и могут быть легко распараллелены. Какой пакет потоков для Lua компилируется из коробки и получает приличные параллельные ускорения на четырех или более ядрах?
Вот что я знаю до сих пор:
-
luaproc
происходит от основной команды Lua, но комплект программного обеспечения на luaforge является старым, а в списке рассылки есть отчеты из этого segfault. Кроме того, мне не очевидно, как использовать скалярную модель передачи сообщений для получения результатов в конечном итоге в родительский поток. -
Lua Lanes предлагает интересные заявки, но, похоже, это тяжеловесное и сложное решение. Многие сообщения в списке рассылки сообщают о том, как Lua Lanes будет создавать или работать на них. Мне самому было трудно получить основной механизм распределения "Lua rocks" для меня.
-
LuaThread требует явной блокировки и требует, чтобы связь между потоками была опосредована глобальными переменными, которые защищены блокировками. Я мог представить себе хуже, но я был бы более счастлив с более высоким уровнем абстракции.
-
Параллельный Lua обеспечивает привлекательную модель передачи сообщений, похожую на Erlang, но она говорит, что процессы не обмениваются памятью. Неясно, работает ли
spawn
с любой функцией Lua или существуют ограничения. -
Russ Cox предложил случайную нить, которая работает только для потоков 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
Функция run_test
передается как аргумент, поэтому пакет может быть полезен для меня, только если он может запускать произвольные функции параллельно. Моя цель достаточно parallelism, чтобы получить 100% загрузку процессора на 6-8 ядер.