void Tile::explode() { if (m_type == Tile::Stone) { setType(Tile::Debris); emit exploded(); } else if (isWalkable()) { emit exploded(); } }
TEST(HalfPrec, cuda) { float hostFloats[] = { -1, -100, 2.3, 0.0, 1.0, 3867.2, }; const auto N = sizeof(hostFloats) / sizeof(float); CUDA<float> devFloats(hostFloats, N); CUDA<half_t> devHalfs(N); halfprec_ToHalf(nullptr, devFloats.data(), devHalfs.data(), devFloats.size()); cudaCheck(cudaDeviceSynchronize()); { uint16_t cpuHalfs[N] = { 666 }; facebook::math::Float16::encode(cpuHalfs, hostFloats, N); half_t convertedHalfs[N]; devHalfs.toHost(convertedHalfs); for (int i = 0; i < N; i++) { // The CPU and GPU disagree by a digit sometimes because the GPU // is using a different rounding mode. EXPECT_NEAR(cpuHalfs[i], convertedHalfs[i], 1); } } CUDA<float> exploded(N); halfprec_ToFloat(nullptr, devHalfs.data(), exploded.data(), N); float postExpl[N]; exploded.toHost(postExpl); for (int i = 0; i < N; i++) { auto thousandth = fabs(hostFloats[i] / 1000.0); EXPECT_NEAR(postExpl[i], hostFloats[i], thousandth); } }