En codant en Lua, j'ai une boucle imbriquée en trois parties qui effectue 6000 itérations. Les 6000 itérations sont indépendantes et peuvent facilement être parallélisées. Quel paquetage de threads pour Lua compile dès le départ y obtient des vitesses parallèles décentes sur quatre cœurs ou plus ?
Voici ce que je sais pour l'instant :
-
luaproc
vient de l'équipe de base de Lua, mais le paquet de logiciels sur luaforge est vieux, et la liste de diffusion a des rapports sur des défauts de fonctionnement. De plus, il n'est pas évident pour moi d'utiliser le modèle de passage de messages scalaires pour obtenir des résultats dans un thread parent. -
Lua Lanes fait des déclarations intéressantes mais semble être une solution lourde et complexe. De nombreux messages sur la liste de diffusion font état de difficultés à construire ou à faire fonctionner les couloirs Lua. J'ai moi-même eu des difficultés à faire fonctionner le mécanisme de distribution sous-jacent "Lua rocks".
-
LuaThread nécessite un verrouillage explicite et exige que la communication entre les threads soit médiée par des variables globales protégées par des verrous. Je pourrais imaginer pire, mais je serais plus heureux avec un niveau d'abstraction plus élevé.
-
Lua simultané fournit un modèle attrayant de passage de messages similaire à Erlang, mais il stipule que les processus ne partagent pas la mémoire. Il n'est pas clair si
spawn
fonctionne en fait avec tout Lua ou s'il existe des restrictions. -
Russ Cox a proposé une enfilage occasionnel qui ne fonctionne que pour les fils C. Pas utile pour moi.
Je vais upvote toutes les réponses qui rapportent sur expérience réelle avec ces paquets ou tout autre paquet multithreading, ou toute réponse qui fournit de nouvelles informations.
Pour référence, voici la boucle que je voudrais paralléliser :
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
En run_test
est passée en argument, donc un paquet ne peut m'être utile que s'il peut exécuter des fonctions arbitraires en parallèle. Mon objectif est un parallélisme suffisant pour obtenir une utilisation à 100% du CPU sur 6 à 8 cœurs.