Haskell Array.Accelerate - forkOS 错误

71

我试图使用 gnuplot 绘制一些 Data.Array.Accelerate 计算的输出,但遇到了一个奇怪的问题。当通过解释器运行时,一切正常,像绘制纯 Haskell 数据或仅打印 Accelerate 值一样,但尝试绘制 Accelerate 数据失败了。给出的错误是 forkOS_entry: interrupted

后来我意识到我应该更加 UNIX 化,并在每个程序中只做一件事(好)。但我有兴趣了解为什么会失败。我在下面包含了一个最小代码示例。

import Prelude hiding (zip,zipWith)

import Graphics.Gnuplot.Simple
import Data.Array.Accelerate
-- import Data.Array.Accelerate.Interpreter
import Data.Array.Accelerate.CUDA

f :: Vector Float -> Vector Float -> Acc (Vector Float)
f xs ys = let xs' = use xs
              ys' = use ys
          in
             (zipWith (*) xs' ys')
n=10::Int

points = toList.run $ f (fromList (Z:.n) [1..10]) (fromList (Z:.n) [-5..4])

main = plotList [] points

更新于2014/09/11

根据user2141650的建议(感谢!),将最后一行更改为

plotList [] $! points

修复了这个问题。实际上它使得情节真正出现了,否则程序会在有或没有错误的情况下完成,但从来不会显示情节。如果有人写出这个答案,我想我会接受它,但是知道发生了什么还是很好的。

可能相关:

(顺便说一下,请停止试图编辑语法。问题本身没有任何问题,我是一个母语为中文的人,写出了我想表达的意思。谢谢你的贡献。)


1
尝试一下:使用-threaded重新编译。(不要忘记对源代码进行微小的编辑,以便ghc认为它值得一试。) - not my job
8
当涉及到编译器标志时,GHC 标志“-fforce-recomp”非常方便。该标志可以使重新编译更加强制,并且能够提高编译时间的效率。 - crockeea
1
@SeanD 你试过了吗? - not my job
2
@enoughreptocomment 很抱歉让你等了,这周我离开了我的GPU盒子。有趣的是,使用“-threaded”使它成功运行的概率约为1/4,否则它会出现相同的错误而失败。感觉好像存在某种竞争条件,我不知道这是否是任一库或GHC的错误。编辑:更令人困惑的是,我注意到只有在使用“runghc”而不是直接使用“ghc”和程序时才会出现错误。 - user328062
2
gnuplot和accelerate是否会相互干扰?在调用plotList之前,您能否尝试完全评估“points”? - user2141650
显示剩余2条评论
1个回答

1
正如我在评论中提到的,这很可能是由于gnuplot和GPU上的加速交错交互引起的,当惰性地调用加速计算时。我不能说我知道细节,但这个[0]似乎相关。可能是gnuplot无法使用GPU,因为Accelerate已经声明了它,但Accelerate不会释放它直到完全评估。或者是gnuplot在加速之前声明了GPU。这是一个看起来很棘手的问题,可能值得在Accelerate的github问题跟踪器中提及。
[0] https://github.com/AccelerateHS/accelerate/issues/48

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接