void generateMask(Parameter *para) { VectorPtr maskTemp = Vector::create(para->getSize(), false); maskTemp->zeroMem(); real *maskTempData = maskTemp->getData(); size_t nonZeroNum = para->getSize() * (1 - sparsityRatio_); VectorPtr paraVec = para->getBuf(PARAMETER_VALUE); VectorPtr paraCpuCopy = Vector::create(para->getSize(), false); paraCpuCopy->copyFrom(*paraVec); std::vector<std::pair<real, size_t>> param; for (size_t i = 0; i < para->getSize(); i++) param.push_back(std::make_pair(fabs(paraCpuCopy->getData()[i]), i)); std::partial_sort( param.begin(), param.begin() + nonZeroNum, param.end(), sortPairAscend); for (size_t i = 0; i < nonZeroNum; i++) maskTempData[param[i].second] = 1.0; // Currently just use a mask vector for hack. if (para->useGpu()) { maskVec_ = Vector::create(para->getSize(), para->useGpu()); maskVec_->copyFrom(*maskTemp); } else { maskVec_ = maskTemp; } }