Какая самая тривиальная функция, которая выиграла бы от вычисления на графическом процессоре?
Вопрос
Я только начинаю изучать OpenCL.Я пытаюсь получить представление о том, какого прироста производительности следует ожидать при переносе функций / алгоритмов на графический процессор.
Самое базовое ядро, приведенное в большинстве руководств, - это ядро, которое принимает два массива чисел, суммирует значения по соответствующим индексам и добавляет их в третий массив, вот так:
__kernel void
add(__global float *a,
__global float *b,
__global float *answer)
{
int gid = get_global_id(0);
answer[gid] = a[gid] + b[gid];
}
__kernel void
sub(__global float* n,
__global float* answer)
{
int gid = get_global_id(0);
answer[gid] = n[gid] - 2;
}
__kernel void
ranksort(__global const float *a,
__global float *answer)
{
int gid = get_global_id(0);
int gSize = get_global_size(0);
int x = 0;
for(int i = 0; i < gSize; i++){
if(a[gid] > a[i]) x++;
}
answer[x] = a[gid];
}
Я предполагаю, что вы никогда не смогли бы оправдать вычисление этого на графическом процессоре, передача памяти превысила бы время, необходимое для вычисления этого на процессоре, на величины (возможно, я ошибаюсь в этом, отсюда и этот вопрос).
Что мне интересно, так это какой был бы самый тривиальный пример, когда вы ожидали бы значительного ускорения при использовании ядра OpenCL вместо центрального процессора?
Решение
если у вас достаточно большой набор матриц, над которыми вы собираетесь выполнять операции линейной алгебры, или вы, по сути, выполняете одну и ту же операцию над каждым элементом, я бы расценил это как тривиальный пример.умножение матриц, сложение, БПФ, свертка и т. д.вы увидите небольшое ускорение без особых усилий.теперь, если вы хотите увидеть 100-кратное ускорение, вам нужно углубиться в управление памятью и немного узнать о том, что происходит за кулисами.
Для начала я бы рекомендовал начать с pycuda, так как начать довольно просто, поскольку он обеспечивает очень высокий уровень абстракции и позволит вам очень быстро приступить к работе.ознакомьтесь с этим курсом по параллельным вычислениям с использованием cuda из Университета Иллинойса. http://courses.ece.illinois.edu/ece498/al/ когда вы будете готовы погрузиться дальше.
Другие советы
зависит от определения тривиальности.на мой взгляд, это будет матричный матричный продукт, поскольку он имеет O(3)/O(2)
соотношение вычислений и памяти.Алгоритмы, демонстрирующие аналогичные соотношения, вероятно, выиграют от конкуренции на графическом процессоре.
Хотя ваше ядро явно очень тривиально, оно может быть полезным примером, оно полностью ограничено памятью, поскольку для каждого элемента у вас есть два чтения и одна запись, и только одна арифметическая операция.Есть несколько инструкций по вычислению адреса и т.д., но все это практически ничего не значит по сравнению со стоимостью доступа к памяти.
Предполагая, что данные уже находятся на графическом процессоре, вы можете извлечь выгоду из очень высокой пропускной способности графического процессора по отношению к памяти даже для этого простого ядра.
Конечно, графические процессоры полагаются на то, что у вас достаточно потоков, чтобы скрыть задержку памяти, поэтому размер вашей локальной рабочей группы должен быть довольно большим (скажем, 256 или 512), а размер вашей глобальной рабочей группы должен быть очень большим (напримерсотни тысяч), чтобы это было эффективно, но в этом-то и суть!
Я знаю, что Вопрос довольно старый, но...Я обнаружил, что вычисления множества Мандельброта вполне оптимальны для графического процессора.У вас есть сложный входной вектор (float2) и скалярный выходной (int), и у вас будет в среднем несколько сотен операций на входной вектор.
Это могло бы быть использовано в качестве хорошего примера приложения, как это...
- имеет двумерный входной набор данных (вычисляет изображение)
- вы можете объяснить волновые фронты и почему двумерная обработка полезна в некоторых случаях
- демонстрирует векторные типы данных
- создает изображение, которое быстро можно проверить человеческими глазами (отладка)
- может быть легко расширен с помощью:отображение цвета (__константа), обработка float4 вместо float2 (оптимизация), создание выходных векторов int4 (R, G, B, A) (оптимизация).Шаги уменьшения (RGBA) => (RGB)
- необходимые математические знания приемлемы (простая формула)
С уважением, Стефан
После умножения матрицы я бы сказал свертку изображения (например, размытие, шумоподавление и т. д.).Проверить Учебное пособие AMD.
Что является «самым тривиальным» — это вопрос мнения, но я бы сказал, что вычисление изображения множества Мандельброта — это довольно простое приложение с использованием графического процессора.Каждая точка полностью независима от любой другой точки, поэтому вы можете запустить поток для каждой точки и получить огромное ускорение.Сама формула, которая повторяется, представляет собой простую квадратичную функцию.Я использовал его в качестве примера в уроке, который можно найти в моем блоге. здесь, просто вычисляя числа, даже не создавая изображения, чтобы сделать его еще проще.Практически любая досадно параллельная (см. статью в Википедии) задача хороша для начала.