Skip to content

Commit 877decd

Browse files
author
xutianbing
committed
merge Daoyuan's FuncArg, address one of the comments.
1 parent 47aaac0 commit 877decd

File tree

9 files changed

+226
-248
lines changed

9 files changed

+226
-248
lines changed

paddle/function/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ if(WITH_TESTING)
2727
add_simple_unittest(ContextProjectionOpTest)
2828
add_simple_unittest(PadOpTest)
2929
add_simple_unittest(MulOpTest)
30+
add_simple_unittest(CosSimOpTest)
3031
endif()
3132
endif()
3233

paddle/function/CosSimOp.cpp

Lines changed: 76 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ namespace paddle {
2727
*
2828
*/
2929
template <>
30-
void CosSimForward<DEVICE_TYPE_CPU>(CpuMatrix* out_mat,
31-
const CpuMatrix* in1_mat,
32-
const CpuMatrix* in2_mat,
30+
void CosSimForward<DEVICE_TYPE_CPU>(CpuMatrix& out_mat,
31+
const CpuMatrix& in1_mat,
32+
const CpuMatrix& in2_mat,
3333
real scale) {
34-
CHECK(out_mat && in1_mat && in2_mat);
35-
size_t num_samples = out_mat->getHeight();
36-
size_t dim = in1_mat->getWidth();
34+
CHECK(out_mat.getData() && in1_mat.getData() && in2_mat.getData());
35+
size_t num_samples = out_mat.getHeight();
36+
size_t dim = in1_mat.getWidth();
3737
/// column vector [nSamples, 1]
38-
real* out = out_mat->getData();
39-
const real* x = in1_mat->getData();
40-
const real* y = in2_mat->getData();
38+
real* out = out_mat.getData();
39+
const real* x = in1_mat.getData();
40+
const real* y = in2_mat.getData();
4141

4242
/// in2 might only have one row or full rows
43-
CHECK(in2_mat->getHeight() == 1LU || in2_mat->getHeight() == num_samples);
44-
size_t inc = (in2_mat->getHeight() == 1LU) ? 0 : dim;
43+
CHECK(in2_mat.getHeight() == 1LU || in2_mat.getHeight() == num_samples);
44+
size_t inc = (in2_mat.getHeight() == 1LU) ? 0 : dim;
4545
for (size_t i = 0; i < num_samples; ++i, x += dim, y += inc) {
4646
real square_sum_x = 0;
4747
real square_sum_y = 0;
@@ -75,26 +75,26 @@ class CosSimForwardFunc : public FunctionBase {
7575
scale_ = config.get<real>("scale");
7676
}
7777

78-
void calc(const Arguments& inputs,
79-
const Arguments& outputs,
80-
const Arguments& inouts) override {
78+
void calc(const BufferArgs& inputs, const BufferArgs& outputs) override {
8179
CHECK_EQ(inputs.size(), 2);
8280
CHECK_EQ(outputs.size(), 1);
83-
CHECK_EQ(inouts.size(), 0);
8481

85-
CHECK_EQ(inputs[0].dims_[0], outputs[0].dims_[0]);
86-
CHECK_EQ(inputs[0].dims_[1], inputs[1].dims_[1]);
87-
CHECK_EQ(outputs[0].dims_[1], 1UL);
82+
CHECK_EQ(inputs[0].shape().ndims(), (size_t)2);
83+
CHECK_EQ(inputs[1].shape().ndims(), (size_t)2);
84+
CHECK_EQ(outputs[0].shape().ndims(), (size_t)2);
8885

89-
CHECK(outputs[0].getData() && inputs[0].getData() && inputs[1].getData());
90-
auto out_mat = std::make_shared<typename MatrixT<Device>::type>(
91-
outputs[0].getData(), outputs[0].dims_[0], outputs[0].dims_[1]);
92-
const auto in1_mat = std::make_shared<typename MatrixT<Device>::type>(
93-
inputs[0].getData(), inputs[0].dims_[0], inputs[0].dims_[1]);
94-
const auto in2_mat = std::make_shared<typename MatrixT<Device>::type>(
95-
inputs[1].getData(), inputs[1].dims_[0], inputs[1].dims_[1]);
86+
CHECK_EQ(inputs[0].shape()[0], outputs[0].shape()[0]);
87+
CHECK_EQ(inputs[0].shape()[1], inputs[1].shape()[1]);
88+
CHECK_EQ(outputs[0].shape()[1], 1UL);
9689

97-
CosSimForward<Device>(out_mat.get(), in1_mat.get(), in2_mat.get(), scale_);
90+
CHECK(outputs[0].data() && inputs[0].data() && inputs[1].data());
91+
92+
CHECK_EQ(outputs[0].getArgType(), ASSIGN_TO);
93+
auto out_mat = outputs[0].matrix<Device>();
94+
const auto in1_mat = inputs[0].matrix<Device>();
95+
const auto in2_mat = inputs[1].matrix<Device>();
96+
97+
CosSimForward<Device>(out_mat, in1_mat, in2_mat, scale_);
9898
}
9999

100100
private:
@@ -116,28 +116,29 @@ class CosSimForwardFunc : public FunctionBase {
116116
* \param scale, default 1.0
117117
*/
118118
template <>
119-
void CosSimBackward<DEVICE_TYPE_CPU>(const CpuMatrix* out_grad,
120-
const CpuMatrix* out_val,
121-
const CpuMatrix* in1_val,
122-
const CpuMatrix* in2_val,
123-
CpuMatrix* in1_grad,
124-
CpuMatrix* in2_grad,
119+
void CosSimBackward<DEVICE_TYPE_CPU>(const CpuMatrix& out_grad,
120+
const CpuMatrix& out_val,
121+
const CpuMatrix& in1_val,
122+
const CpuMatrix& in2_val,
123+
CpuMatrix& in1_grad,
124+
CpuMatrix& in2_grad,
125125
real scale) {
126-
CHECK(out_grad && out_val && in1_val && in2_val && in1_grad && in2_grad);
127-
CHECK_EQ(out_val->useGpu_, false) << "Matrix type are GPU, CPU required";
128-
129-
const real* grad = out_grad->getData();
130-
const real* out = out_val->getData();
131-
const real* prev_out_x = in1_val->getData();
132-
const real* prev_out_y = in2_val->getData();
133-
real* prev_grad_x = in1_grad->getData();
134-
real* prev_grad_y = in2_grad->getData();
135-
136-
size_t num_samples = out_grad->getHeight();
137-
size_t dim = in1_val->getWidth();
138-
CHECK_EQ(in2_val->getHeight(), in2_grad->getHeight());
139-
CHECK(in2_val->getHeight() == 1LU || in2_val->getHeight() == num_samples);
140-
size_t inc = (in2_val->getHeight() == 1LU) ? 0 : dim;
126+
CHECK(out_grad.getData() && out_val.getData() && in1_val.getData() &&
127+
in2_val.getData() && in1_grad.getData() && in2_grad.getData());
128+
CHECK_EQ(out_val.useGpu_, false) << "Matrix type are GPU, CPU required";
129+
130+
const real* grad = out_grad.getData();
131+
const real* out = out_val.getData();
132+
const real* prev_out_x = in1_val.getData();
133+
const real* prev_out_y = in2_val.getData();
134+
real* prev_grad_x = in1_grad.getData();
135+
real* prev_grad_y = in2_grad.getData();
136+
137+
size_t num_samples = out_grad.getHeight();
138+
size_t dim = in1_val.getWidth();
139+
CHECK_EQ(in2_val.getHeight(), in2_grad.getHeight());
140+
CHECK(in2_val.getHeight() == 1LU || in2_val.getHeight() == num_samples);
141+
size_t inc = (in2_val.getHeight() == 1LU) ? 0 : dim;
141142
for (size_t i = 0; i < num_samples; ++i,
142143
prev_out_x += dim,
143144
prev_out_y += inc,
@@ -178,8 +179,8 @@ void CosSimBackward<DEVICE_TYPE_CPU>(const CpuMatrix* out_grad,
178179
/**
179180
* Cosine Similarity backward Derivative
180181
*
181-
* \param inouts[0] forward input grad 1, size: nSamples * dim.
182-
* \param inouts[1] forward input grad 2,
182+
* \param outputs[0] forward input grad 1, size: nSamples * dim.
183+
* \param outputs[1] forward input grad 2,
183184
* size: n2 * dim (n2 == 1 or n2 == nSamples).
184185
*
185186
* \param inputs[0] backward loss output grad, size : nSamples * 1.
@@ -194,46 +195,36 @@ class CosSimBackwardFunc : public FunctionBase {
194195
scale_ = config.get<real>("scale");
195196
}
196197

197-
void calc(const Arguments& inputs,
198-
const Arguments& outputs,
199-
const Arguments& inouts) override {
198+
void calc(const BufferArgs& inputs, const BufferArgs& outputs) override {
200199
CHECK_EQ(inputs.size(), 4);
201-
CHECK_EQ(outputs.size(), 0);
202-
CHECK_EQ(inouts.size(), 2);
200+
CHECK_EQ(outputs.size(), 2);
203201
/// dim of out_grad and out_val == 1, column vector
204-
CHECK_EQ(inputs[0].dims_[1], 1UL);
205-
CHECK_EQ(inputs[1].dims_[1], 1UL);
202+
CHECK_EQ(inputs[0].shape()[1], 1UL);
203+
CHECK_EQ(inputs[1].shape()[1], 1UL);
206204
/// nSamples of out_grad == out_val == in_val1 == in_grad1
207-
CHECK_EQ(inputs[1].dims_[0], inputs[0].dims_[0]);
208-
CHECK_EQ(inputs[0].dims_[0], inputs[0].dims_[0]);
209-
CHECK_EQ(inouts[0].dims_[0], inputs[0].dims_[0]);
205+
CHECK_EQ(inputs[1].shape()[0], inputs[0].shape()[0]);
206+
CHECK_EQ(inputs[0].shape()[0], inputs[0].shape()[0]);
207+
CHECK_EQ(outputs[0].shape()[0], inputs[0].shape()[0]);
210208
/// dim of in1_val1 == in_val2 == in_grad1 == in_grad2
211-
CHECK_EQ(inputs[3].dims_[1], inputs[2].dims_[1]);
212-
CHECK_EQ(inouts[0].dims_[1], inputs[2].dims_[1]);
213-
CHECK_EQ(inouts[1].dims_[1], inputs[2].dims_[1]);
214-
215-
CHECK(inputs[0].getData() && inputs[1].getData() && inputs[2].getData() &&
216-
inputs[3].getData() && inouts[0].getData() && inouts[1].getData());
217-
const auto out_grad = std::make_shared<typename MatrixT<Device>::type>(
218-
inputs[0].getData(), inputs[0].dims_[0], inputs[0].dims_[1]);
219-
const auto out_val = std::make_shared<typename MatrixT<Device>::type>(
220-
inputs[1].getData(), inputs[1].dims_[0], inputs[1].dims_[1]);
221-
const auto in1_val = std::make_shared<typename MatrixT<Device>::type>(
222-
inputs[2].getData(), inputs[2].dims_[0], inputs[2].dims_[1]);
223-
const auto in2_val = std::make_shared<typename MatrixT<Device>::type>(
224-
inputs[3].getData(), inputs[3].dims_[0], inputs[3].dims_[1]);
225-
auto in1_grad = std::make_shared<typename MatrixT<Device>::type>(
226-
inouts[0].getData(), inouts[0].dims_[0], inouts[0].dims_[1]);
227-
auto in2_grad = std::make_shared<typename MatrixT<Device>::type>(
228-
inouts[1].getData(), inouts[1].dims_[0], inouts[1].dims_[1]);
229-
230-
CosSimBackward<Device>(out_grad.get(),
231-
out_val.get(),
232-
in1_val.get(),
233-
in2_val.get(),
234-
in1_grad.get(),
235-
in2_grad.get(),
236-
scale_);
209+
CHECK_EQ(inputs[3].shape()[1], inputs[2].shape()[1]);
210+
CHECK_EQ(outputs[0].shape()[1], inputs[2].shape()[1]);
211+
CHECK_EQ(outputs[1].shape()[1], inputs[2].shape()[1]);
212+
213+
CHECK(inputs[0].data() && inputs[1].data() && inputs[2].data() &&
214+
inputs[3].data() && outputs[0].data() && outputs[1].data());
215+
216+
CHECK_EQ(outputs[0].getArgType(), ADD_TO);
217+
CHECK_EQ(outputs[1].getArgType(), ADD_TO);
218+
219+
const auto out_grad = inputs[0].matrix<Device>();
220+
const auto out_val = inputs[1].matrix<Device>();
221+
const auto in1_val = inputs[2].matrix<Device>();
222+
const auto in2_val = inputs[3].matrix<Device>();
223+
auto in1_grad = outputs[0].matrix<Device>();
224+
auto in2_grad = outputs[1].matrix<Device>();
225+
226+
CosSimBackward<Device>(
227+
out_grad, out_val, in1_val, in2_val, in1_grad, in2_grad, scale_);
237228
}
238229

239230
private:

paddle/function/CosSimOp.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ namespace paddle {
3232
*
3333
*/
3434
template <DeviceType Device>
35-
void CosSimForward(typename MatrixT<Device>::type* output,
36-
const typename MatrixT<Device>::type* input1,
37-
const typename MatrixT<Device>::type* input2,
35+
void CosSimForward(typename Tensor<real, Device>::Matrix& output,
36+
const typename Tensor<real, Device>::Matrix& input1,
37+
const typename Tensor<real, Device>::Matrix& input2,
3838
real scale);
3939

4040
/**
@@ -50,12 +50,12 @@ void CosSimForward(typename MatrixT<Device>::type* output,
5050
*
5151
*/
5252
template <DeviceType Device>
53-
void CosSimBackward(const typename MatrixT<Device>::type* out_grad,
54-
const typename MatrixT<Device>::type* out_value,
55-
const typename MatrixT<Device>::type* in1_value,
56-
const typename MatrixT<Device>::type* in2_value,
57-
typename MatrixT<Device>::type* in1_grad,
58-
typename MatrixT<Device>::type* in2_grad,
53+
void CosSimBackward(const typename Tensor<real, Device>::Matrix& out_grad,
54+
const typename Tensor<real, Device>::Matrix& out_value,
55+
const typename Tensor<real, Device>::Matrix& in1_value,
56+
const typename Tensor<real, Device>::Matrix& in2_value,
57+
typename Tensor<real, Device>::Matrix& in1_grad,
58+
typename Tensor<real, Device>::Matrix& in2_grad,
5959
real scale);
6060

6161
} // namespace paddle

paddle/function/CosSimOpGpu.cu

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ __global__ void KeCosSim(real* output,
6565
}
6666

6767
void hlCossim(real* output,
68-
const real* input1,
69-
const real* input2,
70-
size_t width,
71-
size_t input1_height,
72-
size_t input2_height,
73-
real scale) {
68+
const real* input1,
69+
const real* input2,
70+
size_t width,
71+
size_t input1_height,
72+
size_t input2_height,
73+
real scale) {
7474
CHECK_NOTNULL(output);
7575
CHECK_NOTNULL(input1);
7676
CHECK_NOTNULL(input2);
@@ -84,20 +84,20 @@ void hlCossim(real* output,
8484
}
8585

8686
template <>
87-
void CosSimForward<DEVICE_TYPE_GPU>(GpuMatrix* out_mat,
88-
const GpuMatrix* in1_mat,
89-
const GpuMatrix* in2_mat,
87+
void CosSimForward<DEVICE_TYPE_GPU>(GpuMatrix& out_mat,
88+
const GpuMatrix& in1_mat,
89+
const GpuMatrix& in2_mat,
9090
real scale) {
91-
CHECK(out_mat && in1_mat && in2_mat);
92-
CHECK(in1_mat->useGpu_ == true && in2_mat->useGpu_ == true)
91+
CHECK(out_mat.getData() && in1_mat.getData() && in2_mat.getData());
92+
CHECK(in1_mat.useGpu_ == true && in2_mat.useGpu_ == true)
9393
<< "Matrix type are not GPU";
9494

95-
size_t num_samples = out_mat->getHeight();
96-
size_t dim = in1_mat->getWidth();
97-
real* out = out_mat->getData();
98-
const real* x = in1_mat->getData();
99-
const real* y = in2_mat->getData();
100-
hlCossim(out, x, y, dim, in1_mat->getHeight(), in2_mat->getHeight(), scale);
95+
size_t num_samples = out_mat.getHeight();
96+
size_t dim = in1_mat.getWidth();
97+
real* out = out_mat.getData();
98+
const real* x = in1_mat.getData();
99+
const real* y = in2_mat.getData();
100+
hlCossim(out, x, y, dim, in1_mat.getHeight(), in2_mat.getHeight(), scale);
101101
}
102102

103103
template<int block_size>
@@ -206,34 +206,35 @@ void hlCossimDerivative(const real* grad,
206206
}
207207

208208
template <>
209-
void CosSimBackward<DEVICE_TYPE_GPU>(const GpuMatrix* out_grad,
210-
const GpuMatrix* out_val,
211-
const GpuMatrix* in1_val,
212-
const GpuMatrix* in2_val,
213-
GpuMatrix* in1_grad,
214-
GpuMatrix* in2_grad,
209+
void CosSimBackward<DEVICE_TYPE_GPU>(const GpuMatrix& out_grad,
210+
const GpuMatrix& out_val,
211+
const GpuMatrix& in1_val,
212+
const GpuMatrix& in2_val,
213+
GpuMatrix& in1_grad,
214+
GpuMatrix& in2_grad,
215215
real scale) {
216-
CHECK(out_grad && out_val && in1_val && in2_val && in1_grad && in2_grad);
217-
CHECK(out_grad->useGpu_ && out_val->useGpu_ && in1_val->useGpu_
218-
&& in2_val->useGpu_ && in1_grad->useGpu_ && in2_grad->useGpu_)
216+
CHECK(out_grad.getData() && out_val.getData() && in1_val.getData() &&
217+
in2_val.getData() && in1_grad.getData() && in2_grad.getData());
218+
CHECK(out_grad.useGpu_ && out_val.useGpu_ && in1_val.useGpu_
219+
&& in2_val.useGpu_ && in1_grad.useGpu_ && in2_grad.useGpu_)
219220
<< "Matrix types are not equally GPU";
220221

221-
size_t dim = in1_val->getWidth();
222-
const real* grad = out_grad->getData();
223-
const real* out = out_val->getData();
224-
const real* prev_out_x = in1_val->getData();
225-
const real* prev_out_y = in2_val->getData();
226-
real* prev_grad_x = in1_grad->getData();
227-
real* prev_grad_y = in2_grad->getData();
222+
size_t dim = in1_val.getWidth();
223+
const real* grad = out_grad.getData();
224+
const real* out = out_val.getData();
225+
const real* prev_out_x = in1_val.getData();
226+
const real* prev_out_y = in2_val.getData();
227+
real* prev_grad_x = in1_grad.getData();
228+
real* prev_grad_y = in2_grad.getData();
228229
hlCossimDerivative(grad,
229230
out,
230231
prev_out_x,
231232
prev_out_y,
232233
prev_grad_x,
233234
prev_grad_y,
234235
dim,
235-
in1_val->getHeight(),
236-
in2_val->getHeight(),
236+
in1_val.getHeight(),
237+
in2_val.getHeight(),
237238
scale);
238239
}
239240

0 commit comments

Comments
 (0)