Отговори на тема  [ 11 мнения ] 
32 битов контролер и 8/16 битови данни. 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 32 битов контролер и 8/16 битови данни.
Вече дъвкахме тая тема, но спред мен не стигнахме до нищо конкретно. Става въпрос за АРМ. Може да кълве байтови данни, но иска да са подравнени. Та дотук е ясно следното:

При структури, подравняването е важно. Особенно където има намесени протоколи.

Но да видим какво става при работа с данни.

1. Например статични променливи в рама. Да сравним следното:

for(a=0;a<5;a++) при 8 и 32 битов размер на "а". За по сигурно предполагаме че е глобална променлива (да не може компилатора да я нахака в регистър). Ще има ли разлика във бързодействието/големината на кода.

Или пък в нещо от сорта на:

var1 = var[a], където а е 8 или 32 бита. Ще има ли разлика ако индексираме с 8 битова променлива, сравнено с "нормална" 32 битова?

2. А когато говорим за автоматични променливи (такива във стека)?

3. Какво става с битовите променливи? Това което знам аз е - с битови полета е бавно и отнема доста място като код. Най-бързо май е директно ползване на цял байт (а дали не трябва да е направо 32 бита променлива - егати разхищението). Освен това битовите полета винаги са ми изглеждали крайно нечетливи във формата си на структура - където по просто и прегледно е: boolean bFlag = 1;

Въобще ,като има човек на разположение 1 мегабайт, не му пука особенно за такива неща. Ама като се вземе някое недоносче със само 16К и се почне да се работи според препоръките на компилатора (да се ползва 32 бита винаги когато е възможно) и изведнъж се оказва, че това дето пика го прави във 2К, АРМ му трябват 8К.
И после програмирането ми започва да следва Windows идеологията - защо трябва да се мъчим да пишем оптимизиран софтуер, като можем да ъпгрейднем машината?

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Май 16, 2006 4:12 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пет Окт 21, 2005 9:35 pm
Мнения: 152
Местоположение: Варна
Мнение 
Ами ARM CPU работи само с регистър-регистър операции . Така че в един момент всяка променлива няма как да не се появи в някой 32 битов регистър. Типът на данните ще ти позволи да си спестиш място, няма смисъл да слагаш нещо което ще се събере в 16 бита в 32 битова променлива.

_________________
LDAA


Вто Май 16, 2006 5:48 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: 32 битов контролер и 8/16 битови данни.
Цецо написа:
Става въпрос за АРМ. Може да кълве байтови данни, но иска да са подравнени.

ARM е като повечето RISC процесори - данните трябва да са подравнени до техния размер. Байт може да е на всеки адрес, 16-бит - само на четен адрес, 32-бит на кратен на 4. Някои инструкции позволяват изключение от това правило, примерно ако на LDR се даде неподравнен поинтер, данните се въртят на дясно...

Цитат:
1. Например статични променливи в рама. Да сравним следното:
for(a=0;a<5;a++) при 8 и 32 битов размер на "а". За по сигурно предполагаме че е глобална променлива (да не може компилатора да я нахака в регистър). Ще има ли разлика във бързодействието/големината на кода.


Ако сам си пишеш асемблера - няма причина да има разлика... На теория операциите за четене/запис от паметта адресират 32 бита и това че вземаш само 8 или 16 от тях - не влияе на бързодействието и големината на кода. Аритметичните операции, обаче винаги са 32-бит и поради това някои "глупави" компилатори добавят код за кастинг до 8, 16 бит. Всъщност това е проблем който се поражда от калинг-конвенцията (която е станртизирана от АРМ). Ако първия параметър на една функция е с размер байт, то той се предава по младшите 8 бита на R0, като не е казано какво съдържат осталите 24 бита. Така че за да няма инфекции, компилаторите първо изчистват старшите 24 бита (въпреки че те може да са си били чистички...)
В крайна сметка проблемът е само при параметри на функции и тагава за да няма овърхед понякога е желателно да се ползва int.
Иначе за променливи в паметта - "размерът няма значение" (почти) ;-)


