blob: c04dbfe48f3dad0821d2c685bb653689eeb934ac [file] [log] [blame]
#include "dequantize_dnnlowp_op.h"
#include "caffe2/core/tensor_int8.h"
#include "caffe2_dnnlowp_utils.h"
namespace caffe2 {
template <typename T>
DequantizeDNNLowPOp<T>::DequantizeDNNLowPOp(
const OperatorDef& operator_def,
Workspace* ws)
: Operator<CPUContext>(operator_def, ws),
qfactory_(dnnlowp::GetQuantizationFactoryOf(this)) {}
template <typename T>
bool DequantizeDNNLowPOp<T>::RunOnDevice() {
using namespace dnnlowp;
TensorQuantizationParams in_qparams =
GetInputTensorQuantizationParamsOf(this, 0, qfactory_.get());
const TensorCPU& input = InputIsType<int8::Int8TensorCPU>(0)
? OperatorBase::Input<int8::Int8TensorCPU>(0).t
: Input(0);
CAFFE_ENFORCE(input.template IsType<T>());
Output(0)->ResizeLike(input);
Dequantize(
input.template data<T>(),
Output(0)->template mutable_data<float>(),
input.numel(),
in_qparams);
return true;
}
OPERATOR_SCHEMA(Dequantize)
.NumInputs(1)
.NumOutputs(1)
.IdenticalTypeAndShapeOfInput(0);
REGISTER_CPU_OPERATOR_WITH_ENGINE(
Dequantize, DNNLOWP, DequantizeDNNLowPOp<std::uint8_t>);
REGISTER_CPU_OPERATOR_WITH_ENGINE(
Dequantize, DNNLOWP_ROWWISE, DequantizeDNNLowPOp<std::uint8_t>);
REGISTER_CPU_OPERATOR_WITH_ENGINE(
Dequantize, DNNLOWP_16, DequantizeDNNLowPOp<std::uint16_t>);
REGISTER_CPU_OPERATOR_WITH_ENGINE(
Dequantize, DNNLOWP_ROWWISE_16, DequantizeDNNLowPOp<std::uint16_t>);
REGISTER_CPU_OPERATOR_WITH_ENGINE(
Int8Dequantize, DNNLOWP, DequantizeDNNLowPOp<std::uint8_t>);
REGISTER_CPU_OPERATOR_WITH_ENGINE(
Int8Dequantize, DNNLOWP_ROWWISE, DequantizeDNNLowPOp<std::uint8_t>);
REGISTER_CPU_OPERATOR_WITH_ENGINE(
Int8DequantizeRowWise, DNNLOWP, DequantizeDNNLowPOp<std::uint8_t>);
} // namespace caffe2