diff --git a/src/main.cpp b/src/main.cpp index e1acfd41..c258db5c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -65,26 +65,85 @@ int main() { // в документации подробно объясняется, какой ситуации соответствует данная ошибка, и это позволит, проверив код, понять, чем же вызвана данная ошибка (некорректным аргументом param_name) // Обратите внимание, что в этом же libs/clew/CL/cl.h файле указаны всевоможные defines, такие как CL_DEVICE_TYPE_GPU и т.п. + // OCL_SAFE_CALL(clGetPlatformInfo(platform, 239, 0, nullptr, &platformNameSize)); + // Returns: "OpenCL error code -30" + // cl.h: #define CL_INVALID_VALUE -30 + // Docs: CL_INVALID_VALUE if param_name is not one of the supported values + // 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 platformVendorSize = 0; + OCL_SAFE_CALL(clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, 0, nullptr, &platformVendorSize)); + std::vector platformVendor(platformVendorSize, 0); + OCL_SAFE_CALL(clGetPlatformInfo(platform, CL_PLATFORM_VENDOR, platformVendorSize, platformVendor.data(), nullptr)); + std::cout << " Platform vendor: " << platformVendor.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::vector devices(devicesCount); + OCL_SAFE_CALL(clGetDeviceIDs(platform, CL_DEVICE_TYPE_ALL, devicesCount, devices.data(), nullptr)); for (int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex) { + auto device = devices[deviceIndex]; // TODO 2.2 // Запросите и напечатайте в консоль: // - Название устройства + 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; + // - Тип устройства (видеокарта/процессор/что-то странное) + cl_device_type deviceType; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_TYPE, sizeof(cl_device_type), &deviceType, nullptr)); + std::string deviceTypeString; + switch (deviceType) { + case CL_DEVICE_TYPE_CPU: + deviceTypeString = "CPU"; + break; + + case CL_DEVICE_TYPE_GPU: + deviceTypeString = "GPU"; + break; + + case CL_DEVICE_TYPE_ACCELERATOR: + deviceTypeString = "ACCELERATOR"; + break; + + default: + deviceTypeString = "?"; + break; + } + std::cout << " Device type: " << deviceTypeString << std::endl; + // - Размер памяти устройства в мегабайтах + cl_ulong deviceMemSizeBytes; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(cl_ulong), &deviceMemSizeBytes, nullptr)); + std::cout << " Device mem size: " << deviceMemSizeBytes / 1000000.f << " MB" << std::endl; + + // - Еще пару или более свойств устройства, которые вам покажутся наиболее интересными + size_t deviceProfileSize = 0; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_PROFILE, 0, nullptr, &deviceProfileSize)); + std::vector deviceProfile(deviceProfileSize, 0); + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DEVICE_PROFILE, deviceProfileSize, deviceProfile.data(), nullptr)); + std::cout << " Device profile: " << deviceProfile.data() << std::endl; + + size_t driverVersionSize = 0; + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DRIVER_VERSION, 0, nullptr, &driverVersionSize)); + std::vector driverVersion(driverVersionSize, 0); + OCL_SAFE_CALL(clGetDeviceInfo(device, CL_DRIVER_VERSION, driverVersionSize, driverVersion.data(), nullptr)); + std::cout << " Driver version: " << driverVersion.data() << std::endl; + } }