Характеристики ядра процессора Регистры –Количество –Типы регистров Общего назначения Адресные Регистры флагов Вычислительные устройства –ALU: Fixed-point и Floating-point –Умножители –Адресное АЛУ (TI C54: MAC *AR2+,*AR3+,A) –Устройство сдвига (shifter)
Конвейер Конвейер(ы) –Глубина Время «доступности» регистра «Цена» условного перехода –Количество конвейеров
Память Шины памяти –Количество шин (Шина данных\программы\управления) –Разрядность шины, выравнивание Контроль доступа к не-выровненным данным Чтение массива 8 и 16-битных элементов как четвёрки\пары 32-х битных слов. #define IS_ALIGNED4(ptr) ( ((uint32)ptr)&3 == 0 ) #define ASSERT_ALIGN(ptr) assert( !IS_ALIGNED(ptr),alignment error) 0x0 0x4 0x8 32-bits 0x2
Набор инструкций Работы с памятью –Режимы адресации Абсолютное значение Значение из регистра Регистр + абсолютное значение Автоинкремент\автодекремент Циклический автоинкремент\автодекремент –Множественная загрузка: ARM LDMIA r8!, {r0-r7} – загрузка регистров r0-r7 Эффективное использование регистров –Язык C: Переменные типа register. Арифметические –«Сложные» инструкции MAC – multiply + accumulate ARM: сдвиг + арифметическая инструкция ADD r0, r2, r1 LSL #16 ; сложение с R1, умноженным на ADD r0, r0,r1 ;
Набор инструкций Логические Инструкции сдвига –Логический: 0xFF000000>>16 = 0x0000FF00 –Арифметический 0xFF000000>>16 = 0xFFFFFF00 int VS unsigned int –Циклический 0xFF >> 8 = 0x15FF0000 Инструкции работы с битами –TigerShark: GETBITS, PUTBITS
Набор инструкций Инструкции перехода, условное выполнение –Условный переход –Call\return –Повтор инструкции\последовательности Приме TI C51 : инструкция RPT #n RPT #(20-1) // повторить 20 раз следующую инструкцию MAC *AR2+,*AR3+,AУ –Условное выполнение инструкции Экономия на условных переходах Пример (ARM): if(R0!=0) r1 = r2 + r3 ; else r1 = r2 + r4; CMP R0, #0 ADDNE R1,R2,R3 ; сложение если R0 != 0 ADDNE R1,R2,R4 ; сложение если R0 != 0 SIMD инструкции –Парные умножения (int32 представляется как пара int16) Специальные: –ARM: QDADD Rm,Rn – SAT(Rm + SAT(Rn*2)) –TigerShark: VMAX – Viterbi Maximum
Приёмы оптимизации Подготовка кода –Компиляция под архитектуру –Подготовка тестовой среды, тестирование –Подготовка библиотек Профилирование –Самые медленные функции –Узкие места (память, арифметика, ветвления) Алгоритмическая оптимизация –Пример: «Бабочка» Фурье «Переписывание на ассемблере» –Assembler=>набор макросов или inline-функций #ifdef ARMV5 #define LDRINC(reg,ptr) __asm(LDR %1,[%2],reg,ptr); #else #define LDRINC(reg,ptr) reg = *ptrf++; #end –Inline assembly – функции
Приёмы оптимизации Разворачивание циклов for(i=0;i
Спасибо за внимание!!!