Цитат:
2. А когато говорим за автоматични променливи (такива във стека)?

Размерът също няма значение за бързодействието и кода, но байт променлива ще хаби 4 байта от стека, освен ако компилаторът не се светне да пакетира няколко байт променливи в един word.

Цитат:
3. Какво става с битовите променливи? Това което знам аз е - с битови полета е бавно и отнема доста място като код.

Това си зависи само от компилатора. Правилото е същото като за други променливи - в паметта може да се записва на адрес подравнен според размера на променливата. Това че някои компилатори за по-лесно закръглят всичко до 32 си е техен проблем, а не на процесора. Да се закръгля има полза само ако трябва да се заредят няколко променливи от паметта с една инструкция, но аз поне досега не съв видял компилатор който използва подобни оптимизации...

Цитат:
да се работи според препоръките на компилатора (да се ползва 32 бита винаги когато е възможно) и изведнъж се оказва, че това дето пика го прави във 2К, АРМ му трябват 8К.

хм... това не е задължително... Пак ще повторя, ARM e RISC и инструкциите които работят с паметта не правят нищо друго, а инструкциите които правят някакви операции не могат да работят с паметта. И тъй като инструкциите за работа с паметта има 8/16 и 32 бит варианти (без multiple инстр.) => размера няма значение. Малко нарастване заради подравняването може да има, ама от 2к -> 8к говорим за съвсем различен проблем...
Да се работи с 32 бита е желателно, когато става дума за параметри на функции (те така или иначи се предават като 32-бит) или за регистрови променливи (които също така или иначе са 32-бит). За променливи в памета е препоръчително да ползваш толкова бита, колкото ти трябват.


Вто Май 16, 2006 5:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Да разбирам ли че всичко де що е в стека е подравнено на 32 бита?

И че няма смисъл да правя 8/16 битови променливи, освен ако не са глобални или статични?

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Вто Май 16, 2006 6:52 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Яну 26, 2005 2:01 pm
Мнения: 1952
Местоположение: Варна
Мнение 
Цецо написа:
Да разбирам ли че всичко де що е в стека е подравнено на 32 бита?

И че няма смисъл да правя 8/16 битови променливи, освен ако не са глобални или статични?

Не не са подравнени към 32 бита.
Ако декларираш 8 битова локална променлива тя може да бъде на всеки адрес.
Ето един пример:

Код:
int main(void)
{
    unsigned char Bit8[15];
    unsigned short int Bit16[13];

    Bit8[0] = 1;
    Bit8[1] = 2;
    Bit8[2] = 11;
    Bit8[3] = 13;

    Bit16[0] = 1;
    Bit16[1] = 2;
    Bit16[2] = 512;
    Bit16[3] = 8;

    return 0;
}

