Для яких статистичних методів GPU швидше, ніж процесори?


18

Я щойно встановив на робочий стіл графічну карту Nvidia GT660 і після певної боротьби мені вдається з'єднати її з R.

Я грав з декількома пакетами R, які використовують графічні процесори, особливо gputools, і я порівнював час, витрачений моїм графічним процесором та процесором на виконання деяких основних операцій:

  • інвертування матриць (процесор швидше)
  • qr розкладання (процесор швидше)
  • великі кореляційні матриці (процесор швидше)
  • множення матриці (GPU набагато швидше!)

Зауважте, що я експериментував переважно з gputools, тому, можливо, інші пакети працюють краще.

У широкому розумінні моє запитання таке: які деякі рутинні статистичні операції, які можуть бути вартими виконувати на GPU, а не на процесорі?


1
Що-небудь, що включає багато матричного множення? :) Графічні процесори досить популярні у спільноті нейронних мереж.

вам потрібно вказати розмір матриць, які використовуються. Наприклад, востаннє я перевіряв (правда, 2 роки тому) інверсія та розкладання були лише швидшими на GPU, починаючи з великих матриць (2 ^ 9 разів 2 ^ 9 і вище)
user189035

1
Я використовував матриці приблизно для інверсії, qr та матричного множення, тоді як для кореляцій я використовував приблизно 10 ^ 4 спостереження векторів розміром 100. Для інверсії матриці GPU був набагато повільнішим, тоді як для розкладання qr - повільніше, але порівняно з процесором. 103×103
Югурта

2
це дуже гарне запитання, але я думаю, ви отримаєте кращі відповіді, перенісши їх на stackoverflow (я думаю, подібні запитання там задавались раніше)
user189035,

2
Перевагою GPU від звичайних процесорів є той факт, що вони можуть бути "масово" паралельними, а не те, що вони швидші на ядро. Таким чином, для завдань, які потребують великої кількості «ведення домашнього господарства», як-от факторизація Чолеського тощо, вам потрібно використовувати алгоритми блоків тощо, щоб досягти значного прискорення; це не банально, і я припускаю, що пройде деякий час, перш ніж GPU прийме такі операції. Що, безсумнівно, іде GPU шлях, це MCMC-ing (і генерація випадкових чисел). Вибірка з задньої частини має "паралелізацію", написану по всьому ... І розраховані малі матриці; вони вже "заблоковані" все одно ...
usεr11852 повідомляє Відновити Монік

Відповіді:


6

GPU - чутливі звірі. Хоча beefiest карти Nvidia, теоретично може виконати будь-який з операцій , перерахованих вами 100x швидше , ніж найшвидший процесор, близько мільйонів речі можуть стати на шляху цього прискорення. Кожна частина відповідного алгоритму та програми, яка його запускає, повинна бути широко налаштована та оптимізована для того, щоб досягти будь-якого близького до цього теоретичного максимального прискорення. Як правило, R не є особливо швидкою мовою, і тому мене не дивує, що його реалізація GPU за замовчуванням не настільки велика, принаймні з точки зору необробленої продуктивності. Однак функції R GPU можуть мати налаштування оптимізації, які можна налаштувати, щоб відновити частину цієї відсутньої продуктивності.

Якщо ви шукаєте в графічних процесорах, тому що ви виявили, що на деякий розрахунок, який потрібно запустити, знадобиться тижнів / місяців, щоб закінчити, можливо, варто витратити час на перехід від R на більш сприятливу для продуктивності мову. З Python не так вже й важче працювати, ніж R. Пакети NumPy та SciPy мають більшу частину тих же статистичних функцій, що і R, і PyCuda можна використовувати для реалізації власних функцій на основі графічного процесора досить просто.

Якщо ви дійсно хочете збільшити швидкість, з якою ваші функції працюють на графічних процесорах, я б подумав реалізувати власні функції в поєднанні C ++ і CUDA. Бібліотеку CUBLAS можна використовувати для обробки всіх важких підйомів, пов'язаних з лінійною алгеброю. Однак майте на увазі, що написання такого коду може зайняти досить багато часу (особливо, якщо це робиться вперше), і такий підхід слід зарезервувати лише для тих обчислень, які потребують надзвичайно тривалого часу (місяці) та / або що ви будете повторювати сотні разів.


6

Загалом, алгоритми, які працюють швидше на графічному процесорі, - це ті, де ви виконуєте однотипні інструкції для багатьох точок даних.

Простий приклад проілюструвати це - матричним множенням.

Припустимо, ми робимо обчислення матриць

А×Б=С

