Ejemplo n.º 1
0
    codegen_type,
    register_type_recognizers,
    register_type_codegenerators,
)


class CBLAS_LAYOUT:
    pass


class CBLAS_TRANSPOSE:
    pass


register_type_codegenerators({
    CBLAS_LAYOUT: lambda t: "CBLAS_LAYOUT",
    CBLAS_TRANSPOSE: lambda t: "CBLAS_TRANSPOSE",
})


class ConvertSGEMMCalls(ast.NodeTransformer):
    """
    Converts sgemm(...) calls into a valid cblas_sgemm call for MKL by
    prepending 101 for Row-Major and converting trans_A, trans_B in to the
    proper constant.
    """
    def visit_Call(self, node):
        if node.func.id == "sgemm":
            node.func.id = "cblas_sgemm"
            for i in range(2):
                node.args[i] = C.Cast(
                    CBLAS_TRANSPOSE(),
Ejemplo n.º 2
0
        int: lambda t: ctypes.c_long(t),
        bool: lambda t: ctypes.c_bool(t),
        float: lambda t: ctypes.c_double(t),
        str: lambda t: ctypes.c_char(str.encode(t)) if len(t) == 1 else
        ctypes.c_char_p(str.encode(t)),
        type(None): lambda t: None,
    })

    register_type_codegenerators({
        ctypes.c_int: lambda t: "int",
        ctypes.c_long: lambda t: "long",
        ctypes.c_float: lambda t: "float",
        ctypes.c_double: lambda t: "double",
        ctypes.c_char: lambda t: "char",
        ctypes.c_char_p: lambda t: "char*",
        ctypes.c_void_p: lambda t: "void*",
        ctypes.c_bool: lambda t: "bool",
        ctypes.c_ulong: lambda t: "size_t",
        type(None): lambda n: "void",

        _ctypes.Array: lambda ct: "%s*" % codegen_type(ct._type_()),
        _ctypes._Pointer: lambda ct: "%s*" % codegen_type(ct._type_()),

    })
