Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion data/data_1024/output.json

Large diffs are not rendered by default.

83 changes: 35 additions & 48 deletions test/src/output_correctness.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,6 @@ struct gprat_results
std::vector<std::vector<double>> sum;
std::vector<std::vector<double>> full;
std::vector<double> pred;
std::vector<std::vector<double>> sum_no_optimize;
std::vector<std::vector<double>> full_no_optimize;
std::vector<double> pred_no_optimize;
};

// The following two functions are for JSON (de-)serialization
Expand All @@ -34,9 +31,6 @@ void tag_invoke(boost::json::value_from_tag, boost::json::value &jv, const gprat
{ "sum", boost::json::value_from(results.sum) },
{ "full", boost::json::value_from(results.full) },
{ "pred", boost::json::value_from(results.pred) },
{ "sum_no_optimize", boost::json::value_from(results.sum_no_optimize) },
{ "full_no_optimize", boost::json::value_from(results.full_no_optimize) },
{ "pred_no_optimize", boost::json::value_from(results.pred_no_optimize) },
};
}

Expand All @@ -56,9 +50,6 @@ gprat_results tag_invoke(boost::json::value_to_tag<gprat_results>, const boost::
extract(obj, results.sum, "sum");
extract(obj, results.full, "full");
extract(obj, results.pred, "pred");
extract(obj, results.sum_no_optimize, "sum_no_optimize");
extract(obj, results.full_no_optimize, "full_no_optimize");
extract(obj, results.pred_no_optimize, "pred_no_optimize");
return results;
}

