OpenCL, NVidia, ATI и все все все....

Вопрос о совместимости OpenCL между железом разных производителей - является необычайно волнительным. Понятно, что задумывалось все совместимым, но насколько это получилось и сколько граблей разложено на пути к этой совместимости - отдельный интересный вопрос, который перешел в практическую плоскость сразу после выпуска ATI Stream SDK 2.0 beta 4, где появилась поддержка OpenCL на графическом адаптере. До того поддержка OpenCL на PC была только у NVidia и вопрос был сугубо теоретическим.

Как только мне в руки попал Radeon HD5870, так сразу захотелось тему исследовать... и в первом приближении я ее изучил.

Первое приближение: жизнь есть

Более того, какая-то совместимость достигается и без перекомпиляции приложений. Если быть точным то:
  • Часть примеров из NVidia SDK работает на оборудовании ATI, часть - работает частично (т.к. нет нужных свойств, например интеграции OpenCL/OpenGL), часть - не работает. Все проверялось без перекомпиляции/перелинковки приложений, на готовых бинарных файлов.
  • Аналогично, часть примеров ATI SDK работает без проблем, часть - ругается, дескать не хватает чго-то.

Но в первом приближении - жить можно. Да, надо иметь зоопарк железа для тестирования т.к. архитектура везде разная и оптимальные kernels, соответственно, будут тоже разными.

DLL Hell

DLL Hell имеется в полный рост, причем есть все предпосылки к тому, что дальше будет еще хуже:

  • OpenCL.dll для карты NVidia поставляется вместе с драйвером и впоследствии оказывается в \Windows\SysWOW64 (у меня 64-битная система, на 32-битной наверное окажется в Windows\System32)
  • OpenCL.dll для ATI - является частью SDK и ставится в \Program Files\ATI Stream
Соответственно, в зависимости от $PATH приложение работает с одной, либо другой видеокартой.

Как только ATI включит эту DLL в поставку драйверов - сразу начнется драка с NVidia в полный рост, я предсказываю это.

Странности с ATI

Часть примеров ATI SDK работает нормально только если монитор, подключенный к Radeon является primary display. Код этих примеров я внимательно не рассматривал, на невнимательный взгляд такого быть не должно бы. Нужно разбираться, возможно это происки бета-версии.

Производительность

Оценка производительности - задача сложная, особенно с учетом разницы в архитектурах. Поэтому приведу лишь одну цифру, относиться к которой нужно крайне осторожно. Один шаг примера Nbody (из ATI SDK) с числом частиц 9984 исполняется, согласно его внутренней измерялке:

  • 280 миллисекунд на CPU (i7, 3.6Ghz)
  • 28 миллисекунд на ATI HD5870
  • 12 миллисекунд на NVidia GTX280

При увеличении размеров задачи относительная разница между GPU уменьшается (66/45 ms для 19968 частиц), возможно дело вообще в стадии инициализации или еще в чем-то подобном. В то же время, я ожидал, что HD5870 будет заметно быстрее GTX280, возможно архитектура NVidia больше подходит именно к задаче многих тел.

content classify: 

Tags: