我编写了一个以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
我使用参数8
,500000
和1:+1
,因为我在shell脚本中看到了here。
我理解第一个参数是CPU的核心,但其他的是什么? /usr/bin/time
程序似乎没有使用这些参数,因为如果将%C
添加到其格式中,这些参数将显示为基准程序的参数。
有人可以向我解释或指出这些论点的作用吗? 我的假设是正确的,那个Haskell编译的程序不仅接受程序员所期望的参数,还接受转发到Haskell运行时的其他参数吗?
答案 0 :(得分:3)
+RTS ... -RTS
之间的参数被运行时拦截而不传递给您的程序(如果参数位于调用结束时,-RTS
是可选的)。其他所有内容都将由您的程序使用。
所以问题的答案在于程序的代码 - 特别是使用消息显示为:usage: zeta <nthreads> <boundary> <s>
,如果使用ghc -O2 -threaded --make Main.hs -o zeta
进行编译,则更有意义。看看这些函数是如何被使用的。
答案 1 :(得分:0)
另一个答案解决了你问的问题,但我想解决这个副手评论:
因为它真的是并发的,所以必须......用一些额外的参数启动已编译的程序。
(我将此理解为您想要修复的投诉。)即使没有使用Control.Concurrent
API的RTS选项,也可以将程序设计为使用其他操作系统线程。特别是,getNumCapabilities
和setNumCapabilities
读取和写入专用于评估Haskell代码的OS线程数。您可能还希望rtsSupportsBoundThreads
检查程序是否使用正确的线程标记和getNumProcessors
进行编译,以检查有多少CPU可用于运行线程。