| 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; |
nothing calls this directly
no test coverage detected