@@ -19,17 +19,18 @@ limitations under the License. */
19
19
template <typename DeviceContext, typename Place, typename T>
20
20
void TestSequencePoolingSum (const paddle::framework::LoD& lod) {
21
21
paddle::framework::LoDTensor cpu_out_grad;
22
+ paddle::framework::LoDTensor cpu_in_grad;
22
23
paddle::framework::LoDTensor out_grad;
23
24
paddle::framework::LoDTensor in_grad;
24
25
const size_t second_dim = 128u ;
25
26
26
27
// construct out_grad's tensor in cpu
27
- const size_t out_first_dim = lod.size () - 1 ;
28
+ const size_t out_first_dim = lod[ 0 ] .size () - 1 ;
28
29
auto out_dims = paddle::framework::make_ddim (
29
30
{static_cast <int64_t >(out_first_dim), static_cast <int64_t >(second_dim)});
30
31
31
32
cpu_out_grad.mutable_data <T>(out_dims, paddle::platform::CPUPlace ());
32
- for (int64_t i = 0 ; i < out_grad .numel (); ++i) {
33
+ for (int64_t i = 0 ; i < cpu_out_grad .numel (); ++i) {
33
34
cpu_out_grad.data <T>()[i] = static_cast <T>(i);
34
35
}
35
36
@@ -58,16 +59,38 @@ void TestSequencePoolingSum(const paddle::framework::LoD& lod) {
58
59
paddle::operators::math::SequencePoolGradFunctor<DeviceContext, T>()(
59
60
*context, " SUM" , out_grad, &in_grad);
60
61
62
+ if (paddle::platform::is_cpu_place (*place)) {
63
+ cpu_in_grad = in_grad;
64
+ } else {
65
+ TensorCopySync (in_grad, paddle::platform::CPUPlace (), &cpu_in_grad);
66
+ cpu_in_grad.set_lod (in_grad.lod ());
67
+ }
68
+
61
69
EXPECT_EQ (in_grad.numel (), lod[0 ].back () * second_dim);
62
70
EXPECT_EQ (in_grad.lod (), lod);
63
- for (int64_t i = 0 ; i < in_grad.lod ()[0 ].size () - 1 ; ++i) {
64
- int64_t begin = in_grad.lod ()[0 ][i];
65
- int64_t end = in_grad.lod ()[0 ][i + 1 ];
66
- paddle::framework::Tensor tmp = in_grad.Slice (begin, end);
67
- for (int64_t j = 0 ; j != tmp.numel () / second_dim; ++j) {
68
- for (int64_t m = 0 ; m != second_dim; ++m) {
69
- EXPECT_EQ (tmp.data <T>()[m + j * second_dim],
70
- out_grad.data <T>()[m + i * second_dim]);
71
+
72
+ if (paddle::platform::is_cpu_place (*place)) {
73
+ for (int64_t i = 0 ; i < cpu_in_grad.lod ()[0 ].size () - 1 ; ++i) {
74
+ int64_t begin = in_grad.lod ()[0 ][i];
75
+ int64_t end = in_grad.lod ()[0 ][i + 1 ];
76
+ paddle::framework::Tensor tmp = in_grad.Slice (begin, end);
77
+ for (int64_t j = 0 ; j != tmp.numel () / second_dim; ++j) {
78
+ for (int64_t m = 0 ; m != second_dim; ++m) {
79
+ EXPECT_EQ (tmp.data <T>()[m + j * second_dim],
80
+ out_grad.data <T>()[m + i * second_dim]);
81
+ }
82
+ }
83
+ }
84
+ } else {
85
+ for (int64_t i = 0 ; i < cpu_in_grad.lod ()[0 ].size () - 1 ; ++i) {
86
+ int64_t begin = cpu_in_grad.lod ()[0 ][i];
87
+ int64_t end = cpu_in_grad.lod ()[0 ][i + 1 ];
88
+ paddle::framework::Tensor tmp = cpu_in_grad.Slice (begin, end);
89
+ for (int64_t j = 0 ; j != tmp.numel () / second_dim; ++j) {
90
+ for (int64_t m = 0 ; m != second_dim; ++m) {
91
+ EXPECT_EQ (tmp.data <T>()[m + j * second_dim],
92
+ cpu_out_grad.data <T>()[m + i * second_dim]);
93
+ }
71
94
}
72
95
}
73
96
}
0 commit comments