-
Notifications
You must be signed in to change notification settings - Fork 53
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
14 changed files
with
648 additions
and
162 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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
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
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,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)) |
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 +1,2 @@ | ||
add_subdirectory(clew) | ||
add_subdirectory(utils) |
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,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}) |
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,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; | ||
}; |
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,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; | ||
} |
Oops, something went wrong.