Skip to content

Commit 06c63bb

Browse files
committed
Some small optimizations
1 parent 698cbf5 commit 06c63bb

File tree

1 file changed

+20
-35
lines changed

1 file changed

+20
-35
lines changed

blosc2/blosc2_ext.pyx

+20-35
Original file line numberDiff line numberDiff line change
@@ -509,13 +509,9 @@ ctypedef struct numba_udata:
509509
char* py_func
510510
uintptr_t inputs_id
511511
int output_cdtype
512-
int32_t chunkshape
513-
int ndim
514-
int32_t *blockshape
515-
int32_t *chunkshape_ndim
516-
int64_t *shape
517-
int64_t *ext_shape
518512
b2nd_array_t *array
513+
int64_t chunks_in_array[B2ND_MAX_DIM]
514+
int64_t blocks_in_chunk[B2ND_MAX_DIM]
519515

520516
MAX_TYPESIZE = BLOSC_MAX_TYPESIZE
521517
MAX_BUFFERSIZE = BLOSC2_MAX_BUFFERSIZE
@@ -1566,21 +1562,12 @@ cdef int general_filler(blosc2_prefilter_params *params):
15661562

15671563
cdef int general_numba(blosc2_prefilter_params *params):
15681564
cdef numba_udata *udata = <numba_udata *> params.user_data
1565+
15691566
cdef uint8_t nd = udata.array.ndim
1570-
# off caldrà sumar-li blockshape també
1571-
cdef int64_t offset = params.nchunk * udata.array.sc.chunksize + params.output_offset // params.output_typesize
15721567
cdef int64_t chunk_ndim[B2ND_MAX_DIM]
1573-
cdef int64_t chunks_in_array[B2ND_MAX_DIM]
1574-
for i in range(nd):
1575-
chunks_in_array[i] = udata.array.extshape[i] // udata.array.chunkshape[i]
1576-
blosc2_unidim_to_multidim(nd, chunks_in_array, params.nchunk, chunk_ndim)
1577-
1568+
blosc2_unidim_to_multidim(nd, udata.chunks_in_array, params.nchunk, chunk_ndim)
15781569
cdef int64_t block_ndim[B2ND_MAX_DIM]
1579-
cdef int64_t blocks_in_chunk[B2ND_MAX_DIM]
1580-
for i in range(nd):
1581-
blocks_in_chunk[i] = udata.array.extchunkshape[i] // udata.array.blockshape[i]
1582-
blosc2_unidim_to_multidim(nd, blocks_in_chunk, params.nblock, block_ndim)
1583-
1570+
blosc2_unidim_to_multidim(nd, udata.blocks_in_chunk, params.nblock, block_ndim)
15841571
cdef int64_t start_ndim[B2ND_MAX_DIM]
15851572
for i in range(nd):
15861573
start_ndim[i] = chunk_ndim[i] * udata.array.chunkshape[i] + block_ndim[i] * udata.array.blockshape[i]
@@ -1589,7 +1576,7 @@ cdef int general_numba(blosc2_prefilter_params *params):
15891576
padding = False
15901577
blockshape = []
15911578
for i in range(nd):
1592-
if start_ndim[i] + udata.blockshape[i] > udata.shape[i]:
1579+
if start_ndim[i] + udata.array.blockshape[i] > udata.array.shape[i]:
15931580
padding = True
15941581
blockshape.append(udata.array.shape[i] - start_ndim[i])
15951582
if blockshape[i] <= 0:
@@ -1605,19 +1592,21 @@ cdef int general_numba(blosc2_prefilter_params *params):
16051592
output = np.empty(blockshape, udata.array.dtype)
16061593
else:
16071594
output = np.PyArray_SimpleNewFromData(nd, dims, udata.output_cdtype, <void*>params.output)
1595+
16081596
inputs_tuple = _ctypes.PyObj_FromPtr(udata.inputs_id)
16091597
inputs = []
1598+
# Get slice of each operand
16101599
if nd == 1:
1611-
# Enviar-ho a fer la mà quan nd = 1 ? o ho puc suportar sense problemes??
1600+
# When ndim == 1, schunks as operands are supported
16121601
for obj, dtype in inputs_tuple:
16131602
if isinstance(obj, blosc2.SChunk):
1614-
out = np.empty(udata.array.blockshape[0], dtype=dtype)
1615-
obj.get_slice(start=offset, stop=offset + dims[0], out=out)
1603+
out = np.empty(blockshape[0], dtype=dtype)
1604+
obj.get_slice(start=start_ndim[0], stop=start_ndim[0] + blockshape[0], out=out)
16161605
inputs.append(out)
16171606
elif isinstance(obj, np.ndarray):
1618-
inputs.append(obj[offset : offset + dims[0]])
1607+
inputs.append(obj[start_ndim[0] : start_ndim[0] + blockshape[0]])
16191608
elif isinstance(obj, (int, float, bool, complex)):
1620-
inputs.append(np.full(udata.array.blockshape[0], obj, dtype=dtype))
1609+
inputs.append(np.full(blockshape[0], obj, dtype=dtype))
16211610
else:
16221611
raise ValueError("Unsupported operand")
16231612
else:
@@ -1628,9 +1617,7 @@ cdef int general_numba(blosc2_prefilter_params *params):
16281617
# print("slice dim ", i, " = inici = ", start_ndim[i], " final = ", start_ndim[i] + blockshape[i])
16291618
slices = tuple(l)
16301619
for obj, dtype in inputs_tuple:
1631-
if isinstance(obj, blosc2.SChunk):
1632-
raise ValueError("Cannot mix unidim operands with multidim") # o sí?
1633-
elif isinstance(obj, np.ndarray):
1620+
if isinstance(obj, blosc2.NDArray):
16341621
inputs.append(obj[slices])
16351622
elif isinstance(obj, np.ndarray):
16361623
inputs.append(obj[slices])
@@ -1639,13 +1626,13 @@ cdef int general_numba(blosc2_prefilter_params *params):
16391626
else:
16401627
raise ValueError("Unsupported operand")
16411628

