-
Notifications
You must be signed in to change notification settings - Fork 41
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
Closed
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,114 +1,29 @@ | ||
В этом репозитории предложены задания для курса по вычислениям на видеокартах 2024. | ||
|
||
[Остальные задания](https://github.com/GPGPUCourse/GPGPUTasks2024/). | ||
|
||
# Задание 0. Вводное. | ||
|
||
[](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 | ||
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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|
||
// ����� �������� | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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; | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
консольный вывод ожидается в обсуждении пулреквеста в интерфейсе гитхаба)