Skip to content

Commit

Permalink
added task01
Browse files Browse the repository at this point in the history
  • Loading branch information
simiyutin committed Sep 10, 2023
1 parent 030c37a commit 493f393
Show file tree
Hide file tree
Showing 14 changed files with 648 additions and 162 deletions.
Binary file added .figures/clion_edit_configurations.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/clion_working_directory.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 5 additions & 5 deletions .github/workflows/cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@ env:

jobs:
build:
runs-on: ubuntu-18.04
runs-on: ubuntu-20.04

steps:
- uses: actions/checkout@v2

- name: Install prerequisites
run: |
sudo apt update
sudo apt install -y g++-5
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 90
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 90
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;
Expand All @@ -30,4 +30,4 @@ jobs:

- name: aplusb
working-directory: ${{github.workspace}}
run: ./build/enumDevices
run: ./build/aplusb
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ cmake_minimum_required(VERSION 3.1)

add_subdirectory(libs)

project(enumDevices)
project(aplusb)

set(CMAKE_CXX_STANDARD 11)

add_executable(${PROJECT_NAME} src/main.cpp)
target_link_libraries(${PROJECT_NAME} libclew)
target_link_libraries(${PROJECT_NAME} libclew libutils)
111 changes: 9 additions & 102 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,114 +1,21 @@
В этом репозитории предложены задания для курса по вычислениям на видеокартах 2023.
В этом репозитории предложены задания для В этом репозитории предложены задания для курса по вычислениям на видеокартах 2023.

