Выкладываю слайды со встречи, проходившей вчера на физфаке МГУ.
По сравнению с тем, что было показано в аудитории, стало чуть больше слайдов и добавлен небольшой список литературы (учебные курсы и статьи, которые упоминались с голоса)
В данной статье рассмотрим бинарный поиск и связанную с ним задачу сортировки. Попытаемся сделать теоретическую оценку алгоритмов и провести практические тесты.
Введение
Данная статья является продолжением темы . В этой теме рассматривался простейший линейный поиск на графическом процессоре с помощью технологии nVidia CUDA. В наихудшем случае т.е. когда искомый элемент массива был последним, алгоритм на GPU превзошел свой аналог на CPU почти на 40%. Количество элементов в массиве было равно количеству процессоров. Такие условия задачи достаточно хороши для GPU. Однако, как быть в других условиях? Как с ними справиться GPU? Подходит ли он для других алгоритмов? Что ж, попытаемся ответить на эти вопросы.
По случаю выхода , описанное в несколько устарело. Теперь все иначе, по меньшей мере под Windows.
OpenCL.DLL устанавливается и драйверами NVidia (поверх имеющегося) и ATI SDK (только если в системе такого нет? если в системе есть более старый?) . При этом тот вариант, который ставят драйвера NVidia 196.xx - хороший, позволяющий работать и с NVidia и с ATI картами без каких-то избыточных телодвижений, а вот ATI-шный в двухкарточном варианте у меня вызывал непонятные проблемы.
После на двух машинах, я загорелся сделать это на одной.
Стандартные системные требования в этом случае простые: две G92/G200 видеокарты, к одной подключается монитор (мониторы, если их несколько), вторая настраивается как "ускоритель PhysX" (без подключенного монитора) и все должно работать.
У меня в рабочей машине - две видеокарты, но и сделать так, как написано выше - невозможно, если отключить от NVidia-карты мониторы, то она пропадает из системы, запустить CUDA-программу даже локально (без Nexus) не выходит. Вынимать ATI (менять на NVidia) не хотелось, для третьей двухслотовой карты места в машине нет, покупать еще одну видеокарту хотелось еще меньше.
Стандартные системные требования в этом случае простые: две G92/G200 видеокарты, к одной подключается монитор (мониторы, если их несколько), вторая настраивается как "ускоритель PhysX" (без подключенного монитора) и все должно работать.
У меня в рабочей машине - две видеокарты, но одна из них NVidia, а вторая - ATI и сделать так, как написано выше - невозможно, если отключить от NVidia-карты мониторы, то она пропадает из системы, запустить CUDA-программу даже локально (без Nexus) не выходит. Вынимать ATI (менять на NVidia) не хотелось, для третьей двухслотовой карты места в машине нет, покупать еще одну видеокарту хотелось еще меньше.
UPDATE: от большинства проблем удалось избавиться просто переустановкой NVidia Nexus на обеих машинах. Secure connection заработала, синхронизация - преимущественно заработала, хотя бывают необъяснимые сбои (и тогда надо удалить синхронизируемые файлы с той машины, на которую копируем т.е. ту, где Nexus Monitor).
Update2 И с виртуальной машиной , поэтому проще поменять полностью текст, чем вносить еще поправки:
Если не работает синхронизация или Secure connection (при стандартных настройках, когда вы ничего не меняли) - попробуйте переставить Nexus Monitor, мне помогло.
Иногда (закономерность понять не удалось) синхронизация файлов не может синхронизироваться. Тогда нужно вручную удалить синхронизируемые файлы с той машины, где запущен Nexus Monitor (на Win7/Vista это %user profile%/AppData/Roaming/Nvidia corporation/Nexus/Monitor/Mirror/)
Как ни печально, но поведение драйверов NVidia ничем не лучше драйверов ATI: чтобы CUDA/OpenCL работали, к какой-то видеокарте NVidia должен быть подключен какой-то из активных дисплеев.
Таким образом, идея потестировать NVidia Nexus на одной машине с двумя видеокартами, одна ATI и одна NVidia, полностью провалилась: если к Geforce не подключать монитор, то с точки зрения CUDA/NEXUS этой карты не существует. Вот если бы у меня было две карты NVidia, разговор был бы другой.
Вопрос о совместимости OpenCL между железом разных производителей - является необычайно волнительным. Понятно, что задумывалось все совместимым, но насколько это получилось и сколько граблей разложено на пути к этой совместимости - отдельный интересный вопрос, который перешел в практическую плоскость сразу после выпуска ATI Stream SDK 2.0 beta 4, где появилась поддержка OpenCL на графическом адаптере. До того поддержка OpenCL на PC была только у NVidia и вопрос был сугубо теоретическим.
Как только мне в руки попал Radeon HD5870, так сразу захотелось тему исследовать... и в первом приближении я ее изучил.
Как и обещали, публике предъявили новый чипсет и новые видеокарты на нем. Нас они интересуют не с точки зрения графики, а с точки зрения вычислений, так их и рассмотрим.
То что анонсировано, сильно отличается от того, что прогнозировали весной, никакого терафлопа нету, новый чипсет медленнее и предыдущей топовой модели 8800Ultra и следующей за ней 8800GTX.
Предыдущая моя статья на эту тему
была написана в феврале 2007 года, сразу после выхода первой публичной бета-версии
. Представители NVidia предупреждали,
что в бета-версии производительность не является оптимальной, к релизу она будет улучшена.
На параллельных архитектурах часто приходится делать операцию reduce (складывать и умножать вектора, считать среднее и так далее). В отличие от однопоточной конструкции, где все тривиально, параллельная reduce разбивается на два этапа: сначала мы всеми исполняющими юнитами обрабатываем куски данных, а потом должны сложить (усреднить, поделить) результаты уже меньшим числом процессоров.
Для второго шага reduce обычно используется пирамидальная схема: сначала в N/2 потоков сложим N результатов попарно, затем сложим N/2 в N/4 и так далее.