JASPL  0.2
Just Another Signal Processing Library
openclbase.cpp
1 // Header for this file
2 #include "openclbase.h"
3 // C System-Headers
4 //
5 // C++ System headers
6 #include <string>
7 #include <iostream>
8 // Boost Headers
9 #include <boost/lexical_cast.hpp> //lexical cast (unsurprisingly)
10 // Miscellaneous Headers
11 //
12 //Headers for this project
13 #include "jTypeTraits/jtypetraits.h"
14 
15 namespace jaspl {
16 
17 namespace ocl {
18 
19 std::vector<cl::Platform> OpenCLBase::all_platforms;
20 cl::Platform OpenCLBase::default_platform;
21 std::vector<cl::Device> OpenCLBase::all_devices;
22 cl::Device OpenCLBase::current_device;
23 cl::Context OpenCLBase::context;
24 cl::CommandQueue OpenCLBase::command_queue;
25 bool OpenCLBase::initalized = false;
26 
27 void OpenCLBase::SetUp( uint platform_number, uint device_number ) {
28 
29  if( DEBUG_ON ) {
30  //Force kernels to be compiled each time
31  setenv("CUDA_CACHE_DISABLE", "1", 1);
32  std::cout << "OpenCL Kernel caching disabled." << std::endl;
33  }
34 
35  cl::Platform::get( &OpenCLBase::all_platforms ) ;
36 
37  if( OpenCLBase::all_platforms.size() == 0 ) {
38  std::string err_str = __func__;
39  err_str += "\nNo OpenCL platforms found, check OpenCL installation";
40  throw std::runtime_error( err_str );
41  }
42 
43  OpenCLBase::default_platform = OpenCLBase::all_platforms[ platform_number ];
44  OpenCLBase::default_platform.getDevices(CL_DEVICE_TYPE_ALL, &OpenCLBase::all_devices);
45 
46  if( device_number >= OpenCLBase::all_devices.size() ) {
47  std::string err_str = __func__;
48  err_str += "\nRequested device number of ";
49  err_str += boost::lexical_cast<std::string>( device_number );
50  err_str += " does not correspond to any device.\n";
51  err_str +="Largest device number is ";
52  err_str += boost::lexical_cast<std::string>( OpenCLBase::all_devices.size() );
53  throw std::runtime_error( err_str );
54  }
55 
56  OpenCLBase::current_device = OpenCLBase::all_devices[ device_number ];
57 
58  cl_context_properties props[] = { CL_CONTEXT_PLATFORM, (cl_context_properties)(default_platform)(), 0};
59 
60 // OpenCLBase::context = cl::Context( clCreateContext( props, 1, &current_device(), NULL, NULL, &err_0 ); )
61 // OpenCLBase::context = cl::Context ( {OpenCLBase::current_device} );
62  OpenCLBase::context = cl::Context ( OpenCLBase::current_device, props );
63 
64  cl_int err = 0;
65  OpenCLBase::command_queue = cl::CommandQueue (OpenCLBase::context,OpenCLBase::current_device, err);
66  OCL_DEBUG( err );
67 
68  if( DEBUG_ON ) {
69 
70  std::cout << "OpenCL Platform & Device info:" << std::endl;
71  std::cout << "Platform Info: " <<default_platform.getInfo<CL_PLATFORM_NAME>() << std::endl;
72  std::cout << "Device Info: " << current_device.getInfo<CL_DEVICE_NAME>() << std::endl;
73 
74  }
75 
76 }
77 
78 OpenCLBase::OpenCLBase(uint platform_number, uint device_number ) {
79 
80  //Static variables are initalized once and only once
81  //these variables need to be consistent across all derived classes
82  if( initalized != true ) {
83  SetUp( platform_number, device_number );
84  }
85 
86  initalized |= true;
87 }
88 
89 OpenCLBase::~OpenCLBase() {
90  if( DEBUG_ON )
91  std::cout << __func__ << std::endl;
92 }
93 
94 }
95 
96 }
OpenCLBase(uint platform_number=0, uint device_number=0)
Initialize OpenCL Objects Note that the Platform and Context are selected automatically: Platform is ...
Definition: openclbase.cpp:78