| 214 | } |
| 215 | |
| 216 | void cmp_flt() { |
| 217 | Tensor<> flt0_cpu(handle_cpu, lflt0), flt1_cpu(handle_cpu, lflt1); |
| 218 | float* p0 = flt0_cpu.ptr(); |
| 219 | float* p1 = flt1_cpu.ptr(); |
| 220 | megdnn_memcpy_D2H(handle, p0, flt0->ptr(), lflt0.span().dist_byte()); |
| 221 | megdnn_memcpy_D2H(handle, p1, flt1->ptr(), lflt1.span().dist_byte()); |
| 222 | |
| 223 | size_t IC = lflt1[0], CHL_MUL = lflt1[1], FSIZE = lflt1[3] * lflt1[4]; |
| 224 | |
| 225 | double tot_err = 0, tot_err_num = 0; |
| 226 | for (size_t i = 0; i < IC; ++i) { |
| 227 | for (size_t j = 0; j < CHL_MUL; ++j) { |
| 228 | auto t0 = p0 + ((i * CHL_MUL + j) * IC + i) * FSIZE, |
| 229 | t1 = p1 + (i * CHL_MUL + j) * FSIZE; |
| 230 | for (size_t k = 0; k < FSIZE; ++k) { |
| 231 | auto err = std::abs(diff(t0[k], t1[k])); |
| 232 | tot_err += err; |
| 233 | tot_err_num += 1; |
| 234 | ASSERT_LT(err, 1e-2) << "failed at " << i << " " << j << " " << k |
| 235 | << " vals=" << t0[k] << "," << t1[k]; |
| 236 | } |
| 237 | } |
| 238 | } |
| 239 | auto avg_err = tot_err / tot_err_num; |
| 240 | ASSERT_LT(avg_err, 1e-4); |
| 241 | } |
| 242 | }; |
| 243 | |
| 244 | } // anonymous namespace |