packages feed

halide-arrayfire-0.0.2.0: src/Language/Halide/ArrayFire.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

module Language.Halide.ArrayFire () where

import ArrayFire (AFType, Array)
import ArrayFire qualified as AF
import Data.Proxy
import GHC.TypeLits
import Language.Halide

forceNumDims :: AFType a => Array a -> Int -> [Int]
forceNumDims arr n
  | AF.getNumDims arr <= n = take n shape
  | otherwise =
      error $
        "cannot treat a "
          <> show (AF.getNumDims arr)
          <> "-dimensional array as a "
          <> show n
          <> "-dimensional buffer"
  where
    shape = let (d0, d1, d2, d3) = AF.getDims arr in [d0, d1, d2, d3]

instance (IsHalideType a, AFType a, KnownNat n, n <= 4) => IsHalideBuffer (Array a) n a where
  withHalideBufferImpl arr action = case AF.getBackend arr of
    AF.CPU -> AF.withDevicePtr arr $ \ptr -> bufferFromPtrShape ptr shape action
    AF.CUDA -> undefined
    AF.OpenCL -> undefined
    AF.Default -> error "do not know how to handle 'Default' backend"
    where
      shape = forceNumDims arr . fromIntegral $ natVal (Proxy @n)