Работает, я надеюсь, все же одинаково. В целом.
Но ведь на производительность сильно влияет конкретная архитектура устройства. И вот тут уже могут вылезти особенности и даже ошибки.
Пример: на моей видеокарте NVidia 8192 регистра, то есть если задать размер группы 512 элементов (максимум для моей видеокарты), то на каждый из них по 16 регистров. Если 16 регистров недостаточно для выполнения kernel — полетит ошибка во время исполенния kernel.
То есть если ужать kernel в 16 регистров не выйдет — прийдется задействовать карту не на полную мощьность.
Для чипов AMD, возможно, такое ограничение будет более сильное или слабое, а может его и вовсе не будет, все зависит от архитектуры.
Такие вещи специфичны для конкретного устройства и знание некоторых может помочь ускорить работу приложения, а, иногда, и сберечь нервы)
Да, это из ТТХ.
В 260-х и старше — регистров больше…
Рамер группы 512 — не обязательно так много, можно и меньше, если много работы с памятью нет, падение будет крайне незначительное.
Комментарий оборвался. Так вот, у меня сейчас валяются 260-ка и 4870, если есть идеи, как можно погонять тестами монстров — готов выслушать (или в ПМ). Величайшим достижением для вас будет запуск аппаратной Phys-X на 4ххх или 5ххх, как уже один раз делали на 3870. Все пользователи АТИ на вас молиться будуь.
можно было бы, например, сравнить производительность драйверов OpenCL Nvidia и AMD. При примерно равных условиях: какой-нибудь простой пример из SDK запустить с одинаковыми global size и work-group size и посмотреть что быстрее… ну это из совсем тривиального…
Только сдается мне одновременно они не заработают — конфликтовать драйверы начнут друг с другом. Хотя это только догадки, конечно.
Не конфликтуют именно драйверы OpenCL? Ну то есть то, что карты разных производителей в одной системе работать могут это факт известный, а вот как там с использованием OpenCL при этом? Хотя по идее должны работать… ведь для того все и задумывалось)
Если будете проводить тесты — напишите пожалуйста, что из этого вышло — очень интересно)
Число регистров итп. для конкретной карты Nvidia можно посмотреть в Nvidia OpenCL Programming Guide (Appendix A) — на него есть ссылка в статье.
Там написано какая карта имеет какую версию Compute Capability, там же и расшифровка, что в себя включает каждая версия Compute Capability.
Тогда из этого утверждения у малознакомого с темой человека вырисуется определение: «Подводная лодка — средство для транпортировки цветов по морским каналам».
Java может использовать драйвер OpenCL.
Чуть выше давали ссылку на java-обертку для OpenCL API.
Насколько я понимаю, это не освобождает от написания kernel на С-подобном языке, а оборачивает только вызовы OpenCL API, описанные в статье.
OpenCL — это компилятор плюс библиотека функций для общения с целевым устройством. Они разные для каждого устройства. О бинарниках, способных выполняться на любых устройствах, о виртуальной машине на GPU и даже о привычной работе с памятью речи (пока) не идет.
OpenCL можно сравнивать разве что с обычным C, но никак не с Java.
Стандартизован язык, на котором можно писать собственно вычислительные функции, а также набор и поведение функций OpenCL API. Один и тот же исходник можно (теоретически, конечно) скомпилировать и запустить на любой платформе, для которой есть подходящий драйвер и компилятор.
А почему функции нецелевые-то?
Уже почти так и есть. Новая архитектура Nbidia Fermi (которая в железе пока в числе 7 уникальных чипов существует) была анонсирована как отлично подходящая под вычисления.
Позже рекламщики Nvidia срочно бросились исправлять перегибы и рассказывать, что для 3D графики архитектура тоже очень подходит и покупать ее для игр тоже имеет смысл.
Ферми пока не существует на потоке, у руля (временно) ATI 5870, по бумажным характеристикам 300-ое поколение нвидии — монстры, очень хочется узнать, что же будет в деле…
> ВНИМАНИЕ!!! oclLoadProgSource — не является функцией OpenCL API, а находятся в вспомогательной библиотеке, поставляемой вместе с Nvidia Computing SDK.
OpenCL. Практика