Анализ размеров входного и выходного потоков — КиберПедия 

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

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Анализ размеров входного и выходного потоков

2022-09-11 16
Анализ размеров входного и выходного потоков 0.00 из 5.00 0 оценок
Заказать работу

 

Поскольку блок производит упаковку, распаковку, преобразование типов данных, то количество (в 64-разрядных словах) входных данных как правило не равно количеству выходных. Соотношение количеств входных и выходных данных сильно зависит от того, какая операция производится над данными. Если задан код операции, то существует соответствие между этими размерами, то есть, зная количество входных данных, можно посчитать, сколько из них получится выходных данных, и наоборот. Соотношение между количеством входных данных и количеством выходных данных чисто математическое.

Аппаратура позволяет немного нарушать это соотношение - можно взять на выходе устройства чуть меньше, иногда чуть больше слов. Однако, это число определяется уже особенностями устройства, поэтому рекомендуется разрешать пользователю задавать только естественное соотношение количеств входных и выходных данных.

Это означает, что пользователь задаёт только один из параметров in_size либо out_size, другой параметр рассчитывается транслятором. Транслятор должен выводить информационные сообщения о том, каково рассчитанное значение параметра.

 

Если пользователь задаёт in_ size, то транслятор должен рассчитать out_ size; если пользователь задаёт out_ size, то транслятор должен рассчитать in_ size.

Можно разрешить пользователю задавать оба параметра, но тогда следует проверять их соответствие.

 

Параметры in_size и out_size имеют также ряд ограничений в зависимости от типа операции, например, при упаковке размер in_size должен быть достаточен для формирования хотя бы одного выходного слова. Условия валидности количества операндов также должны соблюдаться, их проверка производится при расчёте.

 

В приведённых ниже формулах используются операторы языка C, кроме квадратных скобок, которые означают округление. При реализации следует правильно выбрать типы данных для переменных и реализовать округление в соответствии с пояснением к формулам. Можно использовать более эффективное решение, если таковое найдётся.

 

Расчёт out_ size по заданному in_ size

 

in_size_a = (in_align>0)? in_size - 1: in_size;

// Если данные не выровнены в 64-разрядных словах, то

// младшие in_align бит первого входного слова и

// старшие 64 - in_align бит последнего отбрасываются

// Фактически после выравнивания входных данных будет

// на 1 меньше

 

in_num_elements = in_matrix? in_size_a: in_size_a * 64 / in_bitwise;

// Количество элементов входных данных

// определяется как количество входных слов,

// умноженное на количество элементов в одном слове

// Если входные данные имеют вид матрицы, то

// в одной строке (слове) один элемент

 

out_num_elements = (in_matrix | (in_bitwise > out_bitwise))? in_num_elements:

([(in_num_elements - 64 / out_bitwise) / step] + 1) * 64 / out_bitwise;

// Всегда, когда исползуется параметр step по умолчанию,

// количество выходных элементов данных равно

// количеству входных элементов данных

// Если step не равен значению по умолчанию, то

// либо какие-то входные элементы отбрасываются,

// либо поступают на выход по нескольку раз

// 64 / out_bitwise младших элементов формируют

// первый выходной блок (1 слово или 1 матрица)

// Далее блоки формируются с шагом step

// На оставшемся после первого шага множестве входных элементов

// помещаются (in_num_elements - 64 / out_bitwise) / step шагов

// Это число надо ОКРУГЛИТЬ ДО МЕНЬШЕГО ЦЕЛОГО

// Не уложившиеся в последний шаг элементы будут отброшены

// + 1 - добавляем один первый блок

// * 64 / out_bitwise - умножаем на количество элементов

// в одном блоке - получаем количество элементов на выходе

 

out_size = out_matrix? out_num_elements: out_num_elements * out_bitwise / 64;

// Если выходные данные имеют вид матрицы, то

// в одной строке (слове) один элемент

// Иначе - делим обратно на количество элементов в слове

// (немного лишней работы, но зато понятные формулы)

 

Следует контролировать возможные переполнения при расчёте. Если рассчитанное значение out_size превысит допустимый диапазон (в таблице параметров), то следует останавливать трансляцию и выдавать ошибку.

 

Все условия ниже должны соблюдаться. При несоблюдении хотя бы одного условия следует завершать работу транслятора и выдавать сообщение об ошибке. Текст из колонки «Описание» рекомендуется использовать в сообщении об ошибке при нарушении соответствующего условия.

 

Условия валидности in_size

Условие Описание
in_size_a > 0 Если используется входное выравнивание, должно быть хотя бы 2 входных данных
(out_bitwise >= in_bitwise) | (in_num_elements >= 64 / out_bitwise) При упаковке количество входных данных должно быть достаточно для формирования хотя бы одного выходного слова
!in_matrix | (in_size_a % (64 / in_bitwise) == 0) Если входные данные в виде матрицы, то количество слов должно быть кратно количеству строк в матрице, то есть на входе должно быть целое число квадратных матриц

 

 

Расчёт in_size по заданному out_size

 

out_num_elements = out_matrix? out_size: out_size * 64 / out_bitwise;

// Если выходные данные имеют вид матрицы, то

// в одной строке (слове) один элемент

// Иначе - умножаем на количество элементов в слове

 

in_num_elements = (in_matrix | (in_bitwise > out_bitwise))? out_num_elements:

[((out_num_elements * out_bitwise / 64 - 1) * step) + 64 / out_bitwise) * in_bitwise / 64]

  * 64 / in_bitwise;

// Если входные данные имеют вид матрицы, то

// в одной строке (слове) один элемент

// Иначе

// Преобразуем формулу выше в обратную сторону,

// только теперь не округляем,

// а дополняем общее количество входных элементов

// до числа, кратного количеству элементов в одном слове

// Т.е. в квадратных скобках ОКРУГЛЕНИЕ ДО БОЛЬШЕГО ЦЕЛОГО

 

in_size_a = in_matrix? in_num_elements: in_num_elements * in_bitwise / 64;

// Если входные данные имеют вид матрицы, то

// в одной строке (слове) один элемент

// Иначе - делим на количество элементов в слове

// (округлять не надо, так как выше мы сделали его кратным..)

 

in_size = (in_align>0)? in_size_a + 1: in_size_a;

// Добавляем одно слово, если входные данные не выровнены

 

Следует контролировать возможные переполнения при расчёте. Если рассчитанное значение in_size превысит допустимый диапазон (в таблице параметров), то следует останавливать трансляцию и выдавать ошибку.

 

Если задан только параметр out_size, то он всегда валиден, так как требуемое для получения out_size выходных данных количество in_size рассчитывается автоматически. Можно ввести проверку некоторых условий (что для получения выходных данных использованы ВСЕ входные), но нарушение этих условий будет вызывать на ошибку, а предупреждение, так как такая настройка не приведёт к зависанию устройства.


 


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.