liboperators.py 2.58 KB
Newer Older
PanZezhongQY's avatar
PanZezhongQY committed
1
2
3
import os
import platform
import ctypes
4
from ctypes import c_int, c_int64, c_uint64, POINTER
PanZezhongQY's avatar
PanZezhongQY committed
5
6
from .datatypes import *
from .devices import *
7
from .op_register import OpRegister
8
from pathlib import Path
9
from .structs import *
PanZezhongQY's avatar
PanZezhongQY committed
10

11
INFINI_ROOT = os.getenv("INFINI_ROOT") or str(Path.home() / ".infini")
PanZezhongQY's avatar
PanZezhongQY committed
12
13


14
15
16
17
18
19
20
21
22
23
24
25
26
27
class InfiniLib:
    def __init__(self, librt, libop):
        self.librt = librt
        self.libop = libop

    def __getattr__(self, name):
        if hasattr(self.libop, name):
            return getattr(self.libop, name)
        elif hasattr(self.librt, name):
            return getattr(self.librt, name)
        else:
            raise AttributeError(f"Attribute {name} not found in library")


PanZezhongQY's avatar
PanZezhongQY committed
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Open operators library
def open_lib():
    def find_library_in_ld_path(subdir, library_name):
        ld_library_path = os.path.join(INFINI_ROOT, subdir)
        paths = ld_library_path.split(os.pathsep)
        for path in paths:
            full_path = os.path.join(path, library_name)
            if os.path.isfile(full_path):
                return full_path
        return None

    system_name = platform.system()
    # Load the library
    if system_name == "Windows":
42
43
        libop_path = find_library_in_ld_path("bin", "infiniop.dll")
        librt_path = find_library_in_ld_path("bin", "infinirt.dll")
PanZezhongQY's avatar
PanZezhongQY committed
44
    elif system_name == "Linux":
45
46
        libop_path = find_library_in_ld_path("lib", "libinfiniop.so")
        librt_path = find_library_in_ld_path("lib", "libinfinirt.so")
PanZezhongQY's avatar
PanZezhongQY committed
47
48

    assert (
49
        libop_path is not None
PanZezhongQY's avatar
PanZezhongQY committed
50
    ), f"Cannot find infiniop.dll or libinfiniop.so. Check if INFINI_ROOT is set correctly."
51
52
53
54
55
56
57
    assert (
        librt_path is not None
    ), f"Cannot find infinirt.dll or libinfinirt.so. Check if INFINI_ROOT is set correctly."

    librt = ctypes.CDLL(librt_path)
    libop = ctypes.CDLL(libop_path)
    lib = InfiniLib(librt, libop)
PanZezhongQY's avatar
PanZezhongQY committed
58
59
60
61
62
63
64
    lib.infiniopCreateTensorDescriptor.argtypes = [
        POINTER(infiniopTensorDescriptor_t),
        c_uint64,
        POINTER(c_uint64),
        POINTER(c_int64),
        c_int,
    ]
PanZezhong's avatar
PanZezhong committed
65
66
67
    lib.infiniopCreateTensorDescriptor.restype = c_int
    lib.infiniopDestroyTensorDescriptor.argtypes = [infiniopTensorDescriptor_t]
    lib.infiniopDestroyTensorDescriptor.restype = c_int
68
    lib.infiniopCreateHandle.argtypes = [POINTER(infiniopHandle_t)]
PanZezhongQY's avatar
PanZezhongQY committed
69
70
71
    lib.infiniopCreateHandle.restype = c_int
    lib.infiniopDestroyHandle.argtypes = [infiniopHandle_t]
    lib.infiniopDestroyHandle.restype = c_int
72
73
    lib.infinirtSetDevice.argtypes = [c_int, c_int]
    lib.infinirtSetDevice.restype = c_int
PanZezhongQY's avatar
PanZezhongQY committed
74

75
76
    OpRegister.register_lib(lib)

PanZezhongQY's avatar
PanZezhongQY committed
77
    return lib
78
79
80


LIBINFINIOP = open_lib()