Почему метод im2col с GEMM более эффективен, чем метод реализации направления с SIMD в CNN - PullRequest
0 голосов
/ 12 ноября 2018

Сверточные слои являются наиболее интенсивными в вычислительном отношении частями сверточных нейронных сетей (CNN). В настоящее время общий подход к созданию сверточных слоев с задержкой заключается в расширении изображения в матрицу столбцов (im2col), а также выполнении и выполнении многоканального многоядерного ядра (MCMK). свертка с использованием существующей параллельной библиотеки General Matrix Multiplication (GEMM). Однако для работы im2col необходимо загрузить и сохранить данные изображения, а также другой блок памяти для хранения промежуточных данных.

Если мне нужно оптимизировать сверточную реализацию, я могу выбрать прямую реализацию с инструкциями SIMD. Такой метод не повлечет за собой никаких операций с памятью.

преимущества от очень регулярных схем доступа к памяти перевешивают расточительные затраты на хранение.

По следующей ссылке, в конце ссылки

https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/

Так что я надеюсь узнать причину. Могут ли операции с плавающей запятой требовать большего цикла инструкций? или входное изображение не очень большое, поэтому оно может остаться в кеше, а операциям с памятью не нужен доступ к DDR и потреблять меньше циклов.

1 Ответ

0 голосов
/ 12 ноября 2018

Кэширующая блокировка GEMM возможна, поэтому вы получаете в основном попадания в кэш L1 (см. Также Что должен знать каждый программист о памяти? ).

Встраивание в большой общий кэш L3 на типичных процессорах x86 недостаточно для эффективной работы. Кэши L2 для каждого ядра обычно имеют размер 256 КБ, и даже это медленнее, чем кэш-память L1d 32 КБ.

Память Задержка очень медленная по сравнению с тактовой частотой ядра ЦП, но память / кэш пропускная способность не страшна в наши дни с быстрыми попаданиями в кэш DDR4 или L3. (Но, как я уже сказал, для матрицы с хорошей блокировкой кеша / циклическим циклом вы можете повторно использовать данные, пока они еще горячие в L1d, если вы только транспонируете части входной матрицы на лету. Сокращение требований к полосе пропускания вне ядра также важно для эффективной работы. matmul, а не просто транспонировать один, поэтому его столбцы последовательны в памяти.)

Кроме того, последовательный доступ к памяти важен для эффективной SIMD (загрузка вектора из нескольких смежных элементов, позволяющая умножать / добавлять / любые 4 или 8 упакованных float элементов с одной инструкцией ЦП). Снижение столбцов в основной матрице строки повредит пропускной способности, даже если матрица будет достаточно маленькой, чтобы поместиться в кэш L1d (32 кБ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...