[Остальные задания](https://github.com/GPGPUCourse/GPGPUTasks2023/).

# Задание 0. Вводное.
# Задание 1. A+B.

[![Build Status](https://github.com/GPGPUCourse/GPGPUTasks2023/actions/workflows/cmake.yml/badge.svg?branch=task00&event=push)](https://github.com/GPGPUCourse/GPGPUTasks2023/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``
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 GPGPUTasks2023``
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``
[![Build Status](https://github.com/GPGPUCourse/GPGPUTasks2023/actions/workflows/cmake.yml/badge.svg?branch=task01&event=push)](https://github.com/GPGPUCourse/GPGPUTasks2023/actions/workflows/cmake.yml)

Задание
=======

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/GPGPUTasks2023/task00/.github/pull_request_example.md)). И ваш бранч должен называться так же, как и у меня - **task00**.
4. Убедиться что Github CI (Github Actions) смог скомпилировать ваш код и что все хорошо (если нет - то поправить, пожалуйста, не используйте C++ из будущего, о котором не знает GCC 5.5)
5. Ждать комментарии проверки
1. Прочитать все комментарии подряд и выполнить все **TODO** в файле ``src/main.cpp`` и ``src/cl/aplusb.cl``
2. Отправить **Pull-request** с названием```Task01 <Имя> <Фамилия> <Аффиляция>``` (добавив в описании вывод работы программы в **pre**-тэгах - см. [пример](https://raw.githubusercontent.com/GPGPUCourse/GPGPUTasks2023/task01/.github/pull_request_example.md))

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

Как работать под 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).
Т.к. в ``TODO 6`` исходники кернела считываются по относительному пути ``src/cl/aplusb.cl``, то нужно правильно настроить working directory. Например в случае CLion нужно открыть ``Edit configurations`` -> и указать ``Working directory: .../НАЗВАНИЕПАПКИПРОЕКТА`` (см. [подробнее](https://github.com/GPGPUCourse/GPGPUTasks2023/tree/task01/.figures))
1 change: 1 addition & 0 deletions libs/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
add_subdirectory(clew)
add_subdirectory(utils)
19 changes: 19 additions & 0 deletions libs/utils/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
cmake_minimum_required(VERSION 3.1)

project(libutils)

set(HEADERS
libutils/fast_random.h
libutils/string_utils.h
libutils/timer.h
)

set(SOURCES
libutils/string_utils.cpp
)

set(CMAKE_CXX_STANDARD 11)

add_library(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_link_libraries(${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR})
38 changes: 38 additions & 0 deletions libs/utils/libutils/fast_random.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#pragma once

#include <limits>

// See https://stackoverflow.com/a/1640399
class FastRandom {
public:
FastRandom(unsigned long seed=123456789) {
reset(seed);
}

void reset(unsigned long seed=123456789) {
x = seed;
y = 362436069;
z = 521288629;
}

// Returns pseudo-random value in range [min; max] (inclusive)
int next(int min=0, int max=std::numeric_limits<int>::max()) {
x ^= x << 16;
x ^= x >> 5;
x ^= x << 1;

unsigned long t = x;
x = y;
y = z;
z = t ^ x ^ y;

return min + (unsigned int) (z % (((unsigned long) max) - min + 1));
}

float nextf() {
return (next() * 2000.0f / std::numeric_limits<int>::max()) - 1000.0f;
}

private:
unsigned long x, y, z;
};
158 changes: 158 additions & 0 deletions libs/utils/libutils/string_utils.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
#include "string_utils.h"
#include <sstream>

std::vector<std::string> split(const std::string &string, const std::string &separator, bool keep_empty_parts)
{
std::vector<std::string> result;
size_t p = 0;

while (true) {
size_t s = string.find(separator, p);
if (s == std::string::npos)
break;
std::string token = string.substr(p, s - p);
if (keep_empty_parts || token.size())
result.push_back(token);
p = s + separator.size();
}

std::string token = string.substr(p);
if (keep_empty_parts || token.size())
result.push_back(token);
return result;
}

std::string join(const std::vector<std::string> &tokens, const std::string &separator)
{
std::string res;
for (size_t i = 0; i < tokens.size(); i++) {
if (i)
res += separator;
res += tokens[i];
}
return res;
}

std::istream &getline(std::istream &is, std::string &str)
{
std::string::size_type nread = 0;

if (std::istream::sentry(is, true)) {
std::streambuf *const sbuf = is.rdbuf();
str.clear();

while (nread < str.max_size()) {
int c1 = sbuf->sbumpc();
if (c1 == std::streambuf::traits_type::eof()) {
is.setstate(std::istream::eofbit);
break;
} else {
++nread;
const char ch = c1;
if (ch != '\n' && ch != '\r') {
str.push_back(ch);
} else {
const char ch1 = is.peek();
if (ch == '\n' && ch1 == '\r') is.ignore(1);
if (ch == '\r' && ch1 == '\n') is.ignore(1);
break;
}
}
}
}

if (nread == 0 || nread >= str.max_size()) {
is.setstate(std::istream::failbit);
}

return is;
}

double atof(const std::string &s)
{
std::stringstream ss(s);
ss.imbue(std::locale::classic());

double value = 0;
ss >> value;
return value;
}

int atoi(const std::string &s)
{
std::stringstream ss(s);
ss.imbue(std::locale::classic());

int value = 0;
ss >> value;
return value;
}

std::string tolower(const std::string &str)
{
std::string res = str;
for (size_t k = 0; k < res.size(); k++) res[k] = ::tolower(res[k]);
return res;
}

std::string trimmed(const std::string &s)
{
const size_t p1 = s.find_first_not_of(' ');
const size_t p2 = s.find_last_not_of(' ');

if (p1 == std::string::npos)
return std::string();

return s.substr(p1, p2 - p1 + 1);
}

// base 64 encoding/decoding
// http://stackoverflow.com/questions/180947/base64-decode-snippet-in-c

std::string base64_encode(const std::string &in)
{
std::string out;

int val=0, valb=-6;
for (std::string::const_iterator it = in.begin(); it != in.end(); ++it) {
unsigned char c = *it;

val = (val<<8) + c;
valb += 8;
while (valb>=0) {
out.push_back("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(val>>valb)&0x3F]);
valb-=6;
}
}

if (valb>-6) out.push_back("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[((val<<8)>>(valb+8))&0x3F]);
while (out.size()%4) out.push_back('=');
return out;
}

std::string base64_decode(const std::string &in)
{
std::string out;

std::vector<int> T(256,-1);
for (int i=0; i<64; i++) T["ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[i]] = i;

int val=0, valb=-8;
for (std::string::const_iterator it = in.begin(); it != in.end(); ++it) {
unsigned char c = *it;
if (isspace(c))
continue;

if (T[c] == -1)
break;

val = (val<<6) + T[c];
valb += 6;
if (valb>=0) {
out.push_back(char((val>>valb)&0xFF));
valb-=8;
}
}

return out;
}
Loading

0 comments on commit 493f393

Please sign in to comment.