diff --git a/arbor/backends/gpu/rand.cpp b/arbor/backends/gpu/rand.cpp
index 513394f74a0b1e8d5d35e443e61b7cf2f3cd9626..9fa173abbd410208c315e22736e88503f26238a5 100644
--- a/arbor/backends/gpu/rand.cpp
+++ b/arbor/backends/gpu/rand.cpp
@@ -15,13 +15,17 @@ namespace gpu {
 
 void random_numbers::instantiate(mechanism& m, std::size_t value_width_padded,
     const mechanism_layout& pos_data, arb_seed_type seed) {
-
     using util::make_span;
 
+    // bail out if there are no random variables
+    if (m.mech_.n_random_variables == 0) return;
+
     // Allocate view pointers for random nubers
     std::size_t num_random_numbers_per_cv = m.mech_.n_random_variables;
     std::size_t random_number_storage = num_random_numbers_per_cv*cbprng::cache_size();
-    for (auto& v : random_numbers_) v.resize(num_random_numbers_per_cv);
+    for (auto& v : random_numbers_) {
+        v.resize(num_random_numbers_per_cv);
+    }
 
     // Allocate bulk storage
     std::size_t count = random_number_storage*value_width_padded;
@@ -44,6 +48,9 @@ void random_numbers::instantiate(mechanism& m, std::size_t value_width_padded,
 }
 
 void random_numbers::update(mechanism& m) {
+    // bail out if there are no random variables
+    if (!impl_) return;
+
     // Assign new random numbers by selecting the next cache
     const auto counter = random_number_update_counter_++;
     const auto cache_idx = cbprng::cache_index(counter);
diff --git a/arbor/util/pimpl.hpp b/arbor/util/pimpl.hpp
index 740ce7d411bdb8b7466364cd1154d4af69e14940..ef59b50a3a831efd8e9e2a43711f3004380c754f 100644
--- a/arbor/util/pimpl.hpp
+++ b/arbor/util/pimpl.hpp
@@ -17,6 +17,8 @@ class pimpl
     
     pimpl() noexcept;
 
+    pimpl(T* ptr) noexcept;
+
     template<typename... Args>
     pimpl(Args&&... args);
 
@@ -30,6 +32,8 @@ class pimpl
     const T* operator->() const noexcept;
     T&       operator*() noexcept;
     const T& operator*() const noexcept;
+
+    operator bool() const noexcept { return (bool)m; }
 };
 
 
diff --git a/arbor/util/pimpl_src.hpp b/arbor/util/pimpl_src.hpp
index 98fd0de4e7e2cc5ce800720590432c499f85e0ed..646820a4721932a64fd1750ecbe3605d3a998af2 100644
--- a/arbor/util/pimpl_src.hpp
+++ b/arbor/util/pimpl_src.hpp
@@ -16,6 +16,9 @@ pimpl<T>::~pimpl() = default;
 template<typename T>
 pimpl<T>::pimpl() noexcept = default;
 
+template<typename T>
+pimpl<T>::pimpl(T* ptr) noexcept : m{ptr} {}
+
 template<typename T>
 template<typename... Args>
 pimpl<T>::pimpl(Args&&... args)
@@ -41,7 +44,7 @@ const T& pimpl<T>::operator*() const noexcept { return *m.get(); }
 
 template<typename T, typename... Args>
 pimpl<T> make_pimpl(Args&&... args) {
-    return pimpl<T>{std::forward<Args>(args)...};
+    return {new T{std::forward<Args>(args)...}};
 }
 
 } // namespace util