| 172 | } |
| 173 | |
| 174 | void cmp_flt() { |
| 175 | Tensor<> flt0_cpu(handle_cpu, lflt0), flt1_cpu(handle_cpu, lflt1); |
| 176 | float* p0 = flt0_cpu.ptr(); |
| 177 | float* p1 = flt1_cpu.ptr(); |
| 178 | megdnn_memcpy_D2H(handle, p0, flt0->ptr(), lflt0.span().dist_byte()); |
| 179 | megdnn_memcpy_D2H(handle, p1, flt1->ptr(), lflt1.span().dist_byte()); |
| 180 | |
| 181 | size_t IC = lflt1[0], CHL_MUL = lflt1[1], |
| 182 | FSIZE = lflt1[3] * lflt1[4] * lflt1[5]; |
| 183 | |
| 184 | double tot_err = 0, tot_err_num = 0; |
| 185 | for (size_t i = 0; i < IC; ++i) { |
| 186 | for (size_t j = 0; j < CHL_MUL; ++j) { |
| 187 | auto t0 = p0 + ((i * CHL_MUL + j) * IC + i) * FSIZE, |
| 188 | t1 = p1 + (i * CHL_MUL + j) * FSIZE; |
| 189 | for (size_t k = 0; k < FSIZE; ++k) { |
| 190 | auto err = std::abs(diff(t0[k], t1[k])); |
| 191 | tot_err += err; |
| 192 | tot_err_num += 1; |
| 193 | ASSERT_LT(err, 1e-2) << "failed at " << i << " " << j << " " << k |
| 194 | << " vals=" << t0[k] << "," << t1[k]; |
| 195 | } |
| 196 | } |
| 197 | } |
| 198 | auto avg_err = tot_err / tot_err_num; |
| 199 | ASSERT_LT(avg_err, 1e-4); |
| 200 | } |
| 201 | }; |
| 202 | |
| 203 | } // anonymous namespace |