问题
您好,我正在使用加速库来创建一个应用程序,允许用户以交互方式调用处理图像的函数,这就是为什么我要使用ghc api来扩展ghci.
问题是当从shell运行已编译的可执行文件时,计算在100ms(略小于80)下完成,而在ghci中运行相同的编译代码则需要超过100ms(平均大于140)才能完成.
资源
示例代码+执行日志:https: //gist.github.com/zgredzik/15a437c87d3d8d03b8fc
描述
首先:测试是在编译CUDA内核之后运行的(编译本身又增加了2秒,但事实并非如此).
从shell运行已编译的可执行文件时,计算在10ms内完成.(shell first run
并second shell run
传递不同的参数以确保数据不会缓存在任何地方).
当尝试从ghci运行相同的代码并摆弄输入数据时,计算时间超过100毫秒.我理解解释的代码比编译的代码慢,但是我在ghci会话中加载相同的编译代码并调用相同的顶级绑定(packedFunction
).我已明确键入它以确保它是专门的(与使用SPECIALIZED编译指示相同的结果).
但是,如果我main
在ghci中运行函数(即使:set args
在连续调用之间更改输入数据),计算确实需要不到10毫秒.
编译Main.hs
与ghc -o main Main.hs -O2 -dynamic -threaded
我想知道开销来自哪里.有没有人有任何关于为什么会这样的建议?
由remdezx发布的示例的简化版本:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Array.Accelerate as A
import Data.Array.Accelerate.CUDA as C
import Data.Time.Clock (diffUTCTime, getCurrentTime)
main :: IO ()
main = do
start <- getCurrentTime
print $ C.run $ A.maximum $ A.map (+1) …
Run Code Online (Sandbox Code Playgroud) Haskell repa库用于在CPU上自动并行计算数组.加速库是GPU上的自动数据并行.API非常相似,具有相同的N维数组表示.人们甚至可以切换与加速,维修服务阵列fromRepa
和toRepa
在Data.Array.Accelerate.IO
:
fromRepa :: (Shapes sh sh', Elt e) => Array A sh e -> Array sh' e
toRepa :: Shapes sh sh' => Array sh' e -> Array A sh e
Run Code Online (Sandbox Code Playgroud)
有多个后端用于加速,包括LLVM,CUDA和FPGA(参见http://www.cse.unsw.edu.au/~keller/Papers/acc-cuda.pdf的图2 ).虽然图书馆似乎没有得到维护,但我发现了一个加速的后端.鉴于修复和加速编程模型是相似的,我希望在它们之间有一种优雅的切换方式,即一次写入的函数可以用repa的R.computeP执行,或者用加速的后端执行,例如使用CUDA 运行函数.
采用简单的图像处理阈值功能.如果灰度像素值小于50,则将其设置为0,否则保留其值.这是它对南瓜的作用:
以下代码介绍了修复和加速实现:
module Main where
import qualified Data.Array.Repa as R
import qualified Data.Array.Repa.IO.BMP as R
import qualified Data.Array.Accelerate as A
import qualified Data.Array.Accelerate.IO as A
import qualified Data.Array.Accelerate.Interpreter as A
import Data.Word …
Run Code Online (Sandbox Code Playgroud) 我需要将Accelerate 库的Exp
orAcc
类型中的 实数值转换为其相应的值,例如:Complex
toComplex :: Exp Double -> Exp (Complex Double)
toComplex' :: Acc (Vector Double) -> Acc (Vector (Complex Double))
Run Code Online (Sandbox Code Playgroud)
我试图模式匹配
toComplex :: Exp Double -> Exp (Complex Double)
toComplex a = (\(r, i) -> constant $ r :+ i) $ (a, constant 0)
Run Code Online (Sandbox Code Playgroud)
并怀疑lift
或unlift
如https://www.acceleratehs.org/examples/mandelbrot.html可能会以某种方式解决这个问题,但无法弄清楚这些问题的正确应用。
因为我的尝试ghc
抱怨说
• Couldn't match type ‘Exp Double’ with ‘Double’
Expected type: Exp (Complex Double)
Actual type: Exp (Complex (Exp …
Run Code Online (Sandbox Code Playgroud) 我在我的OSX Yosemite上安装了CUDA.我已经下载了accele-examples包并用它编译cabal install
.它编译正确.但是,当我运行这些示例时,我注意到它们没有提供在CUDA下运行的选项.例如:
vh:accelerate-crystal apple1$ ./accelerate-crystal
EKG monitor started at: http://localhost:8000
accelerate-crystal (c) [2011..2013] The Accelerate Team
Usage: accelerate-crystal [OPTIONS]
Available backends:
* interpreter reference implementation (sequential)
Run Code Online (Sandbox Code Playgroud)
这使得它们运行缓慢(显然,击败了目的).如何在编译的示例上启用CUDA?
我试图在加速之上定义一个类型安全的矩阵计算库,部分是出于教育目的,部分是为了看看这是否是一种实用的方法。
\n\n但当涉及到正确定义矩阵的乘积时,我完全陷入困境 - 即以 GHC 接受/编译我的代码的方式。
\n\n我进行了一些尝试,这些尝试是以下的变体:
\n\nLinear.hs
{-# LANGUAGE TypeOperators #-}\n{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE KindSignatures #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n\nimport qualified Data.Array.Accelerate as A\n\nimport GHC.TypeLits\nimport Data.Array.Accelerate ( (:.)(..), Array\n , Exp, Shape, FullShape, Slice\n , DIM0, DIM1, DIM2, Z(Z)\n , IsFloating, IsNum, Elt, Acc\n , Any(Any), All(All))\nimport Data.Proxy\n\nnewtype Matrix (rows :: Nat) (cols :: Nat) a = AccMatrix {unMatrix :: Acc (Array DIM2 a)}\n(#*#) :: forall k m n …
Run Code Online (Sandbox Code Playgroud) 嗨,我正在构建自己的GPU编程Haskell DSL版本,称为Accelerate.问题是关于infixl
声明:
这是代码片段:
infixl 3 :.
data tail :. head = tail :. head
deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)
我认为这个片段非常简单明了,但当我尝试将其加载到ghci时,它失败了:
它报告说:
Illegal declaration of a type or class operator ‘:.’
Use TypeOperators to declare operators in type and declarations
Run Code Online (Sandbox Code Playgroud)
你对这个问题有什么看法吗?我正在使用的ghc版本是:
The Glorious Glasgow Haskell Compilation System, version 7.8.3
Run Code Online (Sandbox Code Playgroud)
谢谢!