diff options
author | Kenneth Heafield <github@kheafield.com> | 2020-04-23 01:05:30 +0300 |
---|---|---|
committer | Kenneth Heafield <github@kheafield.com> | 2020-04-23 01:05:30 +0300 |
commit | 47d54971d625711d6292da251ebd904e98ebd43f (patch) | |
tree | ffb6c2c1682510dde63267b200530a019c9f691a | |
parent | a521b74c192d5b72556919a19bf976cc123639aa (diff) |
Tests for unrolled inner dimension are tricky
-rw-r--r-- | test/tile_test.inl | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/test/tile_test.inl b/test/tile_test.inl index c9b2096..cb7b155 100644 --- a/test/tile_test.inl +++ b/test/tile_test.inl @@ -219,8 +219,34 @@ TEST_CASE("MultiplyNoOverhang Signed8 " INTGEMM_TEST_NAME, "[tile]") { TestMultiplyNoOverhangShapes<Signed8>(); } +// Due to unordered_unfurl in dot.inl, the inner dimension can change order. +// That impacts saturation. Then the test doesn't mach reference on arches +// that use 16-bit saturating accumlation. So we only test inner unrolling on +// VNNI. +#ifdef INTGEMM_THIS_IS_AVX512VNNI +TEST_CASE("MultiplyNoOverhang inner unroll " INTGEMM_TEST_NAME, "[tile][multiply]") { + if (kCPU < CPUType::INTGEMM_ARCH) return; + typedef UnrollKernel<1, 2, 1, Signed8> Kernel; + Tile shape = {1, sizeof(Register) * 2, 1}; + TestMultiplyNoOverhang<Kernel>(shape); + TestMultiplyNoOverhang<Kernel>({1, sizeof(Register) * 4, 1}); + TestMultiplyNoOverhangShapes<Kernel>(); +} +#endif + +// If the inner dimension is just twice, then there isn't any non-determinism in saturation order. +TEST_CASE("MultiplyNoOverhang simple inner unroll " INTGEMM_TEST_NAME, "[tile][multiply]") { + if (kCPU < CPUType::INTGEMM_ARCH) return; + typedef UnrollKernel<1, 2, 1, Signed8> Kernel; + static_assert(1 == Kernel::kTile.A_rows, "A_rows matches on unrolled kernel"); + static_assert(sizeof(Register) * 2 == Kernel::kTile.inner, "inner matches on kernel unrolled 2x"); + static_assert(1 == Kernel::kTile.B_cols, "B_cols matches on kernel unrolled"); + TestMultiplyNoOverhang<Kernel>({1, sizeof(Register) * 2, 1}); + TestMultiplyNoOverhang<Kernel>({5, sizeof(Register) * 2, 7}); +} + // Annoyingly, catch's cross-product stuff requires the first argument be a type, which is pretty useless for a cross-product of integers. -TEMPLATE_TEST_CASE("MultiplyNoOverhang Unrolled Signed8 " INTGEMM_TEST_NAME, "[tile]", +TEMPLATE_TEST_CASE("MultiplyNoOverhang Unrolled Signed8 " INTGEMM_TEST_NAME, "[tile][multiply]", (UnrollKernel<1, 1, 1, Signed8>), (UnrollKernel<1, 1, 2, Signed8>), (UnrollKernel<1, 1, 3, Signed8>), @@ -242,7 +268,6 @@ TEMPLATE_TEST_CASE("MultiplyNoOverhang Unrolled Signed8 " INTGEMM_TEST_NAME, "[t (UnrollKernel<1, 1, 19, Signed8>), (UnrollKernel<1, 1, 31, Signed8>), (UnrollKernel<1, 1, 32, Signed8>), - (UnrollKernel<1, 2, 1, Signed8>), (UnrollKernel<2, 1, 1, Signed8>), (UnrollKernel<3, 1, 1, Signed8>), (UnrollKernel<4, 1, 1, Signed8>), |