使用`llvm` Haskell库进行2D LLVM数组操作

时间:2013-11-09 00:17:21

标签: haskell llvm

我正在使用llvm Haskell包来生成LLVM IR代码。考虑以下2D聚合LLVM阵列。它是一个长度为2的数组,长度为4的8位整数。

[2 x [4 x i8]]

我尝试过一个简单的练习,但是我被卡住了。我想增加数组中每个元素的值。

{- input 2D array

[ [1 , 2 , 3 , 4]
, [5 , 6 , 7 , 8] ]

-}

{- desired output 2D array

[ [3 , 4 , 5 , 6 ]
, [7 , 8 , 9 , 10] ]

-}

挑战:实施嵌套forLoop

{-# LANGUAGE ScopedTypeVariables #-}

module TwoDArray where

import Data.Int
import Data.Word
import LLVM.Core
import LLVM.Util.Loop
import Data.TypeLevel (D2,D4)

f :: CodeGenModule (Function (IO ()))
f = createNamedFunction ExternalLinkage "test" $ do
        let xss = [[1,2,3,4],[5,6,7,8]]
            height = 2
            width  = 4
        let arr = Array $ map Array xss :: Array D2 (Array D4 Word8)
        (ptr :: Value (Ptr (Array D2 (Array D4 Word8)))) <- malloc
        store (valueOf arr) ptr
        forLoop (valueOf 0) (valueOf (fromIntegral height) :: Value Int32) () $ \ h () -> do
           forLoop (valueOf 0) (valueOf (fromIntegral width) :: Value Int32) () $ \ w () -> do
             {- 1. load element at <h/w> position in 2D array arr -}
             {- 2. add 2 to the value as y -}
             {- 3. put value of y in to position <h/w> in 2D array arr -}
             ret ()
           ret ()
        return () -- better still, return the pointer `ptr`

1 个答案:

答案 0 :(得分:1)

顺便说一下。我使用LLVM开始使用包knead进行数组处理,但到目前为止还不是很成熟。 该软件包为类似于Accelerate的阵列处理提供DSL。实际上我写的是将它作为后端添加到Accelerate中。 您的简单示例可以通过“地图”表示。在阵列上。