[Ответить в тред] Ответить в тред

01/08/16 - Вернули возможность создавать юзердоски
09/07/16 - Новое API для капчи - внимание разработчикам приложений
03/04/16 - Набор в модераторы 03.04 по 8.04



[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 41 | 2 | 12
Назад Вниз Каталог Обновить

Ежегодный ликбез по OpenCL 2.0 Аноним 15/07/16 Птн 16:42:03  796778  
14685901239880.png (32Кб, 300x300)
14685901239891.png (115Кб, 769x693)
что новенького: согласно кроносу в версии 2.0 и 2.1 можно юзать фичи C++
но уже в 1.2 на AMD можно делать так (на всякий случай дублирую пикчей)

[code lang="python"]
import numpy as np
import pyopencl as cl

kernsrc = """
class Test
{
public: void setX (int value);
private: int x;
private: int y;
};

void Test::setX (int value){
x = value;
}

__kernel void foo (__global Test* InClass)
{
if (get_global_id(0) == 0)
InClass->setX(5);
}
"""

mf = cl.mem_flags
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
arr = np.array([1,2], dtype=np.int32)
res = np.zeros(2, dtype=np.int32)
clarr = cl.Buffer(ctx, mf.READ_WRITE| mf.COPY_HOST_PTR, hostbuf=arr)
prg = cl.Program(ctx, kernsrc).build(options=" -x clc++ ")
prg.foo(queue, (1,), None, clarr)
cl.enqueue_copy(queue, res, clarr)
print("Passed:", arr)
print("Got modified:", res)
[/code]

и оно даже работает.

Может пригодиться при портировании плюсового хлама, например.




Список открытого софта с поддержкой OpenCL, которым пользуюсь я:

Нейросетевой фреймворк caffe - пока отдельный бранч, но уже вполне рабочий и ускоренный
Пакет 3d моделирования blender - с версии 2.76 (или даже раньше) рендер cycles работает поверх OpenCL
Редактор raw фото darktable - многие фильтры идут с поддержкой OpenCL, есть возможность гибко настраивать через конфиг, например разные устройства для превью и полной отрисовки


Аноним 15/07/16 Птн 16:43:05  796779
Да, приветствуется обмен опытом, просьбы о помосчи у опытных товарищей, и так далее.
Аноним 15/07/16 Птн 17:02:00  796793
Лучше бы сделал туториал для ньюфагов с хелловорлдом.
Аноним 15/07/16 Птн 17:15:08  796811
OpenCL де факто мертв на данный момент. Нвидиа подмяла рынок ГПУ вычислений полностью.
Аноним 15/07/16 Птн 17:17:37  796812
>>796811
Чем кудахтахтах лучше?
Аноним 15/07/16 Птн 17:30:58  796818
>>796812
Спонсорством за спиной.
Аноним 15/07/16 Птн 17:32:01  796820
>>796818
И все? А для обычного рядового погромана?
Аноним 15/07/16 Птн 17:39:27  796826
14685935676420.png (168Кб, 1182x749)
>>796793
Можно начать с классики писалось ещё при Стиве:
https://developer.apple.com/library/prerelease/content/samplecode/OpenCL_Hello_World_Example/Listings/hello_c.html

А можно с pyopencl - легче не придумать. Простенький примерчик, как создать на хосте массив структур и обработать.
[code lang="python"]
import numpy as np
import pyopencl as cl

kernsrc = """
// Тут комментарии в цэ-стиле
// Декларируем простенькую структуру

struct Test
{
int x;
int y;
};

__kernel void foo (__global struct Test* InStruct)
{
size_t gid = get_global_id(0); //Глобальный индекс
int dx = gid;
// Локальный индекс (внутри фронта) треды внутри одного фронта
// могут работать с общей памятью с префиксом __local, с __global такой фокус не пройдёт
// - записать можно что угодно, но прочитать записанное, в отличие от __local, не получится.
int dy = get_local_id(0);
// Изменяем переданную структуру
InStruct[gid].x += dx;
InStruct[gid].y += dy;
}
"""

mf = cl.mem_flags
ctx = cl.create_some_context() # Создаём дефольный контекст
queue = cl.CommandQueue(ctx) # Очередь
arr = np.zeros(16, dtype=np.int32).reshape(-1, 2) # Сперва готовим данные на хосте
res = np.zeros(arr.shape, dtype=np.int32) # Пустой массив для записи результата
clarr = cl.Buffer(ctx, mf.READ_WRITE| mf.COPY_HOST_PTR, hostbuf=arr) # Буфер на устройстве, заполненный данными хоста
prg = cl.Program(ctx, kernsrc).build() # Программа
prg.foo(queue, (arr.shape[0],), (4,), clarr) # Вызываем наше ядро (оно может быть и не одно)
cl.enqueue_copy(queue, res, clarr) # Получаем взад отправленные данные
# Сравниваем
print("Passed:\n", arr)
print("Got modified:\n", res)
[/code]
у кого-нибудь работает эта ебучая разметка?
Аноним 15/07/16 Птн 17:47:24  796834
>>796811
Да, есть такое. И раньше начала и учёных спонсировала и сё такое прочее. Но:
>>796820
OpenCL таки лучше. Поддерживается на:
интелах начиная с хасфейла.
голимом CPU на амуде и интел и, как минимум посредством pocl, на остальных - не-OpenCL версию кода можно вообще не писать, заработает везде.
на армах - на всех новых SOC оно уже есть
на FPGA и прочих dsp
* а скоро и в вебе - WebCL маячит где-то в конце тоннеля.

Короче - куда имеет куда меньший спектр возможных применений и добавляет анальную зависимость от вендора.
Аноним 15/07/16 Птн 17:48:46  796835
>>796834
ебучая разметка. Забыл уточнить - поддержка на интелах именно на GPU, на CPU она у них давно есть.
Аноним 15/07/16 Птн 17:49:01  796839
>>796834
>голимом CPU на амуде и интел
Нахуя он вообще нужен на ЦПУ, если и так можно вычисление распараллелить на потоки?

Интересуют то видюшечки.
Аноним 15/07/16 Птн 17:53:34  796841
>>796826
Это типо инлайн си в пайтоне? Компилится на лету?
Аноним 15/07/16 Птн 17:54:12  796843
>>796841
Ты уверен, что оно компайлится, а не отправляется текстом на видюху, и компайлится уже там?
Аноним 15/07/16 Птн 17:55:03  796844
>>796839
Затем, что видюшечки есть не везде и не у всех, а коду как-то работать надо. В случае с кудой придётся соснуть или писать CPU-версию алгоритма, в случае с OpenCL заработает и так.
Аноним 15/07/16 Птн 17:56:02  796845
>>796841
Компилится драйвером OpenCL и скомпиленное летит на видяху
Аноним 15/07/16 Птн 17:56:27  796846
>>796844
Но ГПУ же от ЦПУ пиздец дохуя отличается, написать одинаковый алгоритм чтобы работало похуй где - один хуй же не получится, не?
Аноним 15/07/16 Птн 17:57:05  796847
>>796826
А что этот пример у тебя делает? Ты создал пустой массив, обработал его ядром? Че за ядро? Градиент штоле делает?
Аноним 15/07/16 Птн 18:00:04  796852
>>796778 (OP)
ОП, можешь пояснить за SyCL? Его уже можно юзать?
Не люблю си-подобную лапшу, люблю лаконичное дженерик программирование, чтобы ехали шаблоны через шаблоны, и ими лямбды погоняли.
Аноним 15/07/16 Птн 18:10:25  796861
>>796847
> Че за ядро?
Функция с пометкой __kernel
> Градиент штоле делает?
Просто пихает значения глобального и локального индексов в пустой массив.

>>796846
OpenCL код очень легко векторизуется, CPU реализации размазывают его по процессорам с использованием всяких AVX/SSE . Например, в 512-битном регистре AVX 16 флоатов * 4 ядра получится = 64 потока вычислений внутри 4х софтовых тредов.
Аноним 15/07/16 Птн 18:13:59  796870
>>796852
>SyCL
Понятия не имею, я работаю через питон, в-основним, на сишечке только примеры для багтрекеорв хуячу. Посмотри в сторону clBlas/ViennaCL - там ускоренная работа с матрицами. Если твои потребности ограничиваются простыми операциями над большими массивами данных, должно хватить.
Аноним 15/07/16 Птн 18:40:20  796892
>>796846
Ещё поясню:
OpenCL юзает параллелизм данных, условно говоря, у тебя есть массив на 1000000 значений и тебе нужно получить их синусы. Далее всё просто: задаёшь global_size в 1000000, внутри __kernel получаешь индекс текущего global_id и по нему работаешь с нужным элементом массива. Сколько у юзера потоков исполнения тебя не волнует - всё отработает само.
Аноним 15/07/16 Птн 22:23:55  797077
Помню, раньше в плане GPGPU карты от AMD били карты от NVIDIA по всем фронтам. Это правда? Даже если в AMD-карте реализовано на OpenCL, а в NVIDIA - на CUDA? Как сейчас с этим?
Аноним 15/07/16 Птн 22:46:01  797098
CUDA просто работает. У нее есть компилятор nvcc, который в один проход даст тебе и CPU и GPU код, подсветит тебе ошибки и выдаст бинарник, и все это будет работе на куче железа Nvidia. При этом уже лет 5 как поддерживается С++98 код (шаблоны! перегрузка операторов!) и божественная библиотека thrust, автоматизирующая с помощью RAII и функторов рутинные операции типа map/reduce. Вот к примеру код генерации лучей для моего мини-трассировщика, который я написал позавчера:

struct Ray {
float3 origin;
float3 dir;
__host__ __device__ Ray(){}
Ray(float3 origin_, float3 dir_) :
origin(origin_),
dir(dir_)
{}
};

struct RndToRays {

float3 p1;
float3 v1;
float3 v2;
float3 u;
float3 v;
float half_size;
float3 dir;

RndToRays(float3 p1_, float3 v1_, float3 v2_, float angle_size_, float3 dir_) :
p1(p1_),
v1(v1_),
v2(v2_),
half_size(cosf(angle_size_/2)),
dir(dir_)
{
u = norm(v1);
v = norm(v2);
}

Ray operator()(float4 rnd) {
float3 point;
point.x = p1.x + rnd.x v1.x + rnd.y v2.x;
point.y = p1.y + rnd.x v1.y + rnd.y v2.y;
point.z = p1.z + rnd.x v1.z + rnd.y v2.z;

float phi = rnd.z 2.0f M_PI;
float theta = acosf(half_size + rnd.w (1.0f - half_size));

float3 dir2;

dir2.x = sinf(theta)
(cosf(phi) u.x + sinf(phi) v.x) + cosf(theta) dir.x;
dir2.y = sinf(theta)
(cosf(phi) u.y + sinf(phi) v.y) + cosf(theta) dir.y;
dir2.z = sinf(theta)
(cosf(phi) u.z + sinf(phi) v.z) + cosf(theta) dir.z;

return Ray(point - dir2, dir2);
}

};

//и вызов
thrust::device_vector<float4> d_points(N);
curandGenerateUniform(qrng, (float
)thrust::raw_pointer_cast(&d_points[0]), 4 N);

thrust::device_vector<Ray> d_rays(N);
thrust::transform(d_points.begin(), d_points.end(), d_rays.begin(),
RndToRays({-10, -10, 0},
{20, 0, 0},
{0, 20, 0},
0.5f
M_PI/180,
vec));

Здесь ВООБЩЕ нет хуйни типа __device__, __kernel__ или подобного, тем не менее, это полноценный CUDA-код. Случайные числа я генерю с помощью curand, которая встроена в CUDA и затюнена Nvidia. Есть ли аналог curand под OpenCL? Есть, от васяна на гитхабе. Короче, по уровню поддержки это примерно как коммерческий юникс и линукс в 90-е. Наверное, у открытого OpenCL большое будущее, но сейчас и в ближайшие годы это говнецо.

OpenCL - это несовместимая между собой жопа. Nvidia откровенно на него подзабила, что конечно делает их пидорасами типа Билли Гейтса, но нужно жить в реальном мире.
К примеру, библиотека clFFT медленнее на Nvidia в 6 раз, потому что AMD спонсор clFFT. Поэтому CUDA-код все равно приходится писать - и писать его первым, потому что разработка на CUDA намного удобнее.

Компилятор у AMD, например, хуевый, и любит вместо вывода сообщений об ошибках тупо падать, причем вовсе не в том месте, где должен. К примеру, у меня в коде был такой баг:

context = clCreateContext (contextProperties, 1/deviceIdCount/,
deviceIds.data (), nullptr, nullptr, &error);

Закоменченный код вызывал падение внутри библиотеки clFFT, что привело сначала к дебагу этой либы, потом дебагу кода вокруг (методом "закомментируй код и посмотри упадет или нет", так как падает все все равно в случайном месте). При том, что на картах Nvidia все работает нормально даже с OpenCL. Не говоря уже о cuFFT, которая, как водится, круче clFFT.

Далее нормально распространяются только сырцы, в которых может быть твое ноу-хау. Из-за этого приходится генерить кучу бинарников на разном железе. Кронос придумали для этой цели SPIR, который уже есть в виде совершенно разных SPIR и SPIR-V. Но эта хуйня не везде поддерживается. В итоге приходится иметь CUDA для nvidia, и зоопарк OpenCL-бинарников для AMD.

Поэтому в общем-то CUDA - промышленный стандарт для суровых перцев, занимающихся симуляциями и машинлернингом. А OpenCL - это хуитка для consumer-рынка, покрыть долю людей, у которых AMD вместо видеокарты. Я кончил.
Аноним 15/07/16 Птн 22:47:56  797100
>>797077
AMD били в гигафлопсах на ватт и на бакс. Но только за счет архитектуры. Грубо говоря, биткоины майнить на амд удобнее, но вот какой-то нетривиальный код, требущий умной работы с глобальной памятью и т. п., быстрее уже на нвидии.
Аноним 16/07/16 Суб 10:41:32  797386
>>797098
Это всё оно так, но для меня лично нивелируется 1.5 словом: vendor-lock
вот где невидии нет и не будет, там не взлетит. Поэтому писать код, который будет работать у юзера на утюге/ноуте/десктопе - лучше на OpenCL.
>Поэтому в общем-то CUDA - промышленный стандарт для суровых перцев, занимающихся симуляциями и машинлернингом.
ну, у caffe уже есть OpenCL, мне норм. Хотя и сильно позже, да. Опять же, у интела есть Xeon Phi, на котором OpenCL есть, а куды нет. То есть уже имеем минимум 2х крупных игроков только с OpenCL и одного с кудой. Если твой мини трассировщик готовится вырасти во что-то эдакое макси года через 3 - откуда тебе знать, который из 3х вендоров будет тогда лидировать? С OpenCL в любом случае не пропадёшь, а куду возможно придётся переписывать.

> context = clCreateContext (contextProperties, 1/deviceIdCount/,
> deviceIds.data (), nullptr, nullptr, &error);
ну ёпты, пользуйся pycuda/pyopencl на прототипе, чтобы не ебаться с host-кодом. Как с архитектурой определишься, переноси на си/плюсы/расты
Аноним 16/07/16 Суб 17:02:54  797658
>>797386
>писать код, который будет рандомно не компилиться, крешить юзеру утюг/ноут/десктоп, работать некорректно и медленно - лучше на OpenCL
ftfy

OpenCL - это, в основном, AMD-шный высер, на который AMD же и забил болт. На какой ещё платформе, скажем, нужен mul24 (ещё и без mul24_hi)?

А для phi конпелятор здорового человека - это няшная сишечка с родными интринсиками.
Аноним 16/07/16 Суб 18:08:25  797716
>>797658
> OpenCL - это, в основном, AMD-шный высер
Вообще это задумка Apple, которой не понравилась вендорлочность куды.
> на который AMD же и забил болт
это стакой же стандарт, как и OpenGL. Развивается бюрократической организацией согласно интересам всех участников.

> рандомно не компилиться
так ты и пиши так, чтобы компилился. Выведи часть логики за уровень ядра например, всё равно при большом числе условных переходов у тебя исполнители будут простаивать. Заодно и код упростится == станет более портабельным.

> А для phi конпелятор здорового человека - это няшная сишечка с родными интринсиками.
итого: можно иметь 3 реализации алгоритма под каждый конпелятор, а можно одну. Какого покемона выберешь ты?
Аноним 16/07/16 Суб 18:28:28  797735
>>797386
>Это всё оно так, но для меня лично нивелируется 1.5 словом: vendor-lock
1000 строк кода переписываются с CUDA на OpenCL за вечер. При этом код на CUDA уже будет отлажен и ты будешь уверен, что в нем нет багов, темлейты придется перепердолить в дефайны, а вот если ты начнешь с OpenCL, тебя может ждать что угодно.
Ну и да, OpenCL - это тоже lock-in, потому что вот конкретно под AMD нужно профайлить и тюнить алгоритмы. clFFT например залочен под AMD, я писал выше.
Аноним 16/07/16 Суб 18:35:13  797741
>ну ёпты, пользуйся pycuda/pyopencl на прототипе, чтобы не ебаться с host-кодом
Так у CUDA я и не ебусь с host-кодом, это у AMD спецификация OpenCL реализована криво. Это в общем-то основная проблема OpenCL, при заявляемой совместимости код не совместим и реализации содержат баги в разных местах. В итоге проще для nvidia писать CUDA-код и не ебать мозг.
>Если твой мини трассировщик готовится вырасти во что-то эдакое макси года через 3 - откуда тебе знать, который из 3х вендоров будет тогда лидировать?
Я GPGPU занимаюсь с 2012, знаешь, что изменилось с тех пор? Нихуя.
Аноним 16/07/16 Суб 19:07:51  797772
>>797741
Для линукса у AMD есть открытый драйвер с реализацией OpenCL (в частности, беспокоящий тебя clCreateContext в mesa -> clover)
Бери, правь. Ах да, ты не отрепортил в clFFT? Собери всё с дебагом и запости трейс и дамп в https://github.com/clMathLibraries/clFFT/issues - на то он и опенсорс.
> Я GPGPU занимаюсь с 2012, знаешь, что изменилось с тех пор? Нихуя.
интел только сейчас начал подтягивать свои GPU до приличного уровня и реализовывать в них OpenCL. Глядишь, скоро упрётся в невозможность нарастить мощь проца, кроме как наращиванием числа ядер/GPU/AVX (GPU там уже больше 50% кристалла) и тоже начнёт ещё активнее агитировать за OpenCL, так как иначе всю мощь будет не выжать.
Аноним 16/07/16 Суб 19:58:19  797808
>>797716
>пиши так, чтобы компилился
Теоретик вообще не палится.
Аноним 16/07/16 Суб 20:06:04  797814
>>797098
Что характерно, у нвидии OpenCL умеет в asm-блоки (пусть и в PTX), а у AMD - нет. Там даже сраный carry flag не вытащить, хотя в железе он есть.
Аноним 17/07/16 Вск 09:01:52  798197
>>797808
Всё оч просто: пишешь так, чтобы конпелялось на самой убогой платформе, например pocl или beignet. На остальных заработает автоматическтки.

>>797814
> у нвидии OpenCL умеет в asm-блоки (пусть и в PTX), а у AMD - нет
Во-первых, эксперементальные реализации уже есть, причём нативного асма. Во-вторых, это не нужно в большинстве случаев: если очень хочется писать непереносимый код - бери невидию и ебись с кудой.
Аноним 17/07/16 Вск 09:16:45  798202
>>798197
>не нужно
Типичный амдебил типичен.
Аноним 17/07/16 Вск 09:21:53  798204
>>798202
> Типичный амдебил
да я больше кода отладил на beignet на рабочем ноуте, чем дома на амд, так что мимо.
Аноним 18/07/16 Пнд 16:58:15  799317
Сколько мс на реальных проектах занимает переброска с девайса на хост и/или обратно 1 Гб?
Аноним 19/07/16 Втр 13:32:28  800070
>>799317

1G в мою видяху не лезет, бо всего 2. Вот тебе тест на 0.5
http://ideone.com/Vo4AnP

На моей 7870:
Copy to device: 0.409s
Run: 0.222s
Copy from device: 0.219s

На A8-5500, CPU вариант (GPU не будет, ибо у месы пока кривой OpenCL):
Copy to device: 0.411s
Run: 0.917s
Copy from device: 0.399s
Аноним 19/07/16 Втр 13:45:37  800084
>>799317
Меньше секунды, а так хуй знает. Оно ограничено шиной, сам считай, не твоя армия.
Аноним 19/07/16 Втр 14:13:29  800113
>>800070
>>800084
Спасибо за тред и ответ! Как появится свободное время, то покопаюсь детальней в куде. Вроде не особо много чего придется учить, чтобы начать использовать.
Аноним 19/07/16 Втр 14:27:36  800125
Для тех, у кого нет видеокарты амд/невидии, но кто тоже хочет приобщиться святых таинств:
Опенсорс варианты:
http://cgit.freedesktop.org/beignet/ - реализация для intel gpu начиная с HD4000 (не очень бажная, если репортить - быстро фиксят)
http://portablecl.org/ - CPU-only реализация (весьма бажная, зато тоже можно слать багрепорты)

Для ценителей проприетарных продуктов у интел и амд также есть CPU реализации:
https://software.intel.com/en-us/articles/opencl-drivers
http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/

Аноним 20/07/16 Срд 12:36:16  801106
>>800113
Асло сейчас и зеленые, и красные движутся в сторону unified memory - когда трансферить явно ничего не надо, типа DMA и тормозит оно при каждом обращении.
Аноним 20/07/16 Срд 20:28:20  801563
>>801106
Оно и сейчас как-бы есть через CL_MEM_USE_HOST_PTR
только нужно, чтобы код брал предсказуемые данные, а не случайно определял индекс во время исполнения. Тогда можно даже выиграть по времени за счёт того, что подгрузка данных будет идти одновременно с исполнением.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 41 | 2 | 12
Назад Вверх Каталог Обновить

Топ тредов