1 #ifndef VIENNACL_OCL_DEVICE_HPP_
2 #define VIENNACL_OCL_DEVICE_HPP_
25 #include <OpenCL/cl.h>
52 explicit device(cl_device_id dev) : device_(dev)
54 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_DEVICE)
55 std::cout <<
"ViennaCL: Creating device object (CTOR with cl_device_id)" << std::endl;
62 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_DEVICE)
63 std::cout <<
"ViennaCL: Creating device object (Copy CTOR)" << std::endl;
65 device_ = other.device_;
70 void init(cl_device_id dev)
75 err = clGetDeviceInfo(dev, CL_DEVICE_MAX_WORK_GROUP_SIZE,
sizeof(
size_t), &max_work_group_size_, NULL);
77 err = clGetDeviceInfo(dev, CL_DEVICE_MAX_COMPUTE_UNITS,
sizeof(cl_uint), &compute_units_, NULL);
79 err = clGetDeviceInfo(dev, CL_DEVICE_TYPE,
sizeof(cl_device_type), &type_, NULL);
81 err = clGetDeviceInfo(dev, CL_DEVICE_GLOBAL_MEM_SIZE,
sizeof(cl_ulong), &global_memory_, NULL);
83 err = clGetDeviceInfo(dev, CL_DEVICE_MAX_MEM_ALLOC_SIZE,
sizeof(cl_ulong), &max_memory_alloc_, NULL);
85 err = clGetDeviceInfo(dev, CL_DEVICE_LOCAL_MEM_SIZE,
sizeof(cl_ulong), &local_memory_, NULL);
96 clGetDeviceInfo(device_, CL_DEVICE_EXTENSIONS,
sizeof(
char)*1024, buffer, NULL);
97 std::string extensions(buffer);
98 if (extensions.find(
"cl_khr_fp64") != std::string::npos
99 || extensions.find(
"cl_amd_fp64") != std::string::npos)
104 #if defined(VIENNACL_DEBUG_ALL) || defined(VIENNACL_DEBUG_DEVICE)
105 std::cout <<
"ViennaCL: Device extensions: " << std::endl;
106 std::cout << extensions << std::endl;
108 std::cout <<
"ViennaCL: Device " <<
name() <<
" supports double precision." << std::endl;
110 std::cout <<
"ViennaCL: No double precision for device " <<
name() <<
"." << std::endl;
119 clGetDeviceInfo(device_, CL_DEVICE_EXTENSIONS,
sizeof(
char)*1024, buffer, NULL);
120 std::string extensions(buffer);
122 if (extensions.find(
"cl_amd_fp64") != std::string::npos)
123 return "cl_amd_fp64";
125 if (extensions.find(
"cl_khr_fp64") != std::string::npos)
126 return "cl_khr_fp64";
132 cl_device_id
id()
const
134 assert(device_ != 0);
141 std::ostringstream oss;
144 err = clGetDeviceInfo(device_, CL_DEVICE_NAME,
sizeof(
char)*1024, &buffer, NULL);
153 std::ostringstream oss;
154 char buffer[1024]; buffer[0] = 0;
156 err = clGetDeviceInfo(device_, CL_DRIVER_VERSION,
sizeof(
char)*1024, buffer, NULL);
165 return compute_units_;
171 return max_work_group_size_;
177 return global_memory_;
183 return local_memory_;
189 return max_memory_alloc_;
195 std::ostringstream oss;
196 char buffer[1024]; buffer[0] = 0;
199 cl_ulong local_mem_size;
200 cl_ulong global_mem_size;
202 err = clGetDeviceInfo(device_, CL_DEVICE_VENDOR_ID,
sizeof(cl_uint), &vendor_id, NULL);
204 oss <<
"CL Device Vendor ID: " << vendor_id << std::endl;
206 err = clGetDeviceInfo(device_, CL_DEVICE_NAME,
sizeof(
char)*1024, buffer, NULL);
208 oss <<
"CL Device Name: " << buffer << std::endl;
210 err = clGetDeviceInfo(device_, CL_DRIVER_VERSION,
sizeof(
char)*1024, buffer, NULL);
212 std::string test = buffer;
213 oss <<
"CL Driver Version: " << test << std::endl;
215 oss <<
"--------------------------------" << std::endl;
217 oss <<
"CL Device Max Compute Units: " << compute_units_ << std::endl;
227 oss <<
"CL Device Max Work Group Size: " << max_work_group_size_ << std::endl;
229 err = clGetDeviceInfo(device_, CL_DEVICE_GLOBAL_MEM_SIZE,
sizeof(cl_ulong), &global_mem_size, NULL);
231 oss <<
"CL Device Global Mem Size: " << global_mem_size << std::endl;
233 err = clGetDeviceInfo(device_, CL_DEVICE_LOCAL_MEM_SIZE,
sizeof(cl_ulong), &local_mem_size, NULL);
235 oss <<
"CL Device Local Mem Size: " << local_mem_size << std::endl;
238 std::string ret(oss.str());
244 cl_device_type
type()
const {
return type_; }
248 return device_ == other.device_;
253 return device_ == other;
258 cl_device_id device_;
259 size_t max_work_group_size_;
260 cl_uint compute_units_;
261 cl_device_type type_;
262 cl_ulong max_memory_alloc_;
263 cl_ulong global_memory_;
264 cl_ulong local_memory_;