2

我正在玩弄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`
4

1 回答 1

1

顺便提一句。我开始使用 LLVM 进行数组处理的包揉捏,虽然到目前为止它还不是很成熟。该软件包提供了一个用于阵列处理的 DSL,类似于 Accelerate。实际上,我在编写它时考虑将其添加为 Accelerate 的后端。您的简单示例可以通过数组上的“地图”来表示。

于 2016-08-02T07:59:23.783 回答