Программирование для встроенных систем - статьи

Nbsp; SOA (Simple Offset Assignment)


Допустим, имеется последовательность доступов к переменным (a, b, c, d – имена переменных):

b c a d b c a d

Обозначим через & - операцию вычисления адреса, A – операцию доступа, I – индексный регистр, ++ или -- операцию пост изменения индексного регистра.

В общем случае каждое обращение к переменной имеет вид:

I = &var

A(I)

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

a b c d

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

I=&b

A(I++)

A(I)

I=&a



A(I)

I=d

A(I)

I=&b

A(I++)

A(I)

I=&a

A(I)

I=d

A(I)

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

b c a d

Теперь последовательность операций будет выглядеть так:

I(&b)

A(I++)

A(I++)

A(I++)

A(I)

I(&b)

A(I++)

A(I++)

A(I++)

A(I)

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

Для вычисления оптимального расположения переменных в памяти используются различные эвристики (эвристики для решения задачи SOA).



Содержание раздела