summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/compute/test/test_program_cache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/compute/test/test_program_cache.cpp')
-rw-r--r--src/boost/libs/compute/test/test_program_cache.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/boost/libs/compute/test/test_program_cache.cpp b/src/boost/libs/compute/test/test_program_cache.cpp
new file mode 100644
index 00000000..446e9a87
--- /dev/null
+++ b/src/boost/libs/compute/test/test_program_cache.cpp
@@ -0,0 +1,99 @@
+//---------------------------------------------------------------------------//
+// Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// See http://boostorg.github.com/compute for more information.
+//---------------------------------------------------------------------------//
+
+#define BOOST_TEST_MODULE TestProgramCache
+#include <boost/test/unit_test.hpp>
+
+#include <boost/compute/system.hpp>
+#include <boost/compute/utility/program_cache.hpp>
+
+#include "context_setup.hpp"
+
+namespace compute = boost::compute;
+
+BOOST_AUTO_TEST_CASE(setup)
+{
+ // get default context
+ compute::context ctx = context;
+
+ // get program cache
+ boost::shared_ptr<compute::program_cache> cache =
+ compute::program_cache::get_global_cache(ctx);
+
+ // try to load a null string
+ BOOST_CHECK(cache->get(std::string()) == boost::none);
+
+ // try to load a non-existant program
+ BOOST_CHECK(cache->get("nonexistant") == boost::none);
+
+ // create and store a program
+ const char p1_source[] =
+ "__kernel void add(__global int *a, int x)\n"
+ "{\n"
+ " a[get_global_id(0)] += x;\n"
+ "}\n";
+ compute::program p1 =
+ compute::program::create_with_source(p1_source, ctx);
+ p1.build();
+ cache->insert("p1", p1);
+
+ // try to load the program
+ BOOST_CHECK(cache->get("p1") == p1);
+
+ // create a copy of the context
+ compute::context ctx_copy = ctx;
+
+ // check that they both have the same cl_context
+ BOOST_CHECK(ctx_copy.get() == ctx.get());
+
+ // check that the cache is the same
+ boost::shared_ptr<compute::program_cache> cache_copy =
+ compute::program_cache::get_global_cache(ctx_copy);
+ BOOST_CHECK(cache_copy == cache);
+
+ // try to load the program again
+ BOOST_CHECK(cache_copy->get("p1") == p1);
+}
+
+BOOST_AUTO_TEST_CASE(evict)
+{
+ // create cache with capacity of four and insert four programs
+ compute::program_cache cache(4);
+ cache.insert("a", compute::program());
+ cache.insert("b", compute::program());
+ cache.insert("c", compute::program());
+ cache.insert("d", compute::program());
+
+ // check that all four programs still reside in the cache
+ BOOST_CHECK(cache.get("a") != boost::none);
+ BOOST_CHECK(cache.get("b") != boost::none);
+ BOOST_CHECK(cache.get("c") != boost::none);
+ BOOST_CHECK(cache.get("d") != boost::none);
+
+ // insert fifth program which should evict the oldest ("a")
+ cache.insert("e", compute::program());
+
+ // check that "a" has been evicted and that "e" is now present
+ BOOST_CHECK(cache.get("a") == boost::none);
+ BOOST_CHECK(cache.get("b") != boost::none);
+ BOOST_CHECK(cache.get("c") != boost::none);
+ BOOST_CHECK(cache.get("d") != boost::none);
+ BOOST_CHECK(cache.get("e") != boost::none);
+
+ // clear cache and ensure no program objects are found
+ cache.clear();
+ BOOST_CHECK(cache.get("a") == boost::none);
+ BOOST_CHECK(cache.get("b") == boost::none);
+ BOOST_CHECK(cache.get("c") == boost::none);
+ BOOST_CHECK(cache.get("d") == boost::none);
+ BOOST_CHECK(cache.get("e") == boost::none);
+}
+
+BOOST_AUTO_TEST_SUITE_END()