Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Task00 Нина Чекалина ITMO #54

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 29 additions & 114 deletions README.md
Original file line number Diff line number Diff line change
@@ -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).
<details><summary>Локальный вывод</summary><p>

<pre>
$ ./enumDevices
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

консольный вывод ожидается в обсуждении пулреквеста в интерфейсе гитхаба)

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

</pre>

</p></details>
169 changes: 169 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <CL/cl.h>

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;
}

// ����� ��������
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

у комментов поехала кодировка, попробуйте перезалить в utf-8

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<char> 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<char> 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<char> 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<char> 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;
}
Loading