【问题标题】:Haskell parallel program launch argumentsHaskell 并行程序启动参数
【发布时间】:2018-04-25 01:15:22
【问题描述】:

我编写了一个以 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 运行时的其他参数?

【问题讨论】:

  • +RTS 之前的参数表示您要求程序对它们做什么。如果你的程序中没有getArgs,它们都会被忽略。

标签: shell haskell concurrency command-line-arguments


【解决方案1】:

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

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

【讨论】:

  • 谢谢,解释得很好,现在我更清楚了。
【解决方案2】:

另一个答案解决了您提出的问题,但我想解决这个临时评论:

要真正并发,必须...启动带有一些附加参数的编译程序。

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

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多