diff --git a/src/main.cpp b/src/main.cpp index e1acfd41..b254fb34 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,7 +5,24 @@ #include #include #include - +#include + +namespace { +std::string deviceTypeToString(cl_device_type type) { + switch (type) { + case CL_DEVICE_TYPE_CPU: + return "CL_DEVICE_TYPE_CPU"; + case CL_DEVICE_TYPE_GPU: + return "CL_DEVICE_TYPE_GPU"; + case CL_DEVICE_TYPE_ACCELERATOR: + return "CL_DEVICE_TYPE_ACCELERATOR"; + case CL_DEVICE_TYPE_DEFAULT: + return "CL_DEVICE_TYPE_DEFAULT"; + default: + return "DEVICE_COMBINATION"; + } +} +} template std::string to_string(T value) { @@ -27,7 +44,6 @@ void reportError(cl_int err, const std::string &filename, int line) { #define OCL_SAFE_CALL(expr) reportError(expr, __FILE__, __LINE__) - int main() { // Пытаемся слинковаться с символами OpenCL API в runtime (через библиотеку libs/clew) if (!ocl_init()) @@ -53,7 +69,6 @@ int main() { // Не забывайте проверять коды ошибок с помощью макроса OCL_SAFE_CALL size_t platformNameSize = 0; OCL_SAFE_CALL(clGetPlatformInfo(platform, CL_PLATFORM_NAME, 0, nullptr, &platformNameSize)); - // TODO 1.1 // Попробуйте вместо CL_PLATFORM_NAME передать какое-нибудь случайное число - например 239 // Т.к. это некорректный идентификатор параметра платформы - то метод вернет код ошибки // Макрос OCL_SAFE_CALL заметит это, и кинет ошибку с кодом @@ -65,26 +80,82 @@ int main() { // в документации подробно объясняется, какой ситуации соответствует данная ошибка, и это позволит, проверив код, понять, чем же вызвана данная ошибка (некорректным аргументом param_name) // Обратите внимание, что в этом же libs/clew/CL/cl.h файле указаны всевоможные defines, такие как CL_DEVICE_TYPE_GPU и т.п. - // TODO 1.2 // Аналогично тому, как был запрошен список идентификаторов всех платформ - так и с названием платформы, теперь, когда известна длина названия - его можно запросить: std::vector platformName(platformNameSize, 0); - // clGetPlatformInfo(...); + OCL_SAFE_CALL(clGetPlatformInfo(platform, CL_PLATFORM_NAME, platformNameSize, platformName.data(), nullptr)); std::cout << " Platform name: " << platformName.data() << std::endl; - // TODO 1.3 - // Запросите и напечатайте так же в консоль вендора данной платформы + // Запрашиваем информацию о вендоре платформы + + size_t vendorNameSize = 0; + OCL_SAFE_CALL(clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, 0, nullptr, &vendorNameSize)); + + std::vector vendorName(vendorNameSize, 0); + OCL_SAFE_CALL(clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, vendorNameSize, vendorName.data(), nullptr)); + std::cout << " Platform name: " << vendorName.data() << std::endl; - // TODO 2.1 // Запросите число доступных устройств данной платформы (аналогично тому, как это было сделано для запроса числа доступных платформ - см. секцию "OpenCL Runtime" -> "Query Devices") cl_uint devicesCount = 0; + OCL_SAFE_CALL(clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, 0, nullptr, &devicesCount)); + std::cout << " Number of available devices: " << devicesCount << std::endl; + + std::vector devices(devicesCount); + OCL_SAFE_CALL(clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, devicesCount, devices.data(), nullptr)); for (int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex) { - // TODO 2.2 // Запросите и напечатайте в консоль: // - Название устройства // - Тип устройства (видеокарта/процессор/что-то странное) // - Размер памяти устройства в мегабайтах // - Еще пару или более свойств устройства, которые вам покажутся наиболее интересными + + cl_device_id device = devices[deviceIndex]; + + { + size_t deviceNameSize{0}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_NAME, 0, nullptr, &deviceNameSize)); + + std::vector deviceName(deviceNameSize, 0); + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_NAME, deviceNameSize, deviceName.data(), nullptr)); + std::cout << " Device name: " << deviceName.data() << std::endl; + } + + { + size_t deviceTypeSize{0}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_TYPE, 0, nullptr, &deviceTypeSize)); + + cl_device_type deviceType{}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_TYPE, deviceTypeSize, &deviceType, nullptr)); + std::cout << " Device type: " << deviceTypeToString(deviceType) << std::endl; + } + + { + size_t globalMemSize{0}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, 0, nullptr, &globalMemSize)); + + cl_ulong globalMem{}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, globalMemSize, &globalMem, nullptr)); + std::cout << " Global mem size (Mb): " << (globalMem >> 20) << std::endl; + } + + { + size_t localMemSize{0}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_LOCAL_MEM_SIZE, 0, nullptr, &localMemSize)); + + cl_ulong localMem{}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_LOCAL_MEM_SIZE, localMemSize, &localMem, nullptr)); + std::cout << " Local mem size (bytes): " << localMem << std::endl; + } + + { + size_t maxWGSize{0}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_GROUP_SIZE, 0, nullptr, &maxWGSize)); + + size_t maxWG{}; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_MAX_WORK_GROUP_SIZE, maxWGSize, &maxWG, nullptr)); + std::cout << " Max work group size: " << maxWG << std::endl; + } + } }