1 // This is brl/bbas/bocl/pro/processes/bocl_get_device_process.cxx
2 #include <iostream>
3 #include <fstream>
4 #include <sstream>
5 #include <bprb/bprb_func_process.h>
6 //:
7 // \file
8 // \brief A process for initializing a bocl manager
9 //
10 // \author Vishal Jain
11 // \date Mar 8, 2011
12 // \verbatim
13 //  Modifications
14 //   <none yet>
15 // \endverbatim
16 
17 #ifdef _MSC_VER
18 #  include "vcl_msvc_warnings.h"
19 #endif
20 #include <bocl/bocl_manager.h>
21 
22 namespace bocl_get_device_process_globals
23 {
24   constexpr unsigned n_inputs_ = 1;
25   constexpr unsigned n_outputs_ = 1;
26 }
27 
bocl_get_device_process_cons(bprb_func_process & pro)28 bool bocl_get_device_process_cons(bprb_func_process& pro)
29 {
30   using namespace bocl_get_device_process_globals;
31   std::vector<std::string>  input_types_(n_inputs_);
32   input_types_[0] = "vcl_string";
33 
34   std::vector<std::string>  output_types_(n_outputs_);
35   output_types_[0] = "bocl_device_sptr";
36 
37   return pro.set_input_types(input_types_)
38       && pro.set_output_types(output_types_);
39 }
40 
bocl_get_device_process(bprb_func_process & pro)41 bool bocl_get_device_process(bprb_func_process& pro)
42 {
43   using namespace bocl_get_device_process_globals;
44   unsigned i=0;
45   std::string device_type = pro.get_input<std::string>(i++);
46   bocl_manager_child &mgr = bocl_manager_child::instance();
47 
48   if (device_type=="gpu" || device_type=="gpu0" )
49   {
50     if (mgr.gpus_.size()==0) return false;
51     bocl_device_sptr device = mgr.gpus_[0];
52     pro.set_output_val<bocl_device_sptr>(0,device);
53     std::cout<<"Using the following gpu device: \n" << *(device.ptr());
54     return true;
55   }
56   else if (device_type=="cpu" || device_type=="cpu0")
57   {
58     if (mgr.cpus_.size()==0) return false;
59     bocl_device_sptr device = mgr.cpus_[0];
60     pro.set_output_val<bocl_device_sptr>(0,device);
61     std::cout<<"Using the following cpu device: \n"<<*(device.ptr());
62     return true;
63   }
64 
65   //for multi-gpu setups
66   std::string dev = device_type.substr(0,3);
67   if (dev=="gpu") {
68     std::string str = device_type.substr(3, device_type.size());
69     unsigned int gpuIdx;
70     std::istringstream ( str ) >> gpuIdx;
71     std::cout<<"Setting GPU device #: " << gpuIdx <<std::endl;
72     if (gpuIdx < mgr.gpus_.size()) {
73       bocl_device_sptr device = mgr.gpus_[gpuIdx];
74       pro.set_output_val<bocl_device_sptr>(0,device);
75       std::cout<<*(device.ptr());
76       return true;
77     }
78   }
79 
80   //at this point, device cannot be recognized
81   std::cout<<"Cannot recognize device string.  Available devices:\n";
82 
83   //list gpu options
84   std::cout<<"  GPUs: ";
85   for (unsigned int i=0; i<mgr.gpus_.size(); ++i)
86     std::cout<<"gpu"<<i<<", ";
87   std::cout<<'\n';
88 
89   //list CPU options
90   std::cout<<"  CPUs: ";
91   for (unsigned int i=0; i<mgr.cpus_.size(); ++i)
92     std::cout<<"cpu"<<i <<", ";
93 
94   std::cout<<std::endl;
95   return false;
96 }
97