packages feed

hhlo-0.1.0.0: test/Test/Runtime/BufferGPU.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}

module Test.Runtime.BufferGPU (tests) where

import qualified Data.Vector.Storable as V
import Test.Tasty
import Test.Tasty.HUnit

import HHLO.Core.Types
import HHLO.EDSL.Ops
import HHLO.IR.AST (FuncArg(..), TensorType(..))
import HHLO.IR.Builder
import HHLO.IR.Pretty
import HHLO.Runtime.PJRT.Plugin
import HHLO.Runtime.PJRT.Types
import HHLO.Runtime.Device
import HHLO.Runtime.Compile
import HHLO.Runtime.Execute
import HHLO.Runtime.Buffer

tests :: TestTree
tests = testGroup "Runtime.BufferGPU"
    [ testCase "gpu buffer round-trip f32" gpuRoundTripF32
    , testCase "gpu buffer metadata" gpuBufferMetadata
    ]

gpuRoundTripF32 :: IO ()
gpuRoundTripF32 = withPJRTGPU $ \api client -> do
    mDev <- defaultGPUDevice api client
    dev <- maybe (assertFailure "No GPU found") return mDev

    let input = V.fromList [1, 2, 3, 4, 5, 6] :: V.Vector Float
    buf <- toDeviceOn api client dev input [2, 3] bufferTypeF32
    result <- fromDeviceF32 api buf 6
    result @?= input

gpuBufferMetadata :: IO ()
gpuBufferMetadata = withPJRTGPU $ \api client -> do
    mDev <- defaultGPUDevice api client
    dev <- maybe (assertFailure "No GPU found") return mDev

    let input = V.fromList [1..12] :: V.Vector Float
    buf <- toDeviceOn api client dev input [3, 4] bufferTypeF32

    dims <- bufferDimensions api buf
    dims @?= [3, 4]

    et <- bufferElementType api buf
    et @?= bufferTypeF32

    sz <- bufferOnDeviceSize api buf
    sz @?= (12 * 4)  -- 12 floats * 4 bytes