
- •Министерство образования республики беларусь белорусский госудастрвенный университет Факультет прикладной математики и информатики
- •Минск 2010 аннотация
- •Анатацыя
- •Реферат
- •Введение
- •1. Фильтры
- •1.1 Фильтр Гаусса
- •1.2 Базовый случай фильтра Гаусса
- •1.3 Применение фильтра Гаусса с помощью преобразования Фурье
- •1.3.1 Дискретное преобразование Фурье
- •1.3.2 Быстрое преобразование Фурье
- •1.4 Рекурсивный фильтр Гаусса
- •2. Методы параллелизации. OpenCl
- •2.1 Выбор платформы
- •2.3 Применение технологии OpenCl к рекурсивному фильтру
- •3. Сравнительный анализ, условия тестирования, результаты
- •4. Выводы
- •Заключение
- •Список использованных источников
- •Приложение а. Руководство пользователя
- •Приложение б. Листинг программы
2.1 Выбор платформы
Наиболее распространенными видами параллелизации на данный момент является многопоточность стандартными средствами центрального процессора и многопоточность средствами GPU. К первому типу относится наиболее универсальная платформа под названием OpenMP. OpenMP реализует параллельные вычисления с помощью многопоточности, в которой «главный» (master) поток создает набор подчиненных (slave) потоков и задача распределяется между ними. Предполагается, что потоки выполняются параллельно на машине с несколькими процессорами (количество процессоров не обязательно должно быть больше или равно количеству потоков). Количество создаваемых потоков может регулироваться как самой программой при помощи вызова библиотечных процедур, так и извне, при помощи переменных окружения.
Однако процессоры общего назначения менее приспособлены к интенсивным арифметическим вычислениям, в отличие от GPU, которые проектируются как раз для этих целей. Поэтому посмотрим в их сторону, что приводит нас к следующему понятию.
GPGPU (англ. General-purpose graphics processing units — «GPU общего назначения») — техника использования графического процессора видеокарты для общих вычислений, которые обычно проводит центральный процессор. На данный момент существуют следующие реализации:
AMD FireStream — технология GPGPU, позволяющая программистам реализовывать алгоритмы, выполнимые на графических процессорах ускорителей ATI.
CUDA — технология GPGPU, позволяющая программистам реализовывать на языке программирования Си алгоритмы, выполнимые на графических процессорах ускорителей GeForce восьмого поколения и старше (GeForce 8 Series, GeForce 9 Series, GeForce 200 Series), Nvidia Quadro и Nvidia Tesla компании Nvidia. Технология CUDA разработана компанией Nvidia.
Direct3D 11 — вычислительный шейдер (англ. Compute Shader).
OpenCL является языком программирования задач, связанных с параллельными вычислениями на различных графических и центральных процессорах.
Как видно, каждый производитель пытается продвинуть на рынок именно свою технологию, и только OpenCL является открытым стандартом, который поддерживается на большинстве современных ускорителях.
2.2 OpenCL
OpenCL (от англ. Open Computing Language — открытый язык вычислений) — платформа для написания компьютерных программ, связанных с параллельными вычислениями на различных графических (GPU) и центральных процессорах (CPU). В фреймворк OpenCL входят язык программирования, который базируется на стандарте C99, и интерфейс программирования приложений (англ. API). OpenCL обеспечивает параллелизм на уровне инструкций и на уровне данных и является реализацией техники GPGPU. OpenCL является полностью открытым стандартом, его использование не облагается лицензионными отчислениями.
Цель OpenCL состоит в том, чтобы дополнить OpenGL и OpenAL, которые являются открытыми отраслевыми стандартами для трёхмерной компьютерной графики и звука, пользуясь возможностями GPU. OpenCL разрабатывается и поддерживается некоммерческим консорциумом Khronos Group, в который входят много крупных компаний, включая Apple, AMD, Intel, nVidia, Sun Microsystems, Sony Computer Entertainment и другие.
Машина, на которой проводятся вычисления может содержать процессоры x86, x86-64, Itanium, SpursEngine (Cell), NVidia GPU, AMD GPU, VIA (S3 Graphics) GPU. Для каждого из этих типов процессов существует свой SDK (кроме разве что VIA), свой язык программирования и программная модель.
OpenCL задумывался как технология для создания приложений, которые могли бы исполняться в гетерогенной среде. Более того, он разработан так, чтобы обеспечивать комфортную работу с такими устройствами, которые сейчас находятся только в планах и даже с теми, которые еще никто не придумал. Для координации работы всех этих устройств гетерогенной системе всегда есть одно «главное» устройство, который взаимодействует со всеми остальным посредствами OpenCL API. Такое устройство называется «хост», он определяется вне OpenCL.
Поэтому OpenCL исходит из наиболее общих предпосылок, дающих представление об устройстве с поддержкой OpenCL: так как это устройство предполагается использовать для вычислений – в нем есть некий «процессор» в общем смысле этого слова, назовём его «клиент». Нечто, что может исполнять команды. Так как OpenCL создан для параллельных вычислений, то такой процессор может, иметь средства параллелизма внутри себя (например, несколько ядер одного CPU, несколько SPE процессоров в Cell). Также элементарным способом наращивания производительности параллельных вычислений является установка нескольких таких процессоров на устройстве (к примеру, многопроцессорные материнские платы PC и т.д.). И естественно в гетерогенной системе может быть несколько таких OpenCL-устройств (вообще говоря, с различной архитектурой).
Кроме вычислительных ресурсов устройство имеет какой-то объем памяти. Причем никаких требований к этой памяти не предъявляется, она может быть как на устройстве, так и вообще быть размечена на ОЗУ хоста (как например, это сделано у встроенных видеокарт).
Такое широкое понятие об устройстве позволяет не накладывать каких-либо ограничений на программы, разработанные для OpenCL. Эта технология позволит разрабатывать как приложения, сильно оптимизированные под конкретную архитектуру специфического устройства, поддерживающего OpenCL, так и те, которые будут демонстрировать стабильную производительность на всех типах устройств (при условии эквивалентной производительности этих устройств).
OpenCL предоставляет программисту низкоуровневый API, через который он взаимодействует с ресурсами устройства. OpenCL API может либо напрямую поддерживаться устройством, либо работать через промежуточный API (как в случае NVidia: OpenCL работает поверх CUDA Driver API, поддерживаемый устройствами), это зависит от конкретной реализации не описывается стандартом.