Компилирано с GCC 3.3.1 горното дава следния код(само същественната част):
Код:
...
   mov   r3, #1
   strb   r3, [fp, #-28]

   mov   r3, #2
   strb   r3, [fp, #-27]

   mov   r3, #11
   strb   r3, [fp, #-26]

   mov   r3, #13
   strb   r3, [fp, #-25]

   mov   r3, #1
   strh   r3, [fp, #-56]   @ movhi

   mov   r3, #2
   strh   r3, [fp, #-54]   @ movhi

   mov   r3, #512
   strh   r3, [fp, #-52]   @ movhi

   mov   r3, #8
   strh   r3, [fp, #-50]   @ movhi

   mov   r3, #0
...


Вто Май 16, 2006 8:24 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Съвсем се обърках.

Излиза че няма никакво значение, как са ми дефинирани променливите. Защо тогава в IAR пише че е пожелателно използването на 32 битови променливи, а за цикли било задължително.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Сря Май 17, 2006 9:39 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
И аз го четох това но пробвах че става цикъл и с char. И аз не разбрах какво имат пред вид.


Сря Май 17, 2006 9:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
Цецо написа:
Защо тогава в IAR пише че е пожелателно използването на 32 битови променливи, а за цикли било задължително.


В известна степен е желателно да ползваш 32-бит, просто за да си сигурен че компилатора няма да се олее и да сложи излишен код. Проблемът е че всякаква аритметика се прави на базата на 32-битови регистри, т.е. няма инкремент/декремент на байт, събиране изваждане и т.н. Така ако имаш "i++" и i е int -> знаеш че това се компилира до 1 инструкция (ако е регистрова променлива). Но ако i е байт, тогава след 32-битово добавяне на 1, трябва да маскираш резултата за да си остане в младшите 8 бита на регистъра, а старшите 24 да са нула. Така вместо една стават 2 инструкции (някои даже го правят с 3).
Ако това е променлива в паметта - изчистването на старшите битове не е необходимо. Освен ако след инкремента същата променлива не се сравнява или пък примерно се ползва като индекс на масив. Тъй като индекси могат да бъдат само 32-битови регистри, се налага да им изчистиш старшите 24 бита ако регистъра е съдържал байт променлива.
Когато пиша на асемблер, аз тия неща ги съобразявам и много рядко наистина се налага да слагам допълнителни инструкции - просто щото знам кога какво имам. Но компилаторите не винаги преценяват кога кастинга се налага и кога не... и за да си вържат гащите почти винаги добавят код, който за нас може да изглежда излишен.
Разбира се, ако един компилатор е добър, той ще види когато имаш фиксиран цикъл примерно от 1 до 10 и ще си го направи добре, независимо дали си обявил int или char...


Сря Май 17, 2006 10:49 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Ное 01, 2005 10:23 am
Мнения: 704
Местоположение: Limerick, Ireland
Мнение 
Е, да не забравяме и бързодействието, което при деклариране на 32 битова променлива (зависи от професора), е в пъти по-голямо.

_________________
"640 К са достатъчни на всеки за всичко."
Бил Гейтс


Сря Май 17, 2006 11:04 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ами рецептата се очертава по следния начин:

1. За масиви се ползва типа на данните какъвто си е.

2. Параметри на функции - ако не са много (а те стандартно не са) - 32 битови.

3. За цикли, индексиране и пр. - 32 битови променливи.

Излиза че вместо това:

Код:
unsigned char Counter;
...
...
for(Counter=0;Counter<10;Counter++) {....}
...
...
for(Counter=0;Counter<20;Counter++){...}


e по добре да се запише нещо от сорта:

Код:
...
for(register int Counter=0;Counter<10;Counter++){...}
...
for(register int Counter=0;Counter<20;Counter++){...}


И още нещо. Вярна ли е мойта подредба на типа на декларираните променливи според бързодействието им (големината на генерирания код)?

1. Тип register
2. Тип static (global)
3. Тип auto

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Сря Май 17, 2006 11:12 am
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Ное 01, 2005 10:23 am
Мнения: 704
Местоположение: Limerick, Ireland
Мнение 
В общия случай подредбата ми изглежда вярна. Но бързодействието зависи и от типа на променливата (char, int, int32....) и на какъв проц върви, както и от оптимизацията на компилатора. Ако на един компилатор за арм му кажеш 4е искаш char и искаш да ти го оптимизира за памет, то вероятно той ще се опита да събере колкото може char-ове в 32бита (зависи от режима на арма - ARM или THUMB), което довежда до допълнителни инструкции за маскиране на битовете, което пък намалява бързодействието.
За да си сигурен, че няма да се пробва да оптимизира нещо, декларираш променливата колкото ти е регистъра. :)

_________________
"640 К са достатъчни на всеки за всичко."
Бил Гейтс


Сря Май 17, 2006 11:30 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни