-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathsetup.py
142 lines (111 loc) · 5.2 KB
/
setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/env python
from __future__ import absolute_import, print_function
import os.path
from os.path import join
from distutils.dep_util import newer
import sys
if sys.version_info[:2] < (2, 7) or (3, 0) <= sys.version_info[:2] < (3, 4):
raise RuntimeError("Python version 2.7 or >= 3.4 required.")
if sys.version_info[0] >= 3:
import builtins
else:
import __builtin__ as builtins
# This is a bit hackish: we are setting a global variable so that the main
# micpy __init__ can detect if it is being loaded by the setup routine, to
# avoid attempting to load components that aren't built yet. While ugly, it's
# a lot more robust than what was previously being ussed.
builtins.__MICPY_SETUP__ = True
from micpy.distutils.build_offload import build_ext as build_ext_offload
from micpy.distutils.build_offload_lib import build_clib as build_clib_offload
from micpy.code_generators import generate_umath as gen_umath
numpy_private_dir = join('numpy', 'private')
multiarray_dir = join('micpy', 'multiarray')
mpymath_dir = join('micpy', 'mpymath')
codegen_dir = join('micpy', 'code_generators')
private_npy_defines = [('HAVE_ENDIAN_H', 1),
('HAVE_COMPLEX_H', 1),
('HAVE_LDOUBLE_INTEL_EXTENDED_16_BYTES_LE', 1)]
mpy_defines = [('MPY_HAVE_IMCI_INTRINSICS', 1)]
def add_multiarray_ext(config):
multiarray_sources = ['alloc.c', 'array_assign.c', 'arrayobject.c',
'cblasfuncs.c', 'common.c', 'calculation.c', 'convert.c',
'number.c', 'conversion_utils.c', 'creators.c', 'getset.c',
'methods.c', 'shape.c', 'scalar.c', 'item_selection.c',
'convert_datatype.c', 'dtype_transfer.c', 'mpymem_overlap.c',
'nditer_templ.c.src', 'nditer_constr.c', 'nditer_api.c',
'arraytypes.c.src', 'mpy_lowlevel_strided_loops.c.src',
'temp_elide.c' ,'multiarraymodule.c']
multiarray_sources = [join(multiarray_dir, f) for f in multiarray_sources]
#Add numpy/private/mem_overlap.c to sources
multiarray_sources += [
join(numpy_private_dir, 'templ_common.h.src')]
#TODO: find a better way to define NMAXDEVICES
#hint: use micinfo to get number of devices
config.add_extension('multiarray',
sources=multiarray_sources,
define_macros=private_npy_defines +
[('NMAXDEVICES', '2')],
include_dirs=[multiarray_dir],
libraries=['mpymath'],
extra_link_args=['-mkl'])
def add_mpymath_lib(config):
sources = ['non_standards.h.src', 'ieee754.c.src',
'mpy_math_complex.c.src', 'halffloat.c']
mpymath_sources = [join(mpymath_dir, f) for f in sources]
config.add_library("mpymath", sources=mpymath_sources,
include_dirs=[mpymath_dir],
macros=private_npy_defines)
def add_umath_ext(config):
def generate_umath_c(ext, build_dir):
config.add_include_dirs(build_dir)
target = join(build_dir, '__umath_generated.c')
dir = os.path.dirname(target)
if not os.path.exists(dir):
os.makedirs(dir)
script = join(codegen_dir, 'generate_umath.py')
if newer(script, target):
f = open(target, 'w')
f.write(gen_umath.make_code(gen_umath.defdict,
gen_umath.__file__))
f.close()
return []
umath_dir = join('micpy', 'umath')
umath_sources = ['umathmodule.c', 'mufunc_object.c',
'output_creators.c', 'reduction.c',
'funcs.inc.src', 'loops.h.src', 'loops.c.src',
'simd.inc.src']
umath_sources = [join(umath_dir, f) for f in umath_sources]
umath_sources.append(join(mpymath_dir, 'non_standards.h.src'))
umath_sources.append(join(multiarray_dir, 'mpymem_overlap.c'))
umath_sources.append(generate_umath_c)
config.add_extension('umath',
sources=umath_sources,
include_dirs=[umath_dir, mpymath_dir, multiarray_dir],
libraries=['mpymath'],
define_macros=private_npy_defines+mpy_defines)
def configuration(parent_package='', top_path=None):
from numpy.distutils.misc_util import \
Configuration, get_numpy_include_dirs
config = Configuration('micpy', parent_package, top_path)
config.add_include_dirs([numpy_private_dir, 'micpy'])
add_multiarray_ext(config)
add_mpymath_lib(config)
add_umath_ext(config)
config.add_subpackage('random',
subpackage_path=join('micpy', 'random'))
return config
if __name__ == '__main__':
from numpy.distutils.core import setup
setup(#name='micpy',
version='0.2',
description='Numpy like interface for MIC device',
author='Super Bo',
author_email='[email protected]',
url='https://github.com/SuperBo/micpy',
license = 'BSD',
platforms = ["Windows", "Linux"],
packages=['micpy'],
configuration=configuration,
cmdclass={'build_ext': build_ext_offload,
'build_clib': build_clib_offload})
del builtins.__MICPY_SETUP__