Как выполнять SAT-вызовы параллельно, используя привязки haskell picosat?
import Picosat
import Control.Applicative
main :: IO ()
main = do
dimacsList1 <- (read <$> getLine) :: IO [[Integer]]
dimacsList2 <- (read <$> getLine) :: IO [[Integer]]
res1 <- solve dimacsList1
res2 <- solve dimacsList2
putStrLn $ (show res1) ++ " " ++ (show res2)
Вопрос: Как я могу изменить приведенный выше пример для параллельного запуска двух вызовов sat, т. Е. С использованием параллелизма? Я заинтересован в производительности, если есть разные варианты.
(Просто для проверки: насколько я понимаю, монада ST ортогональна и не может использоваться в сочетании с распараллеливанием / параллелизмом. Вначале монада ST немного смутила меня, это одна из причин, по которой я задаю вопрос.)
1 ответ
Решение
Самый простой подход заключается в использовании async
библиотека. Может быть, как-то так.
[res1, res2] <- mapConcurrently solve [dimacsList1, dimacsList2]