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

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

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

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

Идентификатор руководства

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 раз быстрее, чем базовая скорость модели, что избегает увеличения задержки подсистемы и балансирует уменьшение максимально достижимой частоты увеличением экономии площади на целевом компьютере.

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

Идентификатор руководства

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-кода для Потокового умножения матрицы Системного объекта.

См. также

Похожие темы