Вычисления на GPU или GPGPU заключаются в использовании GPU (графического процессора) для универсальных вычислений в области науки и проектирования.
GPU вычисления представлены совместным использованием CPU и GPU в гетерогенной модели вычислений. Стандартная часть приложения выполняется на CPU, а более требовательная к вычислениям часть обрабатывается с GPU ускорением. С точки зрения пользователя приложение работает быстрее, потому что оно использует высокую производительность GPU для повышения производительности.

После нескольких лет эволюции GPU способен обеспечить терафлопы производительности при проведении вычислений с плавающей запятой. В 2006-2007 компания NVIDIA произвела революцию в GPGPU и ускорила вычисления благодаря новой архитектуре массивно параллельных вычислений CUDA. Архитектура CUDA состоит из сотен процессорных ядер, которые работают в связке, чтобы разом справится с набором данных в приложении.
Главным успехом GPGPU в течение последних нескольких лет стала простота программирования соответствующей модели параллельных вычислений. Благодаря данной модели программирования разработчики могут изменить свои приложения и перенаправить обработку требовательных к ресурсам блоков программ на GPU. Остальная часть приложения выполняется на CPU. Для переноса функции программы на GPU требуется изменение кода функции для включения возможностей параллелизма и добавление ключевых слов «C», позволяющее перенос данных с и на GPU. Задача разработчика – задействовать десятки тысяч потоков одновременно. Аппаратное обеспечение GPU контролирует и планирует потоки.
Графические процессоры Tesla серии 20 основаны на архитектуре «Fermi», являющейся третьим поколением архитектуры CUDA. Архитектура Fermi оптимизирована для выполнения научных приложений благодаря ключевым возможностям, включающим аппаратную поддержку вычислений с плавающей запятой по стандарту IEEE с производительностью в более 500 гигафлоп, L1 и L2 КЭШ, защиту памяти ECC, управляемый пользователем локальный дата-КЭШ в виде разделяемой памяти на GPU, совместный доступ к памяти и т.п.
История вычислений на GPU
История графических чипов началась с графических конвейеров с фиксированной функциональностью. Постепенно их программируемость все возрастала, и в конце концов NVIDIA представила первый GPU, или графический процессор. В 1999-2000 годах специалисты в компьютерной области и научные работники в таких сферах, как получение медицинских изображений и электромагнетизм, перешли на GPU для вычислительных приложений общего назначения. Они обнаружили, что высокая производительность вычислений с плавающей точкой графических процессоров значительно ускоряла работу научных приложений. Это стало началом мощного движения, называющегося GPGPU или вычисления общего назначения на GPU.
Но возникла проблема – для GPGPU были необходимы графические языки программирования, такие как OpenGL и Cg, для программирования GPU. Разработчикам приходилось делать научные приложения похожими на графические приложения, отрисовывая треугольники и полигоны. Это ограничивало доступность огромной производительности GPU для науки.
Компания NVIDIA поняла, насколько велик потенциал данной производительности в научной области, и направила свои ресурсы на модификацию GPU, делая графический процессор полностью программируемым для использования в научных приложениях, также NVIDIA добавила поддержку высокоуровневых языков, таких как C, C++ и Fortran. Так родилась архитектура CUDA для GPU.
Архитектура параллельных вычислений CUDA и программируемая модель
Аппаратной архитектуре параллельных вычислений CUDA сопутствует среда программирования CUDA, которая обеспечивает набор абстракций, позволяющих выражать как паралеллизм данных, так и параллелизм задач. Программист сам выбирает средства разработки: языки высокого уровня, такие как C, C++, Fortran, или же API - OpenCL™ и DirectX™-11 Compute.

Сегодня NVIDIA обеспечивает поддержку программирования GPU на C, C++, Fortran, OpenCL и DirectCompute. Набор инструментов для разработки, а также библиотеки и аппаратно-программные решения, доступные разработчикам, показаны на изображении выше, мы также приводим ссылки в данном тексте . Для программирования GPU используется язык C с минимальным набором ключевых слов и расширений. Вскоре будет предоставлена поддержка Fortran, OpenCL и т.д.
Программируемая модель CUDA подсказывает программистам, как разделить задачу на подзадачи, которые можно решать параллельно и независимо друг от друга. Мелкоструктурный параллелизм в подзадачах заключается в том, что каждую подзадачу можно решать сообща.
OpenCL является товарным знаком Apple и используется по лицензии Khronos Group Inc.
DirectX является зарегистрированным товарным знаком Microsoft Corporation.