Skip to content
Snippets Groups Projects
Commit eaae6cf9 authored by Nicolas Pope's avatar Nicolas Pope
Browse files

Implements #68 gpu selection

parent f170f3d0
No related branches found
No related tags found
No related merge requests found
...@@ -78,9 +78,11 @@ class SceneRep : public ftl::Configurable { ...@@ -78,9 +78,11 @@ class SceneRep : public ftl::Configurable {
void debugHash(); void debugHash();
cudaStream_t getIntegrationStream() const { return integ_stream_; } cudaStream_t getIntegrationStream() const { return integ_stream_; }
int getCUDADevice() const { return cuda_device_; }
private: private:
bool _initCUDA();
HashParams _parametersFromConfig(); HashParams _parametersFromConfig();
void _create(const HashParams& params); void _create(const HashParams& params);
void _destroy(); void _destroy();
...@@ -102,6 +104,7 @@ class SceneRep : public ftl::Configurable { ...@@ -102,6 +104,7 @@ class SceneRep : public ftl::Configurable {
std::vector<Cameras> cameras_; std::vector<Cameras> cameras_;
cudaStream_t integ_stream_; cudaStream_t integ_stream_;
bool reg_mode_; bool reg_mode_;
int cuda_device_;
}; };
}; // namespace voxhash }; // namespace voxhash
......
...@@ -53,6 +53,9 @@ void VirtualSource::setScene(ftl::voxhash::SceneRep *scene) { ...@@ -53,6 +53,9 @@ void VirtualSource::setScene(ftl::voxhash::SceneRep *scene) {
bool VirtualSource::grab() { bool VirtualSource::grab() {
if (scene_) { if (scene_) {
// Ensure this host thread is using correct GPU.
cudaSafeCall(cudaSetDevice(scene_->getCUDADevice()));
DepthCameraParams params; DepthCameraParams params;
params.fx = params_.fx; params.fx = params_.fx;
params.fy = params_.fy; params.fy = params_.fy;
......
...@@ -5,10 +5,13 @@ ...@@ -5,10 +5,13 @@
#include <opencv2/core/cuda_stream_accessor.hpp> #include <opencv2/core/cuda_stream_accessor.hpp>
#include <vector>
using namespace ftl::voxhash; using namespace ftl::voxhash;
using ftl::rgbd::Source; using ftl::rgbd::Source;
using ftl::Configurable; using ftl::Configurable;
using cv::Mat; using cv::Mat;
using std::vector;
#define SAFE_DELETE_ARRAY(a) { delete [] (a); (a) = NULL; } #define SAFE_DELETE_ARRAY(a) { delete [] (a); (a) = NULL; }
...@@ -23,6 +26,8 @@ extern "C" void integrateDepthMapCUDA(ftl::voxhash::HashData& hashData, const ft ...@@ -23,6 +26,8 @@ extern "C" void integrateDepthMapCUDA(ftl::voxhash::HashData& hashData, const ft
SceneRep::SceneRep(nlohmann::json &config) : Configurable(config), do_reset_(false), m_frameCount(0) { SceneRep::SceneRep(nlohmann::json &config) : Configurable(config), do_reset_(false), m_frameCount(0) {
_initCUDA();
// Allocates voxel structure on GPU // Allocates voxel structure on GPU
_create(_parametersFromConfig()); _create(_parametersFromConfig());
...@@ -62,6 +67,30 @@ SceneRep::~SceneRep() { ...@@ -62,6 +67,30 @@ SceneRep::~SceneRep() {
cudaStreamDestroy(integ_stream_); cudaStreamDestroy(integ_stream_);
} }
bool SceneRep::_initCUDA() {
// Do an initial CUDA check
int cuda_device_count = 0;
cudaSafeCall(cudaGetDeviceCount(&cuda_device_count));
CHECK_GE(cuda_device_count, 1) << "No CUDA devices found";
LOG(INFO) << "CUDA Devices (" << cuda_device_count << "):";
vector<cudaDeviceProp> properties(cuda_device_count);
for (int i=0; i<cuda_device_count; i++) {
cudaSafeCall(cudaGetDeviceProperties(&properties[i], i));
LOG(INFO) << " - " << properties[i].name;
}
int desired_device = value("cudaDevice", 0);
cuda_device_ = (desired_device < cuda_device_count) ? desired_device : cuda_device_count-1;
cudaSafeCall(cudaSetDevice(cuda_device_));
// TODO(Nick) Check memory is sufficient
// TODO(Nick) Find out what our compute capability should be.
return true;
}
void SceneRep::addSource(ftl::rgbd::Source *src) { void SceneRep::addSource(ftl::rgbd::Source *src) {
auto &cam = cameras_.emplace_back(); auto &cam = cameras_.emplace_back();
cam.source = src; cam.source = src;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment