Skip to content

Commit d527367

Browse files
committed
support paddle elementwise_floordiv
1 parent 1b7237d commit d527367

File tree

4 files changed

+88
-0
lines changed

4 files changed

+88
-0
lines changed

src/core/tests/frontend/paddle/op_fuzzy.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,18 @@ static const std::vector<std::string> models{
126126
std::string("elementwise_mul4"),
127127
std::string("elementwise_pow4"),
128128
std::string("elementwise_sub4"),
129+
std::string("elementwise_floordiv_for_paddle1.8_int32_1"),
130+
std::string("elementwise_floordiv_for_paddle1.8_int64_1"),
131+
std::string("elementwise_floordiv_for_paddle1.8_int32_2"),
132+
std::string("elementwise_floordiv_for_paddle1.8_int64_2"),
133+
std::string("elementwise_floordiv_for_paddle1.8_int32_3"),
134+
std::string("elementwise_floordiv_for_paddle1.8_int64_3"),
135+
std::string("elementwise_floordiv_for_paddle1.8_int32_4"),
136+
std::string("elementwise_floordiv_for_paddle1.8_int64_4"),
137+
std::string("elementwise_floordiv_for_paddle2.x_int32_1"),
138+
std::string("elementwise_floordiv_for_paddle2.x_int64_1"),
139+
std::string("elementwise_floordiv_for_paddle2.x_int32_2"),
140+
std::string("elementwise_floordiv_for_paddle2.x_int64_2"),
129141
std::string("embedding_0"),
130142
std::string("embedding_sparse"),
131143
std::string("embedding_none_weight"),

src/core/tests/frontend/paddle/test_models/gen_scripts/generate_elementwise_ops.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,32 @@ def elementwise_pow(name : str, x, y, axis, in_dtype):
162162

163163
return outs[0]
164164

165+
166+
def elementwise_floordiv(name : str, x, y, axis, in_dtype, paddle_ver="1.8"):
167+
import paddle
168+
paddle.enable_static()
169+
170+
with paddle.static.program_guard(paddle.static.Program(), paddle.static.Program()):
171+
node_x = paddle.static.data(name = 'x', shape = x.shape, dtype = in_dtype)
172+
node_y = paddle.static.data(name = 'y', shape = y.shape, dtype = in_dtype)
173+
if paddle_ver == "1.8":
174+
out = paddle.fluid.layers.nn.elementwise_floordiv(node_x, node_y, axis=axis)
175+
else:
176+
out = paddle.floor_divide(node_x, node_y)
177+
178+
cpu = paddle.static.cpu_places(1)
179+
exe = paddle.static.Executor(cpu[0])
180+
181+
# startup program will call initializer to initialize the parameters.
182+
exe.run(paddle.static.default_startup_program())
183+
outs = exe.run(
184+
feed={'x': x, 'y': y},
185+
fetch_list=[out])
186+
saveModel(name, exe, feedkeys=['x', 'y'], fetchlist=[out], inputs=[x, y], outputs=[outs[0]], target_dir=sys.argv[1])
187+
188+
return outs[0]
189+
190+
165191
def elementwise_ops(name : str, data_x, data_y, axis, in_dtype):
166192
elementwise_add("elementwise_add" + name, data_x, data_y, axis, in_dtype)
167193
elementwise_sub("elementwise_sub" + name, data_x, data_y, axis, in_dtype)
@@ -193,5 +219,39 @@ def main():
193219
axis = 0
194220
elementwise_ops("4", data_x, data_y, axis, in_dtype)
195221

222+
# test for elementwise_floordiv, support int and int64
223+
# paddle1.8 support axis = [0, x_last_dims]
224+
# paddle2.x only support axis = -1
225+
floordiv_support_dtype = ['int64', 'int32']
226+
data_x = np.array([-2, 0, 4])
227+
data_y = np.array([1, 5, 2])
228+
axis = -1
229+
for dtype in floordiv_support_dtype:
230+
elementwise_floordiv("elementwise_floordiv_for_paddle1.8_" + dtype + "_1",
231+
data_x.astype(dtype), data_y.astype(dtype), axis, dtype)
232+
elementwise_floordiv("elementwise_floordiv_for_paddle2.x_" + dtype + "_1",
233+
data_x.astype(dtype), data_y.astype(dtype), axis, dtype, paddle_ver="2.x")
234+
235+
data_x = np.random.randint(1, 10, [2, 5, 3, 4])
236+
data_y = np.random.randint(1, 5, [3, 4])
237+
for dtype in floordiv_support_dtype:
238+
elementwise_floordiv("elementwise_floordiv_for_paddle1.8_" + dtype + "_2",
239+
data_x.astype(dtype), data_y.astype(dtype), axis, dtype)
240+
elementwise_floordiv("elementwise_floordiv_for_paddle2.x_" + dtype + "_2",
241+
data_x.astype(dtype), data_y.astype(dtype), axis, dtype, paddle_ver="2.x")
242+
243+
data_y = np.random.randint(1, 5, [5])
244+
axis = 1
245+
for dtype in floordiv_support_dtype:
246+
elementwise_floordiv("elementwise_floordiv_for_paddle1.8_" + dtype + "_3",
247+
data_x.astype(dtype), data_y.astype(dtype), axis, dtype)
248+
249+
data_y = np.random.randint(1, 5, [2, 5, 3])
250+
axis = 0
251+
for dtype in floordiv_support_dtype:
252+
elementwise_floordiv("elementwise_floordiv_for_paddle1.8_" + dtype + "_4",
253+
data_x.astype(dtype), data_y.astype(dtype), axis, dtype)
254+
255+
196256
if __name__ == "__main__":
197257
main()

src/frontends/paddle/src/op/elementwise_ops.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ NamedOutputs elementwise_greater_equal(const NodeContext& node_context) {
4646
return elementwise_ops<default_opset::GreaterEqual>(node_context);
4747
}
4848

49+
NamedOutputs elementwise_floordiv(const NodeContext& node_context) {
50+
auto x = node_context.get_input("X");
51+
auto y = node_context.get_input("Y");
52+
auto axis = -1;
53+
if (node_context.has_attribute("axis")) {
54+
axis = node_context.get_attribute<int>("axis");
55+
}
56+
return node_context.default_single_output_mapping(
57+
{std::make_shared<default_opset::Divide>(x,
58+
y,
59+
ov::op::AutoBroadcastSpec(ov::op::AutoBroadcastType::PDPD, axis))},
60+
{"Out"});
61+
}
62+
4963
} // namespace op
5064
} // namespace paddle
5165
} // namespace frontend

src/frontends/paddle/src/op_table.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ OP_CONVERTER(dropout);
2525
OP_CONVERTER(elementwise_add);
2626
OP_CONVERTER(elementwise_div);
2727
OP_CONVERTER(elementwise_equal);
28+
OP_CONVERTER(elementwise_floordiv);
2829
OP_CONVERTER(elementwise_greater_equal);
2930
OP_CONVERTER(elementwise_max);
3031
OP_CONVERTER(elementwise_min);
@@ -121,6 +122,7 @@ std::map<std::string, CreatorFunction> get_supported_ops() {
121122
{"dropout", op::dropout},
122123
{"elementwise_add", op::elementwise_add},
123124
{"elementwise_div", op::elementwise_div},
125+
{"elementwise_floordiv", op::elementwise_floordiv},
124126
{"elementwise_max", op::elementwise_max},
125127
{"elementwise_min", op::elementwise_min},
126128
{"elementwise_mul", op::elementwise_mul},

0 commit comments

Comments
 (0)