Простий алгоритм процесора може виглядати приблизно так

// починаючи з C = 0

for (int i = 0; i < C_Width; i++)
{
    for (int j = 0; j < C_Height; j++)
    {
        for (int k = 0; k < A_Width; k++)
        {
            for (int l = 0; l < B_Height; l++)
            {
                C[j, i] += A[j, k] * B[l, i];
            }
        }
    }
}

Головне, що тут слід побачити, - це те, що є багато вкладених циклів і кожен крок повинен бути виконаний один за одним.

Дивіться схему цього

Зауважте, що обчислення кожного елемента С не залежить від жодного з інших елементів. Тож не має значення, в якому порядку проводяться розрахунки.

Отже, на GPU ці операції можна робити одночасно.

Ядро GPU для обчислення множення матриці виглядало б приблизно так

__kernel void Multiply
(
    __global float * A,
    __global float * B,
    __global float * C
)
{
     const int x = get_global_id(0);
     const int y = get_global_id(1);
     for (int k = 0; k < A_Width; k++)
     {
         for (int l = 0; l < B_Height; l++)
         {
             C[x, y] += A[x, k] * B[l, y];
         }
     }
}

Це ядро ​​має лише дві внутрішні для циклів. Програма, що надсилає це завдання GPU, скаже GPU виконувати це ядро ​​для кожної точки даних у C. GPU виконуватиме кожну з цих інструкцій одночасно у багатьох потоках. Так само, як і колишня приказка «Дешевше за десяток» графічні процесори розроблені так, щоб швидше робити те саме, багато разів.

Однак існують деякі алгоритми, які сповільнюватимуть графічний процес. Деякі не дуже підходять для GPU.

Наприклад, існували залежності даних, тобто: уявіть, обчислення кожного елемента C залежало від попередніх елементів. Програмісту доведеться поставити бар'єр у ядрі, щоб дочекатися завершення кожного попереднього обчислення. Це було б серйозним уповільненням.

Також алгоритми, які мають багато логіки розгалуження, тобто:

__kernel Foo()
{
    if (somecondition)
    {
        do something
    }
    else
    {
        do something completely different
    }
}

прагнуть повільніше працювати на графічному процесорі, оскільки GPU вже не робить те саме в кожному потоці.

Це спрощене пояснення, оскільки є багато інших факторів, які слід враховувати. Наприклад, передача даних між процесором та графічним процесором також забирає багато часу. Іноді варто робити обчислення на графічному процесорі навіть тоді, коли його швидше на процесорі, просто щоб уникнути зайвого часу надсилання (І навпаки).

Також багато сучасних процесорів підтримують паралельність зараз, а також з багатопотоковими процесорами з гіперпотоком.

Графічні процесори також здаються не дуже хорошими для рекурсії, дивіться тут, що, ймовірно, пояснює деякі проблеми з алгоритмом QR. Я вважаю, що людина має деякі рекурсивні залежності даних.


2
Офіційно SX-неслухняно коментувати відповідь, щоб сказати, що це надзвичайна відповідь, але я не даю перинум щурів про ноги: це чудова і інформативна відповідь. Однією з великих несправедливості SX є відсутність кудо людей, які дають вишукано-інформативні відповіді на "старі" (в Інтернеті) питання. (Плюс я даю великі пальці до "старої" (в інтернеті часу) відповіді: Я знаю, правда? МЕТА).
GT.

Важливим питанням є те, чи є насправді бібліотека для обчислення: наприклад, наскільки мені відомо, немає рідкісних x щільних реалізацій GPU множення матриці, звичайно, не через R-пакети. Якщо ви готові працювати з написанням коду GPU C, то удачі.
Джек Уейсі

4

Для всіх згаданих вами додатків графічні процесори повинні бути більш здатними (з апаратної точки зору), ніж процесори для досить великих матриць. Я нічого не знаю про реалізацію R, але я використовував cuBLAS і Magma з великим успіхом для інверсій навколон=210 і множення / співвіднесення для прямокутних матриць з н,м210,к214. Для мене особливо велике здивування, що великі кореляційні матриці будуть швидшими на процесорі за допомогою R.

Загалом, я підозрюю, що більшість статистичних операцій, які проводять більшу частину свого часу в щільній лінійній алгебрі (функціональність BLAS, Lapack), можуть бути ефективно реалізовані на GPU.


0

Кілька методів імпутації для відсутніх даних? Як і в Алісі-II (R).

Я думаю, що це, як правило, незручно паралельно і, отже, підходить до архітектури GPU. Ніколи не пробував сам, хоча.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.