Инструкции по разделению ресурсов для обработки вектора и умножения матриц

Разделение ресурсов является оптимизацией области, в которой HDL Coder™ идентифицирует несколько функционально эквивалентных ресурсов и заменяет их на один ресурс. Данные мультиплексируются временем по совместно используемому ресурсу, чтобы выполнить те же операции. Чтобы узнать больше, как разделение ресурсов работает, смотрите Разделение ресурсов.

Можно следовать этим инструкциям, чтобы изучить, как использовать разделение ресурсов с потоковой передачей при обработке 1D векторов и 2D матриц. Каждая инструкция имеет уровень серьезности, который указывает на уровень требований податливости. Чтобы узнать больше, смотрите Уровни серьезности Руководств по моделированию HDL.

Используйте StreamingFactor для разделения ресурсов векторных сигналов

ID инструкции

3.1.9

Серьезность

Информативный

Описание

Чтобы уменьшать область схемы блока Subsystem, который выполняет тот же расчет на каждом элементе 1D вектора, используйте свойство StreamingFactor блока Subsystem HDL. Для векторного сигнала, который имеет элементы N, устанавливает StreamingFactor на N. При помощи мультиплексирования с разделением времени, чтобы обработать каждый элемент, можно обработать результат при помощи меньшего числа операций. Тактовая частота операторов становится временами N быстрее, чем та из исходной модели.

Когда подсистема, содержащая ресурсы, которые будут совместно использованы, использует несколько векторных сигналов с различными размерами, тактовая частота умножается на наименьшее количество общего множителя размеров вектора, которые могут уменьшить максимальную достижимую целевую частоту. Достигнуть желаемой частоты:

  • Добавьте логику для демультиплексирования векторного сигнала, прежде чем это введет подсистему и для мультиплексирования сигнала, который оставляет подсистему. Можно затем задать SharingFactor на подсистеме вместо StreamingFactor.

  • Заполните различные векторные сигналы сделать их тем же размером как векторный сигнал, который имеет максимальный размер, и затем задайте StreamingFactor.

Откройте модель hdlcoder_vector_stream_gain.

open_system('hdlcoder_vector_stream_gain')
set_param('hdlcoder_vector_stream_gain', 'SimulationCommand', 'Update')

Модель принимает векторный сигнал с 10 элементами, как введено и умножает каждый элемент на значение усиления, которое является еще одним, чем предыдущее значение.

open_system('hdlcoder_vector_stream_gain/Gain_Stream')

Чтобы видеть результаты симуляции, симулируйте модель и откройте блок Scope.

sim('hdlcoder_vector_stream_gain')
open_system('hdlcoder_vector_stream_gain/Show Processing Time')

Gain_Stream подсистеме установили StreamingFactor на 10. Чтобы сгенерировать HDL-код для этой подсистемы, запустите makehdl функция:

makehdl('hdlcoder_vector_stream_gain/Gain_Stream')

После генерации HDL-кода, чтобы видеть эффект оптимизации потоковой передачи, открывают сгенерированную модель и перешли в Gain_Stream подсистема.

Векторные данные сериализируются на входной стороне, и выходной размер параллелизирует последовательные данные. Эта оптимизация увеличивает общий размер схемы с другой стороны, когда целевой размер схемы, который будет совместно использован, мал. Блок Gain в разделяемой подсистеме запускается на уровне, который в 10 раз быстрее, чем базовая ставка модели, которая избегает увеличения задержки подсистемы и балансирует сокращение максимальной достижимой частоты увеличением экономии области на целевом компьютере.

Используйте SharingFactor и свойства блока HDL для совместного использования операций умножения матриц

ID инструкции

3.1.10

Серьезность

Информативный

Описание

Блок Matrix Multiply является блоком Product, которому установили параметры блоков Multiplication на Matrix(*). В диалоговом окне HDL Block Properties архитектура HDL установлена в Matrix Multiply и можно задать DotProductStrategy.

Настройки DotProductStrategy

DotProductStrategyОписание
'Fully Parallel' (значение по умолчанию)Выполняет умножение и операции сложения параллельно. [MxN]*[NxM] умножение матриц требует N*M*M множители.
'Parallel Multiply-Accumulate'Использует архитектуру Parallel блока Multiply-Accumulate, чтобы реализовать умножение матриц. Эта архитектура выполняет несколько блоков Multiply-Add параллельно с накоплением.
'Serial Multiply-Accumulate'Использует архитектуру Serial блока Multiply-Accumulate, чтобы реализовать умножение матриц. Этот режим выполняет N времена сверхдискретизировав и количество множителей становятся M*M.

Чтобы совместно использовать ресурсы и сократить количество множителей далее, когда у вас есть несколько блоков Matrix Multiply в той же подсистеме, устанавливают DotProductStrategy на Fully Parallel и задайте SharingFactor на верхней подсистеме.

Для умножения, включающего комплексные и вещественные числа, количество множителей становится удвоенным.

Количество множителей, сгенерированных умножением [MXN] * [NxM]

Тип умноженияПолностью Параллельный/Параллельный Умножаются - НакапливаютсяПоследовательный умножаются - накапливаются
Действительный x ДействительныйN*M*MM*M
Объедините x ДействительныйN*M*M*2M*M*2
Объедините Комплекс xN*M*M*4M*M*4

Для умножения матриц с плавающей точкой используйте Native Floating Point как Библиотека IP С плавающей точкой. В этом случае необходимо использовать Fully Parallel DotProductStrategy. Когда этот режим не использует поэлементные операции и выполняет параллельное умножение и операции сложения, используйте SharingFactor вместо StreamingFactor, чтобы совместно использовать ресурсы и сохранить область схемы.

Для примера, который показывает, как выполнить умножение матриц потоковой передачи с помощью типов с плавающей точкой, смотрите, что генерация HDL-кода для Потоковой передачи Умножение матриц Системный объект.

Смотрите также

Похожие темы