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