diff --git a/dnn/src/cuda/convolution/backward_data/algo.h b/dnn/src/cuda/convolution/backward_data/algo.h index a4286c6db4d7c35b9335c713255358480c709c9e..d53b3c617927d196369d0eed16b535c37d98e21b 100644 --- a/dnn/src/cuda/convolution/backward_data/algo.h +++ b/dnn/src/cuda/convolution/backward_data/algo.h @@ -236,7 +236,13 @@ public: TensorLayout& grad_pg); MEGDNN_DECL_ALGO_TYPE(CUDA_GROUP_CONV_GENERAL) AlgoAttribute attribute() const override { - auto ret = static_cast(0); + auto ret = AlgoAttribute::DEFAULT; +#define cb(attr) \ + if (m_impl->contain_attribute_all(attr)) { \ + ret |= attr; \ + } + MEGDNN_FOREACH_ALGO_ATTRIBUTE_INHERITABLE(cb) +#undef cb if (m_impl->contain_attribute_all(AlgoAttribute::REPRODUCIBLE)) { ret |= AlgoAttribute::REPRODUCIBLE; } diff --git a/dnn/test/common/accuracy_shake_checker.h b/dnn/test/common/accuracy_shake_checker.h index efbbe6b99a5d893f9fc86b4da75b29cbd4af3ffc..a1deafedaa01cbccba6e2e0632d6678cd3528a35 100644 --- a/dnn/test/common/accuracy_shake_checker.h +++ b/dnn/test/common/accuracy_shake_checker.h @@ -168,7 +168,8 @@ public: AlgoProxy::arity>::get_all_algorithms_info( opr, layouts)) { if (!(algo_info.attribute & - AlgoAttribute::ACCURACY_DEPEND_ON_BATCH) && + AlgoAttribute::ACCURACY_DEPEND_ON_BATCH) && + (algo_info.attribute & AlgoAttribute::REPRODUCIBLE) && std::regex_match( algo_info.desc.name, std::regex("(.*)(" + m_policy_name.name + ")(.*)"))) { diff --git a/dnn/test/cuda/accuracy_shake.cpp b/dnn/test/cuda/accuracy_shake.cpp index ed93afe87a492fa0db876367fa6d940b6c7b6cb8..3f48f4e37595a475d4e29922e39381b16c2238d5 100644 --- a/dnn/test/cuda/accuracy_shake.cpp +++ b/dnn/test/cuda/accuracy_shake.cpp @@ -241,6 +241,41 @@ TEST_F(CUDA, SHAKE_LOCAL_SHARE) { checker.exec({{20, 16, 32, 32}, {3, 3, 16, 3, 3, 64}, {}}); } +TEST_F(CUDA, SHAKE_CONVOLUTION_BACKWARD_DATA) { + AccuracyShakeChecker checker(handle_cuda()); + NormalRNG default_rng; + checker.set_dtype(0, dtype::Float32()) + .set_dtype(1, dtype::Float32()) + .set_rng(0, &default_rng) + .set_rng(1, &default_rng); + // ConvolutionBackwardData + checker.exec({{8, 16, 3, 3}, {64, 8, 5, 5}, {64, 16, 7, 7}}); + + // group + ConvolutionBackwardData::Param param; + param.sparse = Convolution::Param::Sparse::GROUP; + checker.set_param(param); + checker.exec({{2, 16, 32, 3, 3}, {2, 32, 5, 5}, {2, 64, 7, 7}}); + checker.exec({{2, 8, 32, 3, 3}, {64, 16, 19, 19}, {64, 64, 21, 21}}); +} + +TEST_F(CUDA, SHAKE_CONVOLUTION_BACKWARD_FILTER) { + AccuracyShakeChecker checker(handle_cuda()); + NormalRNG default_rng; + checker.set_dtype(0, dtype::Float32()) + .set_dtype(1, dtype::Float32()) + .set_rng(0, &default_rng) + .set_rng(1, &default_rng); + // ConvolutionBackwardFilter + checker.exec({{2, 64, 7, 7}, {2, 32, 5, 5}, {32, 64, 3, 3}}); + + // group + ConvolutionBackwardFilter::Param param; + param.sparse = Convolution::Param::Sparse::GROUP; + checker.set_param(param); + checker.exec({{2, 64, 7, 7}, {2, 32, 5, 5}, {2, 16, 32, 3, 3}}); +} + } // namespace test } // namespace megdnn