 #include <vector>
 #include <algorithm>
 #include <unistd.h>
-#include <random>
 
 using element_t = float;
-constexpr size_t num_elements    = 1e5;
-constexpr size_t num_kernels     = 5;
-constexpr size_t num_repetitions = 3;
 
 using clock_value_t = long long;
 

		}
	);

	std::random_device random_device{};
	std::mt19937 random_engine{random_device()};
	std::uniform_real_distribution<float>distribution{0.0, 10.0};
	auto data_generator = [&]() { return (element_t) distribution(random_engine); };

	for(auto& buffer_set : buffers) {
		std::generate_n(buffer_set.host_lhs.get(), num_elements, data_generator);
		std::generate_n(buffer_set.host_rhs.get(), num_elements, data_generator);
	}
	return buffers;
}

int main(int argc, char **argv)
{
	auto device = cuda::device::current::get();
	std::cout << "Using CUDA device " << device.name() << " (having ID " << device.id() << ")\n";

	std::cout << "Generating host buffers... " << std::flush;
	auto buffers = generate_buffers(device);
	std::cout << "done.\n" << std::flush;

	std::vector<cuda::stream_t<> > streams;

		[&]() {
			return buffer_set_t {
				// Sticking to C++11 here...
				cuda::memory::host::make_unique<element_t[]>(num_elements),
				cuda::memory::host::make_unique<element_t[]>(num_elements),
				cuda::memory::host::make_unique<element_t[]>(num_elements),
				cuda::memory::device::make_unique<element_t[]>(device.id(), num_elements),
				cuda::memory::device::make_unique<element_t[]>(device.id(), num_elements),
				cuda::memory::device::make_unique<element_t[]>(device.id(), num_elements)
