试图绘制一些Data.Array.Accelerate计算的输出gnuplot我遇到了一个奇怪的问题.当通过解释器运行时,一切都很好,如绘制直接Haskell数据或仅打印Accelerate值,但是尝试绘制Accelerate数据失败.给出的错误是forkOS_entry: interrupted.
我已经意识到我应该更多UNIXy并在每个程序中做一件事(好).但我很想知道为什么会失败.我在下面添加了最少的代码示例.
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
Run Code Online (Sandbox Code Playgroud)
更新2014/09/11
根据user2141650建议(谢谢!)将最后一行更改为
plotList [] $! points
Run Code Online (Sandbox Code Playgroud)
解决了这个问题.事实上它使得情节实际上出现了,而没有这个,程序将有或没有错误完成,但实际上永远不会显示情节.我想我会接受这个作为答案,如果它被写了,但知道发生了什么仍然是很好的.
可能相关:
(顺便说一句,请停止尝试编辑语法.这个问题没有任何问题,我是母语人士并写下我的意思.感谢您的贡献.)
正如我在评论中提到的,这可能是因为当延迟调用加速计算时,gnuplot 和加速在 GPU 上的交错交互。我不能说我知道细节,但这个 [0] 似乎相关。可能 gnuplot 无法使用 GPU,因为 Accelerate 已经声明了它,但 Accelerate 在完全评估之前不会释放它。否则 gnuplot在 Accelerate之前就声明了 GPU 。看上去很棘手的问题,可能值得在 Accelerate 的 github 问题跟踪器中提及。
[0] https://github.com/AccelerateHS/accelerate/issues/48