Skip to content

Commit

Permalink
added task00
Browse files Browse the repository at this point in the history
  • Loading branch information
simiyutin committed Sep 14, 2024
1 parent c2305a3 commit 334214b
Show file tree
Hide file tree
Showing 23 changed files with 4,536 additions and 2 deletions.
66 changes: 66 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Generated from CLion C/C++ Code Style settings
BasedOnStyle: LLVM
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: None
AlignOperands: Align
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Always
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakTemplateDeclarations: Yes
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Never
AfterEnum: true
AfterFunction: false
AfterNamespace: false
AfterUnion: true
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: true
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
ColumnLimit: 120
CompactNamespaces: false
ContinuationIndentWidth: 8
IndentCaseLabels: true
IndentPPDirectives: BeforeHash
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: true
MaxEmptyLinesToKeep: 2
NamespaceIndentation: All
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PointerAlignment: Right
ReflowComments: false
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 0
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
TabWidth: 4
UseTab: Never
Binary file added .figures/clion_msvc_settings.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added .figures/intel_cpu_ocl_driver_warning.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 15 additions & 0 deletions .githooks/how_to_use.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# How to use git hooks for this repository:

* Set `.githooks` directory as root directory for git hooks:

```bash
git config --local core.hooksPath ./.githooks
```

or

* Copy `pre-commit` file to `.git/hooks`:

```bash
cp ./.githooks/pre-commit ./.git/hooks/
```
58 changes: 58 additions & 0 deletions .githooks/pre-commit
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/usr/bin/env python

import subprocess


def last_line_valid(path):
"""
Check last file line have linebreak
:param path: path to file
:return: have or haven't
"""
with open(path, 'r') as f:
text = f.readlines()
try:
last_char = text[-1][-1]
return last_char == '\n'
except IndexError:
return False


def fix_last_line(path):
"""
Add a linebreak to the end of file if it doesn't have one
"""
if last_line_valid(path):
return
with open(path, 'a') as f:
print(f'Add linebreak to the file: {path}')
f.write('\n')


def fix_clang_format(path):
"""
Fix clang-format
"""
if path.endswith('.cpp') or path.endswith('.hpp') or path.endswith('.cl'):
print(f'clang-format fix: {path}')
subprocess.Popen(['clang-format', path, '-i'], stdout=subprocess.DEVNULL).communicate()


def fix_format():
git_diff = subprocess.Popen('git diff-index --name-status --cached HEAD'.split(), stdout=subprocess.PIPE)
remove_deleted = subprocess.Popen('grep -v ^D'.split(), stdin=git_diff.stdout, stdout=subprocess.PIPE)
get_second_column = subprocess.Popen(['awk', '{ print $2 }'], stdin=remove_deleted.stdout, stdout=subprocess.PIPE)
git_diff.stdout.close()
remove_deleted.stdout.close()
output = get_second_column.communicate()[0].decode('utf-8').strip()
if not output:
return
for file in output.split('\n'):
path = f'./{file}'
fix_last_line(path)
fix_clang_format(path)
subprocess.Popen(['git', 'add'] + output.split('\n')).communicate()


if __name__ == '__main__':
fix_format()
35 changes: 35 additions & 0 deletions .github/pull_request_example.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Убедитесь что название PR соответствует шаблону:
// Task0N <Имя> <Фамилия> <Аффиляция>
// И проверьте что обе ветки PR (отправляемая из вашего форкнутого репозитория и та в которую вы отправляете PR) называются одинаково - task0N

// Впишите сюда (между pre и /pre тэгами) вывод тестирования на вашем компьютере:

<details><summary>Локальный вывод</summary><p>

<pre>
$ ./enumDevices
Number of OpenCL platforms: 1
Platform #1/1
Platform name:
The command "./enumDevices" exited with 0.
</pre>

</p></details>

