@@ -53,25 +53,27 @@ struct SequenceExpandFunctor<platform::CPUDeviceContext, T> {
53
53
const framework::Vector<size_t >& ref_lod, /* expand referenced lod*/
54
54
LoDTensor* out) {
55
55
int out_offset = 0 ;
56
- auto & eigen_place = *context.eigen_device ();
56
+ int x_item_length = x.numel () / x.dims ()[0 ];
57
+ auto out_data = out->data <T>();
58
+ auto x_data = x.data <T>();
57
59
for (size_t i = 1 ; i < ref_lod.size (); ++i) {
58
60
int repeat_num = ref_lod[i] - ref_lod[i - 1 ];
59
61
int x_start = x_lod[i - 1 ];
60
62
int x_end = x_lod[i];
61
63
int x_seq_len = x_end - x_start;
62
64
if (repeat_num > 0 ) {
63
- auto x_sub_tensor = x.Slice (x_start, x_end);
64
- x_sub_tensor.Resize ({1 , x_sub_tensor.numel ()});
65
65
int out_start = out_offset;
66
66
if (out->lod ().size () == 1 ) {
67
67
out_start = out->lod ()[0 ][out_offset];
68
68
}
69
- auto out_sub_tensor =
70
- out->Slice (out_start, out_start + x_seq_len * repeat_num);
71
- out_sub_tensor.Resize ({repeat_num, x_sub_tensor.dims ()[1 ]});
72
- EigenMatrix<T>::From (out_sub_tensor).device (eigen_place) =
73
- EigenMatrix<T>::From (x_sub_tensor)
74
- .broadcast (Eigen::array<int , 2 >({{repeat_num, 1 }}));
69
+ for (int j = 0 ; j < repeat_num; j++) {
70
+ for (int k = 0 ; k < x_seq_len; k++) {
71
+ for (int l = 0 ; l < x_item_length; l++) {
72
+ out_data[(out_start + j * x_seq_len + k) * x_item_length + l] =
73
+ x_data[(x_start + k) * x_item_length + l];
74
+ }
75
+ }
76
+ }
75
77
}
76
78
out_offset += repeat_num;
77
79
}
0 commit comments