@@ -509,13 +509,9 @@ ctypedef struct numba_udata:
509
509
char * py_func
510
510
uintptr_t inputs_id
511
511
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
518
512
b2nd_array_t * array
513
+ int64_t chunks_in_array[B2ND_MAX_DIM]
514
+ int64_t blocks_in_chunk[B2ND_MAX_DIM]
519
515
520
516
MAX_TYPESIZE = BLOSC_MAX_TYPESIZE
521
517
MAX_BUFFERSIZE = BLOSC2_MAX_BUFFERSIZE
@@ -1566,21 +1562,12 @@ cdef int general_filler(blosc2_prefilter_params *params):
1566
1562
1567
1563
cdef int general_numba(blosc2_prefilter_params * params):
1568
1564
cdef numba_udata * udata = < numba_udata * > params.user_data
1565
+
1569
1566
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
1572
1567
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)
1578
1569
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)
1584
1571
cdef int64_t start_ndim[B2ND_MAX_DIM]
1585
1572
for i in range (nd):
1586
1573
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):
1589
1576
padding = False
1590
1577
blockshape = []
1591
1578
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]:
1593
1580
padding = True
1594
1581
blockshape.append(udata.array.shape[i] - start_ndim[i])
1595
1582
if blockshape[i] <= 0 :
@@ -1605,19 +1592,21 @@ cdef int general_numba(blosc2_prefilter_params *params):
1605
1592
output = np.empty(blockshape, udata.array.dtype)
1606
1593
else :
1607
1594
output = np.PyArray_SimpleNewFromData(nd, dims, udata.output_cdtype, < void * > params.output)
1595
+
1608
1596
inputs_tuple = _ctypes.PyObj_FromPtr(udata.inputs_id)
1609
1597
inputs = []
1598
+ # Get slice of each operand
1610
1599
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
1612
1601
for obj, dtype in inputs_tuple:
1613
1602
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)
1616
1605
inputs.append(out)
1617
1606
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 ]])
1619
1608
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))
1621
1610
else :
1622
1611
raise ValueError (" Unsupported operand" )
1623
1612
else :
@@ -1628,9 +1617,7 @@ cdef int general_numba(blosc2_prefilter_params *params):
1628
1617
# print("slice dim ", i, " = inici = ", start_ndim[i], " final = ", start_ndim[i] + blockshape[i])
1629
1618
slices = tuple (l)
1630
1619
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):
1634
1621
inputs.append(obj[slices])
1635
1622
elif isinstance (obj, np.ndarray):
1636
1623
inputs.append(obj[slices])
@@ -1639,13 +1626,13 @@ cdef int general_numba(blosc2_prefilter_params *params):
1639
1626
else :
1640
1627
raise ValueError (" Unsupported operand" )
1641
1628
1629
+ # Call numba function
1642
1630
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) )
1644
1632
1645
1633
cdef int64_t start[B2ND_MAX_DIM]
1646
1634
cdef int64_t slice_shape[B2ND_MAX_DIM]
1647
1635
cdef int64_t blockshape_int64[B2ND_MAX_DIM]
1648
-
1649
1636
cdef Py_buffer * buf
1650
1637
if padding:
1651
1638
for i in range (nd):
@@ -2303,13 +2290,11 @@ cdef class NDArray:
2303
2290
strcpy(pref_udata.py_func, func_id)
2304
2291
pref_udata.inputs_id = inputs_id
2305
2292
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
2312
2293
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]
2313
2298
2314
2299
preparams.user_data = pref_udata
2315
2300
cparams.preparams = preparams
0 commit comments