1 /*
2  * Copyright (c) 2019-2021, The OSKAR Developers.
3  * See the LICENSE file at the top-level directory of this distribution.
4  */
5 
6 #include "log/oskar_log.h"
7 #include "settings/oskar_option_parser.h"
8 #include "utility/oskar_device.h"
9 #include "utility/oskar_get_error_string.h"
10 #include "utility/oskar_version_string.h"
11 
12 #include <cstdlib>
13 
main(int argc,char ** argv)14 int main(int argc, char** argv)
15 {
16     oskar::OptionParser opt("oskar_system_info", oskar_version_string());
17     opt.set_description("Display information about compute devices "
18             "on the system");
19     if (!opt.check_options(argc, argv)) return EXIT_FAILURE;
20     oskar_Log* log = 0;
21     oskar_log_set_term_priority(log, OSKAR_LOG_STATUS);
22 
23     oskar_Device** devices = 0;
24     int error = 0, num_devices = 0, platform = 0;
25     oskar_device_set_require_double_precision(0);
26 
27     // Log relevant environment variables.
28     oskar_log_section(log, 'M', "Environment variables");
29     oskar_log_value(log, 'M', 1, "OSKAR_PLATFORM",
30             "%s", getenv("OSKAR_PLATFORM"));
31     oskar_log_value(log, 'M', 1, "OSKAR_CL_DEVICE_VENDOR",
32             "%s", getenv("OSKAR_CL_DEVICE_VENDOR"));
33     oskar_log_value(log, 'M', 1, "OSKAR_CL_DEVICE_TYPE",
34             "%s", getenv("OSKAR_CL_DEVICE_TYPE"));
35 
36     // Create CUDA device information list.
37     oskar_device_count("CUDA", &platform);
38     devices = oskar_device_create_list(platform, &num_devices);
39     oskar_device_check_error_cuda(&error);
40     oskar_log_section(log, 'M', "CUDA devices (%d)", num_devices);
41     if (error)
42     {
43         oskar_log_error(log, "Could not determine CUDA device information (%s)",
44                 oskar_get_error_string(error));
45     }
46     for (int i = 0; i < num_devices; ++i)
47     {
48         oskar_device_log_details(devices[i], log);
49         oskar_device_free(devices[i]);
50     }
51     free(devices);
52 
53     // Create OpenCL device information list.
54     oskar_device_count("OpenCL", &platform);
55     devices = oskar_device_create_list(platform, &num_devices);
56     oskar_log_section(log, 'M', "OpenCL devices (%d)", num_devices);
57     for (int i = 0; i < num_devices; ++i)
58     {
59         oskar_device_log_details(devices[i], log);
60         oskar_device_free(devices[i]);
61     }
62     free(devices);
63 
64     return error ? EXIT_FAILURE : EXIT_SUCCESS;
65 }
66