Какая самая тривиальная функция может быть полезна при вычислении на GPU? - PullRequest
8 голосов
/ 14 марта 2010

Я только начинаю изучать 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 вместо процессора?

Ответы [ 6 ]

6 голосов
/ 21 марта 2010

если у вас достаточно большой набор матриц, над которыми вы собираетесь выполнять операции линейной алгебры, или если вы выполняете одну и ту же операцию над каждым элементом, я бы расценил это как тривиальный пример. Умножение матриц, сложение, FFT, свертка и т. д. вы увидите некоторое ускорение без особой работы. Теперь, если вы хотите увидеть 100-кратное ускорение, вам нужно углубиться в управление памятью и узнать немного о том, что происходит за кулисами.

для начала, я бы порекомендовал начать с pycuda, поскольку его довольно просто начать, так как он обеспечивает очень высокий уровень абстракции и позволяет очень быстро подключаться. Ознакомьтесь с этим курсом по параллельным вычислениям с использованием cuda из университета Иллинойса http://courses.ece.illinois.edu/ece498/al/, когда вы будете готовы к дальнейшему погружению.

3 голосов
/ 14 марта 2010

зависит от определения тривиального. по моему мнению, это будет матричный матричный продукт, поскольку он имеет O(3)/O(2) отношение вычислений к памяти. Алгоритмы, которые демонстрируют аналогичные соотношения, могут выиграть от конкуренции на GPU.

2 голосов
/ 15 марта 2010

Хотя ваше ядро ​​явно тривиально, это может быть полезным примером, оно полностью связано с памятью, поскольку для каждого элемента у вас есть две операции чтения и записи и только одна арифметическая операция. Есть некоторые инструкции для вычисления адреса и т. Д., Но все это практически ничего не значит по сравнению со стоимостью доступа к памяти.

Предполагая, что данные уже находятся на графическом процессоре, вы можете воспользоваться очень высокой пропускной способностью графического процессора для памяти даже для этого простого ядра.

Конечно, графические процессоры полагаются на то, что у вас достаточно потоков, чтобы скрыть задержку памяти, поэтому размер вашей локальной рабочей группы должен быть достаточно большим (скажем, 256 или 512), а размер вашей глобальной рабочей группы должен быть очень большим (например, сотни тысяч). ), чтобы это было эффективно, но в этом вся суть!

1 голос
/ 22 марта 2013

Я знаю, что Вопрос довольно старый, но ... Я обнаружил, что вычисления множества Мандельброта довольно оптимальны для GPU. У вас есть сложный входной вектор (float2) и скалярный выход (int), и вы будете иметь в среднем несколько сотен операций на каждый входной вектор.

Это может быть хорошим примером приложения, так как ...

  • имеет двумерный входной набор данных (вычисляет изображение)
  • Вы можете объяснить волновые фронты и почему в некоторых случаях выгодна двухмерная обработка
  • демонстрирует векторные типы данных
  • создает изображение, которое можно проверить человеческим глазом (отладка)
  • может быть легко расширен за счет: цветового отображения (__constant), обработки float4 вместо float2 (оптимизация), получения выходных векторов int4 (R, G, B, A) (оптимизация). Шаг сокращения (RGBA) => (RGB)
  • необходимые математические знания приемлемы (простая формула)

С уважением, Stefan

0 голосов
/ 18 мая 2010

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

0 голосов
/ 15 марта 2010

После умножения матрицы я бы сказал, свертка изображения (например, размытие, шумоподавление и т. Д.). Посмотрите учебник AMD .

...