// Затем создайте PR, должна начать выполняться автоматическиая сборка на Github CI (Github Actions) - рядом с коммитом в PR появится оранжевый шарик (сборка в процессе),
// который потом станет зеленой галкой (прошло успешно) или красным крестиком (что-то пошло не так).
// Затем откройте PR на редактирование чтобы добавить в описание (тоже между pre и /pre тэгами) вывод тестирования на Github CI:
// Чтобы его найти - надо нажать на зеленую галочку или красный крестик рядом с вашим коммитов в рамках PR.
// P.S. В случае если Github CIсборка не запустилась - попробуйте через десять минут или через час добавить фиктивный коммит (например добавив где-то пробел).

<details><summary>Вывод Github CI</summary><p>

<pre>
$ ./enumDevices
Number of OpenCL platforms: 1
Platform #1/1
Platform name:
The command "./enumDevices" exited with 0.
</pre>

</p></details>
32 changes: 32 additions & 0 deletions .github/scripts/install_intel_opencl.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/bin/bash
#See https://github.com/KhronosGroup/SyclParallelSTL/blob/03367798d81fe396cd8ebf5492e51ad6a495467d/.travis/install_intel_opencl.sh

set -ev

apt update

###########################
# Get Intel OpenCL Runtime
###########################

# https://software.intel.com/en-us/articles/opencl-drivers#latest_CPU_runtime
PACKAGE_URL=https://registrationcenter-download.intel.com/akdlm/irc_nas/vcp/15532/l_opencl_p_18.1.0.015.tgz
PACKAGE_NAME=l_opencl_p_18.1.0.015

wget -q ${PACKAGE_URL} -O /tmp/opencl_runtime.tgz
tar -xzf /tmp/opencl_runtime.tgz -C /tmp
sed 's/decline/accept/g' -i /tmp/${PACKAGE_NAME}/silent.cfg
apt-get install -yq cpio
/tmp/${PACKAGE_NAME}/install.sh -s /tmp/${PACKAGE_NAME}/silent.cfg

###################################
# Check OpenCL runtime with clinfo
###################################

apt install -yq ocl-icd-opencl-dev ocl-icd-dev opencl-headers

git clone https://github.com/Oblomov/clinfo
cd clinfo
make -j4
./clinfo
cd ..
33 changes: 33 additions & 0 deletions .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: CMake

on: [push, pull_request]

env:
BUILD_TYPE: RelWithDebInfo

jobs:
build:
runs-on: ubuntu-20.04

steps:
- uses: actions/checkout@v2

- name: Install prerequisites
run: |
sudo apt update
sudo apt install -y g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 90
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 90
- name: Install OpenCL driver for CPU
run: sudo bash .github/scripts/install_intel_opencl.sh;

- name: Configure CMake
run: cmake -B ${{github.workspace}}/build -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}

- name: Build
run: cmake --build ${{github.workspace}}/build --config ${{env.BUILD_TYPE}}

- name: aplusb
working-directory: ${{github.workspace}}
run: ./build/enumDevices
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
**/*_cl.h
.idea
build
cmake-build*
.vs
10 changes: 10 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
cmake_minimum_required(VERSION 3.1)

add_subdirectory(libs)

project(enumDevices)

set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} libclew)
116 changes: 114 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,114 @@
# GPGPUTasks2024
В этом репозитории предложены задания для курса по вычислениям на видеокартах 2024
В этом репозитории предложены задания для курса по вычислениям на видеокартах 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-<версия>`` (например, ``nvidia-384`` или ``nvidia-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 5.5)
5. Ждать комментарии проверки

**Дедлайн**: 23:59 10 сентября. Но убедиться, что хотя бы одно OpenCL-устройство у вас обнаруживается, лучше как можно раньше, желательно, до начала лекции 8 сентября, чтобы было больше времени на решение проблем если они возникнут (см. **Проверка окружения** выше).

Как работать под 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).
1 change: 1 addition & 0 deletions libs/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
add_subdirectory(clew)
Loading

0 comments on commit 334214b

Please sign in to comment.