cupy / cupy

NumPy & SciPy for GPU

Home Page:https://cupy.dev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`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