我正在使用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`
答案 0 :(得分:1)
顺便说一下。我使用LLVM开始使用包knead进行数组处理,但到目前为止还不是很成熟。 该软件包为类似于Accelerate的阵列处理提供DSL。实际上我写的是将它作为后端添加到Accelerate中。 您的简单示例可以通过“地图”表示。在阵列上。