diff --git a/paddle/phi/kernels/cpu/index_select_kernel.cc b/paddle/phi/kernels/cpu/index_select_kernel.cc index 5341ede6b2fd846ee3c14d092d166f2832e3bff7..5c905dd7cd161f0b7546f30926e2fc3b35fb0c41 100644 --- a/paddle/phi/kernels/cpu/index_select_kernel.cc +++ b/paddle/phi/kernels/cpu/index_select_kernel.cc @@ -58,5 +58,6 @@ PD_REGISTER_KERNEL(index_select, phi::IndexSelectKernel, float, double, + phi::dtype::bfloat16, int, int64_t) {} diff --git a/paddle/phi/kernels/gpu/index_select_grad_kernel.cu b/paddle/phi/kernels/gpu/index_select_grad_kernel.cu index 1cd998810ee3c49920a1a345f167166f48e3af27..be00fe0ddc86d012295491994ef355acd5fae132 100644 --- a/paddle/phi/kernels/gpu/index_select_grad_kernel.cu +++ b/paddle/phi/kernels/gpu/index_select_grad_kernel.cu @@ -132,5 +132,6 @@ PD_REGISTER_KERNEL(index_select_grad, float, double, phi::dtype::float16, + phi::dtype::bfloat16, int, int64_t) {} diff --git a/paddle/phi/kernels/gpu/index_select_kernel.cu b/paddle/phi/kernels/gpu/index_select_kernel.cu index 925feee4ccf661efd8e01d8e5f826458aedd5481..c2f447dcb1bca00e67c752e784ec553e91d2c17b 100644 --- a/paddle/phi/kernels/gpu/index_select_kernel.cu +++ b/paddle/phi/kernels/gpu/index_select_kernel.cu @@ -84,5 +84,6 @@ PD_REGISTER_KERNEL(index_select, float, double, phi::dtype::float16, + phi::dtype::bfloat16, int, int64_t) {} diff --git a/python/paddle/fluid/tests/unittests/test_index_select_op.py b/python/paddle/fluid/tests/unittests/test_index_select_op.py index 2234280939cecf37512f6cc927f32101f723222f..dd3bdd80591a50ced35ac93e5ca30a00dea22a9e 100644 --- a/python/paddle/fluid/tests/unittests/test_index_select_op.py +++ b/python/paddle/fluid/tests/unittests/test_index_select_op.py @@ -15,7 +15,7 @@ import unittest import numpy as np -from op_test import OpTest +from op_test import OpTest, convert_float_to_uint16 import paddle import paddle.fluid as fluid @@ -81,6 +81,54 @@ class TestIndexSelectOpCaseSingleThread(TestIndexSelectOp): self.index_size = 10 +class TestIndexSelectFP16OP(TestIndexSelectOp): + def init_dtype_type(self): + self.dim = 1 + self.x_type = np.float16 + self.index_type = np.int64 + self.x_shape = (100, 4, 5) + self.index_size = 100 + + +class TestIndexSelectBF16Op(OpTest): + def setUp(self): + self.python_api = paddle.index_select + self.op_type = "index_select" + self.init_dtype_type() + index_np = np.random.randint( + low=0, high=self.x_shape[self.dim], size=self.index_size + ) + x_np = np.random.random(self.x_shape).astype(np.float32) + self.inputs = {'X': convert_float_to_uint16(x_np), 'Index': index_np} + self.attrs = {'dim': self.dim} + outer_loop = np.prod(self.x_shape[: self.dim]) + x_reshape = [outer_loop] + list(self.x_shape[self.dim :]) + x_np_reshape = np.reshape(x_np, tuple(x_reshape)) + out_list = [] + for i in range(outer_loop): + for j in range(self.index_size): + out_list.append(x_np_reshape[i, index_np[j]]) + self.out_shape = list(self.x_shape) + self.out_shape[self.dim] = self.index_size + self.out_shape = tuple(self.out_shape) + + out = np.reshape(out_list, self.out_shape) + self.outputs = {'Out': convert_float_to_uint16(out)} + + def init_dtype_type(self): + self.dim = 1 + self.x_type = np.uint16 + self.index_type = np.int64 + self.x_shape = (100, 4, 5) + self.index_size = 100 + + def test_check_output(self): + self.check_output(check_eager=True) + + def test_check_grad_normal(self): + self.check_grad(['X'], 'Out', check_eager=True) + + class TestIndexSelectAPI(unittest.TestCase): def input_data(self): self.data_x = np.array( diff --git a/python/paddle/tensor/search.py b/python/paddle/tensor/search.py index c053a85c43edf6d7daf6a34422560f3450e40e12..5a740245bb1feebd0a6801e99fa3edd6ec1daed2 100755 --- a/python/paddle/tensor/search.py +++ b/python/paddle/tensor/search.py @@ -350,7 +350,7 @@ def index_select(x, index, axis=0, name=None): check_variable_and_dtype( x, 'x', - ['float16', 'float32', 'float64', 'int32', 'int64'], + ['bfloat16', 'float16', 'float32', 'float64', 'int32', 'int64'], 'paddle.tensor.search.index_select', ) check_variable_and_dtype(