`bincount` raises with empty input array and `minlength` specified
eriknw opened this issue · comments
Description
Please see reproducer and expected behavior below.
To Reproduce
>>> import numpy as np
>>> import cupy as cp
>>> cp.bincount(cp.array([], np.int32), minlength=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/nfs/erwelch/miniconda3/envs/cugraph_dev2/lib/python3.10/site-packages/cupy/_statistics/histogram.py", line 516, in bincount
size = int(cupy.max(x)) + 1 # synchronize!
File "/home/nfs/erwelch/miniconda3/envs/cugraph_dev2/lib/python3.10/site-packages/cupy/_statistics/order.py", line 81, in amax
return a.max(axis=axis, out=out, keepdims=keepdims)
File "cupy/_core/core.pyx", line 990, in cupy._core.core._ndarray_base.max
File "cupy/_core/core.pyx", line 998, in cupy._core.core._ndarray_base.max
File "cupy/_core/_routines_statistics.pyx", line 31, in cupy._core._routines_statistics._ndarray_max
File "cupy/cuda/cub.pyx", line 492, in cupy.cuda.cub.cub_reduction
File "cupy/cuda/cub.pyx", line 541, in cupy.cuda.cub.cub_reduction
File "cupy/cuda/cub.pyx", line 167, in cupy.cuda.cub.device_reduce
ValueError: zero-size array to reduction operation CUPY_CUB_MAX which has no identity
# numpy gives expected result
>>> np.bincount(np.array([], np.int32), minlength=2)
array([0, 0])
Installation
Conda-Forge (conda install ...
)
Environment
OS : Linux-5.4.0-149-generic-x86_64-with-glibc2.31
Python Version : 3.10.13
CuPy Version : 12.3.0
CuPy Platform : NVIDIA CUDA
NumPy Version : 1.24.4
SciPy Version : 1.11.4
Cython Build Version : 0.29.37
Cython Runtime Version : 3.0.7
CUDA Root : /usr/local/cuda
nvcc PATH : /usr/local/cuda/bin/nvcc
CUDA Build Version : 11080
CUDA Driver Version : 12000
CUDA Runtime Version : 11080
cuBLAS Version : (available)
cuFFT Version : 10900
cuRAND Version : 10300
cuSOLVER Version : (11, 4, 1)
cuSPARSE Version : (available)
NVRTC Version : (11, 8)
Thrust Version : 101501
CUB Build Version : 101501
Jitify Build Version : d7180e1
cuDNN Build Version : None
cuDNN Version : None
NCCL Build Version : 21904
NCCL Runtime Version : 21904
cuTENSOR Version : None
cuSPARSELt Build Version : None
Device 0 Name : Tesla V100-SXM2-32GB
Device 0 Compute Capability : 70
Device 0 PCI Bus ID : 0000:06:00.0
Device 1 Name : Tesla V100-SXM2-32GB
Device 1 Compute Capability : 70
Device 1 PCI Bus ID : 0000:07:00.0
Device 2 Name : Tesla V100-SXM2-32GB
Device 2 Compute Capability : 70
Device 2 PCI Bus ID : 0000:0A:00.0
Device 3 Name : Tesla V100-SXM2-32GB
Device 3 Compute Capability : 70
Device 3 PCI Bus ID : 0000:0B:00.0
Device 4 Name : Tesla V100-SXM2-32GB
Device 4 Compute Capability : 70
Device 4 PCI Bus ID : 0000:85:00.0
Device 5 Name : Tesla V100-SXM2-32GB
Device 5 Compute Capability : 70
Device 5 PCI Bus ID : 0000:86:00.0
Device 6 Name : Tesla V100-SXM2-32GB
Device 6 Compute Capability : 70
Device 6 PCI Bus ID : 0000:89:00.0
Device 7 Name : Tesla V100-SXM2-32GB
Device 7 Compute Capability : 70
Device 7 PCI Bus ID : 0000:8A:00.0```
### Additional Information
_No response_
Thanks for reporting, it seems the problem reproduces even with minlength
unspecified:
>>> cp.bincount(cp.array([], dtype=cp.int32))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/maehashi/Development/cupy/cupy/_statistics/histogram.py", line 516, in bincount
size = int(cupy.max(x)) + 1 # synchronize!
File "/home/maehashi/Development/cupy/cupy/_statistics/order.py", line 81, in amax
return a.max(axis=axis, out=out, keepdims=keepdims)
File "cupy/_core/core.pyx", line 990, in cupy._core.core._ndarray_base.max
File "cupy/_core/core.pyx", line 998, in cupy._core.core._ndarray_base.max
File "cupy/_core/_routines_statistics.pyx", line 31, in cupy._core._routines_statistics._ndarray_max
File "cupy/cuda/cub.pyx", line 492, in cupy.cuda.cub.cub_reduction
File "cupy/cuda/cub.pyx", line 541, in cupy.cuda.cub.cub_reduction
File "cupy/cuda/cub.pyx", line 167, in cupy.cuda.cub.device_reduce
ValueError: zero-size array to reduction operation CUPY_CUB_MAX which has no identity