AMD/ATI и GPGPU

Я как-то не уследил, потому что AMD/ATI-шными видеокартами начал интересоваться с выходом HD5xxx, а оказывается все очень весело. На gpgpu.ru это уже пообсуждали, ну я сюда наброшу, в более концентрированном виде.

Раньше высокоуровневым средством для разработки считалок на видеокартах у ATI был Brook+. Однако начиная с какой-то беты ATI Stream SDK 2.0 Brook из SDK исчез.

Читаем в ATI-шном форуме (это август-2009):

Yes, this SDK 2.0 beta is for CPU only. It focuses on OpenCL 1.0 for CPU. Brook+ is now available on SourceForge: http://sourceforge.net/projects/brookplus

Ну ладно, Stream SDK Beta-1 вообще не поддерживает никаких видеокарт, смешно.

Потом выходит уже релиз Stream SDK 2.0, который поддерживает:

  • HD5xxx
  • HD4xxx
  • ну и соответствующие им мобильные и профессиональные карты.
  • CPU - тоже (и вообще, интересно - не является ли это дешевым способом использовать SSE).

Получается, владельцев Radeon 2000/3000 просто оставили за бортом.

Но и это - тоже не все. В тех же форумах в треде жалобно озаглавленном OpenCL performance issues читаем:

This is entirely dependent on how you coded the kernel and what OpenCL features you are using. There are known performance issues for HD4XXX series of cards on OpenCL and there is currently no plan to focus exclusively on improving performance for that family. The HD4XXX series was not designed for OpenCL whereas the HD5XXX series was. There will be performance improvements on this series because of improvements in the HD5XXX series, so it will get better, but it is not our focus.

For example, if you are using local memory, they are all currently emulated in global memory. So it is possible you are going out to main memory twice as often as you do on NVidia. This can cause a fairly large performance hit if the application is memory bound. On the HD5XXX series, local memory is mapped to hardware local and thus is many times faster than the HD4XXX series.

Получается, что владельцы Radeon 4xxx тоже несколько кинуты, потому как типичная OpenCL-программа использует shared memory.

Ну и на закуску: у меня в рабочей станции сейчас Radeon HD5870 и NVidia GTX280. По всем игровым тестам, первая - сильно быстрее (в наихудшем случае - на уровне GTX285, которая есть сильно разогнаная моя). Но:

Берем пример из ATI SDK (конкретно, NBody), запускаем на карте NVidia без перекомпиляции и эта самая годовалая GTX280 в два с хреном раза быстрее (мерял на бете ATI SDK, но на релизе - ровно те же цифры).

У меня на эту тему следующая теория:

  1. OpenCL и NVidia CUDA - близнецы-братья по смыслу. Я не думаю, что Khronos-у платили взятку, просто к моменту начала рождения спецификаций у NVidia уже было все работающее, а у ATI был только Stream Computing, который относительно OpenGL-ного компьютинга ничего нового не привносит (у них и scatter не было, был MRT в 4, если не путаю, разных потока). Т.е. объединять было особо нечего, CUDA в смысле идей была на голову выше.
  2. Ну и пока писали спеки (минимум год, я думаю), AMD спешно рожала карту, которая эти спеки (имени NVidia, по сути) способна разумно исполнять. Поддержку старых карт пришлось выкинуть, да.

Естественно, за пару лет и карты и SDK вылижут и опять не будет большой разницы между. Но пока - если вы собираетесь кроссплатформенно считать, то есть OpenCL (реально кроссплатформенный, NVidia/ATI/CELL, Windows/Linux/Mac), но в production я об ATI пока думать не советую. Пусть еще полгода-год потренируются на кошках.

P.S. Конечно, есть еще CAL/IL, если охота писать на ассемблере, то в SDK все есть.

Comments

АМД просто исторически недооценила GPGPU и не тратила деньги/время на разработку SDK. я не думаю, что их железная архитектура хуже для GPGPU, просто не могут пока толком написать дрова. хотя да, shared memory у них раньше физически не было, ибо для игр он сильно не нужен.

думаю надо писать в OpenCL и по стандарту, а производительность уж пусть будет на совести АМД.

Ну я скорее про то, как пользователи предыдущих архитектур были ловко кинуты.

А приложения писать - да, надо под OpenCL, не на ассемблере же этом чудовищном (который IL)

А что ам можно считать-то, расскажи ?
тамже, по идее, только 32бит целые и 32бит с плавающей, или я отстал от жизни ?

Во-первых, двойная точность есть, начиная с NVidia GT2xx и 4000-х радеонов.
У NVidia немного плюшевая (производительность относительно маленькая), но есть.

Во-вторых, двойная точность нужна далеко не для всех задач. Скажем, такая вот задачка, как работа с цветовыми пространствами (ну там быстро сделать LAB из RGB или один RGB из другого) - прекрасно параллелится и столь же прекрасно не требует двойной точности.

Спасибо, не знал.

Да, сначала казалось, что поддержка CPU как-то надуманно и мало интересно. Но, порешав несколько задач, поменял мнение. Ловко поддерживается SSE и не надо задумываться о распараллеливании. Делаю сейчас трассировку лучей на OpenCL и время работы на процессоре меня порадовало. Даже появилось желание реализовать на чистом Си, разумеется без всяких диких оптимизаций, и проверить насколько использование OpenCL облегчит жизнь уже на данный момент.