This is an automated email from the ASF dual-hosted git repository.
ruihangl pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 9c77baf77e [REFACTOR] Phase out legacy go ffi (#17940)
9c77baf77e is described below
commit 9c77baf77ed6ad62b4a4438226beea99446886df
Author: Tianqi Chen <[email protected]>
AuthorDate: Fri May 9 16:39:00 2025 -0400
[REFACTOR] Phase out legacy go ffi (#17940)
---
golang/Makefile | 81 ----
golang/README.md | 126 ------
golang/sample/Makefile | 34 --
golang/sample/complex.go | 189 ---------
golang/sample/pack_func_closure_arg.go | 75 ----
golang/sample/pack_func_closure_return.go | 75 ----
golang/sample/pack_func_convert.go | 62 ---
golang/sample/pack_func_handle_arg.go | 78 ----
golang/sample/pack_func_register.go | 81 ----
golang/sample/simple.go | 90 -----
golang/src/array_test.go | 614 ------------------------------
golang/src/bytearray.go | 90 -----
golang/src/bytearray_test.go | 50 ---
golang/src/device.go | 93 -----
golang/src/error.go | 49 ---
golang/src/error_test.go | 45 ---
golang/src/function.go | 383 -------------------
golang/src/function_test.go | 349 -----------------
golang/src/gotvm.cc | 207 ----------
golang/src/gotvm.go | 42 --
golang/src/gotvm.h | 60 ---
golang/src/gotvm_test.go | 48 ---
golang/src/module.go | 139 -------
golang/src/module_test.go | 110 ------
golang/src/ndarray.go | 347 -----------------
golang/src/tvm_runtime_pack.cc | 71 ----
golang/src/type.go | 90 -----
golang/src/utils.go | 42 --
golang/src/value.go | 378 ------------------
golang/src/value_test.go | 255 -------------
30 files changed, 4353 deletions(-)
diff --git a/golang/Makefile b/golang/Makefile
deleted file mode 100644
index 76ac371b62..0000000000
--- a/golang/Makefile
+++ /dev/null
@@ -1,81 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-.PHONY: clean all
-
-TVM_BASE = $(CURDIR)/../
-TARGET = gotvm
-LIBS = -lm -ldl
-NATIVE_SRC = tvm_runtime_pack.cc
-
-GOPATH=$(CURDIR)/gopath
-GOPATHDIR=${GOPATH}/src/${TARGET}/
-CGO_CPPFLAGS="-I. -I${TVM_BASE}/ -I${TVM_BASE}/3rdparty/dmlc-core/include
-I${TVM_BASE}/include -I${TVM_BASE}/3rdparty/dlpack/include/"
-CGO_CXXFLAGS="-std=c++17 -DDMLC_USE_LOGGING_LIBRARY=<tvm/runtime/logging.h>
-DTVM_USE_LIBBACKTRACE=0"
-CGO_CFLAGS="-I${TVM_BASE}"
-CGO_LDFLAGS="-ldl -lm"
-
-all:
- @mkdir gopath 2>/dev/null || true
- @mkdir gopath/src 2>/dev/null || true
- @mkdir gopath/src/$(TARGET) 2>/dev/null || true
- @cp src/$(TARGET).cc gopath/src/$(TARGET)
- @cp src/$(TARGET).h gopath/src/$(TARGET)
- @cp src/$(NATIVE_SRC) gopath/src/$(TARGET)
- @cp src/*.go gopath/src/$(TARGET)
- @export GOPATH=$(GOPATH); \
- export CGO_CPPFLAGS=$(CGO_CPPFLAGS); \
- export CGO_CXXFLAGS=$(CGO_CXXFLAGS); \
- export CGO_CFLAGS=$(CGO_CFLAGS); \
- export CGO_LDFLAGS=$(CGO_LDFLAGS); \
- (cd $(GOPATHDIR) && go clean -cache \
- && golint && go build -o $(TARGET).a \
- && go install)
- @find . -name gotvm.a
- @#mkdir gopath/doc 2>/dev/null || true
- @#godoc -html -goroot gopath/ gotvm | grep -v "for documentation on the
gotvm command" > gopath/doc/gotvm.html
- @#echo "Run 'godoc -http=:6060 -goroot=./gopath' for documentation"
-
-samples: all
- cp gopath/pkg/linux_amd64/gotvm.a sample/ -rfa
- make -C sample
-
-tests: all
- @(cd sample; python3 deploy.py)
- @export GOPATH=$(GOPATH); \
- export CGO_CPPFLAGS=$(CGO_CPPFLAGS); \
- export CGO_CXXFLAGS=$(CGO_CXXFLAGS); \
- export CGO_CFLAGS=$(CGO_CFLAGS); \
- export CGO_LDFLAGS=$(CGO_LDFLAGS); \
- (cd $(GOPATHDIR) \
- && cp ../../../sample/deploy.so . \
- && go test -v)
-
-clean:
- @if [ -d $(GOPATHDIR) ] ; then \
- export GOPATH=$(GOPATH); \
- export CGO_CPPFLAGS=$(CGO_CPPFLAGS); \
- export CGO_CFLAGS=$(CGO_CFLAGS); \
- export CGO_LDFLAGS=$(CGO_LDFLAGS); \
- (cd $(GOPATHDIR) && go clean -cache); fi
- @rm -rf gopath
- @make -C sample clean
-
-lint:
- @(cd src; golint)
- @python3 ${TVM_BASE}/dmlc-core/scripts/lint.py gotvm cpp src/*.cc
- @python3 ${TVM_BASE}/dmlc-core/scripts/lint.py gotvm cpp src/*.h
diff --git a/golang/README.md b/golang/README.md
deleted file mode 100644
index ee3ea8cc2e..0000000000
--- a/golang/README.md
+++ /dev/null
@@ -1,126 +0,0 @@
-<!--- Licensed to the Apache Software Foundation (ASF) under one -->
-<!--- or more contributor license agreements. See the NOTICE file -->
-<!--- distributed with this work for additional information -->
-<!--- regarding copyright ownership. The ASF licenses this file -->
-<!--- to you under the Apache License, Version 2.0 (the -->
-<!--- "License"); you may not use this file except in compliance -->
-<!--- with the License. You may obtain a copy of the License at -->
-
-<!--- http://www.apache.org/licenses/LICENSE-2.0 -->
-
-<!--- Unless required by applicable law or agreed to in writing, -->
-<!--- software distributed under the License is distributed on an -->
-<!--- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -->
-<!--- KIND, either express or implied. See the License for the -->
-<!--- specific language governing permissions and limitations -->
-<!--- under the License. -->
-
-# gotvm - Golang Frontend for TVM Runtime
-
-This folder contain golang interface for TVM runtime. It brings TVM runtime to
Golang.
-
-- It enable c runtime api of tvm exposed to golang.
-- It enables module loading (lib, graph and params) and inference operations.
-
-## Installation
-
-### Requirements
-
-- go compiler (https://golang.org/) version 0.10 or above.
-
-### Modules
-
-- src
- Module that generates golang package corresponding to the c runtime api
exposed from tvm source tree.
- This process build golang package _gotvm.a_
-
-- samples
- Sample golang reference application to inference through gotvm package.
-
-### Build
-
-Once the Requirements are installed
-
-To build _gotvm_ package
-
-```bash
-make
-```
-
-To build and run internal tests
-
-```bash
-make tests
-```
-
-To build sample apps.
-
-```bash
-make samples
-```
-
-## Run
-
-To Demonstrates sample TVM module compilation using python and deploy via
golang.
-```bash
-./simple
-```
-
-To deploy a realtime module with lib, graph and param.
-```bash
-python3 gen_mobilenet_lib.py
-
-./complex
-```
-
-To demonstrate go function closure conversion to packed function handle.
-
-```bash
-./pack_func_convert
-```
-
-To demonstrate a packed function handle given as an argument.
-
-```bash
-./pack_func_handle_arg
-```
-
-To register go function with runtime as a global function.
-
-```bash
-./pack_func_register
-```
-
-To demonstrate function closure passed as argument to a function call.
-
-```bash
-./pack_func_closure_arg
-```
-
-To demonstrate function closure returned from a packed function.
-
-```bash
-./pack_func_closure_return
-```
-
-## Documentation
-gotvm.go is documented with sufficient information about gotvm package.
-A html version documentation can be accessed by running below command after
building runtime.
-
-```bash
-godoc -http=:6060 -goroot=./gopath
-```
-After above command try http://127.0.0.1:6060 from any browser.
-
-Also please refer to the sample applications under sample folder.
-
-## Docker
-Docker setup may need below additions for dependencies and environment
preparation.
-
-Please refer ```docker/install/ubuntu_install_golang.sh``` for the packages
dependencies.
-
-go compiler 1.10 on ubuntu doesn't install on standard path, hence an explicit
export may be needed as shown below.
-
-```bash
-export PATH="/usr/lib/go-1.10/bin:$PATH"
-```
diff --git a/golang/sample/Makefile b/golang/sample/Makefile
deleted file mode 100644
index fd738b6f97..0000000000
--- a/golang/sample/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-
-.PHONY: clean all
-
-SOURCES=$(wildcard *.go)
-EXECUTABLE=$(patsubst %.go, %, $(SOURCES))
-
-all: $(EXECUTABLE)
- @golint
- @python3 deploy.py
-
-%: %.o
- @go tool link -linkmode external -extld "g++" -extldflags "-ldl" -o $@
$<
-
-%.o: %.go
- @go tool compile -pack -o $@ $<
-
-clean:
- @rm -f $(EXECUTABLE) *.so *.o *.a *.json *.params
diff --git a/golang/sample/complex.go b/golang/sample/complex.go
deleted file mode 100644
index c048207b8b..0000000000
--- a/golang/sample/complex.go
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief Sample golang application deployment over tvm.
- * \file complex.go
- */
-
-package main
-
-import (
- "fmt"
- "io/ioutil"
- "math/rand"
- "./gotvm"
- "runtime"
-)
-
-// NNVM compiled model paths.
-const (
- modLib = "./mobilenet.so"
- modJSON = "./mobilenet.json"
- modParams = "./mobilenet.params"
-)
-
-// main
-func main() {
- defer runtime.GC()
- // Welcome
- fmt.Printf("TVM Version : v%v\n", gotvm.TVMVersion)
- fmt.Printf("DLPACK Version: v%v\n\n", gotvm.DLPackVersion)
-
- // Query global functions available
- funcNames, err := gotvm.FuncListGlobalNames()
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Global Functions:%v\n", funcNames)
-
- // Import tvm module (so)
- modp, err := gotvm.LoadModuleFromFile(modLib)
- if err != nil {
- fmt.Print(err)
- fmt.Printf("Please copy tvm compiled modules here and update the
sample.go accordingly.\n")
- fmt.Printf("You may need to update modLib, modJSON, modParams,
tshapeIn, tshapeOut\n")
- return
- }
- fmt.Printf("Module Imported:%p\n", modp)
- bytes, err := ioutil.ReadFile(modJSON)
- if err != nil {
- fmt.Print(err)
- return
- }
- jsonStr := string(bytes)
-
- // Load module on tvm runtime - call tvm.graph_executor.create
- funp, err := gotvm.GetGlobalFunction("tvm.graph_executor.create")
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Calling tvm.graph_executor.create\n")
- // Call function
- graphrt, err := funp.Invoke(jsonStr, modp, (int64)(gotvm.KDLCPU),
(int64)(0))
- if err != nil {
- fmt.Print(err)
- return
- }
- graphmod := graphrt.AsModule()
- fmt.Printf("Graph executor Created\n")
-
- // Array allocation attributes
- tshapeIn := []int64{1, 224, 224, 3}
- tshapeOut := []int64{1, 1001}
-
- // Allocate input Array
- inX, err := gotvm.Empty(tshapeIn, "float32", gotvm.CPU(0))
- if err != nil {
- fmt.Print(err)
- return
- }
-
- // Allocate output Array
- out, err := gotvm.Empty(tshapeOut)
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Input and Output Arrays allocated\n")
-
- // Get module function from graph executor : load_params
- // Read params
- bytes, err = ioutil.ReadFile(modParams)
- if err != nil {
- fmt.Print(err)
- }
-
- // Load Params
- funp, err = graphmod.GetFunction("load_params")
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Func load_params:%p\n", funp)
-
- // Call function
- _, err = funp.Invoke(bytes)
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Module params loaded\n")
-
- // Set some data in input Array
- inSlice := make([]float32, (224 * 224 * 3))
- rand.Seed(10)
- rand.Shuffle(len(inSlice), func(i, j int) {inSlice[i],
- inSlice[j] = rand.Float32(),
- rand.Float32() })
- inX.CopyFrom(inSlice)
-
- // Set Input
- funp, err = graphmod.GetFunction("set_input")
- if err != nil {
- fmt.Print(err)
- return
- }
-
- // Call function
- _, err = funp.Invoke("input", inX)
- if err != nil {
- fmt.Print(err)
- return
- }
-
- fmt.Printf("Module input is set\n")
-
- // Run
- funp, err = graphmod.GetFunction("run")
- if err != nil {
- fmt.Print(err)
- return
- }
-
- // Call function
- _, err = funp.Invoke()
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Module Executed \n")
-
- // Call runtime function get_output
- funp, err = graphmod.GetFunction("get_output")
- if err != nil {
- fmt.Print(err)
- return
- }
-
- // Call function
- _, err = funp.Invoke(int64(0), out)
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Got Module Output \n")
-
- // Print results
- outIntf, _ := out.AsSlice()
- outSlice := outIntf.([]float32)
- fmt.Printf("Result:%v\n", outSlice[:10])
-}
diff --git a/golang/sample/pack_func_closure_arg.go
b/golang/sample/pack_func_closure_arg.go
deleted file mode 100644
index ff2d1e2754..0000000000
--- a/golang/sample/pack_func_closure_arg.go
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief Sample golang application to demonstrate go-closure given to a
packed function argument.
- * \file pack_func_closure_arg.go
- */
-
-package main
-
-import (
- "fmt"
- "./gotvm"
-)
-
-
-// sampleFunctionArg receives a Packed Function handle and calls it.
-func sampleFunctionArg(args ...*gotvm.Value) (retVal interface{}, err error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
- // Call Packed Function
- retVal, err = pfunc.Invoke(args[1].AsInt64(), args[2].AsInt64())
- return
-}
-
-// main
-func main() {
- // Not passing a function name implicitely
- // picks the name from reflection as "main.sampleDunctionArg"
- gotvm.RegisterFunction(sampleFunctionArg);
- fmt.Printf("Registered: sampleFunctionArg\n")
-
- // Get registered global function.
- funp, err := gotvm.GetGlobalFunction("main.sampleFunctionArg")
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("GetGlobalFunction: main.sampleFunctionArg - Success\n")
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*gotvm.Value) (retVal interface{}, err error) {
- for _, v := range args {
- fmt.Printf("ARGS:%T : %v\n", v.AsInt64(), v.AsInt64())
- }
- val1 := args[0].AsInt64()
- val2 := args[1].AsInt64()
- retVal = int64(val1+val2)
- return
- }
-
- // Call function
- result, err := funp.Invoke(funccall, 30, 50)
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Invoked sampleFunctionArg with function closure arg :
Result:%v\n", result.AsInt64())
-}
diff --git a/golang/sample/pack_func_closure_return.go
b/golang/sample/pack_func_closure_return.go
deleted file mode 100644
index e010b93953..0000000000
--- a/golang/sample/pack_func_closure_return.go
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief Sample golang application to demonstrate go-closure returned from a
callback function.
- * \file pack_func_closure_return.go
- */
-
-package main
-
-import (
- "fmt"
- "./gotvm"
-)
-
-// sampleFunctionCb returns a function closure which is embed as packed
function in TVMValue.
-func sampleFunctionCb(args ...*gotvm.Value) (retVal interface{}, err error) {
- funccall := func (cargs ...*gotvm.Value) (fret interface{}, ferr error) {
- for _, v := range cargs {
- fmt.Printf("ARGS:%T : %v\n", v.AsInt64(), v.AsInt64())
- }
- val1 := cargs[0].AsInt64()
- val2 := cargs[1].AsInt64()
- fret = int64(val1+val2)
- return
- }
- retVal = funccall
- return
-}
-
-// main
-func main() {
- // Not passing a function name implicitely
- // picks the name from reflection as "main.sampleDunctionCb"
- gotvm.RegisterFunction(sampleFunctionCb);
- fmt.Printf("Registered: sampleFunctionCb\n")
-
- // Get registered global function
- funp, err := gotvm.GetGlobalFunction("main.sampleFunctionCb")
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("GetGlobalFunction: main.sampleFunctionCb - Success\n")
-
- // Call function
- result, err := funp.Invoke()
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Invoked main.sampleFunctionCb via Function handle\n")
-
- pfunc := result.AsFunction()
- fmt.Printf("Function Handle received via Packed Function call:%T - %v \n",
pfunc, pfunc)
-
- pfuncRet, err := pfunc.Invoke(30, 40)
- fmt.Printf("Invoked closure inside sampleFunctionCb result:%v\n",
pfuncRet.AsInt64())
-}
diff --git a/golang/sample/pack_func_convert.go
b/golang/sample/pack_func_convert.go
deleted file mode 100644
index b6d1fbf24d..0000000000
--- a/golang/sample/pack_func_convert.go
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief Sample golang application to demonstrate function conversion to
packed function.
- * \file pack_func_convert.go
- */
-
-package main
-
-import (
- "fmt"
- "./gotvm"
-)
-
-// sampleCb is a simple golang callback function like C = A + B.
-func sampleCb(args ...*gotvm.Value) (retVal interface{}, err error) {
- for _, v := range args {
- fmt.Printf("ARGS:%T : %v\n", v.AsInt64(), v.AsInt64())
- }
- val1 := args[0].AsInt64()
- val2 := args[1].AsInt64()
- retVal = int64(val1+val2)
- return
-}
-
-// main
-func main() {
- // Welcome
-
- // Simple convert to a packed function
- fhandle, err := gotvm.ConvertFunction(sampleCb)
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Converted function\n")
-
- retVal, err := fhandle.Invoke(10, 20)
- fmt.Printf("Invoke Completed\n")
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Result:%v\n", retVal.AsInt64())
-}
diff --git a/golang/sample/pack_func_handle_arg.go
b/golang/sample/pack_func_handle_arg.go
deleted file mode 100644
index d5a3f07494..0000000000
--- a/golang/sample/pack_func_handle_arg.go
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief Sample golang application to demonstrate converted packed
- * function handle passed to another packed function.
- * \file pack_func_handle_arg.go
- */
-
-package main
-
-import (
- "fmt"
- "./gotvm"
-)
-
-// sampleCb is a simple golang callback function like C = A + B.
-func sampleCb(args ...*gotvm.Value) (retVal interface{}, err error) {
- for _, v := range args {
- fmt.Printf("ARGS:%T : %v\n", v.AsInt64(), v.AsInt64())
- }
- val1 := args[0].AsInt64()
- val2 := args[1].AsInt64()
- retVal = int64(val1+val2)
- return
-}
-
-// sampleFunctionArg receives a Packed Function handle and calls it.
-func sampleFunctionArg(args ...*gotvm.Value) (retVal interface{}, err error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
-
- // Call Packed Function
- retVal, err = pfunc.Invoke(args[1], args[2])
- return
-}
-
-// main
-func main() {
- // Simple convert to a packed function
- fhandle, err := gotvm.ConvertFunction(sampleCb)
- if err != nil {
- fmt.Print(err)
- return
- }
-
- gotvm.RegisterFunction(sampleFunctionArg);
- fmt.Printf("Registered: sampleFunctionArg\n")
-
- funp, err := gotvm.GetGlobalFunction("main.sampleFunctionArg")
- if err != nil {
- fmt.Print(err)
- return
- }
-
- retVal, err := funp.Invoke(fhandle, 10, 20)
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("Result:%v\n", retVal.AsInt64())
-}
diff --git a/golang/sample/pack_func_register.go
b/golang/sample/pack_func_register.go
deleted file mode 100644
index ac4ea438db..0000000000
--- a/golang/sample/pack_func_register.go
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief Sample golang application to demonstrate function register into TVM
global functions.
- * \file pack_func_register.go
- */
-
-package main
-
-import (
- "fmt"
- "./gotvm"
- "strings"
-)
-
-// sampleCb is a simple golang callback function like C = A + B.
-func sampleCb(args ...*gotvm.Value) (retVal interface{}, err error) {
- for _, v := range args {
- fmt.Printf("ARGS:%T : %v\n", v.AsInt64(), v.AsInt64())
- }
- val1 := args[0].AsInt64()
- val2 := args[1].AsInt64()
- retVal = int64(val1+val2)
- return
-}
-
-// main
-func main() {
- // Register sampleCb with TVM packed function system and call and check
Global Function List.
- gotvm.RegisterFunction(sampleCb, "sampleCb");
- // Query global functions available
- funcNames, err := gotvm.FuncListGlobalNames()
- if err != nil {
- fmt.Print(err)
- return
- }
-
- found := 0
- for ii := range (funcNames) {
- if strings.Compare(funcNames[ii], "sampleCb") == 0 {
- found = 1
- }
- }
- if found == 0 {
- fmt.Printf("Function registerd but, not listed\n")
- return
- }
-
-
- // Get "sampleCb" and verify the call.
- funp, err := gotvm.GetGlobalFunction("sampleCb")
- if err != nil {
- fmt.Print(err)
- return
- }
-
- // Call function
- result, err := funp.Invoke((int64)(10), (int64)(20))
- if err != nil {
- fmt.Print(err)
- return
- }
- fmt.Printf("sampleCb result: %v\n", result.AsInt64())
-}
diff --git a/golang/sample/simple.go b/golang/sample/simple.go
deleted file mode 100644
index 7bb503db45..0000000000
--- a/golang/sample/simple.go
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief Sample golang application deployment over tvm.
- * \file simple.go
- */
-
-package main
-
-import (
- "fmt"
- "runtime"
- "./gotvm"
- "math/rand"
-)
-
-// NNVM compiled model paths.
-const (
- modLib = "./deploy.so"
-)
-
-// main
-func main() {
- // Welcome
- defer runtime.GC()
- fmt.Printf("TVM Version : v%v\n", gotvm.TVMVersion)
- fmt.Printf("DLPACK Version: v%v\n\n", gotvm.DLPackVersion)
-
- // Import tvm module (so)
- modp, _ := gotvm.LoadModuleFromFile(modLib)
- fmt.Printf("Module Imported\n")
-
-
- // Allocate Array for inputs and outputs.
- // Allocation by explicit type and device.
- tshapeIn := []int64{4}
- inX, _ := gotvm.Empty(tshapeIn, "float32", gotvm.CPU(0))
-
- // Default allocation on CPU
- inY, _ := gotvm.Empty(tshapeIn, "float32")
-
- // Default allocation to type "float32" and on CPU
- out, _ := gotvm.Empty(tshapeIn)
- fmt.Printf("Input and Output Arrays allocated\n")
-
- // Fill Input Data : inX , inY
- inXSlice := make([]float32, 4)
- inYSlice := make([]float32, 4)
- for i := range inXSlice {
- inXSlice[i] = rand.Float32()
- inYSlice[i] = rand.Float32()
- }
-
-
- // Copy the data on target memory through runtime CopyFrom api.
- inX.CopyFrom(inXSlice)
- inY.CopyFrom(inYSlice)
- fmt.Printf("X: %v\n", inXSlice)
- fmt.Printf("Y: %v\n", inYSlice)
-
- // Get function "myadd"
- funp, _ := modp.GetFunction("myadd")
-
- // Call function
- funp.Invoke(inX, inY, out)
- fmt.Printf("Module function myadd executed\n")
-
- // Get the output tensor as an interface holding a slice through runtime
CopyTo api.
- outSlice, _ := out.AsSlice()
-
- // Print results
- fmt.Printf("Result:%v\n", outSlice.([]float32))
-}
diff --git a/golang/src/array_test.go b/golang/src/array_test.go
deleted file mode 100644
index a2636a8b0f..0000000000
--- a/golang/src/array_test.go
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file array_test.go
- */
-
-
-package gotvm
-
-import (
- "testing"
- "unsafe"
- "math/rand"
-)
-
-// Create an array and check size.
-func TestArrayCreateSize(t *testing.T) {
- _, err := Empty([]int64{4})
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- _, err = Empty([]int64{4, 5, 6})
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- _, err = Empty([]int64{})
- if err == nil {
- t.Error("Expected err for empty Array created, but didn't got !!")
- return
- }
-}
-
-// Check array creation via various different arguments.
-func TestArrayCreateArgs(t *testing.T) {
- _, err := Empty([]int64{4, 2}, "float32", CPU(0))
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- _, err = Empty([]int64{4, 2}, "float32")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- _, err = Empty([]int64{4, 2}, CPU(0))
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- _, err = Empty([]int64{4, 2}, CPU(0), "float32")
- if err != nil {
- t.Error(err.Error())
- return
- }
-}
-
-// Create an array and check the NDim.
-func TestArrayNDim(t *testing.T) {
- arr, err := Empty([]int64{4, 5, 6})
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- if 3 != arr.GetNdim() {
- t.Errorf("GetNdim failed Expected: 3 Got :%v\n", arr.GetNdim())
- return
- }
-}
-
-// Create an array and check Shape.
-func TestArrayShape(t *testing.T) {
- arr, err := Empty([]int64{4, 5, 6})
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- shape := arr.GetShape()
- if len(shape) != 3 {
- t.Errorf("Shape slice expected: 3 Got :%v\n", len(shape))
- return
- }
-
- if shape[0] != 4 || shape[1] != 5 || shape[2] != 6 {
- t.Errorf("Shape values expected {4, 5, 6} Got : %v\n", shape);
- return
- }
-}
-
-// Create an array and check created Device.
-func TestArrayDevice(t *testing.T) {
- // TODO: Could some test cases for other targets
- arr, err := Empty([]int64{4}, CPU(0))
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- dev := arr.GetDevice()
- if dev.DeviceType != KDLCPU {
- t.Errorf("Dev DeviceType expected: %v Got :%v\n", KDLCPU,
dev.DeviceType)
- return
- }
- if dev.DeviceID != 0 {
- t.Errorf("Dev DeviceID expected: %v Got :%v\n", KDLCPU, dev.DeviceID)
- return
- }
-
- arr, err = Empty([]int64{4}, CPU(2))
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- dev = arr.GetDevice()
- if dev.DeviceType != KDLCPU {
- t.Errorf("Dev DeviceType expected: %v Got :%v\n", KDLCPU,
dev.DeviceType)
- return
- }
- if dev.DeviceID != 2 {
- t.Errorf("Dev DeviceID expected: %v Got :%v\n", KDLCPU, dev.DeviceID)
- return
- }
-}
-
-// Create array of different dtypes and check dtypes.
-func TestArrayDType(t *testing.T) {
- for _, dtype := range []string{"int8", "int16", "int32", "int64",
- "uint8", "uint16", "uint32", "uint64",
- "float32", "float64"} {
- arr, err := Empty([]int64{4}, dtype)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- if dtype != arr.GetDType() {
- t.Errorf("Dtype expected: %v Got :%v\n", dtype, arr.GetDType())
- return
- }
- }
-}
-
-// Copy Int8 data to created Array and verify.
-func TestArrayCopySliceInt8(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "int8")
-
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen)
- rand.Read(bdata)
- data := (*[1<<31]int8)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []int8:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
-
- dataRet := ret.([]int8)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy Int16 data to created Array and verify.
-func TestArrayCopySliceInt16(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "int16")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen*2)
- rand.Read(bdata)
- data := (*[1<<31]int16)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
- switch ret.(type) {
- case []int16:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
-
- dataRet := ret.([]int16)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy Int32 data to created Array and verify.
-func TestArrayCopySliceInt32(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "int32")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen*4)
- rand.Read(bdata)
- data := (*[1<<31]int32)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []int32:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]int32)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy Int64 data to created Array and verify.
-func TestArrayCopySliceInt64(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "int64")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen*8)
- rand.Read(bdata)
- data := (*[1<<31]int64)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []int64:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]int64)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy UInt8 data to created Array and verify.
-func TestArrayCopySliceUInt8(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "uint8")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen)
- rand.Read(bdata)
- data := (*[1<<31]uint8)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []uint8:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]uint8)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy UInt16 data to created Array and verify.
-func TestArrayCopySliceUInt16(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "uint16")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen*2)
- rand.Read(bdata)
- data := (*[1<<31]uint16)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []uint16:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]uint16)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy UInt32 data to created Array and verify.
-func TestArrayCopySliceUInt32(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "uint32")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen*4)
- rand.Read(bdata)
- data := (*[1<<31]uint32)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []uint32:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]uint32)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy UInt64 data to created Array and verify.
-func TestArrayCopySliceUInt64(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "uint64")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- bdata := make([]byte, dlen*8)
- rand.Read(bdata)
- data := (*[1<<31]uint64)(unsafe.Pointer(&bdata[0]))[:dlen:dlen]
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []uint64:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]uint64)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
-
-// Copy Float32 data to created Array and verify.
-func TestArrayCopySliceFloat32(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "float32")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- data := make([]float32, dlen)
-
- for i := range data {
- data[i] = rand.Float32()
- }
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []float32:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]float32)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v \nGot :%v \n", data, dataRet)
- return
- }
- }
-}
-
-// Copy Float64 data to created Array and verify.
-func TestArrayCopySliceFloat64(t *testing.T) {
- dlen := int64(32)
- arr, err := Empty([]int64{4, dlen/4}, "float64")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- data := make([]float64, dlen)
-
- for i := range data {
- data[i] = rand.Float64()
- }
-
- err = arr.CopyFrom(data)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- ret, err := arr.AsSlice()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- switch ret.(type) {
- case []float64:
- default:
- t.Errorf("Expected : %T but got :%T\n", data, ret)
- return
- }
- dataRet := ret.([]float64)
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v\n", data, dataRet)
- return
- }
- }
-}
diff --git a/golang/src/bytearray.go b/golang/src/bytearray.go
deleted file mode 100644
index 4dcecef4a9..0000000000
--- a/golang/src/bytearray.go
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for TVMByteArray interface.
- * \file bytearray.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "unsafe"
-)
-
-// ByteArray type wraps the TVMByteArray of C runtime API.
-//
-// This can be used to hold raw data like params of a model.
-type ByteArray uintptr
-
-// nativeCPtr returns the type freed unitptr for ByteArray.
-func (tbytearray ByteArray) nativeCPtr() (retVal uintptr) {
- retVal = (uintptr)(tbytearray)
- return
-}
-
-// SetData is used to intialize ByteArray from a golang string object.
-//
-// This method initialize both data and data size of the underlaying object.
-// This function handles freeing old data object if any before allocating new.
-//
-// `val` is the golang string object from which the ByteArray is initialized.
-func (tbytearray ByteArray) setData(val string) {
- bufPtr := ((*C.TVMByteArray)(unsafe.Pointer(tbytearray))).data
- if bufPtr == (*C.char)(C.NULL) {
- C.free(unsafe.Pointer(bufPtr))
- }
-
- ((*C.TVMByteArray)(unsafe.Pointer(tbytearray))).data = C.CString(val)
- ((*C.TVMByteArray)(unsafe.Pointer(tbytearray))).size = C.ulong(len(val))
-}
-
-// getData returns the golang byte slice corresponding to the ByteArray.
-func (tbytearray ByteArray) getData() (retVal []byte) {
- val := ((*C.TVMByteArray)(unsafe.Pointer(tbytearray))).data
- blen := ((*C.TVMByteArray)(unsafe.Pointer(tbytearray))).size
- retVal = C.GoBytes(unsafe.Pointer(val), C.int(blen))
- return
-}
-
-// newByteArray initilizes the native TVMByteArray object with given byte slice
-//
-//`val` is the golang byte array used to initialize.
-//
-// returns newly created ByteArray.
-func newByteArray(val []byte) (retVal ByteArray) {
- handle := ByteArray(C.malloc(C.sizeof_TVMByteArray))
- ((*C.TVMByteArray)(unsafe.Pointer(handle))).data = (*C.char)(C.NULL)
- ((*C.TVMByteArray)(unsafe.Pointer(handle))).size = 0
- handle.setData(string(val))
- retVal = handle
- return
-}
-
-// deleteTVMByteArray releases the allocated native object of ByteArray.
-//
-// This delete handles freeing of underlaying native data object too.
-func (tbytearray ByteArray) deleteTVMByteArray() {
- bufPtr := ((*C.TVMByteArray)(unsafe.Pointer(tbytearray))).data
- C.free(unsafe.Pointer(bufPtr))
- C.free(unsafe.Pointer(tbytearray.nativeCPtr()))
-}
diff --git a/golang/src/bytearray_test.go b/golang/src/bytearray_test.go
deleted file mode 100644
index c4047c50a6..0000000000
--- a/golang/src/bytearray_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file bytearray_test.go
- */
-
-
-package gotvm
-
-import (
- "testing"
- "math/rand"
-)
-
-// Check ByteArray creation from byte slice and verify the data.
-func TestByteArrayGet(t *testing.T) {
- data := make([]byte, 1024)
- rand.Read(data)
-
- barr := newByteArray(data)
- dataRet := barr.getData()
- if len(data) != len(dataRet) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(data),
len(dataRet))
- return
- }
- for i := range data {
- if data[i] != dataRet[i] {
- t.Errorf("Data expected: %v Got :%v at : %v\n", data[i],
dataRet[i], i)
- return
- }
- }
-}
diff --git a/golang/src/device.go b/golang/src/device.go
deleted file mode 100644
index 2918cf6a0f..0000000000
--- a/golang/src/device.go
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for Device interface
- * \file device.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-// KDLCPU is golang enum correspond to TVM device type kDLCPU.
-var KDLCPU = int32(C.kDLCPU)
-// kDLCUDA is golang enum correspond to TVM device type kDLCUDA.
-var kDLCUDA = int32(C.kDLCUDA)
-// kDLCUDAHost is golang enum correspond to TVM device type kDLCUDAHost.
-var kDLCUDAHost = int32(C.kDLCUDAHost)
-// KDLOpenCL is golang enum correspond to TVM device type kDLOpenCL.
-var KDLOpenCL = int32(C.kDLOpenCL)
-// KDLMetal is golang enum correspond to TVM device type kDLMetal.
-var KDLMetal = int32(C.kDLMetal)
-// KDLVPI is golang enum correspond to TVM device type kDLVPI.
-var KDLVPI = int32(C.kDLVPI)
-// KDLROCM is golang enum correspond to TVM device type kDLROCM.
-var KDLROCM = int32(C.kDLROCM)
-// KDLVulkan is golang enum correspond to TVM device type kDLVulkan.
-var KDLVulkan = int32(C.kDLVulkan)
-// KExtDev is golang enum correspond to TVM device type kDLExtDev.
-var KExtDev = int32(C.kDLExtDev)
-
-// Device dtype corresponding to Device aka DLDevice
-type Device struct {
- DeviceType int32
- DeviceID int32
-}
-
-// CPU returns the Device object for CPU target on given index
-func CPU(index int32) Device {
- return Device{KDLCPU, index}
-}
-
-// CUDA returns the Device object for CUDA target on given index
-func CUDA(index int32) Device {
- return Device{kDLCUDA, index}
-}
-
-// CUDAHost returns the Device object for CUDAHost target on given index
-func CUDAHost(index int32) Device {
- return Device{kDLCUDAHost, index}
-}
-
-// OpenCL returns the Device object for OpenCL target on given index
-func OpenCL(index int32) Device {
- return Device{KDLOpenCL, index}
-}
-
-// Metal returns the Device object for Metal target on given index
-func Metal(index int32) Device {
- return Device{KDLMetal, index}
-}
-
-// VPI returns the Device object for VPI target on given index
-func VPI(index int32) Device {
- return Device{KDLVPI, index}
-}
-
-// ROCM returns the Device object for ROCM target on given index
-func ROCM(index int32) Device {
- return Device{KDLROCM, index}
-}
-
-// Vulkan returns the Device object for Vulkan target on given index
-func Vulkan(index int32) Device {
- return Device{KDLVulkan, index}
-}
diff --git a/golang/src/error.go b/golang/src/error.go
deleted file mode 100644
index edd8116a36..0000000000
--- a/golang/src/error.go
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for error related API interface.
- * \file error.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "unsafe"
-)
-
-// getTVMLastError returns the detailed error string for any api called in TVM
runtime.
-//
-// This is useful when any api returns non zero value.
-//
-// Returns golang string for the corresponding native error message.
-func getTVMLastError() (retVal string) {
- errStr := C.TVMGetLastError()
- retVal = C.GoString(errStr)
- return
-}
-
-func setTVMLastError(errStr string) {
- cstr := C.CString(errStr)
- C.TVMAPISetLastError(cstr)
- C.free(unsafe.Pointer(cstr))
-}
diff --git a/golang/src/error_test.go b/golang/src/error_test.go
deleted file mode 100644
index 3fe912db11..0000000000
--- a/golang/src/error_test.go
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file error_test.go
- */
-
-
-package gotvm
-
-import (
- "testing"
- "strings"
-)
-
-// Check err receiving from TVM global function.
-func TestErrorTest(t *testing.T) {
- _, err := LoadModuleFromFile("dummy.so")
- if err == nil {
- t.Error("Expected an error, but not received\n")
- return
- }
-
- errStr := err.Error()
- if !(strings.Contains(errStr, string("cannot open shared object"))) {
- t.Error("Ah! TVM didn't report an error\n")
- }
-}
diff --git a/golang/src/function.go b/golang/src/function.go
deleted file mode 100644
index 7b1c5d27d4..0000000000
--- a/golang/src/function.go
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for TVMFunction interface.
- * \file function.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "unsafe"
- "encoding/binary"
- "errors"
- "runtime"
- "reflect"
- "fmt"
-)
-
-// Function type in golang hold pointer for the TVMFunction handle.
-type Function uintptr
-
-// nativeCPtr returns type freed uintptr for the Function.
-func (tvmfunction Function) nativeCPtr() (retVal uintptr) {
- retVal = (uintptr)(tvmfunction)
- return
-}
-
-// Invoke calls the TVM packed function referred by the handle with given
arguments.
-func (tvmfunction *Function) Invoke(args ...interface{}) (retVal *Value, err
error) {
- funccall := func (fargs ...interface{}) (*Value, error) {
- return callNativeFunction(tvmfunction, fargs)
- }
- // Check is any args are contain any ValueArray
- // Possible is it's a args forward from one packed function to another.
- valueArrayFound := false
- for ii := range args {
- switch args[ii].(type) {
- case []*Value:
- valueArrayFound = true
- }
- }
-
- if !valueArrayFound {
- return funccall(args...)
- }
- if len(args) != 1 {
- err = fmt.Errorf("Not supported if packed function args are a mix of
[]Value and other types")
- return
- }
-
- valArray := args[0].([]*Value)
- if len(valArray) > 0 {
- newArgs := make([]interface{}, len(valArray))
- for ii := range valArray {
- newVal := newTVMValue()
- newVal.moveFrom(valArray[ii])
- newArgs[ii] = newVal
- }
-
- return funccall(newArgs...)
- }
- return funccall()
-}
-
-// FuncListGlobalNames is used to query global callable packed function names
from TVM.
-//
-// returns slice of string holding function names and error if any.
-func FuncListGlobalNames() (retVal []string, err error) {
- var str string
- ret := (int32)(C._TVMFuncListGlobalNames(unsafe.Pointer((&str))))
- if ret != 0 {
- err = errors.New(getTVMLastError())
- return
- }
-
- str = goStringFromNative(*(*string)(unsafe.Pointer(&str)))
- bin := binary.LittleEndian
- size := bin.Uint64([]byte(str[:8]))
- str = str[8:]
- retVal = make([]string, size)
- for i := range retVal {
- len := bin.Uint64([]byte(str[:8]))
- str = str[8:]
- retVal[i] = str[:len]
- str = str[len:]
- }
- return
-}
-
-// GetGlobalFunction is to get handle to the given global function name.
-//
-// `funcname` is the name of global packed function.
-//
-// returns a function closure with signature
-// func (args ...interface{}) (interface{}, error) and error if any.
-//
-// The closure function can be used to call Function with arguments directly.
-//
-// Variadic arguments can be any type which can be embed into Value.
-func GetGlobalFunction(funcname string) (retVal *Function, err error) {
- var funp uintptr
-
- cfuncname := C.CString(funcname)
- ret := (int32)(C.TVMFuncGetGlobal(cfuncname,
-
(*C.TVMFunctionHandle)(unsafe.Pointer(&funp))))
- C.free(unsafe.Pointer(cfuncname))
-
- if ret != 0 {
- err = errors.New(getTVMLastError())
- return
- }
-
- handle := new(Function)
- *handle = Function(funp)
- finalizer := func(fhandle *Function) {
- nativeTVMFuncFree(fhandle)
- fhandle = nil
- }
- runtime.SetFinalizer(handle, finalizer)
- retVal = handle
- return
-}
-
-// callNativeFunction is routine which calls gotvm native wrapper with given
arguments.
-//
-// `handle` is the handle for Function.
-//
-// `args` are the variadic arguments to the Function.
-//
-// returns the interface for the return value from TVM if any and error if any.
-func callNativeFunction(handle *Function, args []interface{}) (retVal *Value,
err error) {
- argsIn := make([]*Value, len(args))
- var typeCodes []int32
- if len(args) != 0 {
- typeCodes = make([]int32, len(args))
- } else {
- typeCodes = make([]int32, 1)
- }
-
- for ii := range args {
- argsIn[ii] = newTVMValue()
- if typeCodes[ii], err = argsIn[ii].setValue(args[ii]); err != nil {
- return
- }
- }
-
- retVal = newTVMValue()
- argsOut := []*Value{retVal}
- retTypeCode := KNull
- err = nativeTVMFuncCall(handle, argsIn, typeCodes, argsOut, &retTypeCode)
- if err != nil {
- retVal = nil
- return
- }
- retVal.isLocal = false
- retVal.dtype = retTypeCode
- return
-}
-
-// nativeTVMFuncFree free the function handle allocated in TVM runtime.
-//
-// `funp` is the Function handle to be freed.
-func nativeTVMFuncFree(funp *Function) (retVal int32) {
- retVal = (int32) (C.TVMFuncFree(C.TVMFunctionHandle(funp.nativeCPtr())))
- return
-}
-
-// nativeToGoSlice converts native TVMValue array to Golang slice of TVMValue
-//
-//
-func nativeToGoSlice(nargValues (*C.void), argValues []*Value, typeCodes
[]int32) {
- for ii := range argValues {
- C._TVMValueNativeGet(unsafe.Pointer(argValues[ii].nativeCPtr()),
- unsafe.Pointer(nargValues),
- C.int(int32(ii)))
- argValues[ii].dtype = typeCodes[ii]
- }
-}
-
-// nativeFromGoSlice converts golang slice of TVMValue to native TVMValue
array.
-//
-//
-func nativeFromGoSlice(argValues []*Value) (nptr (*C.void)) {
- nargValues := ((uintptr)(C.malloc(C.ulong(C.sizeof_TVMValue *
len(argValues)))))
- for ii := range argValues {
- C._TVMValueNativeSet(unsafe.Pointer(nargValues),
- unsafe.Pointer(argValues[ii].nativeCPtr()),
- C.int(int32(ii)))
- }
- nptr = (*C.void)(unsafe.Pointer(nargValues))
- return
-}
-
-// nativeTVMFuncCall executes the function with given arguments
-//
-// `funp` Function handle to the packed function.
-//
-// `argValues` is the slice of Value which are arguments to the packed
function.
-//
-// `typeCodes` is the alice of argument type codes corresponding to argValues.
-//
-// `retValues` is return argument which is slice of return values from the
packed function.
-//
-// `retTypeCode` is int32 holding type codes for retValue
-//
-// Returns err indicating native error if any.
-func nativeTVMFuncCall(funp *Function, argValues []*Value, typeCodes []int32,
- retValues []*Value, retTypeCode *int32) (err error) {
- nargValues := nativeFromGoSlice(argValues)
- nretValues := nativeFromGoSlice(retValues)
- result := (int32)(C.TVMFuncCall(C.TVMFunctionHandle(*funp),
- (*C.TVMValue)(unsafe.Pointer(nargValues)),
- (*C.int)(unsafe.Pointer(&(typeCodes[0]))),
- C.int(len(argValues)),
- (*C.TVMValue)(unsafe.Pointer(nretValues)),
- (*C.int)(unsafe.Pointer(retTypeCode))))
- nativeToGoSlice(nargValues, argValues, typeCodes)
- nativeToGoSlice(nretValues, retValues, (*[1<<31]
int32)(unsafe.Pointer(retTypeCode))[:1:1])
- C.free(unsafe.Pointer(nargValues))
- C.free(unsafe.Pointer(nretValues))
-
- if result != 0 {
- err = errors.New(getTVMLastError())
- }
- return
-}
-
-// goCallBack is a structure holding the go callback function pointer.
-// This wrapping is necessary as cgo doesn't support
-// passing golang functions type conversion to native.
-type goCallBack struct {
- cb func (args ...*Value) (interface{}, error)
-}
-
-//export goTVMCallback
-func goTVMCallback(args C.native_voidp, typeCodes C.native_voidp, numArgs
int32,
- retArg C.native_voidp, resourceHandle C.native_voidp) (ret
int32){
- fcb := (*goCallBack)(resourceHandle)
- // Make Value Sice from native TVMValue pointer.
- argValues := make([]*Value, numArgs)
-
- for ii := range argValues {
- argValues[ii] = newTVMValue()
- argValues[ii].isLocal = false
- }
-
- // Prepare arguments for golang callback function
- nativeToGoSlice((*C.void)(unsafe.Pointer(args)), argValues,
- (*[1<<31]
int32)(unsafe.Pointer(typeCodes))[:numArgs:numArgs])
- cbargs := argValues
-
- // Execute the callback
- retVal, err := fcb.cb(cbargs...)
- if err != nil {
- errStr := err.Error()
- setTVMLastError(errStr)
- return -1
- }
-
- // It's possible a packed function directly return
- // the return value of another packed function.
- //
- // Inside a packed func :
- // ```return pfunc.Invoke(args)```
- //
- // In this case pfunc returns nil which is
- // returned as an interface holding nil *Value.
- // Which becomes a valid retVal holding nil *Value.
- isRetNull := false
- switch retVal.(type) {
- case *Value:
- pRet := retVal.(*Value)
- if pRet == nil {
- isRetNull = true
- }
- }
-
- // Handle return value from callback function
- if retVal != nil && !isRetNull {
- var retTypeCode int32
- retValues := []*Value{newTVMValue()}
-
- retTypeCode, err = retValues[0].setValue(retVal)
- if err != nil {
- errStr := err.Error()
- setTVMLastError(errStr)
- return -1
- }
- nretValues := nativeFromGoSlice(retValues)
-
- // Handle KStr, KBytes: Local finalizers shouldn't try freeing them.
- retValues[0].isLocal = false
-
- apiRet := (int32) (C.TVMCFuncSetReturn(C.TVMRetValueHandle(retArg),
-
(*C.TVMValue)(unsafe.Pointer(nretValues)),
-
(*C.int)(unsafe.Pointer(&retTypeCode)), 1))
- C.free(unsafe.Pointer(nretValues))
- if apiRet != 0 {
- errStr := string("TVMCFuncSetReturn failed ")
- setTVMLastError(errStr)
- }
- }
- return
-}
-
-// ConvertFunction converts given golang function to TVM packed function.
-//
-// `args[0]` function pointer for a type ```func (args ...interface{})
(interface{})```
-//
-// Returns Function handle and err if any.
-func ConvertFunction(args ...interface{}) (retVal *Function, err error) {
- function := args[0].(func (args ...*Value) (interface{}, error))
- fcb := &goCallBack{cb:function}
- var funp uintptr
-
- result := (int32) (C._ConvertFunction(unsafe.Pointer(fcb),
- unsafe.Pointer(&funp)))
- if result != 0 {
- err = errors.New(getTVMLastError())
- }
-
- handle := new(Function)
- *handle = Function(funp)
- finalizer := func(fhandle *Function) {
- nativeTVMFuncFree(fhandle)
- fhandle = nil
- }
- runtime.SetFinalizer(handle, finalizer)
- retVal = handle
- return
-}
-
-// RegisterFunction registers the golang func in TVM runtime global space.
-//
-// `args[0]` function pointer for a type ```func (args ...interface{})
(interface{})```
-//
-// `args[1]` Optional argument of function name with which it will be
registered.
-// If not passed we use function name from reflection.
-//
-// Returns err indicating native error if any.
-func RegisterFunction(args ...interface{}) (err error) {
- fhandle, err := ConvertFunction(args...)
- if err != nil {
- return
- }
-
- funcname := runtime.FuncForPC(reflect.ValueOf(args[0]).Pointer()).Name()
- if len(args) > 1 {
- funcname = args[1].(string)
- }
-
- cfuncname := C.CString(funcname)
- result := (int32) (C.TVMFuncRegisterGlobal(cfuncname,
- C.TVMFunctionHandle(*fhandle),
- 0)); // Override = False
- C.free(unsafe.Pointer(cfuncname))
- if result != 0 {
- err = errors.New(getTVMLastError())
- }
- // Clear the finalizer as we don't need to control it anymore.
- runtime.SetFinalizer(fhandle, nil)
- return
-}
diff --git a/golang/src/function_test.go b/golang/src/function_test.go
deleted file mode 100644
index 0830d16419..0000000000
--- a/golang/src/function_test.go
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file function_test.go
- */
-
-package gotvm
-
-import (
- "testing"
- "reflect"
- "math/rand"
- "strings"
- "fmt"
-)
-
-// Check global function list API
-func TestFunctionGlobals(t *testing.T) {
- funcNames, err := FuncListGlobalNames()
- if err != nil {
- t.Error(err.Error())
- return
- }
- if len(funcNames) < 1 {
- t.Errorf("Global Function names received:%v\n", funcNames)
- }
-}
-
-// Check GetFunction API
-func TestFunctionGlobalGet(t *testing.T) {
- funp, err := GetGlobalFunction("tvm.graph_executor.create")
- if err != nil {
- t.Error(err.Error())
- return
- }
- if reflect.TypeOf(funp).Kind() != reflect.Ptr {
- t.Error("Function type mis matched\n")
- return
- }
-}
-
-func TestFunctionModuleGet(t *testing.T) {
- modp, err := LoadModuleFromFile("./deploy.so")
- if err != nil {
- t.Error(err.Error())
- return
- }
- funp, err := modp.GetFunction("myadd")
- if err != nil {
- t.Error(err.Error())
- return
- }
- if reflect.TypeOf(funp).Kind() != reflect.Ptr {
- t.Error("Function type mis matched\n")
- return
- }
-
- dlen := int64(1024)
- shape := []int64{dlen}
- inX, _ := Empty(shape)
- inY, _ := Empty(shape)
- out, _ := Empty(shape)
- dataX := make([]float32, (dlen))
- dataY := make([]float32, (dlen))
- outExpected := make([]float32, (dlen))
-
- for i := range dataX {
- dataX[i] = rand.Float32()
- dataY[i] = rand.Float32()
- outExpected[i] = dataX[i] + dataY[i]
- }
-
- inX.CopyFrom(dataX)
- inY.CopyFrom(dataY)
-
- funp.Invoke(inX, inY, out)
- outi, _ := out.AsSlice()
- outSlice := outi.([]float32)
- if len(outSlice) != len(outExpected) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(outExpected),
len(outSlice))
- return
- }
- for i := range outSlice {
- if outExpected[i] != outSlice[i] {
- t.Errorf("Data expected: %v Got :%v at index %v\n",
outExpected[i], outSlice[i], i)
- return
- }
- }
-}
-
-// Check FunctionConvert API
-func TestFunctionConvert(t *testing.T) {
- sampleCb := func (args ...*Value) (retVal interface{}, err error) {
- val1 := args[0].AsInt64()
- val2 := args[1].AsInt64()
- retVal = int64(val1+val2)
- return
- }
-
- fhandle, err := ConvertFunction(sampleCb)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- retVal, err := fhandle.Invoke(10, 20)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- if retVal.AsInt64() != int64(30) {
- t.Errorf("Expected result :30 got:%v\n", retVal.AsInt64())
- return
- }
-}
-
-func TestFunctionError(t *testing.T) {
- sampleCb := func (args ...*Value) (retVal interface{}, err error) {
- err = fmt.Errorf("Sample Error XYZABC");
- return
- }
-
- fhandle, err := ConvertFunction(sampleCb)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- _, err = fhandle.Invoke()
- if err == nil {
- t.Error("Expected error but didn't received\n")
- return
- }
-
- if !strings.Contains(err.Error(), string("Sample Error XYZABC")) {
- t.Errorf("Expected Error should contain :\"Sample Error XYZABC\" got
:%v\n", err.Error())
- }
-}
-
-// Check FunctionRegister
-func TestFunctionRegister(t *testing.T) {
- sampleCb := func (args ...*Value) (retVal interface{}, err error) {
- val1 := args[0].AsInt64()
- val2 := args[1].AsInt64()
- retVal = int64(val1+val2)
- return
- }
-
- RegisterFunction(sampleCb, "TestFunctionRegister.sampleCb");
- // Query global functions available
- funcNames, err := FuncListGlobalNames()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- found := 0
- for ii := range (funcNames) {
- if strings.Compare(funcNames[ii], "TestFunctionRegister.sampleCb") ==
0 {
- found = 1
- }
- }
- if found == 0 {
- t.Error("Registered function not found in global function list.")
- return
- }
-
- // Get "sampleCb" and verify the call.
- funp, err := GetGlobalFunction("TestFunctionRegister.sampleCb")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // Call function
- result, err := funp.Invoke((int64)(10), (int64)(20))
- if err != nil {
- t.Error(err.Error())
- return
- }
- if result.AsInt64() != int64(30) {
- t.Errorf("Expected result :30 got:%v\n", result.AsInt64())
- return
- }
-}
-
-// Check packed function receiving go-closure as argument.
-func TestFunctionClosureArg(t *testing.T) {
- // sampleFunctionArg receives a Packed Function handle and calls it.
- sampleFunctionArg := func (args ...*Value) (retVal interface{}, err error)
{
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
-
- // Call Packed Function by Value
- ret, err := pfunc.Invoke(args[1], args[2])
- if err != nil {
- return
- }
-
- // Call Packed Function with extracted values
- ret1, err := pfunc.Invoke(args[1].AsInt64(), args[2].AsInt64())
- if err != nil {
- return
- }
- if ret1.AsInt64() != ret.AsInt64() {
- err = fmt.Errorf("Invoke with int64 didn't match with Value")
- return
- }
- retVal = ret
- return
- }
-
- RegisterFunction(sampleFunctionArg,
"TestFunctionClosureArg.sampleFunctionArg");
- funp, err := GetGlobalFunction("TestFunctionClosureArg.sampleFunctionArg")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*Value) (retVal interface{}, err error) {
- val1 := args[0].AsInt64()
- val2 := args[1].AsInt64()
- retVal = int64(val1+val2)
- return
- }
-
- // Call function
- result, err := funp.Invoke(funccall, 30, 50)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- if result.AsInt64() != int64(80) {
- t.Errorf("Expected result :80 got:%v\n", result.AsInt64())
- return
- }
-}
-
-// Check packed function returning a go-closure.
-func TestFunctionClosureReturn(t *testing.T) {
- // sampleFunctionCb returns a function closure which is embed as packed
function in TVMValue.
- sampleFunctionCb := func (args ...*Value) (retVal interface{}, err error) {
- funccall := func (cargs ...*Value) (fret interface{}, ferr error) {
- val1 := cargs[0].AsInt64()
- val2 := cargs[1].AsInt64()
- fret = int64(val1+val2)
- return
- }
- retVal = funccall
- return
- }
-
- RegisterFunction(sampleFunctionCb,
"TestFunctionClosureReturn.sampleFunctionCb");
- funp, err :=
GetGlobalFunction("TestFunctionClosureReturn.sampleFunctionCb")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // Call function
- result, err := funp.Invoke()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- pfunc := result.AsFunction()
- pfuncRet, err := pfunc.Invoke(30, 40)
- if err != nil {
- t.Error(err.Error())
- return
- }
- if pfuncRet.AsInt64() != int64(70) {
- t.Errorf("Expected result :70 got:%v\n", pfuncRet.AsInt64())
- return
- }
-}
-
-// Check packed function with no arguments and no return values.
-func TestFunctionNoArgsReturns(t *testing.T) {
- sampleFunction := func (args ...*Value) (retVal interface{}, err error) {
- return
- }
-
- fhandle, err := ConvertFunction(sampleFunction)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- _, err = fhandle.Invoke()
- if err != nil {
- t.Error(err.Error())
- return
- }
-}
-
-// Check packed function returning a go-closure with no arg and returns.
-func TestFunctionNoArgsReturns2(t *testing.T) {
- // sampleFunctionCb returns a function closure which is embed as packed
function in TVMValue.
- sampleFunctionCb := func (args ...*Value) (retVal interface{}, err error) {
- funccall := func (cargs ...*Value) (fret interface{}, ferr error) {
- return
- }
- retVal = funccall
- return
- }
-
- funp, err := ConvertFunction(sampleFunctionCb)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // Call function
- result, err := funp.Invoke()
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- pfunc := result.AsFunction()
- _, err = pfunc.Invoke()
- if err != nil {
- t.Error(err.Error())
- return
- }
-}
diff --git a/golang/src/gotvm.cc b/golang/src/gotvm.cc
deleted file mode 100644
index d8919dafbf..0000000000
--- a/golang/src/gotvm.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm native interface definition
- * \file gotvm.cxx
- */
-
-// Standard includes
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-// golang string compatible definition
-typedef struct {
- char* p;
- int n;
-} _gostring_;
-#include <string>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// TVM runtime C interface
-#include <dlpack/dlpack.h>
-#include <tvm/runtime/c_runtime_api.h>
-
-/*!
- * \brief Convert native char array to _gostring_ structure.
- * _gostring_ structure represents the same memory footprint as golang string
object.
- *
- * \param p is char pointer to a char array.
- * \param l is the size of the char array. this method exclusively need length
as
- * its possible to have a bytearray in a string.
- *
- * \return _gostring_ object corresponding to native char array.
- * Caller is responsible to free the memory block allocated here.
- */
-static _gostring_ _native_to_gostring(const char* p, size_t l) {
- _gostring_ ret;
- ret.p = reinterpret_cast<char*>(malloc(l));
- if (NULL == ret.p) {
- ret.n = 0;
- return ret;
- }
- memcpy(ret.p, p, l);
- ret.n = l;
- return ret;
-}
-
-/*!
- * \brief embeds a 64bit uint value inside a string to serialize the data.
- *
- * \param s is string object.
- * \param off is the offset in the string object.
- * \param v is the uint64_t value which need to embed into given string.
- */
-static void putuint64(std::string* s, size_t off, uint64_t v) {
- for (int i = 0; i < 8; i++) {
- (*s)[off + i] = (v >> (i * 8)) & 0xff;
- }
-}
-
-// TVM runtime C interface wrappers
-
-/*!
- * \brief Native interface to query TVM_VERSION in golang string format.
- *
- * \return char pointer to TVM-VERSION
- */
-const char* _TVM_VERSION(void) {
- const char* version = TVM_VERSION;
- return version;
-}
-
-/*!
- * \brief Native interface for getting TVMGlobal function list.
- *
- * \param names return by argument to return the function names.
- * We wrap all strings into single string joined by (len+string)
- * which is unpacked and processed in golang.
- *
- * \return c_runtime_api return status.
- */
-int _TVMFuncListGlobalNames(_gostring_* names) {
- int names_size;
- char** names_array;
- int result;
-
- result = TVMFuncListGlobalNames(&names_size, (char const***)&names_array);
- if (result) {
- return result;
- }
-
- size_t tot = 8;
- for (int ii = 0; ii < names_size; ++ii) {
- tot += 8 + strlen(names_array[ii]);
- }
-
- std::string str;
- str.resize(tot);
- putuint64(&str, 0, names_size);
- size_t off = 8;
- for (int64_t ii = 0; ii < names_size; ++ii) {
- putuint64(&str, off, strlen(names_array[ii]));
- off += 8;
- str.replace(off, strlen(names_array[ii]), names_array[ii]);
- off += strlen(names_array[ii]);
- }
- *names = _native_to_gostring(str.data(), str.size());
- if (str.size() != names->n) {
- TVMAPISetLastError("malloc failed during _native_to_gostring");
- result = 1;
- }
- return result;
-}
-
-// Helpers for TVMValue
-
-/*!
- * \brief Native helper to copy TVMValue from golang slice to native array.
- * this helper is need as underlying memory for golang slice is not continuous.
- *
- * \param to_ptr is the native pointer of TVMValue array.
- * \param from_ptr pointer to TVMValue in golang slice.
- * \param array index in native array.
- */
-void _TVMValueNativeSet(void* to_ptr, void* from_ptr, int ind) {
- TVMValue* from_p = reinterpret_cast<TVMValue*>(from_ptr);
- TVMValue* to_p = reinterpret_cast<TVMValue*>(to_ptr);
- memcpy(to_p + ind, from_p, sizeof(TVMValue));
-}
-
-/*!
- * \brief Native helper to copy TVMValue from golang slice to native array.
- * this helper is need as underlying memory for golang slice is not continuous.
- *
- * \param to_ptr pointer to TVMValue in golang slice.
- * \param from_ptr is the native pointer of TVMValue array.
- * \param array index in native array.
- */
-void _TVMValueNativeGet(void* to_ptr, void* from_ptr, int ind) {
- TVMValue* from_p = reinterpret_cast<TVMValue*>(from_ptr);
- TVMValue* to_p = reinterpret_cast<TVMValue*>(to_ptr);
- memcpy(to_p, from_p + ind, sizeof(TVMValue));
-}
-
-extern int goTVMCallback(void*, void*, int, void*, void*);
-
-/*!
- * \brief _TVMCallback is the TVM runtime callback function for
ffi::Functiontion system.
- *
- * \param args is an array of TVMValue
- * \param type_codes is an array of int
- * \param num_args is int representing number of in arguments
- * \param ret is the return value handle to set the packed function return.
- * \param resource_handle is the golang private data pointer.
- *
- * \returns the error status as TVM_DLL
- */
-int _TVMCallback(TVMValue* args, int* type_codes, int num_args,
TVMRetValueHandle ret,
- void* resource_handle) {
- return goTVMCallback(args, type_codes, num_args, ret, resource_handle);
-}
-
-/*!
- * _TVMPackedCFuncFinalizer is finalizer for packed function system.
- *
- */
-void _TVMPackedCFuncFinalizer(void* resource_handle) { return; }
-
-/*!
- * /brief _ConvertFunction creates a packed function for with given resource
handle.
- *
- * /param fptr is the pointer to golang resource handle.
- * /param *fhandle is the return argument holding packed function.
- *
- * /return is an int indicating the return status.
- */
-int _ConvertFunction(void* fptr, TVMFunctionHandle* fhandle) {
- int ret = TVMFuncCreateFromCFunc(_TVMCallback, fptr,
_TVMPackedCFuncFinalizer, fhandle);
- return ret;
-}
-
-#ifdef __cplusplus
-}
-#endif
diff --git a/golang/src/gotvm.go b/golang/src/gotvm.go
deleted file mode 100644
index 072d9cce46..0000000000
--- a/golang/src/gotvm.go
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file gotvm.go
- */
-
-
-// Package gotvm is TVM runtime interface definition for golang.
-//
-// Application need to import this package to access the c_runtime_api exposed
by TVM.
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-// DLPackVersion is the dlpack version of tvm runtime.
-var DLPackVersion = int(C.DLPACK_VERSION)
-// TVMVersion is the TVM runtime version.
-var TVMVersion = getTVMVersion()
-
-func getTVMVersion() (retStr string) {
- retStr = C.GoString(C._TVM_VERSION())
- return
-}
diff --git a/golang/src/gotvm.h b/golang/src/gotvm.h
deleted file mode 100644
index a053e39bd7..0000000000
--- a/golang/src/gotvm.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm native interface declaration.
- * \file gotvm.h
- *
- * These declarations are in cgo interface definition while calling API
- * across golang and native C boundaries.
- */
-
-#ifndef GOTVM_GOTVM_H_
-#define GOTVM_GOTVM_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <dlpack/dlpack.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
-#include <tvm/runtime/c_runtime_api.h>
-
-// Some type definitions for golang "C"
-typedef void* native_voidp;
-
-// Version
-extern char* _TVM_VERSION(void);
-
-// Wrappers : For incompatible cgo API.
-// To handle array of strings wrapped into __gostring__
-extern int _TVMFuncListGlobalNames(void*);
-// To handle TVMValue slice to/from native sequential TVMValue array.
-extern void _TVMValueNativeSet(void* to, void* from, int index);
-extern void _TVMValueNativeGet(void* to, void* from, int index);
-
-// Callbacks
-extern int _ConvertFunction(void* fptr, void* funp);
-
-#ifdef __cplusplus
-}
-#endif
-#endif // GOTVM_GOTVM_H_
diff --git a/golang/src/gotvm_test.go b/golang/src/gotvm_test.go
deleted file mode 100644
index 271b189989..0000000000
--- a/golang/src/gotvm_test.go
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file gotvm_test.go
- */
-
-
-package gotvm
-
-import (
- "testing"
- "reflect"
-)
-
-// Check TVMVersion API
-func TestTVMVersion(t *testing.T) {
- if len(TVMVersion) == 0 {
- t.Error("TVMVersion not set\n")
- }
- if reflect.TypeOf(TVMVersion).Kind() != reflect.String {
- t.Error("TVMVersion type mismatch\n")
- }
-}
-
-// Check DLPackVersion API
-func TestDLPackVersion(t *testing.T) {
- if reflect.TypeOf(DLPackVersion).Kind() != reflect.Int {
- t.Error("TVMVersion type mismatch\n")
- }
-}
diff --git a/golang/src/module.go b/golang/src/module.go
deleted file mode 100644
index 8ac09e369c..0000000000
--- a/golang/src/module.go
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for TVMModule interface.
- * \file module.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "errors"
- "runtime"
- "unsafe"
-)
-
-// Module type in golang hold pointer for the TVMModule handle.
-//
-// Module initialization happen through TVMModLoadFromFile api in TVM runtime.
-type Module uintptr
-
-// nativeCPtr returns type freed uintptr for the Module.
-func (tvmmodule *Module) nativeCPtr() (retVal uintptr) {
- retVal = (uintptr)(*tvmmodule)
- return
-}
-
-// LoadModuleFromFile loads the given module in TVM runtime.
-//
-// `modpath` is the path to tvm module.
-//
-// `args` is an optional arguments of ["dll", "dylib", "dso", "so"] with
default value "so"
-//
-// returns pointer to Module and err or if any.
-func LoadModuleFromFile(modpath string, args ...interface{}) (retVal *Module,
err error) {
- modtype := "so"
- if len(args) > 0 {
- modtype = args[0].(string)
- }
- var modp uintptr
-
- cmodpath := C.CString(modpath)
- cmodtype := C.CString(modtype)
-
- ret := (int32)(C.TVMModLoadFromFile(cmodpath,
- cmodtype,
-
(*C.TVMModuleHandle)(unsafe.Pointer(&modp))))
-
- C.free(unsafe.Pointer(cmodpath))
- C.free(unsafe.Pointer(cmodtype))
-
- if ret != 0 {
- err = errors.New(getTVMLastError())
- return
- }
-
- handle := new(Module)
- *handle = Module(modp)
- finalizer := func(mhandle *Module) {
- nativeTVMModFree(mhandle)
- mhandle = nil
- }
- runtime.SetFinalizer(handle, finalizer)
- retVal = handle
- return
-}
-
-// nativeTVMModFree free the module handle allocated in TVM runtime.
-//
-// `modp` is the Module handle to be freed.
-func nativeTVMModFree(modp *Module) (retVal int32) {
- retVal = (int32) (C.TVMModFree(C.TVMModuleHandle(modp.nativeCPtr())))
- return
-}
-
-// GetFunction returns the function pointer from the module for given function
name.
-//
-// `tvmmodule` is handle for Module
-//
-// `funcname` function name in module.
-//
-// `args` variadic args of `queryImport`
-//
-// returns function closure with signature
-// func (args ...interface{}) (interface{}, error) and error if any.
-//
-// The closure function can be used to call Function with arguments directly.
-//
-// Variadic arguments can be any type which can be embed into Value.
-func (tvmmodule *Module) GetFunction (
- funcname string, args ...interface{}) (
- retVal *Function, err error){
- queryImports := int32(1)
- if len(args) > 0 {
- queryImports = int32(args[1].(int))
- }
-
- var funp uintptr
- cfuncname := C.CString(funcname)
- ret := (int32)(C.TVMModGetFunction((C.TVMModuleHandle)(*tvmmodule),
- cfuncname,
- C.int(queryImports),
-
(*C.TVMFunctionHandle)(unsafe.Pointer(&funp))))
- C.free(unsafe.Pointer(cfuncname))
-
- if ret != 0 {
- err = errors.New(getTVMLastError())
- return
- }
-
- handle := new(Function)
- *handle = Function(funp)
- finalizer := func(fhandle *Function) {
- nativeTVMFuncFree(fhandle)
- fhandle = nil
- }
- runtime.SetFinalizer(handle, finalizer)
- retVal = handle
- return
-}
diff --git a/golang/src/module_test.go b/golang/src/module_test.go
deleted file mode 100644
index 7e18a86c5b..0000000000
--- a/golang/src/module_test.go
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file module_test.go
- */
-
-
-package gotvm
-
-import (
- "testing"
- "reflect"
-)
-
-// Check module loading - dll
-func TestModuleTestLoad1(t *testing.T) {
- // dll
- mod, err := LoadModuleFromFile("./deploy.so", "dll")
- if err != nil {
- t.Error(err.Error())
- return
- }
- if reflect.TypeOf(mod).Kind() != reflect.Ptr {
- t.Error("Module type mis matched\n")
- return
- }
-}
-
-// Check module loading - dylib
-func TestModuleTestLoad2(t *testing.T) {
- // dylib
- mod, err := LoadModuleFromFile("./deploy.so", "dylib")
- if err != nil {
- t.Error(err.Error())
- return
- }
- if reflect.TypeOf(mod).Kind() != reflect.Ptr {
- t.Error("Module type mis matched\n")
- return
- }
-}
-
-func TestModuleTestLoad3(t *testing.T) {
- // dso
- mod, err := LoadModuleFromFile("./deploy.so", "dso")
- if err != nil {
- t.Error(err.Error())
- return
- }
- if reflect.TypeOf(mod).Kind() != reflect.Ptr {
- t.Error("Module type mis matched\n")
- return
- }
-}
-
-// Check module loading - so
-func TestModuleTestLoad4(t *testing.T) {
- // so
- mod, err := LoadModuleFromFile("./deploy.so", "so")
- if err != nil {
- t.Error(err.Error())
- return
- }
- if reflect.TypeOf(mod).Kind() != reflect.Ptr {
- t.Error("Module type mis matched\n")
- return
- }
-}
-
-// Check module loading - default (so)
-func TestModuleTestLoad5(t *testing.T) {
- // default type as so
- mod, err := LoadModuleFromFile("./deploy.so")
- if err != nil {
- t.Error(err.Error())
- return
- }
- if reflect.TypeOf(mod).Kind() != reflect.Ptr {
- t.Error("Module type mis matched\n")
- return
- }
-}
-
-// Check module loading err
-func TestModuleTestLoadErr(t *testing.T) {
- // Unknown file should return error
- _, err := LoadModuleFromFile("xyzabc.so")
- if err == nil {
- t.Error("Expected an error, but not received\n")
- return
- }
-}
diff --git a/golang/src/ndarray.go b/golang/src/ndarray.go
deleted file mode 100644
index b1e71aef56..0000000000
--- a/golang/src/ndarray.go
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for TVMArray aka DLTensor
- * \file ndarray.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "unsafe"
- "fmt"
- "errors"
- "runtime"
- "reflect"
-)
-
-// Array type in golang hold pointer for the TVMArray object from dlpack.
-//
-// Array initialization happen through Empty api
-type Array uintptr
-
-// nativeCPtr returns type freed uintptr for the Array.
-func (parray Array) nativeCPtr() (retVal uintptr) {
- retVal = (uintptr)(parray)
- return
-}
-
-func (parray Array) nativeCopyFrom(data unsafe.Pointer, datalen int) (err
error) {
- ret :=
C.TVMArrayCopyFromBytes((*C.DLTensor)(unsafe.Pointer(parray.nativeCPtr())),
- data,
- C.ulong(datalen))
- if ret != 0 {
- err = errors.New(getTVMLastError())
- }
- return
-}
-
-// CopyFrom copies given golang data slice into Array.
-//
-// `val` is interface homding a slice of Array data type.
-//
-// returns err is any.
-// TOD: Use reflections for better handling
-func (parray Array) CopyFrom(val interface{}) (err error) {
- var data unsafe.Pointer
- var datalen int
- dtype := ((*C.DLTensor)(unsafe.Pointer(parray))).dtype
-
- switch val.(type) {
- case []int8:
- sliceVal := val.([]int8)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []int16:
- sliceVal := val.([]int16)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []int32:
- sliceVal := val.([]int32)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []int64:
- sliceVal := val.([]int64)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []uint8:
- sliceVal := val.([]uint8)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []uint16:
- sliceVal := val.([]uint16)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []uint32:
- sliceVal := val.([]uint32)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []uint64:
- sliceVal := val.([]uint64)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []float32:
- sliceVal := val.([]float32)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- case []float64:
- sliceVal := val.([]float64)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- return parray.nativeCopyFrom(data, datalen)
- default:
- err = fmt.Errorf("Given type not supported : %v",
reflect.TypeOf(val))
- return
- }
- return
-}
-
-func (parray Array) nativeCopyTo (data unsafe.Pointer, datalen int) (err
error){
- ret :=
C.TVMArrayCopyToBytes((*C.DLTensor)(unsafe.Pointer(parray.nativeCPtr())),
- unsafe.Pointer(data),
- C.ulong(datalen))
-
- if ret != 0 {
- err = errors.New(getTVMLastError())
- }
- return
-}
-
-// AsSlice returns the unitptr of for the data inside Array.
-//
-// returns the slice of array inside Array and err of any.
-// TOD: Use reflections for better handling
-func (parray Array) AsSlice() (retVal interface{}, err error) {
- shape := parray.GetShape()
- size := int64(1)
- var data unsafe.Pointer
- var datalen int
-
- for ii := range shape {
- size *= shape[ii]
- }
- dtype := ((*C.DLTensor)(unsafe.Pointer(parray))).dtype
-
- switch parray.GetDType() {
- case "int8":
- sliceVal := make([]int8, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "int16":
- sliceVal := make([]int16, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "int32":
- sliceVal := make([]int32, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "int64":
- sliceVal := make([]int64, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "uint8":
- sliceVal := make([]uint8, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "uint16":
- sliceVal := make([]uint16, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "uint32":
- sliceVal := make([]uint32, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "uint64":
- sliceVal := make([]uint64, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "float32":
- sliceVal := make([]float32, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- case "float64":
- sliceVal := make([]float64, size)
- data = unsafe.Pointer(&sliceVal[0])
- datalen = len(sliceVal) * int(dtype.bits / 8)
- err = parray.nativeCopyTo(data, datalen)
- retVal = sliceVal
- default:
- err = fmt.Errorf("Given type not supported : %v",
parray.GetDType())
- return
- }
- return
-}
-
-// GetNdim returns the number of dimentions in Array
-func (parray Array) GetNdim() (retVal int32) {
- retVal = int32(((*C.DLTensor)(unsafe.Pointer(parray))).ndim)
- return
-}
-
-// GetShape returns the number of dimentions in Array
-func (parray Array) GetShape() (retVal []int64) {
- shapePtr := (*C.int64_t)(((*C.DLTensor)(unsafe.Pointer(parray))).shape)
- ndim := parray.GetNdim()
-
- shapeSlice := (*[1<<31] int64)(unsafe.Pointer(shapePtr))[:ndim:ndim]
- retVal = make([]int64, ndim)
- copy(retVal, shapeSlice)
- return
-}
-
-// GetDType returns the number of dimentions in Array
-func (parray Array) GetDType() (retVal string) {
- ret := ((*C.DLTensor)(unsafe.Pointer(parray))).dtype
- retVal, _ = dtypeFromTVMType(*(*pTVMType)(unsafe.Pointer(&ret)))
- return
-}
-
-// GetDevice returns the number of dimentions in Array
-func (parray Array) GetDevice() (retVal Device) {
- ret := ((*C.DLTensor)(unsafe.Pointer(parray))).device
- retVal = *(*Device)(unsafe.Pointer(&ret))
- return
-}
-
-// nativeTVMArrayAlloc is used to allocate TVMArray from given attributes.
-//
-// `shape` is int64 slice holding shape of the Array to be created.
-//
-// `ndim` is the rank of the Array to be created.
-//
-// `dtypeCode`, `dtypeBits` and `dtypeLanes` describe the data type in Array.
-//
-// `deviceType` indicates the device on whose memory the Array to allocated.
-//
-// `deviceID` indicates device index if multiple devices of same type present.
-//
-// return argument holding native pointer to newly created Array and error is
any.
-func nativeTVMArrayAlloc(shape []int64, ndim int32,
- dtypeCode int32, dtypeBits int32, dtypeLanes int32,
- deviceType int32, deviceID int32) (retVal uintptr, err
error) {
- ret := (int32)(C.TVMArrayAlloc((*C.long)(&(shape[0])),
- C.int(ndim),
- C.int(dtypeCode),
- C.int(dtypeBits),
- C.int(dtypeLanes),
- C.int(deviceType),
- C.int(deviceID),
-
(*C.TVMArrayHandle)(unsafe.Pointer(&retVal))))
- if ret != 0 {
- err = errors.New(getTVMLastError())
- return
- }
- return
-}
-
-// Empty is used to allocate TVM empty array of given epecification.
-//
-// `shape` is int64 slice holding shape of the Array
-//
-// `args` is variadic args for
-//
-// `args[0]` is string for data type. Default value is 'float32'
-//
-// `args[1]` is Device. Default value is '{KDLCPU, 0}'
-//
-// returns pointer to Array on successful execution and error if any.
-func Empty(shape []int64, args ...interface{}) (parray *Array, err error) {
- typeName := "float32"
- dev := Device{KDLCPU, 0}
-
- if len(shape) < 1 {
- err = fmt.Errorf("Invalid shape for Array creation: %v", len(shape))
- return
- }
-
- for i, val := range args {
- switch val.(type) {
- case string:
- typeName = args[i].(string)
- case Device:
- dev = args[i].(Device)
- default:
- err = fmt.Errorf("Invalid Optional Argument Type: %T", val)
- return
- }
- }
-
- tvmType, err := dtypeToTVMType(typeName)
- if err != nil {
- return
- }
- ndim := int32(len(shape))
- newArray, err := nativeTVMArrayAlloc(shape, ndim, int32(tvmType.code),
- int32(tvmType.bits), int32(tvmType.lanes),
- dev.DeviceType, dev.DeviceID)
- if err != nil {
- return
- }
- handle := new(Array)
- *handle = Array(newArray)
-
- finalizer := func (ahandle *Array) {
- nativeTVMArrayFree(*ahandle)
- ahandle = nil
- }
- runtime.SetFinalizer(handle, finalizer)
- parray = handle
- return
-}
-
-// nativeTVMArrayFree is used to release the Array.
-//
-// `parray` is the Array handle.
-//
-// `ret` indicates the status of this api execution.
-func nativeTVMArrayFree(parray Array) (retVal int32) {
- retVal =
(int32)(C.TVMArrayFree((*C.DLTensor)(unsafe.Pointer(parray.nativeCPtr()))))
- return
-}
diff --git a/golang/src/tvm_runtime_pack.cc b/golang/src/tvm_runtime_pack.cc
deleted file mode 100644
index 475abf5a3e..0000000000
--- a/golang/src/tvm_runtime_pack.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief This is an all in one TVM runtime file.
- * \file tvm_runtime_pack.cc
- */
-#include "src/runtime/c_runtime_api.cc"
-#include "src/runtime/container.cc"
-#include "src/runtime/cpu_device_api.cc"
-#include "src/runtime/file_utils.cc"
-#include "src/runtime/library_module.cc"
-#include "src/runtime/logging.cc"
-#include "src/runtime/module.cc"
-#include "src/runtime/ndarray.cc"
-#include "src/runtime/object.cc"
-#include "src/runtime/registry.cc"
-#include "src/runtime/thread_pool.cc"
-#include "src/runtime/threading_backend.cc"
-#include "src/runtime/workspace_pool.cc"
-
-// NOTE: all the files after this are optional modules
-// that you can include remove, depending on how much feature you use.
-
-// Likely we only need to enable one of the following
-// If you use Module::Load, use dso_module
-// For system packed library, use system_lib_module
-#include "src/runtime/dso_library.cc"
-#include "src/runtime/system_library.cc"
-
-// Graph executor
-#include "src/runtime/memory/memory_manager.cc"
-
-// Uncomment the following lines to enable RPC
-// #include "../../src/runtime/rpc/rpc_session.cc"
-// #include "../../src/runtime/rpc/rpc_event_impl.cc"
-// #include "../../src/runtime/rpc/rpc_server_env.cc"
-
-// These macros enables the device API when uncommented.
-#define TVM_CUDA_RUNTIME 1
-#define TVM_METAL_RUNTIME 1
-#define TVM_OPENCL_RUNTIME 1
-
-// Uncomment the following lines to enable Metal
-// #include "../../src/runtime/metal/metal_device_api.mm"
-// #include "../../src/runtime/metal/metal_module.mm"
-
-// Uncomment the following lines to enable CUDA
-// #include "../../src/runtime/cuda/cuda_device_api.cc"
-// #include "../../src/runtime/cuda/cuda_module.cc"
-
-// Uncomment the following lines to enable OpenCL
-// #include "../../src/runtime/opencl/opencl_device_api.cc"
-// #include "../../src/runtime/opencl/opencl_module.cc"
-// #include "../src/runtime/source_utils.cc"
diff --git a/golang/src/type.go b/golang/src/type.go
deleted file mode 100644
index 6202e0baa8..0000000000
--- a/golang/src/type.go
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package for TVMType interface
- * \file type.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "fmt"
-)
-
-// pTVMType corresponding to data types.
-type pTVMType struct {
- code uint8
- bits uint8
- lanes uint16
-}
-
-// data type to pTVMType mapping
-var dtypeMap = map[string] pTVMType {
- "int8": pTVMType{0, 8, 1},
- "int16": pTVMType{0, 16, 1},
- "int32": pTVMType{0, 32, 1},
- "int64": pTVMType{0, 64, 1},
- "uint8": pTVMType{1, 8, 1},
- "uint16": pTVMType{1, 16, 1},
- "uint32": pTVMType{1, 32, 1},
- "uint64": pTVMType{1, 64, 1},
- "float32": pTVMType{2, 32, 1},
- "float64": pTVMType{2, 64, 1},
-}
-
-// dtypeFromTVMType return the pTVMType corresponding to given dtype
-//
-// `dtype` string for the given data type.
-func dtypeFromTVMType(tvmtype pTVMType) (retVal string, err error) {
- for k, v := range dtypeMap {
- if v.code == tvmtype.code && v.bits == tvmtype.bits && v.lanes ==
tvmtype.lanes {
- retVal = k
- return
- }
- }
-
- err = fmt.Errorf("Cannot map TVMType:%v to dtype", tvmtype)
- return
-}
-
-// dtypeToTVMType return the pTVMType corresponding to given dtype
-//
-// `dtype` string for the given data type.
-func dtypeToTVMType(args ...interface{}) (tvmtype pTVMType, err error) {
- dtype := args[0].(string)
- lanes := 1
-
- if len(args) == 2 {
- lanes = args[1].(int)
- }
-
- for k, v := range dtypeMap {
- if k == dtype {
- tvmtype = v
- tvmtype.lanes = uint16(lanes)
- return
- }
- }
- err = fmt.Errorf("Cannot map dtype:%v to TVMType", dtype)
- return
-}
diff --git a/golang/src/utils.go b/golang/src/utils.go
deleted file mode 100644
index 2da4138a1e..0000000000
--- a/golang/src/utils.go
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for common utilities
- * \file utils.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "unsafe"
-)
-
-// Native string map for go string
-type nativeGoString struct { p uintptr; n int32 }
-
-func goStringFromNative (s string) (retStr string) {
- p := *(*nativeGoString)(unsafe.Pointer(&s))
- retStr = string((*[0x7fffffff]byte)(unsafe.Pointer(p.p))[:p.n])
- C.free(unsafe.Pointer(p.p))
- return
-}
diff --git a/golang/src/value.go b/golang/src/value.go
deleted file mode 100644
index 450cf4866a..0000000000
--- a/golang/src/value.go
+++ /dev/null
@@ -1,378 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package source for TVMValue interface
- * \file value.go
- */
-
-package gotvm
-
-//#include "gotvm.h"
-import "C"
-
-import (
- "fmt"
- "runtime"
- "unsafe"
-)
-
-// KHandle is golang type code for TVM enum kTVMOpaqueHandle.
-var KHandle = int32(C.kTVMOpaqueHandle)
-// KNull is golang type code for TVM kTVMNullptr.
-var KNull = int32(C.kTVMNullptr)
-// KTVMType is golang type code for TVM kTVMDataType.
-var KTVMType = int32(C.kTVMDataType)
-// KDLDevice is golang type code for TVM kDLDevice.
-var KDLDevice = int32(C.kDLDevice)
-// KArrayHandle is golang type code for TVM kTVMDLTensorHandle.
-var KArrayHandle = int32(C.kTVMDLTensorHandle)
-// KObjectHandle is golang type code for TVM kTVMObjectHandle.
-var KObjectHandle = int32(C.kTVMObjectHandle)
-// KModuleHandle is gonag type code for TVM kTVMModuleHandle.
-var KModuleHandle = int32(C.kTVMModuleHandle)
-// KFuncHandle is gonalg type code for TVM kTVMPackedFuncHandle.
-var KFuncHandle = int32(C.kTVMPackedFuncHandle)
-// KStr is golang type code for TVM kTVMStr.
-var KStr = int32(C.kTVMStr)
-// KBytes is golang type code for TVM kTVMBytes.
-var KBytes = int32(C.kTVMBytes)
-// KNDArrayContainer is golang typecode for kTVMNDArrayHandle.
-var KNDArrayContainer = int32(C.kTVMNDArrayHandle)
-// KExtBegin is golang enum corresponding to TVM kTVMExtBegin.
-var KExtBegin = int32(C.kTVMExtBegin)
-// KNNVMFirst is golang enum corresponding to TVM kNNVMFirst.
-var KNNVMFirst = int32(C.kTVMNNVMFirst)
-// KNNVMLast is golang enum corresponding to TVM kNNVMLast.
-var KNNVMLast = int32(C.kTVMNNVMLast)
-// KExtReserveEnd is golang enum corresponding to TVM kExtReserveEnd.
-var KExtReserveEnd = int32(C.kTVMExtReserveEnd)
-// KExtEnd is golang enum corresponding to TVM kExtEnd.
-var KExtEnd = int32(C.kTVMExtEnd)
-// KDLInt is golang type code for TVM kDLInt.
-var KDLInt = int32(C.kDLInt)
-// KDLUInt is golang type code for TVM kDLUInt.
-var KDLUInt = int32(C.kDLUInt)
-// KDLFloat is golang type code for TVM kDLFloat.
-var KDLFloat = int32(C.kDLFloat)
-
-// Value Typemap for union exposed by TVM runtime API.
-//
-// gotvm maps it to a uintptr and then dynamically allocates memory by
newTVMValue method.
-type Value struct {
- nptr uintptr
- dtype int32
- isLocal bool
-}
-
-// AsInt64 returns the int64 value inside the Value.
-func (tvmval *Value) AsInt64() (retVal int64) {
- retVal = tvmval.getVInt64()
- return
-}
-
-// AsFloat64 returns the Float64 value inside the Value.
-func (tvmval *Value) AsFloat64() (retVal float64) {
- retVal = tvmval.getVFloat64()
- return
-}
-
-// AsModule returns the Module inside the Value.
-func (tvmval *Value) AsModule() (retVal *Module) {
- mhandle := tvmval.getVMHandle()
- retVal = &mhandle
- return
-}
-
-// AsFunction returns the Function inside the Value.
-func (tvmval *Value) AsFunction() (retVal *Function) {
- fhandle := tvmval.getVFHandle()
- retVal = &fhandle
-
- return
-}
-
-// AsBytes returns the byte slice value inside the Value.
-func (tvmval *Value) AsBytes() (retVal []byte) {
- retVal = tvmval.getVBHandle().getData()
- return
-}
-
-// AsStr returns the golang string in the Value.
-func (tvmval *Value) AsStr() (retVal string) {
- str := tvmval.getVStr()
- retVal = str
- return
-}
-
-// nativeCPtr return the unitptr corresponding to Value type.
-func (tvmval *Value) nativeCPtr() (ret uintptr) {
- ret = (uintptr)(tvmval.nptr)
- return
-}
-
-// moveFrom copies the tvmval from other Value object.
-func (tvmval *Value) moveFrom(fromval *Value) () {
- C.memcpy(unsafe.Pointer(tvmval.nativeCPtr()),
- unsafe.Pointer(fromval.nativeCPtr()),
- C.sizeof_TVMValue)
-
- // Move the dtype too.
- tvmval.dtype = fromval.dtype
- fromval.dtype = KNull
- return
-}
-
-// setVInt64 initializes the Value object with given int64 value.
-//
-// `val` is the int64 value to initialize the Value
-func (tvmval *Value) setVInt64(val int64) {
- valp := (*C.int64_t)(unsafe.Pointer(tvmval.nativeCPtr()))
- *valp = C.int64_t(val)
- tvmval.dtype = KDLInt
- return
-}
-
-
-// getVInt64 returns the int64 value inside the Value.
-func (tvmval *Value) getVInt64() (retVal int64) {
- valp := (*C.int64_t)(unsafe.Pointer(tvmval.nativeCPtr()))
- retVal = int64(*valp)
- return
-}
-
-// setVFloat64 initializes the Value object with given float64 value.
-//
-// `val` is the float64 value to initialize the Value.
-func (tvmval *Value) setVFloat64(val float64) {
- valp := (*C.double)(unsafe.Pointer(tvmval.nativeCPtr()))
- *valp = C.double(val)
- tvmval.dtype = KDLFloat
- return
-}
-
-// getVFloat64 returns the float64 value inside Value.
-func (tvmval *Value) getVFloat64() (retVal float64) {
- valp := (*C.double)(unsafe.Pointer(tvmval.nativeCPtr()))
- retVal = float64(*valp)
- return
-}
-
-// setVHandle initializes the handle inside the Value.
-//
-// Can be used to store any uintptr type object like
-// module handle, function handle and any object's nativeCPtr.
-//
-// `val` is the uintptr type of given handle.
-func (tvmval *Value) setVHandle(val uintptr) {
- valp := (**C.void)(unsafe.Pointer(tvmval.nativeCPtr()))
- *valp = (*C.void)(unsafe.Pointer(val))
-}
-
-// getVHandle returns the uintptr handle
-func (tvmval *Value) getVHandle() (retVal uintptr) {
- valp := (**C.void)(unsafe.Pointer(tvmval.nativeCPtr()))
- retVal = uintptr(unsafe.Pointer(*valp))
- return
-}
-
-// setVStr intializes the Value with given golang string object.
-//
-// `val` is the golang string object used to initialize the Value.
-func (tvmval *Value) setVStr(val string) {
- valp := (**C.char)(unsafe.Pointer(tvmval.nativeCPtr()))
- *valp = C.CString(val)
- tvmval.dtype = KStr
- return
-}
-
-
-// getVStr returns the golang string for the native string inside Value.
-func (tvmval *Value) getVStr() (retVal string) {
- valp := (**C.char)(unsafe.Pointer(tvmval.nativeCPtr()))
- retVal = C.GoString(*valp)
- return
-}
-
-// unSetVStr release the memory allocated in setVStr
-func (tvmval *Value) unSetVStr() {
- valp := (**C.char)(unsafe.Pointer(tvmval.nativeCPtr()))
- C.free(unsafe.Pointer(*valp))
- tvmval.dtype = KNull
-}
-
-// setVAHandle is used to set Array handle in Value.
-//
-// Application can call the setVHandle with nativeCPtr instead too.
-// This is a wrapper to accept Array directly.
-func (tvmval *Value) setVAHandle(ptvmarray Array) {
- tvmval.setVHandle(ptvmarray.nativeCPtr())
- tvmval.dtype = KArrayHandle
- return
-}
-
-// getVAHandle is used to get Array handle in Value.
-func (tvmval *Value) getVAHandle() (retVal Array) {
- retVal = (Array)(tvmval.getVHandle())
- return
-}
-
-// setVMHandle is used to set Module handle in Value.
-//
-// Application can call the setVHandle with nativeCPtr instead too.
-// This is a wrapper to accept Module directly.
-func (tvmval *Value) setVMHandle(tvmmodule Module) {
- tvmval.setVHandle(tvmmodule.nativeCPtr())
- tvmval.dtype = KModuleHandle
- return
-}
-
-// getVMHandle is used to get Module handle in Value.
-func (tvmval *Value) getVMHandle() (retVal Module) {
- retVal = (Module)(tvmval.getVHandle())
- return
-}
-
-// setVFHandle is used to set Function handle in Value.
-//
-// Application can call the setVHandle with nativeCPtr instead.
-// This is a wrapper to accept Function directly.
-func (tvmval *Value) setVFHandle(tvmfunction Function) {
- tvmval.setVHandle(tvmfunction.nativeCPtr())
- tvmval.dtype = KFuncHandle
- return
-}
-
-// getVFHandle is used to get Function handle in Value.
-func (tvmval *Value) getVFHandle() (retVal Function) {
- retVal = (Function)(tvmval.getVHandle())
- return
-}
-
-// setVBHandle is used to set ByteArray handle in Value.
-//
-// Application can call the setVHandle with nativeCPtr instead.
-// This is a wrapper to accept ByteArray directly.
-func (tvmval *Value) setVBHandle(tbytearray ByteArray) {
- tvmval.setVHandle(tbytearray.nativeCPtr())
- tvmval.dtype = KBytes
- return
-}
-
-// getVBHandle is used to get ByteArray handle in Value.
-func (tvmval *Value) getVBHandle() (retVal ByteArray) {
- retVal = (ByteArray)(tvmval.getVHandle())
- return
-}
-
-// setValue is used to set the given value in Value.
-//
-// `val` is value of types accepted by Value container or native union.
-func (tvmval *Value) setValue(val interface{}) (retVal int32, err error) {
- retVal = KNull
- switch val.(type) {
- case string:
- tvmval.setVStr(val.(string))
- case uint8:
- tvmval.setVInt64(int64(val.(uint8)))
- case uint16:
- tvmval.setVInt64(int64(val.(uint16)))
- case uint32:
- tvmval.setVInt64(int64(val.(uint32)))
- case uint64:
- tvmval.setVInt64(int64(val.(uint64)))
- case int:
- tvmval.setVInt64(int64(val.(int)))
- case int8:
- tvmval.setVInt64(int64(val.(int8)))
- case int16:
- tvmval.setVInt64(int64(val.(int16)))
- case int32:
- tvmval.setVInt64(int64(val.(int32)))
- case int64:
- tvmval.setVInt64(val.(int64))
- case float32:
- tvmval.setVFloat64(float64(val.(float32)))
- case float64:
- tvmval.setVFloat64(val.(float64))
- case *Module:
- tvmval.setVMHandle(*(val.(*Module)))
- case *Function:
- tvmval.setVFHandle(*(val.(*Function)))
- case *ByteArray:
- tvmval.setVBHandle(*(val.(*ByteArray)))
- case []byte:
- barray := newByteArray(val.([]byte))
- tvmval.setVBHandle(barray)
- case *Array:
- tvmval.setVAHandle(*(val.(*Array)))
- case func (args ...*Value) (interface{}, error):
- fhandle, apierr := ConvertFunction(val)
- if apierr != nil {
- err = fmt.Errorf("Given value Type not defined for Value: %v :
%T", val, val);
- return
- }
- tvmval.setVFHandle(*fhandle)
-
- // Clear the finalizer as we don't need to control it anymore.
- runtime.SetFinalizer(fhandle, nil)
- case *Value:
- tvmval.moveFrom(val.(*Value))
- case Value:
- fromval := val.(Value)
- tvmval.moveFrom(&fromval)
- default:
- err = fmt.Errorf("Given value Type not defined for Value: %v :
%T", val, val);
- }
- retVal = tvmval.dtype
- return
-}
-
-// newTVMValue initialize the TVMValue native object.
-//
-// This is intended to use as intermediate type between native and golang
types.
-// Allocated from FuncCall or Callback to handle conversions.
-func newTVMValue() (retVal *Value) {
- handle := new(Value)
-
- handle.nptr = (uintptr(C.malloc(C.sizeof_TVMValue)))
- handle.dtype = KNull
- handle.isLocal = true
- finalizer := func(vhandle *Value) {
- vhandle.deleteTVMValue()
- vhandle = nil
- }
- runtime.SetFinalizer(handle, finalizer)
- retVal = handle
- return
-}
-
-// deleteTVMValue free the native Value object which is allocated in
newTVMValue.
-func (tvmval Value) deleteTVMValue() {
- if tvmval.isLocal == true {
- if tvmval.dtype == KStr {
- tvmval.unSetVStr()
- }
- if tvmval.dtype == KBytes {
- tvmval.getVBHandle().deleteTVMByteArray()
- }
- }
-
- C.free(unsafe.Pointer(tvmval.nativeCPtr()))
-}
diff --git a/golang/src/value_test.go b/golang/src/value_test.go
deleted file mode 100644
index ba502254cd..0000000000
--- a/golang/src/value_test.go
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-/*!
- * \brief gotvm package
- * \file value_test.go
- */
-
-package gotvm
-
-import (
- "testing"
- "math/rand"
- "strings"
-)
-
-// Check Int64 Value looping via packed function calling another packed
function.
-func TestValueLoopInt64(t *testing.T) {
- // Receive a function Handle and argument and echo the Value on the handle.
- sampleFunctionLoop := func (args ...*Value) (retVal interface{}, err
error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
- newArgs := args[1:]
-
- // Call Packed Function by Value
- return pfunc.Invoke(newArgs)
- }
-
- fhandle, err := ConvertFunction(sampleFunctionLoop)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*Value) (retVal interface{}, err error) {
- retVal = args[0]
- return
- }
-
- result := rand.Int63()
- retVal, err := fhandle.Invoke(funccall, result)
- if err != nil {
- t.Error(err.Error())
- return
- }
- if retVal.AsInt64() != result {
- t.Errorf("Expected : %v got:%v\n", result, retVal.AsInt64())
- return
- }
-}
-
-// Check Int32 Value looping via packed function calling another packed
function.
-func TestValueLoopInt32(t *testing.T) {
- // Receive a function Handle and argument and echo the Value on the handle.
- sampleFunctionLoop := func (args ...*Value) (retVal interface{}, err
error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
- newArgs := args[1:]
-
- // Call Packed Function by Value
- return pfunc.Invoke(newArgs)
- }
-
- fhandle, err := ConvertFunction(sampleFunctionLoop)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*Value) (retVal interface{}, err error) {
- retVal = args[0]
- return
- }
-
- result := rand.Int31()
- retVal, err := fhandle.Invoke(funccall, result)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- if retVal.AsInt64() != int64(result) {
- t.Errorf("Expected : %v got:%v\n", result, retVal.AsInt64())
- return
- }
-}
-
-// Check Float32 Value looping via packed function calling another packed
function.
-func TestValueLoopFloat32(t *testing.T) {
- // Receive a function Handle and argument and echo the Value on the handle.
- sampleFunctionLoop := func (args ...*Value) (retVal interface{}, err
error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
- newArgs := args[1:]
- // Call Packed Function by Value
- return pfunc.Invoke(newArgs)
- }
-
- fhandle, err := ConvertFunction(sampleFunctionLoop)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*Value) (retVal interface{}, err error) {
- retVal = args[0]
- return
- }
-
- result := rand.Float32()
- retVal, err := fhandle.Invoke(funccall, result)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- if retVal.AsFloat64() != float64(result) {
- t.Errorf("Expected : %v got:%v\n", result, retVal.AsInt64())
- return
- }
-}
-
-// Check Float64 Value looping via packed function calling another packed
function.
-func TestValueLoopFloat64(t *testing.T) {
- // Receive a function Handle and argument and echo the Value on the handle.
- sampleFunctionLoop := func (args ...*Value) (retVal interface{}, err
error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
- newArgs := args[1:]
- // Call Packed Function by Value
- return pfunc.Invoke(newArgs)
- }
-
- fhandle, err := ConvertFunction(sampleFunctionLoop)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*Value) (retVal interface{}, err error) {
- retVal = args[0]
- return
- }
-
- result := rand.Float64()
- retVal, err := fhandle.Invoke(funccall, result)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- if retVal.AsFloat64() != result {
- t.Errorf("Expected : %v got:%v\n", result, retVal.AsInt64())
- return
- }
-}
-
-func TestValueLoopString(t *testing.T) {
- // Receive a function Handle and argument and echo the Value on the handle.
- sampleFunctionLoop := func (args ...*Value) (retVal interface{}, err
error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
- argStr := args[1].AsStr()
- // Call Packed Function by Value
- return pfunc.Invoke(argStr)
- }
-
- fhandle, err := ConvertFunction(sampleFunctionLoop)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*Value) (retVal interface{}, err error) {
- retVal = args[0].AsStr()
- return
- }
-
- retVal, err := fhandle.Invoke(funccall, "TestString")
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- vStr := retVal.AsStr()
- if strings.Compare(vStr, string("TestString")) != 0 {
- t.Errorf("Expected : %v got:%v\n", string("TestString"), vStr)
- return
- }
-}
-
-// Check []byte Value looping via packed function calling another packed
function.
-func TestValueLoopByteSlice(t *testing.T) {
- // Receive a function Handle and argument and echo the Value on the handle.
- sampleFunctionLoop := func (args ...*Value) (retVal interface{}, err
error) {
- // Reveive Packed Function Handle
- pfunc := args[0].AsFunction()
- argBytes := args[1].AsBytes()
- // Call Packed Function by Value
- return pfunc.Invoke(argBytes)
- }
-
- fhandle, err := ConvertFunction(sampleFunctionLoop)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- // funccall is a simple golang callback function like C = A + B.
- funccall := func (args ...*Value) (retVal interface{}, err error) {
- retVal = args[0].AsBytes()
- return
- }
-
- result := make([]byte, 1024)
- rand.Read(result)
- retVal, err := fhandle.Invoke(funccall, result)
- if err != nil {
- t.Error(err.Error())
- return
- }
-
- received := retVal.AsBytes()
- if len(result) != len(received) {
- t.Errorf("Data expected Len: %v Got :%v\n", len(result),
len(received))
- return
- }
- for i := range result {
- if result[i] != received[i] {
- t.Errorf("Data expected: %v Got :%v at index %v\n", result[i],
received[i], i)
- return
- }
- }
-}