什么的虾| 雪藏是什么意思| 自言自语是什么原因导致| 中国文字博大精深什么意思| 斜视是什么意思| 津津有味什么意思| 生存是什么意思| 咽炎吃什么好| 追悔莫及什么意思| sf是什么意思| 什么是清淡饮食| 菊花茶喝多了有什么坏处| 湿气重的人不能吃什么| 食道炎吃什么药| 腿抽筋吃什么药| 流汗有什么好处| 左旋肉碱什么时候吃效果好| 头疼看什么科| 渡船是什么意思| 金字旁土念什么字| 区长是什么级别| 茹字五行属什么| 预防心肌梗塞吃什么药最好| 知更鸟是什么鸟| 绯色是什么颜色| 心电图异常q波是什么意思| 为什么心会痛| 孕妇吃什么牌子奶粉| 茶话会是什么意思| 细菌性阴道炎用什么药效果最好| 最好的大学是什么大学| 月经不规律吃什么药调理| 鼻血止不住是什么原因| 脂溢性皮炎用什么药| 贝加台念什么| 倒斗是什么意思| 什么是爱呢| 重孙是什么意思| 12月3日什么星座| d cup是什么意思| 苏联为什么解体| 态度是什么意思| 晚上做梦梦到蛇是什么意思| 车前草有什么作用| 右手麻木是什么原因引起的| 2003年什么年| 公貔貅和母貔貅有什么区别| 代谢慢的人吃什么有助于新陈代谢| 副省长是什么级别| 日和立念什么| 狗狗体内驱虫用什么药最好| 梦见抓鸟是什么征兆| 公务员是做什么的| 心里害怕紧张恐惧是什么症状| 脚上起水泡是什么原因| 中标是什么意思| 缺金的人戴什么最旺| 已是什么意思| 看手指甲挂什么科室| 台湾是什么民族| 幽门螺旋杆菌的症状吃什么药| 感冒了吃什么好的快| im医学上是什么意思| 血小板聚集是什么意思| 多种维生素什么时候吃效果最好| 欲言又止的欲什么意思| 硫黄是什么| 产后为什么脸部松弛| 高处不胜寒是什么意思| 无语凝噎是什么意思| 右乳钙化灶是什么意思| 拔罐对身体有什么好处| 昙花一现是什么生肖| 汛期是什么| 狮子女喜欢什么样的男生| 本垒打是什么意思| 大公鸡是什么牌子| fe是什么意思| xr是什么| 什么的金边| onlycook是什么牌子| 肝多发钙化灶什么意思| 薄荷叶泡水喝有什么功效和作用| 中医把脉能看出什么| 盆腔炎是什么病| ca199检查是什么意思| 请问尿路感染吃什么药最好| 阴道里面痒用什么药| 抗组胺是什么意思| 失恋什么意思| 丝光棉是什么材质| 肝郁气滞是什么意思| 什么牌子的洗衣机最好| 为什么会得高血压| 什么高| 长沙有什么玩的| 小孩腰疼是什么原因引起的| 地龙是什么| 心性是什么意思| ad和d3有什么区别| 猕猴桃不能和什么一起吃| 什么的柏树| 女人吃洋葱有什么好处| 总出虚汗是什么原因| 肾阳虚什么症状| 蝉吃什么东西| erdos是什么牌子| 拍黄瓜是什么意思| 送人礼物送什么好| 坐月子什么不可以吃| 手黄是什么原因| 女生的下体长什么样| 雪燕是什么| rmb是什么货币| 痔疮的表现症状是什么| 肚子左边是什么部位| 侏儒症是缺乏什么元素| 尤加一笔是什么字| 花笺是什么意思| 宝宝吐奶是什么原因引起的| 宫寒是什么| 屎是什么味道| 2024年属什么| 3月4日是什么星座| aki是什么意思| 副鼻窦炎症是什么意思| 牛油果树长什么样| 后天是什么意思| rca是什么意思| evol是什么意思| 什么树| 什么算高危性行为| 上火流鼻血是什么原因| 喝石斛水有什么禁忌| 乙肝前s1抗原阳性是什么意思| add是什么意思| 屈原属什么生肖| 明矾是什么东西| 甲状腺做什么检查最准确| 胸部正侧位片检查什么| 辅酶q10什么时候吃| 咳嗽痰多用什么药| 上嘴唇发白是因为什么原因| 眷属是什么意思| 小孩手足口病吃什么食物好| 走四方是什么生肖| 持续高烧不退是什么原因| 反胃想吐吃什么药| 六月初八是什么日子| 什么汤清热解毒去火| 姨妈是什么| 瓜子脸适合什么发型| 血压太低有什么危害| 草朋刀是什么字| 缺维生素d吃什么| 85属什么生肖| 肝脏b超能检查出什么| 屁特别臭是什么原因| 10月16日出生的是什么星座| 考研复试是什么意思| 利字五行属什么| 负压引流器有什么作用| 孩子走路晚是什么原因| 白酒都有什么香型| 每次上大便都出血是什么原因| 社保断交有什么影响| 胃痛去药店买什么药| 什么叫精神出轨| 鼻窦炎的症状是什么| 为什么小鸟站在电线上不会触电| 血红蛋白偏低什么意思| 阴阳代表什么数字| 检查免疫力都需要化验什么项目| 腰疼看什么科| 颈椎曲度变直是什么意思| 二五八万是什么意思| 美容美体是干什么的| 下半夜咳嗽是什么原因| 心绞痛是什么症状| 中国国鸟是什么| 流产后不能吃什么东西| 什么是人工智能| sds是什么意思| 女人五行缺水是什么命| 伊玛目是什么意思| 鸡枞是什么东西| 法香是什么菜| 肺结核传染途径是什么| 明天叫什么日子| 浮肿是什么原因| 鹿的部首是什么| 乳腺挂什么科| 蕞是什么意思| 凝血酶是什么| 阴道真菌感染用什么药| 湿气重吃什么调理| 吃什么食品减肥| 寒性和凉性有什么区别| 梦见老鼠是什么征兆| 高血压会引起什么病症| 什么人容易得焦虑症| kamagra是什么药| 25羟基维生素d是什么| 外耳炎用什么药| 五月十二是什么星座| 云南有什么少数民族| 惊恐发作是什么病| 喝苏打水有什么好处和坏处| 临终关怀的目的是什么| 杏花什么时候开| 拔牙后能吃什么东西| 尿多是什么回事| 加特纳菌阳性是什么病| 崩大碗配什么煲汤最好| 三刀六洞什么意思| 生菜是什么菜| 四不念什么| 文笔是什么意思| 平均血小板体积偏低是什么意思| 眉什么眼什么| 脚气是什么样的图片| 肝左叶囊肿是什么意思| 胃烧吃什么药| 耳朵一直痒是什么原因| 素质教育是什么| 结肠炎吃什么食物好| 七月五号是什么星座| 天天流鼻血是什么原因| 胃肠炎吃什么药好| 肠憩室是什么意思| 突然眼睛充血是什么原因引起的| 流鼻涕咳嗽吃什么药| 1968年猴是什么命| 对什么都不感兴趣| 丙烯颜料用什么洗掉| 金牛座是什么象| 血压低压低是什么原因| 膝盖酸痛什么原因| 包皮红肿瘙痒用什么药| 血管变窄吃什么能改善| 女性分泌物少是什么原因| 努尔哈赤是什么意思| 什么药治便秘| 皮蛋不能和什么一起吃| 仙女座是什么星座| 牙龈疼痛吃什么药| 八月八号什么星座| 托马斯是什么意思| 尿液清澈透明说明什么| 心电图逆钟向转位什么意思| 痛经打什么针止痛| 属猪的跟什么属相最配| 试管婴儿是什么意思| 肺结节吃什么药散结节最快| 香菇炒什么好吃| 马蹄南去人北望是什么歌| 温州人为什么会做生意| 是什么原因导致肥胖| 咖啡喝多了有什么危害| 上环要做什么检查| 牛蒡根泡水喝有什么好处| 基佬什么意思| 羸弱什么意思| 疳积是什么病| 百度
Skip to content

