in src/optimize_op.cc [780:833]
void Compute(OpKernelContext* ctx) override
{
if (SMs_ == 0)
SMs_ = GetCountSMs();
CUstream stream = ((CUDAStream*)ctx->op_device_context()->stream()->implementation())->cuda_stream();
float grad_scale = ctx->input(0).scalar<float>()();
float clip_norm = ctx->input(1).scalar<float>()();
OpInputList x_float, x_ehalf, x_bhalf;
ctx->input_list("x_float", &x_float);
ctx->input_list("x_ehalf", &x_ehalf);
ctx->input_list("x_bhalf", &x_bhalf);
uint tensor_idx = 0;
uint tensor_cnt = x_float.size() + x_ehalf.size() + x_bhalf.size();
Tensor *l2norm, *scale, *sum_sqr;
OP_REQUIRES_OK(ctx, ctx->allocate_output(0, TensorShape({}), &l2norm));
OP_REQUIRES_OK(ctx, ctx->allocate_output(1, TensorShape({}), &scale));
OP_REQUIRES_OK(ctx, ctx->allocate_output(2, TensorShape({ tensor_cnt }), &sum_sqr));
float* l2norm_ptr = l2norm->flat<float>().data();
float* scale_ptr = scale->flat<float>().data();
float* sum_sqr_ptr = sum_sqr->flat<float>().data();
for (int i = 0; i < x_float.size(); i++)
{
uint size = x_float[i].shape().num_elements();
const float* x_ptr = (const float*)x_float[i].flat<FLOAT>().data();
ReduceSumSquared<float,float4>(stream, SMs_, sum_sqr_ptr, x_ptr, size, grad_scale, saturate_, zero_infs_, zero_nans_, tensor_idx, tensor_cnt);
tensor_idx++;
}
for (int i = 0; i < x_ehalf.size(); i++)
{
uint size = x_ehalf[i].shape().num_elements();
const ehalf* x_ptr = (const ehalf*)x_ehalf[i].flat<EHALF>().data();
ReduceSumSquared<ehalf,ehalf4>(stream, SMs_, sum_sqr_ptr, x_ptr, size, grad_scale, saturate_, zero_infs_, zero_nans_, tensor_idx, tensor_cnt);
tensor_idx++;
}
for (int i = 0; i < x_bhalf.size(); i++)
{
uint size = x_bhalf[i].shape().num_elements();
const bhalf* x_ptr = (const bhalf*)x_bhalf[i].flat<BHALF>().data();
ReduceSumSquared<bhalf,bhalf4>(stream, SMs_, sum_sqr_ptr, x_ptr, size, grad_scale, saturate_, zero_infs_, zero_nans_, tensor_idx, tensor_cnt);
tensor_idx++;
}
ComputeClipNorm(stream, l2norm_ptr, scale_ptr, sum_sqr_ptr, clip_norm, tensor_cnt);
}