Skip to content

Commit

Permalink
Merge branch 'master' into release
Browse files Browse the repository at this point in the history
  • Loading branch information
kiyo-masui committed Nov 5, 2018
2 parents 9ffba9d + 0af8f0e commit 02259e2
Show file tree
Hide file tree
Showing 5 changed files with 614 additions and 24 deletions.
3 changes: 2 additions & 1 deletion bitshuffle/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
Functions
=========
using_NEON
using_SSE2
using_AVX2
bitshuffle
Expand All @@ -16,5 +17,5 @@
from __future__ import absolute_import


from bitshuffle.ext import (__version__, bitshuffle, bitunshuffle, using_SSE2,
from bitshuffle.ext import (__version__, bitshuffle, bitunshuffle, using_NEON, using_SSE2,
using_AVX2, compress_lz4, decompress_lz4)
39 changes: 39 additions & 0 deletions bitshuffle/ext.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ cdef int REPEATC = 1
REPEAT = REPEATC

cdef extern from b"bitshuffle.h":
int bshuf_using_NEON()
int bshuf_using_SSE2()
int bshuf_using_AVX2()
int bshuf_bitshuffle(void *A, void *B, int size, int elem_size,
Expand All @@ -45,20 +46,26 @@ __version__ = str("%d.%d.%d").format(BSHUF_VERSION_MAJOR, BSHUF_VERSION_MINOR,
cdef extern int bshuf_copy(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_byte_elem_scal(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_byte_elem_SSE(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_byte_elem_NEON(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_byte_scal(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_byte_SSE(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_byte_NEON(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_byte_AVX(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bitrow_eight(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_elem_AVX(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_elem_SSE(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_elem_NEON(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_elem_scal(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_byte_bitrow_SSE(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_byte_bitrow_NEON(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_byte_bitrow_AVX(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_byte_bitrow_scal(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_shuffle_bit_eightelem_scal(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_shuffle_bit_eightelem_SSE(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_shuffle_bit_eightelem_NEON(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_shuffle_bit_eightelem_AVX(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_untrans_bit_elem_SSE(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_untrans_bit_elem_NEON(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_untrans_bit_elem_AVX(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_untrans_bit_elem_scal(void *A, void *B, int size, int elem_size)
cdef extern int bshuf_trans_bit_elem(void *A, void *B, int size, int elem_size)
Expand All @@ -68,6 +75,14 @@ cdef extern int bshuf_untrans_bit_elem(void *A, void *B, int size, int elem_size
ctypedef int (*Cfptr) (void *A, void *B, int size, int elem_size)


def using_NEON():
"""Whether compiled using Arm NEON instructions."""
if bshuf_using_NEON():
return True
else:
return False


def using_SSE2():
"""Whether compiled using SSE2 instructions."""
if bshuf_using_SSE2():
Expand Down Expand Up @@ -144,6 +159,10 @@ def trans_byte_elem_SSE(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_byte_elem_SSE, arr)


def trans_byte_elem_NEON(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_byte_elem_NEON, arr)


def trans_bit_byte_scal(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_bit_byte_scal, arr)

Expand All @@ -152,6 +171,10 @@ def trans_bit_byte_SSE(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_bit_byte_SSE, arr)


def trans_bit_byte_NEON(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_bit_byte_NEON, arr)


def trans_bit_byte_AVX(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_bit_byte_AVX, arr)

Expand All @@ -172,10 +195,18 @@ def trans_bit_elem_SSE(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_bit_elem_SSE, arr)


def trans_bit_elem_NEON(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_bit_elem_NEON, arr)


def trans_byte_bitrow_SSE(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_byte_bitrow_SSE, arr)


def trans_byte_bitrow_NEON(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_byte_bitrow_NEON, arr)


def trans_byte_bitrow_AVX(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_trans_byte_bitrow_AVX, arr)

Expand All @@ -192,6 +223,10 @@ def shuffle_bit_eightelem_SSE(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_shuffle_bit_eightelem_SSE, arr)


def shuffle_bit_eightelem_NEON(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_shuffle_bit_eightelem_NEON, arr)


def shuffle_bit_eightelem_AVX(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_shuffle_bit_eightelem_AVX, arr)

Expand All @@ -200,6 +235,10 @@ def untrans_bit_elem_SSE(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_untrans_bit_elem_SSE, arr)


def untrans_bit_elem_NEON(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_untrans_bit_elem_NEON, arr)


def untrans_bit_elem_AVX(np.ndarray arr not None):
return _wrap_C_fun(&bshuf_untrans_bit_elem_AVX, arr)

Expand Down
60 changes: 40 additions & 20 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

VERSION_MAJOR = 0
VERSION_MINOR = 3
VERSION_POINT = 4
VERSION_POINT = 5

# Only unset in the 'release' branch and in tags.
VERSION_DEV = 0
Expand All @@ -28,7 +28,9 @@

COMPILE_FLAGS = ['-O3', '-ffast-math', '-march=native', '-std=c99']
# Cython breaks strict aliasing rules.
COMPILE_FLAGS += ["-fno-strict-aliasing"]
COMPILE_FLAGS += ['-fno-strict-aliasing']
COMPILE_FLAGS += ['-fPIC']
COMPILE_FLAGS_MSVC = ['/Ox', '/fp:fast']

MACROS = [
('BSHUF_VERSION_MAJOR', VERSION_MAJOR),
Expand All @@ -53,7 +55,10 @@
'extra_link_args': [],
}

if sys.platform == 'darwin':
if 'HDF5_DIR' in os.environ:
FALLBACK_CONFIG['include_dirs'] += [os.environ['HDF5_DIR'] + '/include'] # macports
FALLBACK_CONFIG['library_dirs'] += [os.environ['HDF5_DIR'] + '/lib'] # macports
elif sys.platform == 'darwin':
# putting here both macports and homebrew paths will generate
# "ld: warning: dir not found" at the linking phase
FALLBACK_CONFIG['include_dirs'] += ['/opt/local/include'] # macports
Expand All @@ -69,6 +74,8 @@
FALLBACK_CONFIG['library_dirs'] = [d for d in FALLBACK_CONFIG['library_dirs']
if path.isdir(d)]

FALLBACK_CONFIG['extra_compile_args'] = ['-DH5_BUILT_AS_DYNAMIC_LIB']


def pkgconfig(*packages, **kw):
config = kw.setdefault('config', {})
Expand Down Expand Up @@ -108,7 +115,6 @@ def pkgconfig(*packages, **kw):
depends=["src/bitshuffle.h", "src/bitshuffle_core.h",
"src/iochain.h", "lz4/lz4.h"],
libraries=[],
extra_compile_args=COMPILE_FLAGS,
define_macros=MACROS,
)

Expand All @@ -122,8 +128,7 @@ def pkgconfig(*packages, **kw):
"lz4/lz4.h"],
define_macros=MACROS,
**pkgconfig("hdf5", config=dict(
include_dirs=["src/", "lz4/"],
extra_compile_args=COMPILE_FLAGS))
include_dirs=["src/", "lz4/"]))
)

filter_plugin = Extension(
Expand All @@ -136,8 +141,7 @@ def pkgconfig(*packages, **kw):
"lz4/lz4.h"],
define_macros=MACROS,
**pkgconfig("hdf5", config=dict(
include_dirs=["src/", "lz4/"],
extra_compile_args=['-fPIC', '-g'] + COMPILE_FLAGS))
include_dirs=["src/", "lz4/"]))
)

lzf_plugin = Extension(
Expand All @@ -147,15 +151,15 @@ def pkgconfig(*packages, **kw):
depends=["lzf/lzf_filter.h", "lzf/lzf/lzf.h",
"lzf/lzf/lzfP.h"],
**pkgconfig("hdf5", config=dict(
include_dirs=["lzf/", "lzf/lzf/"],
extra_compile_args=['-fPIC', '-g'] + COMPILE_FLAGS))
include_dirs=["lzf/", "lzf/lzf/"]))
)


EXTENSIONS = [ext_bshuf, h5filter]
# Check for plugin hdf5 plugin support (hdf5 >= 1.8.11)
HDF5_PLUGIN_SUPPORT = False
for p in ["/usr/include"] + pkgconfig("hdf5")["include_dirs"]:
CPATHS = os.environ['CPATH'].split(':') if 'CPATH' in os.environ else []
for p in ["/usr/include"] + pkgconfig("hdf5")["include_dirs"] + CPATHS:
if os.path.exists(os.path.join(p, "H5PLextern.h")):
HDF5_PLUGIN_SUPPORT = True

Expand Down Expand Up @@ -239,6 +243,19 @@ def finalize_options(self):
import numpy as np
ext_bshuf.include_dirs.append(np.get_include())

# Required only by old version of setuptools < 18.0
from Cython.Build import cythonize
self.extensions = cythonize(self.extensions)
for ext in self.extensions:
ext._needs_stub = False

def build_extensions(self):
c = self.compiler.compiler_type

if self.omp not in ('0', '1', True, False):
raise ValueError("Invalid omp argument. Mut be '0' or '1'.")
self.omp = int(self.omp)

if self.omp:
if not hasattr(self, "_printed_omp_message"):
self._printed_omp_message = True
Expand All @@ -247,17 +264,20 @@ def finalize_options(self):
print("#################################\n")
# More portable to pass -fopenmp to linker.
# self.libraries += ['gomp']
if self.compiler.compiler_type == 'msvc':
openmpflag = '/openmp'
compileflags = COMPILE_FLAGS_MSVC
else:
openmpflag = '-fopenmp'
compileflags = COMPILE_FLAGS
for e in self.extensions:
if '-fopenmp' not in e.extra_compile_args:
e.extra_compile_args += ['-fopenmp']
if '-fopenmp' not in e.extra_link_args:
e.extra_link_args += ['-fopenmp']
e.extra_compile_args = list(set(e.extra_compile_args).union(compileflags))
if openmpflag not in e.extra_compile_args:
e.extra_compile_args += [openmpflag]
if openmpflag not in e.extra_link_args:
e.extra_link_args += [openmpflag]

# Required only by old version of setuptools < 18.0
from Cython.Build import cythonize
self.extensions = cythonize(self.extensions)
for ext in self.extensions:
ext._needs_stub = False
build_ext_.build_extensions(self)


# Don't install numpy/cython/hdf5 if not needed
Expand Down
Loading

0 comments on commit 02259e2

Please sign in to comment.