From d1adc9a22f5f1e32106b4c65a3a568a32e55dfae Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Wed, 16 Dec 2020 00:22:40 +0800 Subject: [PATCH] fix(dnn): fix opencl algo search GitOrigin-RevId: 25997d0ef168769b18f06434b32a99739f857bb0 --- dnn/include/megdnn/oprs/base.h | 10 +++++++++- dnn/src/common/algo_chooser.h | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/dnn/include/megdnn/oprs/base.h b/dnn/include/megdnn/oprs/base.h index d870edfe..27bfc1b9 100644 --- a/dnn/include/megdnn/oprs/base.h +++ b/dnn/include/megdnn/oprs/base.h @@ -155,7 +155,15 @@ public: template static T deserialize_read_pod(const std::string& data, size_t offset = 0) { - T ret = *reinterpret_cast(&data[offset]); + T ret; + //! A pointer to an object or incomplete type may be converted to a + //! pointer to a different object or incomplete type. If the resulting + //! pointer is not correctly aligned for the pointed-to type, the + //! behavior is undefined. + //! + //! so here we should use memcpy instead of + //! *reinterpret_cast(&data[offset]); + memcpy(&ret, data.data() + offset, sizeof(T)); return ret; } diff --git a/dnn/src/common/algo_chooser.h b/dnn/src/common/algo_chooser.h index e597ca3f..1215a647 100644 --- a/dnn/src/common/algo_chooser.h +++ b/dnn/src/common/algo_chooser.h @@ -48,10 +48,10 @@ typename Opr::AlgoBase* get_algorithm_or_construct(Opr* opr, Args&&... args) { if (set.valid()) { return opr->algo_pack().construct_and_get_algo(set.desc); } else { - ret = opr->get_algorithm_info_heuristic( - std::forward(args)..., std::numeric_limits::max(), - false); - return opr->get_algo_from_desc(ret.desc); + return static_cast( + opr->get_algorithm_heuristic(std::forward(args)..., + std::numeric_limits::max(), + false)); } }