Конференція Високопродуктивні обчислення, Київ, 13-15 жовтня 2014

Десять способів обману на результатах вимірювання продуктивності GPU

Ten Ways to Fool the Masses When Giving Performance Results on GPUs

Скот Пакін, дослідник, Applied Computer Science group, Los Alamos National Laboratory

Потенціал продуктивності графічних прискорювачів призвів до значного пожвавлення в середовищі спеціалістів з високопродуктивних обчислень.

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

Відроджуючи класичну доповідь Девіда Бейлі «Дванадцять способів обману на результатах продуктивності паралельних комп’ютерів», я представляю десять форм експериментального нехлюйства, з якими я неодноразово стикався у наукових статтях. До цих псевдорезультатів звертаються новачки у GPU (та їхнє некомпетентне начальство), вважаючи, що графічні прискорювачі можуть магічним чином підвищити продуктивність будь-якої програми на кілька порядків. Цей список, як кишеньковий довідник, дозволить читачеві навчитись скептично ставитись до інформації про надзвичайну продуктивність GPU.

Ви готові збільшити продуктивність вашого графічного прискорювача на папері без фактичного збільшення продуктивності? Тоді читайте далі…

1. Цитуйте результати вимірювання продуктивності лише для 32-бітної арифметики з плаваючою точкою, а не 64-бітної.
Продуктивність GPU подвоюється, якщо використовується 32-бітна точність. Зрештою, кому потрібно більше ніж вісім десяткових розрядів? Само собою зрозуміло, що та версія коду для CPU, з якою ви порівнюєте результати, має бути тільки 64-бітною, тому що, ну …, так люди пишуть код для CPU (навіть якщо продуктивність CPU також подвоюється при використанні 32-бітної арифметики).

2. Не враховуйте час на завантаження даних та накладні витрати на системні виклики.
Копіювання даних між оперативною пам’яттю та вбудованою пам’яттю GPU дуже повільне, воно негативно впливає на заявлену продуктивність GPU. Отже, щоб GPU виглядали краще, переконайтесь, що ви запустили годинник після того, як всі дані програми вже передані до пам’яті GPU, ядро запустилось, а зупинили годинник до того, як результати скопійовані назад до основної пам’яті. З цього правила є два наслідки:

Наслідок 1: Ніколи, в жодному разі не звітуйте про продуктивність програми, яка працює на кількох гібридних вузлах. Це вимагає застосування всіх видів комунікації з CPU, Інтерконекту, що в свою чергу вимагає переміщень даних та додаткових системних викликів – а це вже погано для результатів прискорення.

Наслідок 2: Завжди доповідайте про продуктивність окремих модулів, а не програми в цілому. Це особливо справедливо для програм, які містять важливі підпрограми, які надзвичайно складно оптимізувати.

3. Цитуйте вартість та розповсюдженість найдешевших GPU карт. Обчислюйте продуктивність на найкращому обладнанні.
Ось готовий шматок тексту, який ви можете адаптувати для своїх потреб: «Графічні процесори є важливою платформою, на яку варто орієнтуватись, тому що вони коштують до $100 та входять у стандартну комплектацію кожного сучасного комп’ютера. В нашому експерименті ми вимірювали продуктивність NVidia Tesla M2090…».

4. Цитуйте пропускну здатність пам’яті тільки всередині GPU карти, а не пропускну здатність при обміні з основною пам’яттю комп’ютера.
Вражайте аудиторію здатністю прискорювача найвищого класу переміщувати дані в пам’яті зі швидкістю 177 ГБ/сек. Поки вам не треба зберігати, передавати чи застосовувати результати ваших обчислень, це абсолютно чесне число для цитування.

5. Відключіть перевірки коректності пам’яті (ECC).
Графічні прискорювачі працюють швидше, забезпечують більше доступного обсягу пам’яті коли їм не треба так сильно намагатись забезпечити правильність даних. Крім того, хіба якесь з GPU ядер працює достатньо довго, щоб це могло стати проблемою?

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