Commit 609f55e

Browse files
authored
[Cherry-pick] Fix indexing shape bug and Optimize (#62117)
* tensor_array slice in PIR (#60503) * use slice_array, now will meet error of destory opresult still in use * disable the pir test until the bug fixed * Optimize advanced setting by remove the last set_value (#60771) * pure-advanced setitem will not set_value back * fix multi output in tensor_array_pir * only in dynamic mode * add only advanced-setting case to fix coverage * fast pass for bool setitem (#61021) * fast pass for bool setitem * fix 0-size value case * remove final set_value OP in combined-indexing setting (#60983) * remove setvalue in combined indexing set * using combined-setting case to test * Optimize index put preprocess (#61060) * reduce vector operations when no bool index * reduce vector in index_put * reduce vector operations * no change for value * fix shape error in combine-getitem (#61922)
1 parent f4d9adf commit 609f55e

File tree

7 files changed

+335
-183
lines changed

7 files changed

+335
-183
lines changed

?paddle/fluid/pybind/eager_method.cc

Lines changed: 125 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ typedef SSIZE_T ssize_t;
5454
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
5555
#include "paddle/common/ddim.h"
5656
#include "paddle/fluid/eager/amp_utils.h"
57+
#include "paddle/fluid/eager/api/generated/eager_generated/backwards/nodes.h"
5758
#include "paddle/fluid/eager/api/generated/eager_generated/forwards/dygraph_functions.h"
5859
#include "paddle/fluid/eager/eager_amp_auto_cast.h"
5960
#include "paddle/fluid/framework/python_headers.h"
@@ -1359,6 +1360,7 @@ static PyObject* tensor__getitem_dygraph(TensorObject* self,
13591360
&use_strided_slice);
13601361

13611362
// step2: Dealing with basic indexing
1363+
bool out_is_view = false;
13621364
auto out = getTensorWithBasicIndexing(tensor,
13631365
&slice_axes,
13641366
&slice_starts,
@@ -1367,7 +1369,8 @@ static PyObject* tensor__getitem_dygraph(TensorObject* self,
13671369
&decrease_axis,
13681370
&none_axes,
13691371
&infer_flags,
1370-
&use_strided_slice);
1372+
&use_strided_slice,
1373+
&out_is_view);
13711374

13721375
if (!has_advanced_index) {
13731376
return ToPyObject(out);
@@ -1386,7 +1389,8 @@ static PyObject* tensor__getitem_dygraph(TensorObject* self,
13861389
&trans_back_dim,
13871390
&pos_of_new_dim,
13881391
&rank_of_new_dim,
1389-
&trans_dim);
1392+
&trans_dim,
1393+
&out_is_view);
13901394

13911395
if (transed_index.size() == 1 &&
13921396
transed_index[0].dtype() == phi::DataType::BOOL) {
@@ -1416,14 +1420,14 @@ static PyObject* tensor__getitem_dygraph(TensorObject* self,
14161420

14171421
if (pos_of_new_dim != 0) {
14181422
std::vector<int> perm(out.shape().size(), 0);
1419-
int tmp1 = pos_of_new_dim, tmp2 = 0,
1423+
int tmp1 = rank_of_new_dim, tmp2 = 0,
14201424
tmp3 = pos_of_new_dim + rank_of_new_dim;
14211425
for (int i = 0; i < static_cast<int>(out.shape().size()); ++i) {
1422-
if (i < rank_of_new_dim) {
1426+
if (i < pos_of_new_dim) {
14231427
perm[i] =
1424-
tmp1++; // range(pos_of_new_dim, pos_of_new_dim + rank_of_new_dim)
1425-
} else if (i >= rank_of_new_dim && i < pos_of_new_dim + rank_of_new_dim) {
1426-
perm[i] = tmp2++; // range(0, pos_of_new_dim)
1428+
tmp1++; // range(rank_of_new_dim, pos_of_new_dim + rank_of_new_dim)
1429+
} else if (i >= pos_of_new_dim && i < pos_of_new_dim + rank_of_new_dim) {
1430+
perm[i] = tmp2++; // range(0, rank_of_new_dim)
14271431
} else {
14281432
perm[i] = tmp3++; // range(pos_of_new_dim + rank_of_new_dim, out.ndim)
14291433
}
@@ -1681,6 +1685,7 @@ static PyObject* tensor__setitem_dygraph(TensorObject* self,
16811685
// 3. assign values to the sliced result by index_put OP;
16821686
// 4. transpose back and assign the result to original tensor by set_value
16831687
// OP.
1688+
bool out_is_view = false;
16841689
paddle::Tensor sub_tensor = getTensorWithBasicIndexing(tensor,
16851690
&slice_axes,
16861691
&slice_starts,
@@ -1689,7 +1694,8 @@ static PyObject* tensor__setitem_dygraph(TensorObject* self,
16891694
&decrease_axis,
16901695
&none_axes,
16911696
&infer_flags,
1692-
&use_strided_slice);
1697+
&use_strided_slice,
1698+
&out_is_view);
16931699

16941700
std::vector<paddle::Tensor> transed_index;
16951701
std::vector<int> trans_back_dim, trans_dim;
@@ -1705,65 +1711,126 @@ static PyObject* tensor__setitem_dygraph(TensorObject* self,
17051711
&trans_back_dim,
17061712
&pos_of_new_dim,
17071713
&rank_of_new_dim,
1708-
&trans_dim);
1714+
&trans_dim,
1715+
&out_is_view);
17091716

17101717
// Release gil and do tracing
17111718
py::gil_scoped_release release;
1712-
1713-
if (value_tensor.initialized() &&
1714-
(self->tensor.dtype() != value_tensor.dtype())) {
1715-
if (egr::Controller::Instance().GetAMPLevel() !=
1716-
paddle::imperative::AmpLevel::O0) {
1717-
paddle::small_vector<std::vector<paddle::Tensor>,
1718-
egr::kSlotSmallVectorSize>
1719-
tmps = {{self->tensor}, {value_tensor}};
1720-
auto amp_dtype = egr::GetAmpDestDtype("index_put", tmps);
1721-
self->tensor = egr::EagerAmpAutoCast(
1722-
self->tensor.name(), self->tensor, amp_dtype, "index_put");
1723-
value_tensor = egr::EagerAmpAutoCast(
1724-
value_tensor.name(), value_tensor, amp_dtype, "index_put");
1725-
}
1719+
if (value_tensor.initialized()) {
17261720
if (self->tensor.dtype() != value_tensor.dtype()) {
1727-
value_tensor = cast_ad_func(value_tensor, self->tensor.dtype());
1721+
if (egr::Controller::Instance().GetAMPLevel() !=
1722+
paddle::imperative::AmpLevel::O0) {
1723+
paddle::small_vector<std::vector<paddle::Tensor>,
1724+
egr::kSlotSmallVectorSize>
1725+
tmps = {{self->tensor}, {value_tensor}};
1726+
auto amp_dtype = egr::GetAmpDestDtype("index_put", tmps);
1727+
self->tensor = egr::EagerAmpAutoCast(
1728+
self->tensor.name(), self->tensor, amp_dtype, "index_put");
1729+
value_tensor = egr::EagerAmpAutoCast(
1730+
value_tensor.name(), value_tensor, amp_dtype, "index_put");
1731+
}
1732+
if (self->tensor.dtype() != value_tensor.dtype()) {
1733+
value_tensor = cast_ad_func(value_tensor, self->tensor.dtype());
1734+
}
17281735
}
1729-
}
17301736

1731-
if (value_tensor.dims().size() > 1 && pos_of_new_dim != 0) {
1732-
value_tensor = transpose_ad_func(value_tensor, trans_dim);
1733-
}
1737+
if (value_tensor.dims().size() > 1 && pos_of_new_dim != 0) {
1738+
value_tensor = transpose_ad_func(value_tensor, trans_dim);
1739+
}
17341740

1735-
// TODO(zoooo0820) 1.Using inplace version index_put
1736-
// 2.Remove following code after backward bug fixed.
1737-
transed_sub_tensor = assign_ad_func(transed_sub_tensor);
1741+
const phi::distributed::ProcessMesh* mesh = nullptr;
1742+
if (InputsContainDistTensor(
1743+
&mesh, self->tensor, transed_sub_tensor, value_tensor)) {
1744+
ConvertAllInputsToDistTensor(
1745+
mesh, self->tensor, transed_sub_tensor, value_tensor);
1746+
}
17381747

1739-
const phi::distributed::ProcessMesh* mesh = nullptr;
1740-
if (InputsContainDistTensor(
1741-
&mesh, self->tensor, transed_sub_tensor, value_tensor)) {
1742-
ConvertAllInputsToDistTensor(
1743-
mesh, self->tensor, transed_sub_tensor, value_tensor);
1744-
}
1748+
if (transed_index.size() == 1 &&
1749+
transed_index[0].dtype() == phi::DataType::BOOL &&
1750+
transed_index[0].shape().size() == self->tensor.shape().size()) {
1751+
if (value_tensor.shape() != self->tensor.shape()) {
1752+
value_tensor = expand_ad_func(value_tensor, self->tensor.shape());
1753+
}
1754+
transed_sub_tensor =
1755+
where__ad_func(logical_not_ad_func(transed_index[0]),
1756+
transed_sub_tensor,
1757+
value_tensor);
1758+
} else {
1759+
transed_sub_tensor =
1760+
index_put__ad_func(transed_sub_tensor, transed_index, value_tensor);
1761+
}
17451762

1746-
transed_sub_tensor =
1747-
index_put_ad_func(transed_sub_tensor, transed_index, value_tensor);
1748-
1749-
paddle::Tensor transback_sub_tensor =
1750-
transpose_ad_func(transed_sub_tensor, trans_back_dim);
1751-
1752-
self->tensor = set_value_with_tensor__ad_func(self->tensor,
1753-
transback_sub_tensor,
1754-
slice_starts,
1755-
slice_ends,
1756-
slice_strides,
1757-
slice_axes,
1758-
decrease_axis,
1759-
none_axes);
1760-
if (PyCheckTensor(value_obj)) {
1761-
// pass the stop_gradient from value to tensor.
1762-
// pass stop gradient should be done after CheckInplace in
1763-
// set_value__dygraph_function.
1764-
if (!egr::EagerUtils::autograd_meta(&value_tensor)->StopGradient() &&
1765-
egr::EagerUtils::autograd_meta(&self->tensor)->StopGradient()) {
1766-
egr::EagerUtils::autograd_meta(&self->tensor)->SetStopGradient(false);
1763+
if (out_is_view) {
1764+
// NOTE(zoooo0820): if out_is_view is true, it is a case of
1765+
// combined-indexing setitem, i.e. firstly we get a view of
1766+
// self->tensor, then modified it with inplace api index_put_ For now,
1767+
// in design of Paddle, the forward result is right. But the backward
1768+
// edge can not be established because the Base Tensor cannot sense
1769+
// whether it has been modified by other operations. Following codes are
1770+
// to add a new node (set_value_with_tensor_grad) to record the backward
1771+
// edge, with out ad_function which needs to do the forward calculation.
1772+
1773+
egr::AutogradMeta* x_autograd_meta =
1774+
egr::EagerUtils::nullable_autograd_meta(self->tensor);
1775+
egr::AutogradMeta* values_autograd_meta =
1776+
egr::EagerUtils::nullable_autograd_meta(transed_sub_tensor);
1777+
bool trace_backward = egr::Controller::Instance().HasGrad();
1778+
bool require_any_grad = egr::EagerUtils::ComputeRequireGrad(
1779+
trace_backward, x_autograd_meta, values_autograd_meta);
1780+
// Node Declaration
1781+
std::shared_ptr<SetValueWithTensorGradNode> grad_node;
1782+
// Set grad_node before API Call
1783+
if (require_any_grad) {
1784+
paddle::Tensor transback_sub_tensor =
1785+
transpose_ad_func(transed_sub_tensor, trans_back_dim);
1786+
const auto& values_tmp =
1787+
(require_any_grad && transback_sub_tensor.is_dense_tensor() &&
1788+
!std::dynamic_pointer_cast<phi::DenseTensor>(
1789+
transback_sub_tensor.impl())
1790+
->meta()
1791+
.is_contiguous())
1792+
? paddle::Tensor(
1793+
std::make_shared<phi::DenseTensor>(
1794+
std::move(paddle::experimental::Trans2Contiguous(
1795+
*(std::dynamic_pointer_cast<phi::DenseTensor>(
1796+
transback_sub_tensor.impl()))))),
1797+
transback_sub_tensor.mutable_autograd_meta())
1798+
: transback_sub_tensor;
1799+
1800+
grad_node = std::shared_ptr<SetValueWithTensorGradNode>(
1801+
new SetValueWithTensorGradNode(1, 2)); // NOLINT
1802+
grad_node->SetAttributestarts(slice_starts);
1803+
grad_node->SetAttributeends(slice_ends);
1804+
grad_node->SetAttributesteps(slice_strides);
1805+
grad_node->SetAttributeaxes(slice_axes);
1806+
grad_node->SetAttributedecrease_axes(decrease_axis);
1807+
grad_node->SetAttributenone_axes(none_axes);
1808+
grad_node->SetTensorWrappervalues(values_tmp);
1809+
1810+
paddle::memory::LogDeviceMemoryStats(
1811+
egr::Controller::Instance().GetExpectedPlace(),
1812+
"set_value_with_tensor");
1813+
egr::EagerUtils::CheckInplace(
1814+
self->tensor, x_autograd_meta, require_any_grad);
1815+
egr::EagerUtils::PassStopGradient(false, x_autograd_meta);
1816+
// SetGradOutMeta & SetEdges
1817+
grad_node->SetGradOutMeta(self->tensor, 0);
1818+
grad_node->SetGradOutMeta(transback_sub_tensor, 1);
1819+
if (x_autograd_meta) {
1820+
egr::EagerUtils::SetOutRankWithSlot(x_autograd_meta, 0);
1821+
egr::EagerUtils::SetHistory(x_autograd_meta, grad_node);
1822+
}
1823+
grad_node->SetGradInMeta(self->tensor, 0);
1824+
}
1825+
}
1826+
if (PyCheckTensor(value_obj)) {
1827+
// pass the stop_gradient from value to tensor.
1828+
// pass stop gradient should be done after CheckInplace in
1829+
// set_value__dygraph_function.
1830+
if (!egr::EagerUtils::autograd_meta(&value_tensor)->StopGradient() &&
1831+
egr::EagerUtils::autograd_meta(&self->tensor)->StopGradient()) {
1832+
egr::EagerUtils::autograd_meta(&self->tensor)->SetStopGradient(false);
1833+
}
17671834
}
17681835
}
17691836
}

?paddle/fluid/pybind/slice_utils.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,11 +347,13 @@ static paddle::Tensor getTensorWithBasicIndexing(
347347
std::vector<int64_t>* decrease_axis,
348348
std::vector<int64_t>* none_axes,
349349
std::vector<int64_t>* infer_flags,
350-
bool* use_strided_slice) {
350+
bool* use_strided_slice,
351+
bool* out_is_view) {
351352
paddle::Tensor out;
352353
if (slice_axes->empty()) {
353354
out = tensor;
354355
} else {
356+
*out_is_view = true;
355357
if (!(*use_strided_slice)) {
356358
eager_gil_scoped_release guard;
357359
out = slice_ad_func(tensor,
@@ -372,6 +374,7 @@ static paddle::Tensor getTensorWithBasicIndexing(
372374
}
373375
}
374376
if (!none_axes->empty()) {
377+
*out_is_view = true;
375378
eager_gil_scoped_release guard;
376379
// Deal with cases that decrease_axes is not empty
377380
// For example:
@@ -400,7 +403,8 @@ static paddle::Tensor dealWithAdvancedIndex(
400403
std::vector<int>* trans_back_dim,
401404
int* pos_of_new_dim,
402405
int* rank_of_new_dim,
403-
std::vector<int>* trans_dim) {
406+
std::vector<int>* trans_dim,
407+
bool* out_is_view) {
404408
int p = 0;
405409
for (size_t i = 0; i < advanced_index_dim->size(); ++i) {
406410
auto index_dim = (*advanced_index_dim)[i];
@@ -443,6 +447,7 @@ static paddle::Tensor dealWithAdvancedIndex(
443447
if (original_dim_order == *trans_dim) {
444448
transed_tensor = tensor;
445449
} else {
450+
*out_is_view = true;
446451
transed_tensor = transpose_ad_func(tensor, *trans_dim);
447452
}
448453

0 commit comments

Comments
?(0)
肝胃郁热吃什么中成药 妊娠反应什么时候开始 什么是npc 呔是什么意思 胃热吃什么食物好
慢性气管炎吃什么药最有效 吃苦荞有什么好处 一什么金鱼 竹叶青是什么 智齿什么时候开始长
什么是粒子植入治疗 精神病吃什么药 狗能吃什么 叶子是什么意思 关节退行性改变是什么意思
刘胡兰是什么样的人 9月什么星座 衣字旁的字和什么有关 风寒感冒吃什么药最快 fujixerox是什么牌子
二次元文化是什么意思hcv9jop5ns3r.cn 为什么总是犯困想睡觉hcv7jop9ns8r.cn 成吉思汗姓什么wzqsfys.com 宝宝眼屎多是什么原因xinjiangjialails.com 74年出生属什么生肖hcv9jop3ns9r.cn
阑尾炎吃什么hcv9jop2ns1r.cn 豆浆和什么不能一起吃hcv8jop7ns7r.cn 流产是什么样子的hcv9jop1ns8r.cn 老舍原名什么hcv8jop2ns4r.cn 讲信修什么hcv8jop5ns5r.cn
手机壳什么材质最好gysmod.com 歹且念什么hcv9jop7ns9r.cn 中国属于什么半球wuhaiwuya.com 风云人物什么意思hcv8jop3ns4r.cn 什么叫前列腺钙化imcecn.com
egfr是什么意思jasonfriends.com 知我者非你也什么意思hcv8jop3ns4r.cn 女孩小名叫什么好hcv8jop7ns2r.cn 菠菜什么季节吃hcv8jop2ns1r.cn 血液粘稠吃什么药hcv9jop8ns2r.cn
百度