标签: accelerate-haskell

编译的加速代码的性能差异来自ghci和shell

问题

您好,我正在使用加速库来创建一个应用程序,允许用户以交互方式调用处理图像的函数,这就是为什么我要使用ghc api来扩展ghci.

问题是当从shell运行已编译的可执行文件时,计算在100ms(略小于80)下完成,而在ghci中运行相同的编译代码则需要超过100ms(平均大于140)才能完成.

资源

示例代码+执行日志:https: //gist.github.com/zgredzik/15a437c87d3d8d03b8fc

描述

首先:测试是在编译CUDA内核之后运行的(编译本身又增加了2秒,但事实并非如此).

从shell运行已编译的可执行文件时,计算在10ms内完成.(shell first runsecond shell run传递不同的参数以确保数据不会缓存在任何地方).

当尝试从ghci运行相同的代码并摆弄输入数据时,计算时间超过100毫秒.我理解解释的代码比编译的代码慢,但是我在ghci会话中加载相同的编译代码并调用相同的顶级绑定(packedFunction).我已明确键入它以确保它是专门的(与使用SPECIALIZED编译指示相同的结果).

但是,如果我main在ghci中运行函数(即使:set args在连续调用之间更改输入数据),计算确实需要不到10毫秒.

编译Main.hsghc -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)

performance profiling haskell ghci accelerate-haskell

33
推荐指数
1
解决办法
1110
查看次数

编写一个并行数组Haskell表达式,在带有修复和加速的CPU和GPU上运行

修复和加速API相似性

Haskell repa库用于在CPU上自动并行计算数组.加速库是GPU上的自动数据并行.API非常相似,具有相同的N维数组表示.人们甚至可以切换与加速,维修服务阵列fromRepatoRepaData.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)

arrays haskell repa accelerate-haskell

12
推荐指数
1
解决办法
1267
查看次数

Exp / Acc 中的 Real-Complex 类型转换

我需要将Accelerate 库ExporAcc类型中的 实数值转换为其相应的值,例如: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)

并怀疑liftunlifthttps://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)

haskell accelerate-haskell

6
推荐指数
0
解决办法
79
查看次数

如何在accele-examples包的示例中启用CUDA?

我在我的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?

haskell cuda accelerate-haskell

5
推荐指数
1
解决办法
180
查看次数

如何在accelerate-haskell中定义矩阵乘积

我试图在加速之上定义一个类型安全的矩阵计算库,部分是出于教育目的,部分是为了看看这是否是一种实用的方法。

\n\n

但当涉及到正确定义矩阵的乘积时,我完全陷入困境 - 即以 GHC 接受/编译我的代码的方式。

\n\n

我进行了一些尝试,这些尝试是以下的变体:

\n\n

Linear.hs

\n\n
{-# 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)

haskell matrix accelerate-haskell

5
推荐指数
1
解决办法
346
查看次数

GHC - Haskell中的Infixl声明

嗨,我正在构建自己的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)

谢谢!

haskell ghc accelerate-haskell

3
推荐指数
1
解决办法
672
查看次数

标签 统计

accelerate-haskell ×6

haskell ×6

arrays ×1

cuda ×1

ghc ×1

ghci ×1

matrix ×1

performance ×1

profiling ×1

repa ×1