7. Порівнюйте добре оптимізований код для GPU з не оптимізованим кодом для CPU.
Природно, ви вже переконались, що GPU код працює найшвидше завдяки його адаптації так, щоб він використовував паралелізм даних, локальну пам’ять та інші дружні до GPU програмні прийоми. Тепер не забудьте порівняти його тільки з початковим, простим кодом для CPU, причому не з тою версією, яка широко застосовує SIMD інструкції CPU, правильні блоки для кешу, оптимально вирівнює структури даних або містить будь-які інші прийоми оптимізації продуктивності, про які CPU програмісти рідко турбуються. Безумовно, в жодному разі не переносіть оптимізований GPU код назад на CPU, інакше прискорення у вашій доповіді буде невтішно меншим.

8. Обирайте розмір задачі так, щоб умістити його в пам’ять GPU.
Ця рекомендація працює в обох напрямках. Якщо ваш GPU має 6 ГБ вбудованої пам’яті, а розмір даних вашої програми більше – зменшіть їх до 6 ГБ і ви позбудетесь всіх витрат на синхронізацію та безладну подвійну буферизацію, які тягнуть за собою великі розміри задач. Якщо ваш GPU має 6 ГБ вбудованої пам’яті, а розмір даних вашої задачі значно менший – тоді збільшіть розмір даних, не зважаючи на розумні межі. Так ви зможете отримати переваги додаткової продуктивності від збільшеного паралелізму даних. Наступна рекомендація розвиває цю точку зору:

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

10. Обирайте алгоритми, які краще виконуються на GPU.
Найкращі CPU алгоритми часто не є найкращими на GPU і навпаки. Отже, ви повинні завжди обирати з усіх алгоритмів той, який має найкращі результати на GPU, та порівнювати його з CPU версією. Що хорошого в цьому підході, на відміну від порівняння найкращого GPU та CPU алгоритмів, це те, що порівняння виходить «чесним». Зрештою, ви ж запустили один і той самий алгоритм на обох системах. Чесно, правда?

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

На закінчення, значною мірою пов’язаний коментар: чи можна виключити іменник-оксюморон «GPGPU» з нашого спільного лексикону? Якщо процесор спеціалізується на графічних обчисленнях, тоді він не зовсім пристрій загального призначення, чи не так?

Читайте також:

David H. Bailey. "Highly parallel perspective: Twelve ways to fool the masses when giving performance results on parallel computers". Supercomputing Review, 4(8):54-55, August, 1991. ISSN: 1048-6836. Also appears as NASA Ames RNR Technical Report RNR-91-020.

Rajesh Bordawekar, Uday Bondhugula, and Ravi Rao. "Can CPUs match GPUs on performance with productivity?: Experiences with optimizing a FLOP-intensive application on CPUs and GPU". IBM T. J. Watson Research Center Technical Report RC25033 (W1008-020). August 5, 2010.

Victor W. Lee, Changkyu Kim, Jatin Chhugani, Michael Deisher, Daehyun Kim, Anthony D. Nguyen, Nadathur Satish, Mikhail Smelyanskiy, Srinivas Chennupaty, Per Hammarlund, Ronak Singhal, and Pradeep Dubey. "Debunking the 100X GPU vs. CPU myth: An evaluation of throughput computing on CPU and GPU", Proceedings of the 37th Annual International Symposium on Computer Architecture (ISCA 2010), Saint-Malo, France, June 19-23, 2010. ISBN: 978-1-4503-0053-7, DOI: 10.1145/1815961.1816021.

Теги: CPU, GPU, NVidia, високопродуктивні обчислення, гібридні вузли, гумор, інтерконект, пам'ять, паралельні обчислення, прискорювачі, програмування, продуктивність, процесори, технології

Матеріали за темою:

Коментарі