Введение
Вычисления общего назначения с использованием графических процессоров (GPU) прошли долгий путь с тех пор, как пионеры этого направления использовали графически ориентированные шейдерные языки для реализации своих исследований с использованием этой концепции. Хотя интерфейсы программирования приложений (API) CUDA (от компании Nvidia) и OpenCL (от компании Khronos) сегодня значительно облегчают использование GPU для вычислений общего назначения и позволяют абстрагироваться от многих сложностей массивных параллельных архитектур графических процессоров, написание эффективного кода для GPU ускорителей остается проблемой. Необходимо рассмотреть много разных аспектов, включая общую стратегию распараллеливания данной вычислительной задачи, как и что связывать между GPU и хостом и как использовать различные пространства памяти, доступные программисту. Все это усугубляется быстрым потоком новых функций, которые улучшают работу графического процессора, но увеличивают количество вариантов, которые должны исследовать и обработать программисты.
Что такое GeNN
С помощью построенных на GPU улучшенных нейронных сетей (GPU enhanced neuronal networks) GeNN исследователи разработали промежуточное программное обеспечение, использующее эвристику, специфичную для области применения нейронных сетей с пиками нагрузок, для облегчения работы программистов связанных с наукой. В частности, в GeNN пользователи определяют модель нейронной сети, предоставляя следующие компоненты в простом C ++ API:
- - Описания моделей нейронов, включая строки кода для обновления состояния нейронов и обнаружения пиков;
- - Описания моделей синапсов, включая правила обновления для предсинаптических пиков, пресинаптических пиковых «событий», определения для этих пиковых «событий» и потенциально обучающие правила;
- - Постсинаптические модели, описывающие, как пресинаптическая активация транслируется в постсинаптический ток;
- - Определение популяций нейронов, основанное на любом из описанных типов нейронов;
- - Определение популяций синапсов, полная исходная и целевая популяция нейронов, синаптическая модель и постсинаптическая модель.
На основе этого протокола, GeNN создает оптимизированный код для запуска модели на любых обнаруженных аппаратных ускорителях с поддержкой NVIDIA CUDA. Если присутствует несколько ускорителей, GeNN обнаружит наиболее подходящий и использует его. При создании кода GeNN позаботится, о таких важных моментах как выбор используемого устройства, размерах блоков, так и о том, как эффективно передавать пики и всплески событий, и учитывать ситуации, когда размеры популяций нейронов не соответствуют оптимальному размеру блока, и необходимо отслеживать индексы для более эффективных методов вычисления разреженной матрицы. Это освобождает ученого занимающегося исследованиями от сосредоточенности на настройках оборудования.
GeNN, разработана с учетом максимальной гибкости и прозрачности для опытных пользователей. Используя собственную генерацию кода и предоставляя только критический код для функций ускорителя GPU и функций, связанных с управлением данными, пользователь полностью контролирует оставшуюся часть кода. Таким образом, GeNN можно легко использовать во многих сценариях - от крупномасштабного моделирования на высокопроизводительных компьютерах с GPU ускорением, до встроенных контроллеров, используемых в робототехнике.
Для пользователей, которым не нравится полный программный контроль создаваемого кода, были разработаны интерфейсы более высокого уровня в виде Spinecreator/SpineML интеграции и интерфейса brian2genn. В первом случае, пользователи могут использовать графический интерфейс SpineCreator для проектирования моделей, а затем выполнять их на GPU-ускорителе через интерфейс с GeNN. Во втором случае пользователи могут полностью определить свои модели в симуляторе Brian 2, а затем выбрать genn-совместимое устройство для запуска модели на GPU ускорителе через GeNN.
Заключение
GeNN может в некоторых моделях достичь скорости более чем в 100 раз выше скорости одного ядра процессора, но для других случаев моделирование на CPU может происходить быстрее. При работе через Brian2genn, результаты тестов аналогичны, с широким спектром характеристик в зависимости от модели. Как правило, модели с низкой активностью, редкими, но упорядоченными связями и большой вычислительной нагрузкой для нейронной динамики, например, в моделях Ходжкина-Хаксли, являются самыми быстрыми. Модели с плотными случайными соединениями и множеством пиков обычно меньше выигрывают от GPU-ускорения с GeNN.
На данный момент команда GeNN разрабатывает методы распределения вычислений на нескольких GPU одновременно, эта работа поддерживается OpenCL в рамках проекта Google Summer of Code.