diff --git a/applications/reconstruct/include/ftl/voxel_scene.hpp b/applications/reconstruct/include/ftl/voxel_scene.hpp
index df6a70c29fca86101c945c431f052a43a8bd1375..487cf4b953dc2ea41eda8a645fb3ff56d296eff6 100644
--- a/applications/reconstruct/include/ftl/voxel_scene.hpp
+++ b/applications/reconstruct/include/ftl/voxel_scene.hpp
@@ -78,6 +78,7 @@ class SceneRep : public ftl::Configurable {
 	void debugHash();
 
 	cudaStream_t getIntegrationStream() const { return integ_stream_; }
+	int getCUDADevice() const { return cuda_device_; }
 
 	private:
 
diff --git a/applications/reconstruct/src/virtual_source.cpp b/applications/reconstruct/src/virtual_source.cpp
index 73c80323b9a702964a18bbc7ce68e9c407873b06..245339376c7ded2093de988aa4366c2ef539a325 100644
--- a/applications/reconstruct/src/virtual_source.cpp
+++ b/applications/reconstruct/src/virtual_source.cpp
@@ -53,6 +53,9 @@ void VirtualSource::setScene(ftl::voxhash::SceneRep *scene) {
 
 bool VirtualSource::grab() {
 	if (scene_) {
+		// Ensure this host thread is using correct GPU.
+
+		cudaSafeCall(cudaSetDevice(scene_->getCUDADevice()));
 		DepthCameraParams params;
 		params.fx = params_.fx;
 		params.fy = params_.fy;