else:
    register_type_recognizers({
        types.IntType: lambda t: ctypes.c_long(t),
        types.LongType: lambda t: ctypes.c_long(t),
        types.BooleanType: lambda t: ctypes.c_bool(t),
        types.FloatType: lambda t: ctypes.c_double(t),
        types.StringType: lambda t: ctypes.c_char(t) if len(t) == 1 else
        ctypes.c_char_p(t),
Ejemplo n.º 3
0
register_type_codegenerators({
    # pointers
    np.ctypeslib._ndptr: codegen_ndptr,

    # boolean types
    np.bool8:            lambda t: "bool",

    # signed integer types
    np.byte:             lambda t: "char",
    np.short:            lambda t: "short",
    np.intc:             lambda t: "int",
    np.longlong:         lambda t: "long long",

    # technically not universally compatible
    np.int8:             lambda t: "char",
    np.int16:            lambda t: "short",
    np.int32:            lambda t: "int",
    np.int64:            lambda t: "long",

    # unsigned integer types
    np.ubyte:            lambda t: "unsigned byte",
    np.ushort:           lambda t: "unsigned short",
    np.uintc:            lambda t: "unsigned int",
    np.ulonglong:        lambda t: "unsigned long long",

    # floating point types
    np.single:           lambda t: "float",
    np.float32:          lambda t: "float",
    np.double:           lambda t: "double",
    np.float64:          lambda t: "double",
})
Ejemplo n.º 4
0
if sys.maxsize > 2 ** 32:
    X64_BIT = True
else:
    # Python alias c_int to c_long on 32 bit platforms
    X64_BIT = False

register_type_codegenerators({
    ctypes.c_short: lambda t: "short",
    ctypes.c_int: lambda t: "int",
    ctypes.c_long: lambda t: "long" if X64_BIT else "int",
    ctypes.c_float: lambda t: "float",
    ctypes.c_double: lambda t: "double",
    ctypes.c_char: lambda t: "char",
    ctypes.c_char_p: lambda t: "char*",
    ctypes.c_void_p: lambda t: "void*",
    ctypes.c_bool: lambda t: "bool",
    ctypes.c_ulong: lambda t: "size_t",
    ctypes.c_uint32: lambda t: "uint32_t",
    type(None): lambda n: "void",

    _ctypes.Array: lambda ct: "%s*" % codegen_type(ct._type_()),
    _ctypes._Pointer: lambda ct: "%s*" % codegen_type(ct._type_()),

})

#register version specific nodes

if sys.version_info >= (3, 0):
    pass

else:
Ejemplo n.º 5
0
register_type_codegenerators({
    # pointers
    np.ctypeslib._ndptr:
    codegen_ndptr,

    # boolean types
    np.bool8:
    lambda t: "bool",

    # signed integer types
    np.byte:
    lambda t: "char",
    np.short:
    lambda t: "short",
    np.intc:
    lambda t: "int",
    np.longlong:
    lambda t: "long long",

    # technically not universally compatible
    np.int8:
    lambda t: "char",
    np.int16:
    lambda t: "short",
    np.int32:
    lambda t: "int",
    np.int64:
    lambda t: "long",

    # unsigned integer types
    np.ubyte:
    lambda t: "unsigned byte",
    np.ushort:
    lambda t: "unsigned short",
    np.uintc:
    lambda t: "unsigned int",
    np.ulonglong:
    lambda t: "unsigned long long",

    # floating point types
    np.single:
    lambda t: "float",
    np.float32:
    lambda t: "float",
    np.double:
    lambda t: "double",
    np.float64:
    lambda t: "double",
})
Ejemplo n.º 6
0
except:
    log.warn("Failed to load OpenCL runtime.")

import pycl

from ctree.types import (
    codegen_type,
    register_type_recognizers,
    register_type_codegenerators,
)

register_type_recognizers({})

register_type_codegenerators({
    pycl.cl_context: lambda t: "cl_context",
    pycl.cl_command_queue: lambda t: "cl_command_queue",
    pycl.cl_kernel: lambda t: "cl_kernel",
    pycl.cl_mem: lambda t: "cl_mem",
})

devices_context_queue_map = {}


def get_context_and_queue_from_devices(devices):
    key = tuple(device.vendor_id for device in devices)
    try:
        return devices_context_queue_map[key]
    except KeyError:
        context = pycl.clCreateContext(devices)
        queue = pycl.clCreateCommandQueue(context)
        devices_context_queue_map[key] = (context, queue)
        return devices_context_queue_map[key]
Ejemplo n.º 7
0
if ctree.OCL_ENABLED:

    import pycl

    from ctree.types import (
        codegen_type,
        register_type_recognizers,
        register_type_codegenerators,
    )

    register_type_recognizers({
    })

    register_type_codegenerators({
        pycl.cl_context:        lambda t: "cl_context",
        pycl.cl_command_queue:  lambda t: "cl_command_queue",
        pycl.cl_kernel:         lambda t: "cl_kernel",
        pycl.cl_mem:            lambda t: "cl_mem",
    })


    devices_context_queue_map = {}


def get_context_and_queue_from_devices(devices):
    key = tuple(device.vendor_id for device in devices)
    try:
        return devices_context_queue_map[key]
    except KeyError:
        context = pycl.clCreateContext(devices)
        queue = pycl.clCreateCommandQueue(context)
        devices_context_queue_map[key] = (context, queue)
Ejemplo n.º 8
0
from ctree.simd.types import m256d, m256, m512

from ctree.types import register_type_codegenerators

register_type_codegenerators({
    m256d: lambda t: "__m256d",
    m256: lambda t: "__m256",
    m512: lambda t: "__m512"
})
Ejemplo n.º 9
0
from ctypes import Structure
from ctree.c.nodes import Statement, Block, SymbolRef
from ctree.types import register_type_codegenerators

register_type_codegenerators({
    Structure: lambda t: "struct " + type(t).__name__})


class CodegenableStruct(Structure):
    def codegen(self):
        return "struct " + type(self).__name__

    def __str__(self):
        return self.codegen()


class StructDef(Statement):
    def __init__(self, struct_type, initializer=None):
        super(StructDef, self).__init__()
        self.struct_type = struct_type
        fields = map(lambda (n, t): SymbolRef(n, t()), struct_type._fields_)
        self.block = Block(fields)
        self.struct_name = struct_type.__name__
        self.initializer = initializer

    def codegen(self, indent=0):
        return "struct " + self.struct_name + self.block.codegen(indent)