Expand All @@ -69,7 +60,7 @@ gprat_results run_on_data_cpu(const std::string &train_path, const std::string &
const std::size_t OPT_ITER = 3;
const std::size_t n_test = 128;
const std::size_t n_train = 128;
const std::size_t n_tiles = 16;
const std::size_t n_tiles = 4;
const std::size_t n_reg = 8;

// Compute tile sizes and number of predict tiles
Expand All @@ -86,6 +77,7 @@ gprat_results run_on_data_cpu(const std::string &train_path, const std::string &

// GP
const std::vector<bool> trainable = { true, true, true };

gprat::GP gp_cpu(
training_input.data, training_output.data, n_tiles, tile_size, n_reg, { 1.0, 1.0, 0.1 }, trainable);

Expand All @@ -94,15 +86,24 @@ gprat_results run_on_data_cpu(const std::string &train_path, const std::string &

gprat_results results_cpu;

// Cholesky decomposition
results_cpu.choleksy = gp_cpu.cholesky();

results_cpu.losses = gp_cpu.optimize(hpar);

// Prediction
results_cpu.sum = gp_cpu.predict_with_uncertainty(test_input.data, test_tiles.first, test_tiles.second);

results_cpu.full = gp_cpu.predict_with_full_cov(test_input.data, test_tiles.first, test_tiles.second);

results_cpu.pred = gp_cpu.predict(test_input.data, test_tiles.first, test_tiles.second);
// Optimization
results_cpu.losses = gp_cpu.optimize(hpar);

// // Sequential version for creating reference
// const auto test_total = utils::compute_test_tiles(n_test, 1, n_test);
// gprat::GP gp_cpu_seq(
// training_input.data, training_output.data, 1, n_train, n_reg, { 1.0, 1.0, 0.1 }, trainable);
// results_cpu.choleksy = gp_cpu.cholesky();
// results_cpu.sum = gp_cpu_seq.predict_with_uncertainty(test_input.data, test_total.first, test_total.second);
// results_cpu.full = gp_cpu_seq.predict_with_full_cov(test_input.data, test_total.first, test_total.second);
// results_cpu.pred = gp_cpu_seq.predict(test_input.data, test_total.first, test_total.second);
// results_cpu.losses = gp_cpu_seq.optimize(hpar);

// Stop the HPX runtime
utils::stop_hpx_runtime();
Expand All @@ -115,7 +116,7 @@ gprat_results run_on_data_gpu(const std::string &train_path, const std::string &
{
const std::size_t n_test = 128;
const std::size_t n_train = 128;
const std::size_t n_tiles = 16;
const std::size_t n_tiles = 4;
const std::size_t n_reg = 8;
const int gpu_id = 0;
const int n_streams = 1;
Expand All @@ -142,11 +143,14 @@ gprat_results run_on_data_gpu(const std::string &train_path, const std::string &
utils::start_hpx_runtime(0, nullptr);

gprat_results results_gpu;

// Cholesky
results_gpu.choleksy = gp_gpu.cholesky();
// NOTE: optimize and optimize_step are currently not implemented for GPU
results_gpu.sum_no_optimize = gp_gpu.predict_with_uncertainty(test_input.data, test_tiles.first, test_tiles.second);
results_gpu.full_no_optimize = gp_gpu.predict_with_full_cov(test_input.data, test_tiles.first, test_tiles.second);
results_gpu.pred_no_optimize = gp_gpu.predict(test_input.data, test_tiles.first, test_tiles.second);

// Prediction
results_gpu.sum = gp_gpu.predict_with_uncertainty(test_input.data, test_tiles.first, test_tiles.second);
results_gpu.full = gp_gpu.predict_with_full_cov(test_input.data, test_tiles.first, test_tiles.second);
results_gpu.pred = gp_gpu.predict(test_input.data, test_tiles.first, test_tiles.second);

utils::stop_hpx_runtime();

Expand Down Expand Up @@ -198,16 +202,7 @@ TEST_CASE("GP CPU results match known-good values", "[integration][cpu]")
return;
}

// First we check for equal size
REQUIRE(results.choleksy.size() == expected_results.choleksy.size());
REQUIRE(results.losses.size() == expected_results.losses.size());
REQUIRE(results.sum.size() == expected_results.sum.size());
REQUIRE(results.sum[0].size() == expected_results.sum[0].size());
REQUIRE(results.full.size() == expected_results.full.size());
REQUIRE(results.full[0].size() == expected_results.full[0].size());
REQUIRE(results.pred.size() == expected_results.pred.size());

// Now we can compare content
// Compare content
// The default-constructed WithinRel() matcher has a tolerance of epsilon * 100
// see:
// https://github.com/catchorg/Catch2/blob/914aeecfe23b1e16af6ea675a4fb5dbd5a5b8d0a/docs/comparing-floating-point-numbers.md#withinrel
Expand Down Expand Up @@ -253,7 +248,6 @@ TEST_CASE("GP CPU results match known-good values", "[integration][cpu]")
}

// Test for GPU
// NOTE: using higher tolerance than for CPU
TEST_CASE("GP GPU results match known-good values (no loss)", "[integration][gpu]")
{
if (!utils::compiled_with_cuda())
Expand All @@ -278,13 +272,6 @@ TEST_CASE("GP GPU results match known-good values (no loss)", "[integration][gpu
return;
}

REQUIRE(results.choleksy.size() == expected_results.choleksy.size());
REQUIRE(results.sum_no_optimize.size() == expected_results.sum_no_optimize.size());
REQUIRE(results.sum_no_optimize[0].size() == expected_results.sum_no_optimize[0].size());
REQUIRE(results.full_no_optimize.size() == expected_results.full_no_optimize.size());
REQUIRE(results.full_no_optimize[0].size() == expected_results.full_no_optimize[0].size());
REQUIRE(results.pred_no_optimize.size() == expected_results.pred_no_optimize.size());

using Catch::Matchers::WithinRel;
double eps = std::numeric_limits<double>::epsilon() * 1'000'000;
for (std::size_t i = 0, n = results.choleksy.size(); i != n; ++i)
Expand All @@ -296,27 +283,27 @@ TEST_CASE("GP GPU results match known-good values (no loss)", "[integration][gpu
}
}

for (std::size_t i = 0, n = results.sum_no_optimize.size(); i != n; ++i)
for (std::size_t i = 0, n = results.sum.size(); i != n; ++i)
{
for (std::size_t j = 0, m = results.sum_no_optimize[i].size(); j != m; ++j)
for (std::size_t j = 0, m = results.sum[i].size(); j != m; ++j)
{
INFO("GPU sum_no_optimize " << i << " " << j);
REQUIRE_THAT(results.sum_no_optimize[i][j], WithinRel(expected_results.sum_no_optimize[i][j], eps));
INFO("GPU sum " << i << " " << j);
REQUIRE_THAT(results.sum[i][j], WithinRel(expected_results.sum[i][j], eps));
}
}

for (std::size_t i = 0, n = results.full_no_optimize.size(); i != n; ++i)
for (std::size_t i = 0, n = results.full.size(); i != n; ++i)
{
for (std::size_t j = 0, m = results.full_no_optimize[i].size(); j != m; ++j)
for (std::size_t j = 0, m = results.full[i].size(); j != m; ++j)
{
INFO("GPU full " << i << " " << j);
REQUIRE_THAT(results.full_no_optimize[i][j], WithinRel(expected_results.full_no_optimize[i][j], eps));
REQUIRE_THAT(results.full[i][j], WithinRel(expected_results.full[i][j], eps));
}
}

for (std::size_t i = 0, n = results.pred_no_optimize.size(); i != n; ++i)
for (std::size_t i = 0, n = results.pred.size(); i != n; ++i)
{
INFO("GPU pred_no_optimize " << i);
REQUIRE_THAT(results.pred_no_optimize[i], WithinRel(expected_results.pred_no_optimize[i], eps));
INFO("GPU pred " << i);
REQUIRE_THAT(results.pred[i], WithinRel(expected_results.pred[i], eps));
}
}