diff --git a/README.md b/README.md index 7546319d..ac0ba3c4 100644 --- a/README.md +++ b/README.md @@ -1,114 +1,29 @@ -В этом репозитории предложены задания для курса по вычислениям на видеокартах 2024. - -[Остальные задания](https://github.com/GPGPUCourse/GPGPUTasks2024/). - -# Задание 0. Вводное. - -[![Build Status](https://github.com/GPGPUCourse/GPGPUTasks2024/actions/workflows/cmake.yml/badge.svg?branch=task00&event=push)](https://github.com/GPGPUCourse/GPGPUTasks2024/actions/workflows/cmake.yml) - -Установка OpenCL-драйвера для процессора -======================================== - -Установить OpenCL-драйвер для процессора полезно, даже если у вас есть видеокарта, т.к. на нем удобно тестировать приложение (драйвер видеокарты гораздо чаще может повиснуть вместе с ОС). - -Windows -------- - -1. Откройте https://software.intel.com/content/www/us/en/develop/tools/opencl-cpu-runtime.html -2. Скачайте (требует регистрацию, [прямая ссылка для Windows](http://registrationcenter-download.intel.com/akdlm/irc_nas/vcp/13794/opencl_runtime_18.1_x64_setup.msi) - если не качает - попробуйте из-под инкогнито или [отсюда](https://disk.yandex.ru/d/dlVbMoI3tsPZfw)) -3. Установите - -Linux (Рекомендуется Ubuntu 18.04, 20.04 или 22.04) ----------------------------------- - -1. Откройте https://software.intel.com/content/www/us/en/develop/tools/opencl-cpu-runtime.html -2. Скачайте (требует регистрацию, [прямая ссылка для Ubuntu](http://registrationcenter-download.intel.com/akdlm/irc_nas/vcp/15532/l_opencl_p_18.1.0.015.tgz) - если не качает - попробуйте из-под инкогнито или [отсюда](https://disk.yandex.ru/d/dlVbMoI3tsPZfw)) -3. ``apt-get install -yq cpio lsb-core`` -4. ``tar -xzf l_opencl_p_18.1.0.015.tgz`` -5. ``sudo ./l_opencl_p_18.1.0.015/install.sh`` -6. Проведите установку. - -Если у вас довольно новый процессор, например i7-8550U, то драйвер может его не поддерживать - ```clCreateContext``` вернет ошибку ```CL_DEVICE_NOT_AVAILABLE```, в таком случае поставьте свежий драйвер [отсюда](https://github.com/intel/compute-runtime/releases) (включает в т.ч. драйвер для встроенной Intel GPU). - -Если в процессе запуска этого задания процессор не виден как допустимое OpenCL-устройство - создайте **Issue** в этом репозитории с перечислением: - - - Версия OS - - Вывод команды ``ls /etc/OpenCL/vendors`` - - Если там в т.ч. есть ``intel.icd`` файл - то его содержимое (это маленький текстовый файл) - -Установка OpenCL-драйвера для видеокарты -======================================== - -Windows -------- - -Поставьте драйвер стандартным образом - скачав инсталлятор с официального сайта вендора вашей видеокарты и установив. - -Linux ------ - -NVidia: ``sudo apt install nvidia-driver-<версия>`` (например, ``nvidia-driver-535``) - -AMD: [скачав](https://www.amd.com/en/support) и установив amdgpu-pro драйвер - -Проверка окружения и начало выполнения задания -============================================== - -Про работу под Windows см. в секции [Как работать под windows](#%D0%9A%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C-%D0%BF%D0%BE%D0%B4-windows). - -1. Сделайте fork этого репозитория -2. ``git clone ВАШ_ФОРК_РЕПОЗИТОРИЯ`` -3. ``cd GPGPUTasks2024`` -4. ``git checkout task00`` -5. ``mkdir build`` -6. ``cd build`` -7. ``cmake ..`` -8. ``make -j4`` -9. ``./enumDevices`` должно увидеть хотя бы одну OpenCL-платформу: - -``` -Number of OpenCL platforms: 1 -Platform #1/1 - Platform name: -``` - -Если же вы видите ошибку: -``` -terminate called after throwing an instance of 'std::runtime_error' - what(): Can't init OpenCL driver! -Aborted (Core dumped) -``` -То попробуйте установить ```sudo apt install ocl-icd-libopencl1``` и выполнить ``./enumDevices`` снова. - -Если вы видите ошибку: -``` -: CommandLine Error: Option 'polly' registered more than once! -LLVM ERROR: inconsistency in registered CommandLine options -``` -То, наоборот, может помочь удалить пакет ```sudo apt remove ocl-icd-libopencl1``` и попробовать выполнить ``./enumDevices`` снова. - -Если ``./enumDevices`` не показывает хотя бы одну платформу - создайте **Issue** с перечислением: - - - OS, процессор и видеокарта - - Успешно ли прошла установка Intel-CPU драйвера - - Какое было поведение до установки пакета ``ocl-icd-libopencl1`` и какое поведение стало после - - Вывод ``./enumDevices`` - -Задание -======= - -0. Сделать fork проекта -1. Прочитать все комментарии подряд и выполнить все **TODO** в файле ``src/main.cpp``. Для разработки под Linux рекомендуется использовать CLion. Под Windows рекомендуется использовать CLion+MSVC. Также под Windows можно использовать Visual Studio Community. -2. Отправить **Pull-request** с названием ```Task00 <Имя> <Фамилия> <Аффиляция>```. **Аффиляция** - SPbU/HSE/ITMO. -3. В тексте **PR** укажите вывод программы при исполнении на сервере Github CI (Github Actions) и на вашем компьютере (в **pre**-тэгах, чтобы сохранить форматирование, см. [пример](https://raw.githubusercontent.com/GPGPUCourse/GPGPUTasks2024/task00/.github/pull_request_example.md)). И ваш бранч должен называться так же, как и у меня - **task00**. -4. Убедиться что Github CI (Github Actions) смог скомпилировать ваш код и что все хорошо (если нет - то поправить, пожалуйста, не используйте C++ из будущего, о котором не знает GCC 7) -5. Ждать комментарии проверки - -**Дедлайн**: 23:59 22 сентября. Но убедиться, что хотя бы одно OpenCL-устройство у вас обнаруживается, лучше как можно раньше, чтобы было больше времени на решение проблем если они возникнут (см. **Проверка окружения** выше). - -Как работать под Windows -======================== - -1. Используйте **64-битный компилятор**, т.е. [amd64](/.figures/clion_msvc_settings.png), а не x86. (Если при запуске видите ``Invalid Parameter - 100``, то вы все еще используете 32-битный компилятор) -2. Рекомендуется использовать CLion+MSVC. -3. Можно использовать Visual Studio 2017 Community или новее, она поддерживает CMake-проекты (``File`` -> ``Open`` -> ``Cmake...``). Разве что передавать аргументы запускаемой программе [неудобно](https://docs.microsoft.com/en-us/cpp/ide/cmake-tools-for-visual-cpp?view=vs-2017#configure-cmake-debugging-sessions). +
Локальный вывод

+ +

+$ ./enumDevices
+Number of OpenCL platforms: 2
+Platform #1: 0x748e70
+    Platform name: NVIDIA CUDA
+    Platform vendor: NVIDIA Corporation
+    Platform version: OpenCL 3.0 CUDA 11.4.176
+    Number of devices: 1
+        Device #1: NVIDIA GeForce GTX 1050
+            Device type: GPU
+            Global memory size: 4096 MB
+            Maximum compute units: 5
+            Maximum clock frequency: 1493 MHz
+Platform #2: 0x71b870
+    Platform name: Intel(R) OpenCL HD Graphics
+    Platform vendor: Intel(R) Corporation
+    Platform version: OpenCL 3.0
+    Number of devices: 1
+        Device #1: Intel(R) UHD Graphics 630
+            Device type: GPU
+            Global memory size: 3221 MB
+            Maximum compute units: 23
+            Maximum clock frequency: 1000 MHz
+
+
+ +

\ No newline at end of file diff --git a/main.cpp b/main.cpp new file mode 100644 index 00000000..e23c0086 --- /dev/null +++ b/main.cpp @@ -0,0 +1,169 @@ +#include +#include +#include +#include + +using namespace std; + +int main() { + // the number of platforms + cl_uint platformCount = 0; + cl_int result = clGetPlatformIDs(0, nullptr, &platformCount); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform count: " << result << std::endl; + return -1; + } + + // + std::cout << "Number of OpenCL platforms: " << platformCount << std::endl; + + // IDs + if (platformCount > 0) { + cl_platform_id* platforms = (cl_platform_id*)malloc(sizeof(cl_platform_id) * platformCount); + result = clGetPlatformIDs(platformCount, platforms, nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform IDs: " << result << std::endl; + free(platforms); + return -1; + } + + // ID + for (cl_uint i = 0; i < platformCount; ++i) { + std::cout << "Platform #" << (i + 1) << ": " << platforms[i] << std::endl; + + // + size_t platformNameSize; + result = clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, 0, nullptr, &platformNameSize); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform name size: " << result << std::endl; + continue; + } + + + std::vector platformName(platformNameSize); + result = clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, platformNameSize, platformName.data(), nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform name: " << result << std::endl; + continue; + } + + // + std::cout << " Platform name: " << platformName.data() << std::endl; + + // + size_t platformVendorSize; + result = clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR, 0, nullptr, &platformVendorSize); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform vendor size: " << result << std::endl; + continue; + } + std::vector platformVendor(platformVendorSize); + result = clGetPlatformInfo(platforms[i], CL_PLATFORM_VENDOR, platformVendorSize, platformVendor.data(), nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform vendor: " << result << std::endl; + continue; + } + std::cout << " Platform vendor: " << platformVendor.data() << std::endl; + + size_t platformVersionSize; + result = clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, 0, nullptr, &platformVersionSize); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform version size: " << result << std::endl; + continue; + } + std::vector platformVersion(platformVersionSize); + result = clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, platformVersionSize, platformVersion.data(), nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting platform version: " << result << std::endl; + continue; + } + std::cout << " Platform version: " << platformVersion.data() << std::endl; + + // + cl_uint devicesCount = 0; + result = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, nullptr, &devicesCount); + if (result != CL_SUCCESS) { + std::cerr << "Error getting device count: " << result << std::endl; + continue; + } + + // + std::cout << " Number of devices: " << devicesCount << std::endl; + + if (devicesCount > 0) { + cl_device_id* devices = (cl_device_id*)malloc(sizeof(cl_device_id) * devicesCount); + result = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, devicesCount, devices, nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting device IDs: " << result << std::endl; + free(devices); + continue; + } + + // + for (int deviceIndex = 0; deviceIndex < devicesCount; ++deviceIndex) { + // Get the device name + size_t deviceNameSize; + result = clGetDeviceInfo(devices[deviceIndex], CL_DEVICE_NAME, 0, nullptr, &deviceNameSize); + if (result != CL_SUCCESS) { + std::cerr << "Error getting device name size: " << result << std::endl; + continue; + } + std::vector deviceName(deviceNameSize); + result = clGetDeviceInfo(devices[deviceIndex], CL_DEVICE_NAME, deviceNameSize, deviceName.data(), nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting device name: " << result << std::endl; + continue; + } + std::cout << " Device #" << (deviceIndex + 1) << ": " << deviceName.data() << std::endl; + + // + cl_device_type deviceType; + result = clGetDeviceInfo(devices[deviceIndex], CL_DEVICE_TYPE, sizeof(deviceType), &deviceType, nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting device type: " << result << std::endl; + continue; + } + std::string deviceTypeStr; + if (deviceType & CL_DEVICE_TYPE_CPU) deviceTypeStr += "CPU "; + if (deviceType & CL_DEVICE_TYPE_GPU) deviceTypeStr += "GPU "; + if (deviceType & CL_DEVICE_TYPE_ACCELERATOR) deviceTypeStr += "Accelerator "; + if (deviceTypeStr.empty()) deviceTypeStr = "Unknown"; + std::cout << " Device type: " << deviceTypeStr << std::endl; + + // + cl_ulong globalMemSize; + result = clGetDeviceInfo(devices[deviceIndex], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof(globalMemSize), &globalMemSize, nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting global memory size: " << result << std::endl; + continue; + } + std::cout << " Global memory size: " << globalMemSize / (1024 * 1024) << " MB" << std::endl; + + // max + cl_uint maxComputeUnits; + result = clGetDeviceInfo(devices[deviceIndex], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof(maxComputeUnits), &maxComputeUnits, nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting maximum compute units: " << result << std::endl; + continue; + } + std::cout << " Maximum compute units: " << maxComputeUnits << std::endl; + + + cl_uint maxClockFrequency; + result = clGetDeviceInfo(devices[deviceIndex], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof(maxClockFrequency), &maxClockFrequency, nullptr); + if (result != CL_SUCCESS) { + std::cerr << "Error getting maximum clock frequency: " << result << std::endl; + continue; + } + std::cout << " Maximum clock frequency: " << maxClockFrequency << " MHz" << std::endl; + } + + free(devices); + } + } + + free(platforms); + } + + return 0; +}