|
|
|
@ -62,16 +62,14 @@ void MKLDNNAddtoLayer::resetFwd(std::vector<primitive>& pipeline,
|
|
|
|
|
MKLDNNMatrixPtr& wgt,
|
|
|
|
|
MKLDNNMatrixPtr& bias,
|
|
|
|
|
MKLDNNMatrixPtr& out) {
|
|
|
|
|
if (biases_) {
|
|
|
|
|
LOG(FATAL) << "not implemented yet";
|
|
|
|
|
}
|
|
|
|
|
resetFwdBuffers(inVals_, out);
|
|
|
|
|
resetFwdBuffers(inVals_, bias, out);
|
|
|
|
|
in = inVals_[0];
|
|
|
|
|
|
|
|
|
|
std::shared_ptr<sum::primitive_desc> fwdPD;
|
|
|
|
|
resetFwdPD(fwdPD, inVals_, out);
|
|
|
|
|
std::shared_ptr<sum::primitive_desc> biasPD;
|
|
|
|
|
resetFwdPD(fwdPD, biasPD, inVals_, bias, out);
|
|
|
|
|
|
|
|
|
|
resetFwdPipeline(pipeline, fwdPD, inVals_, out);
|
|
|
|
|
resetFwdPipeline(pipeline, fwdPD, biasPD, inVals_, bias, out);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MKLDNNAddtoLayer::resetBwd(std::vector<primitive>& pipeline,
|
|
|
|
@ -79,7 +77,7 @@ void MKLDNNAddtoLayer::resetBwd(std::vector<primitive>& pipeline,
|
|
|
|
|
MKLDNNMatrixPtr& wgt,
|
|
|
|
|
MKLDNNMatrixPtr& bias,
|
|
|
|
|
MKLDNNMatrixPtr& out) {
|
|
|
|
|
resetBwdBuffers(inGrads_, out);
|
|
|
|
|
resetBwdBuffers(inGrads_, bias, out);
|
|
|
|
|
in = inGrads_[0];
|
|
|
|
|
|
|
|
|
|
// backward only need share output grad to input grad
|
|
|
|
@ -89,6 +87,20 @@ void MKLDNNAddtoLayer::resetBwd(std::vector<primitive>& pipeline,
|
|
|
|
|
inputLayers_[i]->getOutputGrad()->setData(inGrads_[i]->getData());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// backward bias
|
|
|
|
|
bwdBias_ = nullptr;
|
|
|
|
|
if (bias) {
|
|
|
|
|
std::vector<double> scales(bs_, 1.0);
|
|
|
|
|
std::vector<memory::primitive_desc> srcPDs(bs_, bias->getPrimitiveDesc());
|
|
|
|
|
auto biasPD = sum::primitive_desc(bias->getMemoryDesc(), scales, srcPDs);
|
|
|
|
|
std::vector<primitive::at> srcs;
|
|
|
|
|
for (size_t i = 0; i < grads_.size(); ++i) {
|
|
|
|
|
srcs.push_back(*(grads_[i]));
|
|
|
|
|
}
|
|
|
|
|
bwdBias_.reset(new sum(biasPD, srcs, *bias));
|
|
|
|
|
pipeline.push_back(*bwdBias_);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MKLDNNAddtoLayer::updateWeights(const UpdateCallback& callback) {
|
|
|
|
@ -97,7 +109,25 @@ void MKLDNNAddtoLayer::updateWeights(const UpdateCallback& callback) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MKLDNNAddtoLayer::prepareBias(MKLDNNMatrixPtr& bias,
|
|
|
|
|
const MatrixPtr& biasMat,
|
|
|
|
|
const MKLDNNMatrixPtr& out,
|
|
|
|
|
std::vector<MKLDNNMatrixPtr>& outs) {
|
|
|
|
|
auto pd = MKLDNNMatrix::createPrimitiveDesc(
|
|
|
|
|
{(int)layerSize_}, memory::format::x, engine_);
|
|
|
|
|
bias = MKLDNNMatrix::create(pd, biasMat);
|
|
|
|
|
outs.clear();
|
|
|
|
|
real* data = out->getData();
|
|
|
|
|
CHECK_EQ(bs_ * layerSize_, out->getElementCnt());
|
|
|
|
|
for (int i = 0; i < bs_; ++i) {
|
|
|
|
|
MatrixPtr tmp =
|
|
|
|
|
Matrix::create(data + i * layerSize_, 1, layerSize_, false, false);
|
|
|
|
|
outs.push_back(MKLDNNMatrix::create(bias->getPrimitiveDesc(), tmp));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MKLDNNAddtoLayer::resetFwdBuffers(std::vector<MKLDNNMatrixPtr>& inputs,
|
|
|
|
|
MKLDNNMatrixPtr& bias,
|
|
|
|
|
MKLDNNMatrixPtr& out) {
|
|
|
|
|
inputs.resize(inputLayers_.size());
|
|
|
|
|
for (size_t i = 0; i < inputs.size(); i++) {
|
|
|
|
@ -110,10 +140,18 @@ void MKLDNNAddtoLayer::resetFwdBuffers(std::vector<MKLDNNMatrixPtr>& inputs,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resetOutValue(out, inputs[0]->getPrimitiveDesc());
|
|
|
|
|
|
|
|
|
|
if (biases_ && biases_->getW()) {
|
|
|
|
|
prepareBias(bias, biases_->getW(), out, vals_);
|
|
|
|
|
} else {
|
|
|
|
|
bias = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MKLDNNAddtoLayer::resetFwdPD(std::shared_ptr<sum::primitive_desc>& pd,
|
|
|
|
|
std::shared_ptr<sum::primitive_desc>& biasPD,
|
|
|
|
|
std::vector<MKLDNNMatrixPtr>& inputs,
|
|
|
|
|
MKLDNNMatrixPtr bias,
|
|
|
|
|
MKLDNNMatrixPtr out) {
|
|
|
|
|
std::vector<double> scales(inputs.size(), 1.0);
|
|
|
|
|
std::vector<memory::primitive_desc> srcPDs;
|
|
|
|
@ -123,12 +161,23 @@ void MKLDNNAddtoLayer::resetFwdPD(std::shared_ptr<sum::primitive_desc>& pd,
|
|
|
|
|
CHECK(out);
|
|
|
|
|
pd.reset(new sum::primitive_desc(out->getMemoryDesc(), scales, srcPDs));
|
|
|
|
|
CHECK_PRIMITIVE_DESC_EQ(out, pd->dst_primitive_desc());
|
|
|
|
|
|
|
|
|
|
biasPD = nullptr;
|
|
|
|
|
if (bias) {
|
|
|
|
|
std::vector<double> scales(2, 1.0);
|
|
|
|
|
std::vector<memory::primitive_desc> srcPDs(2, bias->getPrimitiveDesc());
|
|
|
|
|
biasPD.reset(
|
|
|
|
|
new sum::primitive_desc(bias->getMemoryDesc(), scales, srcPDs));
|
|
|
|
|
CHECK_PRIMITIVE_DESC_EQ(bias, biasPD->dst_primitive_desc());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MKLDNNAddtoLayer::resetFwdPipeline(
|
|
|
|
|
std::vector<primitive>& pipeline,
|
|
|
|
|
std::shared_ptr<sum::primitive_desc>& pd,
|
|
|
|
|
std::shared_ptr<sum::primitive_desc>& biasPD,
|
|
|
|
|
std::vector<MKLDNNMatrixPtr>& inputs,
|
|
|
|
|
MKLDNNMatrixPtr& bias,
|
|
|
|
|
MKLDNNMatrixPtr& out) {
|
|
|
|
|
std::vector<primitive::at> srcs;
|
|
|
|
|
for (size_t i = 0; i < inputs.size(); i++) {
|
|
|
|
@ -136,9 +185,23 @@ void MKLDNNAddtoLayer::resetFwdPipeline(
|
|
|
|
|
}
|
|
|
|
|
fwd_.reset(new sum(*pd, srcs, *out));
|
|
|
|
|
pipeline.push_back(*fwd_);
|
|
|
|
|
|
|
|
|
|
fwdBias_.clear();
|
|
|
|
|
if (biasPD == nullptr || bias == nullptr) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
fwdBias_.resize(vals_.size());
|
|
|
|
|
for (size_t i = 0; i < vals_.size(); ++i) {
|
|
|
|
|
std::vector<primitive::at> srcs;
|
|
|
|
|
srcs.push_back(*(vals_[i]));
|
|
|
|
|
srcs.push_back(*bias);
|
|
|
|
|
fwdBias_[i].reset(new sum(*biasPD, srcs, *vals_[i]));
|
|
|
|
|
pipeline.push_back(*fwdBias_[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MKLDNNAddtoLayer::resetBwdBuffers(std::vector<MKLDNNMatrixPtr>& inputs,
|
|
|
|
|
MKLDNNMatrixPtr& bias,
|
|
|
|
|
MKLDNNMatrixPtr& out) {
|
|
|
|
|
CHECK(outVal_);
|
|
|
|
|
resetOutGrad(out, outVal_->getPrimitiveDesc());
|
|
|
|
@ -149,6 +212,12 @@ void MKLDNNAddtoLayer::resetBwdBuffers(std::vector<MKLDNNMatrixPtr>& inputs,
|
|
|
|
|
resetInGrad(inputs[i], inVal_->getPrimitiveDesc(), i);
|
|
|
|
|
CHECK_PRIMITIVE_DESC_EQ(inputs[i], out->getPrimitiveDesc());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (biases_ && biases_->getWGrad()) {
|
|
|
|
|
prepareBias(bias, biases_->getWGrad(), out, grads_);
|
|
|
|
|
} else {
|
|
|
|
|
bias = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace paddle
|
|
|
|
|