1629+
# Call numba function
16421630
func_id = udata.py_func.decode("utf-8")
1643-
blosc2.prefilter_funcs[func_id](tuple(inputs), output, offset)
1631+
blosc2.prefilter_funcs[func_id](tuple(inputs), output, np.array(start_ndim))
16441632

16451633
cdef int64_t start[B2ND_MAX_DIM]
16461634
cdef int64_t slice_shape[B2ND_MAX_DIM]
16471635
cdef int64_t blockshape_int64[B2ND_MAX_DIM]
1648-
16491636
cdef Py_buffer *buf
16501637
if padding:
16511638
for i in range(nd):
@@ -2303,13 +2290,11 @@ cdef class NDArray:
23032290
strcpy(pref_udata.py_func, func_id)
23042291
pref_udata.inputs_id = inputs_id
23052292
pref_udata.output_cdtype = np.dtype(self.dtype).num
2306-
pref_udata.chunkshape = self.array.sc.chunksize // self.array.sc.typesize
2307-
pref_udata.ndim = self.ndim
2308-
pref_udata.blockshape = self.array.blockshape
2309-
pref_udata.shape = self.array.shape
2310-
pref_udata.chunkshape_ndim = self.array.chunkshape
2311-
pref_udata.ext_shape = self.array.extshape
23122293
pref_udata.array = self.array
2294+
# Save these in numba_udata to avoid computing them for each block
2295+
for i in range(self.array.ndim):
2296+
pref_udata.chunks_in_array[i] = pref_udata.array.extshape[i] // pref_udata.array.chunkshape[i]
2297+
pref_udata.blocks_in_chunk[i] = pref_udata.array.extchunkshape[i] // pref_udata.array.blockshape[i]
23132298

23142299
preparams.user_data = pref_udata
23152300
cparams.preparams = preparams

0 commit comments

Comments
 (0)