Haskell并行程序启动参数

时间:2018-04-24 08:11:59

标签: shell haskell concurrency command-line-arguments

我编写了一个以Unix实用程序方式工作的Haskell程序 - 启动程序,完成工作并退出。 我在该程序中使用了并发,但是为了使它真正并发,必须分别编译它,而且,让我感到惊讶的是,使用一些额外的参数启动编译程序。 我编译它:

ghc -O2 -threaded --make Main.hs -o Main.parallel

当我像这样运行时,它似乎并行工作:

./Main.parallel ds_houses/task.txt 8 500000 1:+1 +RTS -N8 ./Main.parallel ds_houses/task.txt 8 500000 +RTS -N8 ./Main.parallel ds_houses/task.txt 8 +RTS -N8 ./Main.parallel ds_houses/task.txt +RTS -N8

我使用参数85000001:+1,因为我在shell脚本中看到了here

我理解第一个参数是CPU的核心,但其他的是什么? /usr/bin/time程序似乎没有使用这些参数,因为如果将%C添加到其格式中,这些参数将显示为基准程序的参数。

有人可以向我解释或指出这些论点的作用吗? 我的假设是正确的,那个Haskell编译的程序不仅接受程序员所期望的参数,还接受转发到Haskell运行时的其他参数吗?

2 个答案:

答案 0 :(得分:3)

+RTS ... -RTS之间的参数被运行时拦截而不传递给您的程序(如果参数位于调用结束时,-RTS是可选的)。其他所有内容都将由您的程序使用。

所以问题的答案在于程序的代码 - 特别是使用消息显示为:usage: zeta <nthreads> <boundary> <s>,如果使用ghc -O2 -threaded --make Main.hs -o zeta进行编译,则更有意义。看看这些函数是如何被使用的。

答案 1 :(得分:0)

另一个答案解决了你问的问题,但我想解决这个副手评论:

  

因为它真的是并发的,所以必须......用一些额外的参数启动已编译的程序。

(我将此理解为您想要修复的投诉。)即使没有使用Control.Concurrent API的RTS选项,也可以将程序设计为使用其他操作系统线程。特别是,getNumCapabilitiessetNumCapabilities读取和写入专用于评估Haskell代码的OS线程数。您可能还希望rtsSupportsBoundThreads检查程序是否使用正确的线程标记和getNumProcessors进行编译,以检查有多少CPU可用于运行线程。