Попытка на сравнение GPU/CPU?

Простота и сложность GPU.

Почему CPU просто программировать, а GPU сложно?
Каким образом на GPU достигается высокая производительность?
(Далее по тексту под GPU иногда понимается GPU поддерживающие CUDA)

Давайте взглянем на устройство CPU.
Центральное место - конвейер, а вокруг него множество "заплат" или "костылей" -
- переименование регистров
- предсказание переходов (спекулятивное исполнение+логика сброса конвейера)
- поддержка когерентности кэшей
- предвыборка данных
- hyper-threading
- страничная организация памяти

Эти функциональные блоки существуют для того, что бы программист шибко не задумывался о внутреннем устройстве процессора.
Очень редко кто спускается до оптимизации программ не на алгоритмическом уровне, а на аппаратном, и, обычно, дальше использования кэша дело не доходит.
Если же программист, наконец, доходит до программирования на ассемблере и соответствующего уровня оптимизации, то, конечно, он должен начать разбираться во всех деталях современных процессоров.
А деталей оказывается очень и очень много... и в этом случае уже нельзя сказать, что на CPU программировать проще чем GPU - порою кажется, что ещё сложнее.

А на GPU ничего такого нет - там все предельно просто с точки зрения проектирования самого GPU.
Единственные похожие функциональные элементы - планировщик потоков GPU и планировщик внеочередного исполнения CPU.
Одновременно с этим, планировщик потоков - единственный нетривиальный, и при этом неизвестно-как-устроенный функциональный блок мультипроцессора.
(Можно вспомнить про кэши констант и текстур на GPU, но они несравнимо малы, по сравнению с кэшами CPU)

В остальном, ничего предназначенного для упрощения программирования на GPU не имеется - все остальное управляемо. Однако от этой "простоты" программисту жить совсем не просто - надо знать почти все особенности GPU даже для написания небольших программ:
- выровненное использование глобальное памяти
- отсутствие конфликтов по банкам при использовании разделяемой памяти
- наличие самой разделяемой памяти (управляемый кэш)
- максимизация использования разделяемой памяти
- отсутствия полноценных кэшей
- блоки и сетка блоков потоков
- warp'ы и исполнение условных ветвлений
- однотактовое исполнение почти всех команд (4-х тактовое для warp'а)
- слабые средства синхронизации потоков (только барьеры внутри блока потоков)
- отсутствие полноценного отладчика
- нужна в огромном количестве потоков для эффективного исполнения

P.S. Явного вопроса нет. На обсуждение.

Forums: 

omega

В моем понимании это 2 инструмента, взаимно дополняющие друг друга.
Как ложка и вилка.

У СPU - больше разнообразной информции и опыта, не паралллящиеся алгоитмы лучше делать на нем.
У GPU - параллелизм, параллелщиеся задачи (те же фрактлы) - лучше на нем.

И задача-то не ставится весь код программы на GPU тащить.
А если речь идет об оптимизации конкретного алгоритма - то что с особенностями процессора разбираться, что с особенностями GPU - везде придется вникать и делать руками.

Я как раз и пытался сказать,

Я как раз и пытался сказать, что при реализации на CPU редко (очень редко) кто добирается до внутреннего устройства. А на GPU - надо вначале разобраться, а потом делать. Немного разные подходы.
Скорее всего я лишь написал в начале темы несколько понятых мною банальностей. не больше.

Есть ли где список чего неплохо было бы сделать на GPU ? Руки чешутся...

omega

На GPU можно писать что-то, связанное с обсчетом большого количества незвисимых элементов.
Те же видеофильтры можно пописать для начала, взяв за точку отсчета edge фильтр из CUDA SDK.
А вообще, даже lame-кодек тут на видеокарту энтузиасты пытаются закинуть.

фракталы

Какие фракталы долго считать на компьютере?
Чтоб даже на глаз было видно ускорение.

CUDA SDK

В CUDA SDK code samples есть пример, который считает и на компьютере и на GPU http://www.nvidia.com/object/cuda_get.html. Там действительно на глаз видно.