From f2c82f0a91e2c2a7fb754c8e3caab10dce56af4c Mon Sep 17 00:00:00 2001 From: yang_chun Date: Thu, 17 Dec 2020 10:21:46 +0800 Subject: [PATCH] Fix Apply adagrad CodeDex. --- .../cpu/apply_adagrad_cpu_kernel.cc | 17 +++++++++++------ .../cpu/apply_adagrad_cpu_kernel.h | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.cc b/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.cc index cd6b7134ce..90d7c9d482 100644 --- a/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.cc +++ b/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.cc @@ -80,12 +80,15 @@ void ApplyAdagradCPUKernel::LaunchKernel(const std::vector &inputs) std::vector threads; threads.reserve(use_thread_num); size_t start = 0; - size_t batch_size = (length + use_thread_num - 1) / use_thread_num; + const size_t batch_size = (length + use_thread_num - 1) / use_thread_num; + if (batch_size == 0) { + MS_LOG(EXCEPTION) << "Error occur in launch kernel"; + } while (start < length) { size_t end = (start + batch_size) > length ? length : (start + batch_size); threads.emplace_back( - std::thread(&ApplyAdagradCPUKernel::LaunchApplyAdagrad, this, var, accum, *lr, gradient, start, end)); + std::thread(&ApplyAdagradCPUKernel::LaunchApplyAdagrad, this, var, accum, lr, gradient, start, end)); start += batch_size; } @@ -95,16 +98,18 @@ void ApplyAdagradCPUKernel::LaunchKernel(const std::vector &inputs) } template -void ApplyAdagradCPUKernel::LaunchApplyAdagrad(T *var, T *accum, T lr, T *gradient, size_t start, size_t end) { - const T one = T(1); - const T eps = T(1e-6); +void ApplyAdagradCPUKernel::LaunchApplyAdagrad(T var, T accum, T lr, T gradient, size_t start, size_t end) { + // DataType can only be float32 or float16, so eps will not be zero. + using DataType = typename std::iterator_traits::value_type; + const DataType one = DataType(1); + const DataType eps = DataType(1e-6); for (size_t i = start; i < end; ++i) { // update accum: accum += grad * grad if (update_slots_) { accum[i] += gradient[i] * gradient[i]; } // update var: var -= lr * grad * \frac{1}{\sqrt{accum}} - var[i] -= lr * gradient[i] * (one / sqrt(accum[i] + eps)); + var[i] -= lr[0] * gradient[i] * (one / sqrt(accum[i] + eps)); } } } // namespace kernel diff --git a/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.h b/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.h index 79beb8e974..739c964c10 100644 --- a/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.h +++ b/mindspore/ccsrc/backend/kernel_compiler/cpu/apply_adagrad_cpu_kernel.h @@ -38,7 +38,7 @@ class ApplyAdagradCPUKernel : public CPUKernel { template void LaunchKernel(const std::vector &inputs); template - void LaunchApplyAdagrad(T *var, T *accum, T lr, T *gradient, size_t start, size_t end); + void LaunchApplyAdagrad(T var, T accum, T lr, T gradient, size_t start, size_t end); bool update_slots_{true}; TypeId dtype_{kTypeUnknown}; };