Какая самая тривиальная функция, которая выиграла бы от вычисления на графическом процессоре?

StackOverflow https://stackoverflow.com/questions/2443402

  •  19-09-2019
  •  | 
  •  

Вопрос

Я только начинаю изучать 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.

Что является «самым тривиальным» — это вопрос мнения, но я бы сказал, что вычисление изображения множества Мандельброта — это довольно простое приложение с использованием графического процессора.Каждая точка полностью независима от любой другой точки, поэтому вы можете запустить поток для каждой точки и получить огромное ускорение.Сама формула, которая повторяется, представляет собой простую квадратичную функцию.Я использовал его в качестве примера в уроке, который можно найти в моем блоге. здесь, просто вычисляя числа, даже не создавая изображения, чтобы сделать его еще проще.Практически любая досадно параллельная (см. статью в Википедии) задача хороша для начала.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top