Итак, мы поговорили о векторных процесорах Мы ввели идею векторной обработки по принципу одной инструкции для набора данных (SMP-архитектура). И, я хотел уделить несколько слов типичному случаю, когда вы видите что-то, напоминающее процессор для векторной обработки, что однако не совсем является векторным процессором. И это графические вычислительные процессоры. Это компоненты графической карты вашего компьютера. Так, мой ноутбук, который вы видите, имеет внутри графический чип компании ATI. И я собственно запускау на нём программный код, скомпилированный из инструкций языка OpenCL, что является примером типичного использования графического процессора. Итак, одна из идей, с которой я хочу начать, состоит в том, что такого рода архитектуры выглядят отличными от привычных компьютерных архитектур. И основной причиной этому служит тот факт, что они не были спроектированы для того выполнять вычисления общего назначения. Они были спроектированы для отрисовки трехмерной графики. Так, ранние версии имели фиксированную схему конвееров обработки, не предоставляя возможностей по их ручному программированию. Их использование для вычислений общего плана было невозможным. Но вскоре архитектура начала предоставлять чуть больше гибкости. Примером этому служат пиксельный шейдеры оригинальных чипов компании NVidia. Идей состояла в том, что в процессе попиксельной отрисовки (рендеринга) трехмерной сцены для формирования изображения для игры или тому подобного для индивидуального пикселя возникает возможность небольшой модификации (кастомизации) того, как именно он дожен быть отрисован. Так, для программиста компьютерных игр, это означало написание небольшой программы(процедуры) для обработки каждого пикселя в процессе его отрисовки на экран. Итак в процессе отрисовки идёт постоянное выполнение небольших процедур. Что действительно интересно во всём этом, в такого рода пиксельный шейдерах, так это то, что для них был разработан специализированный язык программирования. И самым первым примером выполнения вычислений общего назначения на данной архитектуре был тот, когда программисты писали шейдеры для отрисовки пикселей, но в действительности добивались иного. С помощью пиксельный шейдеров они реализовывали иную вычислительную задачу, обработку или алгоритм. Так, мы можем сделать перемножение матриц, а результат оформить как изображение. (Улыбка). Несколько творческий подход и идея. Это вроде как взять одно изображение, ещё одно изображение и выполнить некую особую шейдерную обработку над ними, как если бы это предназначалось для формирования трехмерной сцены. И вдруг, в результате вывода будет получено пользовательское преобразование. Итак, специалисты по компьтерной графике, те, которые связанны с индустрией и визуализацией на графических вычислительных процессорах поняли простую идею, что, возможно, мы можем сделать всё несколько проще, расширить аудиторию пользователей, предложив им не только графические карты как готовые инструменты, но предоствив им возможность писать на них собственные приложения. Итак, они стали делать из графических карт инструмент для всё более и более общих вычислений. Вместо того, чтобы иметь возможность написания только пиксельных шейдеров или работать над единственным пикселем в заданный момент времени, то есть делать преобразования пиксельно-ориентированными, ориентированными лишь на компьютерную графику, пришла идея пересмотреть всё и прийти к некой программной модели, сформировать элементы архитектуры, которые сделали бы её пригодной для вычислений более общего назначения. Таким образом получая возможность запуска и выполнения новых программ. Вот, именно это и произошло. И как я уже говорил, первыми кто начал использовать новые возможности и учиться программировать стали те, кто пытался на языке шейдеров реализовывать вычислительные задачи, как те же векторные и вершинные преобразования, что на тогдашней архитектуре требовало колоссальных усилий. Поскольку приходилось думать о всём, как об изображении в странице памяти и о предвычислениях, которые над ними выполнялись. Если мы немного промотаем вперёд, то мы увидим несколько новых языков программирования. Они позволили ускорить написание приложений, а архитектуры ориентировались всё более и более на общие вычисления. Итак, мы подошли к вычислительным процессорам общего назначения. Мы и сейчас по-прежнему имеем GPU и они по-прежнему обеспечивают выполнение вычислений общего типа. Но после мы добавили еще один префикс GP вперед и назвали новый инструмент GPGPU - графические вычислители общего назначения дословно (общего назначения графические вычислительные процессоры). Хорошим примером служат предложенный компанией NVidia язык программирования CUDA Он не был первым специализированным языком такого рода Существует ряд предшествующих исследовательских разработок в создании специализированного языка и предшествовавших идей. Но мы еще вернёмся к этому вопросу несколько позднее. Модель разработки и программирования GPGPU является особенной. Она включает в себя модель многопоточности. Давайте поговорим об этом более детально. Но прежде всего я хочу выделить несколько особенностей, которые отличают GPGPU от векторных процессоров. GPGPU работает в взаимодействии с центральным процессором, выполненным по x86 архитектуре. Далее взаимодействие осуществляется через коммуникационно-управляющую шину ввода/вывода: шину PCIE или PCI или шину AGP Таким образом есть взаимодействие с центральным (host) процессором, но нет управляющего процессора, как в векторных процессорах, в том понимании, в котором мы говорили на последней лекции. Скалярный процессор не интегрирован, расположен "далеко" и вовсе не управляет организацией вычислений настолько строго. Фактически идёт одновременное функционирование двух вычислительных элементов: центрального процессора и графического вычислителя. И именно поэтому необходимо выполнение каким-то образом управляющего кода на векторизованном устройстве Модель выполнения, в которой присутствует взаимодействие с центральным процессором имеет ряд преимуществ. Мы получает возможность эффективного выполнения легко распараллеливаемых фрагментов кода в то время как центральный процессор выполняет последовательную логику приложения или сопроцессор, который подключен к нему через шину и выполняет другие вычисления. Здесь давайте остановимся поподробнее и поговорим о унифицированной вычислительной архитектуре, той для которой и спроектирован язык CUDA CUDA является отражением взгляда компании Nvidia на программирование, или модель программирования для графических процессоров от Nvidia. Также есть промышленного более широко принятый способом программирования, который использует примерно аналогичную модель программирования под названием OpenCL, чьё имя символизирует связь с широко известной библиотекой OpenGL, используемой для для 3D-рендеринга. Итак, здесь вам придется поверить мне на слово. Что по моему мнению эта модель немного странна. Но, давайте поговорим о том, что из себя представляет CUDA. Так в CUDA, давайте скажем у нас есть цикл. Давайте для начала возмём реализацию не на CUDA Итак вам нужно сильные, сильной использования прогнозный чтобы позволить потокам перейти разные направления. Таким образом ситуация еще более усложняется в Эти архитектуры. Эти GPU, общего назначения GPU архитектуры и принять .