1 #include <iostream>
2 #include <iomanip>
3 #include <sstream>
4 #include <iterator>
5 #include <set>
6 #include <algorithm>
7 #include <vexcl/devlist.hpp>
8 
9 using namespace std;
10 
11 template <class Extensions>
show_extensions(const Extensions & extensions)12 void show_extensions(const Extensions &extensions) {
13     cout << "    " << left << setw(32) << "CL_DEVICE_EXTENSIONS" << " = ";
14     size_t w = 40;
15     for(auto s = extensions.begin(); s != extensions.end(); ++s) {
16         w += s->length() + 1;
17         if (w > 80) {
18             cout << endl << setw(w = 8) << "";
19             w += s->length() + 1;
20         }
21         cout << *s << " ";
22     }
23 }
24 
main()25 int main() {
26 
27     try {
28         auto dev = vex::backend::device_list(vex::Filter::Any);
29 
30 #if defined(VEXCL_BACKEND_OPENCL)
31         cout << "OpenCL devices:" << endl << endl;
32         for (auto d = dev.begin(); d != dev.end(); d++) {
33             cout << "  " << d->getInfo<CL_DEVICE_NAME>() << endl
34                  << "    " << left << setw(32) << "CL_PLATFORM_NAME" << " = "
35                  << cl::Platform(d->getInfo<CL_DEVICE_PLATFORM>()).getInfo<CL_PLATFORM_NAME>()
36                  << endl;
37 
38 #define SHOW_DEVPROP(name) \
39             cout << "    " << left << setw(32) << #name << " = " \
40                       << d->getInfo< name >() << endl
41 
42             SHOW_DEVPROP(CL_DEVICE_TYPE);
43             SHOW_DEVPROP(CL_DEVICE_VENDOR);
44             SHOW_DEVPROP(CL_DEVICE_VERSION);
45             SHOW_DEVPROP(CL_DEVICE_MAX_COMPUTE_UNITS);
46             SHOW_DEVPROP(CL_DEVICE_HOST_UNIFIED_MEMORY);
47             SHOW_DEVPROP(CL_DEVICE_GLOBAL_MEM_SIZE);
48             SHOW_DEVPROP(CL_DEVICE_LOCAL_MEM_SIZE);
49             SHOW_DEVPROP(CL_DEVICE_MAX_MEM_ALLOC_SIZE);
50             SHOW_DEVPROP(CL_DEVICE_ADDRESS_BITS);
51             SHOW_DEVPROP(CL_DEVICE_MAX_CLOCK_FREQUENCY);
52 
53 #undef SHOW_DEVPROP
54 
55             istringstream extensions(d->getInfo<CL_DEVICE_EXTENSIONS>());
56             show_extensions( set<string>(
57                         istream_iterator<string>(extensions),
58                         istream_iterator<string>()
59                         ) );
60 
61             cout << endl << endl;
62         }
63 #elif defined(VEXCL_BACKEND_COMPUTE)
64         cout << "Compute devices:" << endl << endl;
65         for(auto d = dev.begin(); d != dev.end(); d++) {
66             cout << "  " << d->name() << endl
67                  << "    " << left << setw(32) << "CL_PLATFORM_NAME" << " = "
68                  << d->platform().name() << endl;
69 
70 #define SHOW_DEVPROP(name, method) \
71             cout << "    " << left << setw(32) << #name << " = " << d->method() << endl
72 
73             SHOW_DEVPROP(CL_DEVICE_VENDOR, vendor);
74             SHOW_DEVPROP(CL_DEVICE_VERSION, version);
75             SHOW_DEVPROP(CL_DEVICE_MAX_COMPUTE_UNITS, compute_units);
76             SHOW_DEVPROP(CL_DEVICE_GLOBAL_MEM_SIZE, global_memory_size);
77             SHOW_DEVPROP(CL_DEVICE_LOCAL_MEM_SIZE, local_memory_size);
78             SHOW_DEVPROP(CL_DEVICE_MAX_MEM_ALLOC_SIZE, max_memory_alloc_size);
79             SHOW_DEVPROP(CL_DEVICE_ADDRESS_BITS, address_bits);
80             SHOW_DEVPROP(CL_DEVICE_MAX_CLOCK_FREQUENCY, clock_frequency);
81 
82 #undef SHOW_DEVPROP
83 
84             show_extensions( d->extensions() );
85             cout << endl << endl;
86         }
87 #elif defined(VEXCL_BACKEND_CUDA)
88         cout << "CUDA devices:" << endl << endl;
89         unsigned pos = 0;
90         for(auto d = dev.begin(); d != dev.end(); d++)
91             cout << ++pos << ". " << *d << endl;
92 #elif defined(VEXCL_BACKEND_JIT)
93         cout << "Devices:" << endl << endl;
94         unsigned pos = 0;
95         for(auto d = dev.begin(); d != dev.end(); d++)
96             cout << ++pos << ". " << d->name() << endl;
97 #else
98 #error Unsupported backend
99 #endif
100     } catch (const vex::error &e) {
101         std::cerr << e << std::endl;
102     }
103 }
104 
105 // vim: et
106