
- •3.3 Расширение языка c……………………………………………………….46
- •1.1 Задача Дирихле
- •1.2 Метод простых итераций
- •1.3 Методы Якоби
- •1.4 Методы Зейделя и его модификации
- •2 Параллельные методы решения задачи Дирихле для систем с общей памятью
- •2.1 Использование OpenMp для организации параллелизма
- •2.2 Проблема синхронизации параллельных вычислений
- •2.3 Возможность неоднозначности вычислений в параллельных программах
- •2.4 Исключение неоднозначности вычислений
- •2.5 Волновые схемы параллельных вычислений
- •3 Параллельные вычисления с использованием видеокарты
- •3.1 Общие сведения о gpu и nvidia cuda
- •3.1.1 Разница между cpu и gpu в параллельных расчётах
- •3.1.2 Первые попытки применения расчётов на gpu
- •3.1.3 Возможности nvidia cuda
- •3.1.4 Области применения параллельных расчётов на gpu
- •3.2 Аппаратная и программная реализация cuda
- •3.2.1 Состав nvidia cuda
- •3.2.2 Архитектура gpu
- •3.2.3 Модель программирования cuda: потоковая модель
- •3.2.4 Модель программирования cuda: модель памяти
- •3.3 Расширение языка c
- •3.3.1 Директива вызова ядра
- •3.3.2 Основы cuda host api
- •3.3.3 Работа с памятью в cuda
- •3.3.4 Использование событий для синхронизации на cpu
- •3.3.5 Получение информации об имеющихся gpu и их возможностях
- •3.3.6 Компиляция
- •Http://habrahabr.Ru/blogs/cuda/54707/
3.1.3 Возможности nvidia cuda
Технология CUDA — это программно-аппаратная вычислительная архитектура NVIDIA, основанная на расширении языка С, которая даёт возможность организации доступа к набору инструкций графического ускорителя и управления его памятью при организации параллельных вычислений. CUDA помогает реализовывать алгоритмы, выполнимые на графических процессорах видеоускорителей GeForce восьмого поколения и старше (серии GeForce 8, GeForce 9, GeForce 200), а также Quadro и Tesla.
Программно-аппаратная архитектура для вычислений на GPU компании NVIDIA отличается от предыдущих моделей GPGPU тем, что позволяет писать программы для GPU на настоящем языке С со стандартным синтаксисом, указателями и необходимостью в минимуме расширений для доступа к вычислительным ресурсам видеочипов. CUDA не зависит от графических API, и обладает некоторыми особенностями, предназначенными специально для вычислений общего назначения.
Слабыми местами программирования при помощи предыдущих методов GPGPU является то, что эти методы не используют блоки исполнения вершинных шейдеров в предыдущих неунифицированных архитектурах, данные хранятся в текстурах, а выводятся во внеэкранный буфер, а многопроходные алгоритмы используют пиксельные шейдерные блоки. В ограничения GPGPU можно включить: недостаточно эффективное использование аппаратных возможностей, ограничения полосой пропускания памяти, отсутствие операции scatter (только gather), обязательное использование графического API.
Основные преимущества CUDA по сравнению с предыдущими методами GPGPU вытекают из того, что эта архитектура спроектирована для эффективного использования неграфических вычислений на GPU и использует язык программирования C, не требуя переноса алгоритмов в удобный для концепции графического конвейера вид. CUDA предлагает новый путь вычислений на GPU, не использующий графические API, предлагающий произвольный доступ к памяти (scatter или gather).
Рис. 11 Произвольный доступ к памяти
Такая архитектура лишена недостатков GPGPU и использует все исполнительные блоки, а также расширяет возможности за счёт целочисленной математики и операций битового сдвига.
Кроме того, CUDA открывает некоторые аппаратные возможности, недоступные из графических API, такие как разделяемая память. Это память небольшого объёма (16 килобайт на мультипроцессор), к которой имеют доступ блоки потоков. Она позволяет кэшировать наиболее часто используемые данные и может обеспечить более высокую скорость, по сравнению с использованием текстурных выборок для этой задачи. Что, в свою очередь, снижает чувствительность к пропускной способности параллельных алгоритмов во многих приложениях.
Удобнее в CUDA и доступ к памяти. Программный код в графических API выводит данные в виде 32-х значений с плавающей точкой одинарной точности (RGBA значения одновременно в восемь render target) в заранее предопределённые области, а CUDA поддерживает scatter запись — неограниченное число записей по любому адресу. Такие преимущества делают возможным выполнение на GPU некоторых алгоритмов, которые невозможно эффективно реализовать при помощи методов GPGPU, основанных на графических API.
Также, графические API в обязательном порядке хранят данные в текстурах, что требует предварительной упаковки больших массивов в текстуры, что усложняет алгоритм и заставляет использовать специальную адресацию. А CUDA позволяет читать данные по любому адресу. Ещё одним преимуществом CUDA является оптимизированный обмен данными между CPU и GPU. А для разработчиков, желающих получить доступ к низкому уровню (например, при написании другого языка программирования), CUDA предлагает возможность низкоуровневого программирования на ассемблере.
Хотя трудоёмкость программирования GPU при помощи CUDA довольно велика, она ниже, чем с ранними GPGPU решениями. Такие программы требуют разбиения приложения между несколькими мультипроцессорами подобно MPI программированию, но без разделения данных, которые хранятся в общей видеопамяти. И так как CUDA программирование для каждого мультипроцессора подобно OpenMP программированию, оно требует хорошего понимания организации памяти.
Для трансляции кода с языка С в состав CUDA SDK входит компилятор командной строки nvcc, созданный на основе открытого компилятора Open64.
Перечислим основные характеристики CUDA:
унифицированное программно-аппаратное решение для параллельных вычислений на видеочипах NVIDIA;
большой набор поддерживаемых решений, от мобильных до мультичиповых;
стандартный язык программирования С;
стандартные библиотеки численного анализа FFT (быстрое преобразование Фурье) и BLAS (линейная алгебра);
оптимизированный обмен данными между CPU и GPU;
взаимодействие с графическими API OpenGL и DirectX;
поддержка 32- и 64-битных операционных систем: Windows XP, Windows Vista, Linux и MacOS X;
возможность разработки на низком уровне.
Среда разработки CUDA (CUDA Toolkit) включает:
компилятор nvcc;
библиотеки FFT и BLAS;
профилировщик;
отладчик gdb для GPU;
CUDA runtime драйвер в комплекте стандартных драйверов NVIDIA;
руководство по программированию;
CUDA Developer SDK (исходный код, утилиты и документация).
CUDA является полностью бесплатной. На данный момент последней версией является CUDA 4.0.