MCPcopy Create free account
hub / github.com/alibaba/MNN / testUnit

Method testUnit

test/op/ConvolutionTest.cpp:526–677  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

524 }
525
526 bool testUnit(MNNForwardType type, const std::string& device_name, const std::string& test_op_name, int batch,
527 int ic, int oc, int ih, int iw, PadMode mode, int pad_h, int pad_w, int kh, int kw, int stride,
528 int dilation, int group, int precision, MNN::SparseAlgo sparseAlgo = MNN::SparseAlgo_RANDOM, int sparseBlockOC = 1, bool debug = false, int nbit = 8, bool async = false) {
529 using namespace MNN::Express;
530 std::map<PadMode, Express::PaddingMode> padMap = {
531 {PadMode_CAFFE, CAFFE}, {PadMode_VALID, VALID}, {PadMode_SAME, SAME}};
532 std::vector<float> weightData, biasData;
533
534 generateWeight(weightData, ic, oc, kh, kw, dilation, group, sparseBlockOC);
535
536 for (int i = 0; i < oc; i++) {
537 auto data = (((i / kw) % 1317) * ((i / kh) % 1317) + i / ic + i / oc + (oc - i) * ic + i * (oc - i)) % 1317;
538 auto floatData = (float)(data % 255) / 255.0f;
539 biasData.push_back(floatData);
540 }
541
542 std::vector<float> inputData, outputData, outputDataSeparateBias;
543 float rate = 1.0f;
544 if (ih * iw * ic * batch > 10000) {
545 // Avoid exceed fp16 limit
546 rate = 0.01f;
547 }
548 for (int i = 0; i < ih * iw * ic * batch; ++i) {
549 auto data = ((i / kw) % 1317) * ((i / kh) % 1317) + ((i / ic)% 1317) * ((i / oc) % 1317) + ((oc - i) % 1317) * ic + (i % 1317) * ((oc - i) % 1317);
550 data = data % 1317;
551 data = (data * data) % 1317;
552 auto floatData = (float)(data % 255) / 255.0f * rate;
553 inputData.push_back(floatData);
554 }
555 float fac = 1.23;
556 int res = 10;
557 float tail = 0.2;
558 float threshold = (float)(1 << (nbit - 1)) - 1.0f;
559 float clampMin = -threshold;
560 if (async) {
561 clampMin = -threshold - 1;
562 }
563 int kernel_size = ic * kw * kh;
564 std::vector<int8_t> quantWeight(oc*ic*kw*kh);
565 std::vector<float> wScale;
566 if (async) {
567
568 wScale.resize(2 * oc);
569 for (int k = 0; k < oc; ++k) {
570 int beginIndex = k * kernel_size;
571 auto minMax = findMinMax(weightData.data() + beginIndex, kernel_size);
572 auto minValue = minMax.first;
573 wScale[2*k] = minMax.first;
574 auto absMax = minMax.second - minMax.first;
575 wScale[2*k+1] = 0;
576
577 float quantscale = 1.0f;
578 if (absMax >= 0.000001f) {
579 wScale[2 * k + 1] = absMax / (threshold - clampMin);
580 quantscale = 1.0f / wScale[2*k+1];
581
582 }
583 float* ptr = weightData.data() + beginIndex;

Callers

nothing calls this directly

Calls 15

fmaxFunction · 0.85
fminFunction · 0.85
reference_conv2dFunction · 0.85
_InputFunction · 0.85
_HybridConvFunction · 0.85
_ConvertFunction · 0.85
findMinMaxFunction · 0.50
roundFunction · 0.50
findAbsMaxFunction · 0.50
getFunction · 0.50
push_backMethod · 0.45
resizeMethod · 0.45

Tested by

no test coverage detected