Совместное использование ресурсов - это оптимизация области, при которой HDL- Coder™ идентифицирует несколько функционально эквивалентных ресурсов и заменяет их одним ресурсом. Данные мультиплексируются во времени по совместно используемому ресурсу для выполнения тех же операций. Дополнительные сведения о том, как работает совместное использование ресурсов, см. в разделе Совместное использование ресурсов.
Можно следовать этим рекомендациям, чтобы узнать, как использовать совместное использование ресурсов с потоковой передачей при обработке 1-D векторов и 2-D матриц. Каждое руководство имеет уровень серьезности, который указывает на уровень податливостей. Для получения дополнительной информации см. HDL-руководства по моделированию уровней серьезности.
Идентификатор руководства
3.1.9
Серьезность
Информативный
Описание
Чтобы уменьшить площадь схемы блока Subsystem, который выполняет те же расчеты для каждого элемента массива вектора 1-D, используйте свойство блока Подсистемы HDL StreamingFactor. Для сигнала вектора, который имеет 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')
The Gain_Stream
подсистема имеет значение StreamingFactor, равное 10
. Чтобы сгенерировать HDL-код для этой подсистемы, запустите makehdl
функция:
makehdl('hdlcoder_vector_stream_gain/Gain_Stream')
После генерации HDL-кода, чтобы увидеть эффект потоковой оптимизации, откройте сгенерированную модель и перемещайтесь внутри Gain_Stream
подсистема.
Данные векторы сериализуются на вход стороне, а размер выхода параллелизирует последовательные данные. Эта оптимизация увеличивает общий размер схемы, наоборот, когда размер целевой схемы, который будет совместно использоваться, мал. Блок Gain внутри общей подсистемы работает со скоростью, которая в 10 раз быстрее, чем базовая скорость модели, что избегает увеличения задержки подсистемы и балансирует уменьшение максимально достижимой частоты увеличением экономии площади на целевом компьютере.
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*M | M*M |
Комплекс x Реальный | N*M*M*2 | M*M*2 |
Комплекс X | N*M*M*4 | M*M*4 |
Для матричного умножения с плавающей точкой используйте Native Floating Point
как библиотека IP с плавающей точкой. В этом случае необходимо использовать Fully Parallel
DotProductStrategy. Поскольку этот режим не использует поэлементные операции и выполняет параллельные операции умножения и сложения, используйте SharingFactor вместо StreamingFactor для совместного использования ресурсов и сохранения области схемы.
Для примера, который показывает, как выполнить потоковое умножение матрицы с использованием типов с плавающей точкой, смотрите Генерацию HDL-кода для Потокового умножения матрицы Системного объекта.