|
Искусство программирования на Си/си++, Или как правильно объяснить компилятору... |
|
|
|
Jan 17 2012, 05:51
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337

|
Цитата(demiurg_spb @ Jan 17 2012, 09:44)  Конечно. Чего вы юлите я не пойму? Для всех кроме вас очевидно что разрядность переменных влияет на скорость выполнения программ. Точка. разрядность используемых в вашем примере выше никак не влияет, влияет unsigned или signed переменная. компилятор явно приводит в случае uint_fast8_t к unsigned, что и приводит к лишней операции, за счет цикла кол-во операций увеличивается в вашем примере на 8 тактов. это просто конкретная фича компилятора, и в принципе, другой компилятор может явно не делать Код UXTB r1,r1 так что зря вы так, в приведенном вашем примере не влияет РАЗРЯДНОСТЬ, выше я объяснил почему. так что ваш пример плох и не подтверждает ваше высказывание выше
|
|
|
|
|
Jan 17 2012, 05:55
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Вам что в лоб что по лбу. Честное слово! Проверил специально для вас: Разница лишь в том что стало SXTB вместо UXTB Код 00000e b249 SXTB r1,r1;25 А вы продолжайте наедятся на безграничные возможности оптимизирующего компилятора. За сим, откланяюсь. Удачи!
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 17 2012, 05:56
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (sparcmaster @ Jan 17 2012, 12:27)  PS: Т.к. arm 32 битный, то для скорости, я стараюсь использовать только 32 битные переменные (даже там, где нужен всего байт). PPS: Если интересно, можете почитать эту статью.Я использую 32-битные и 64-битные переменные. Ну от типа char не уйти. За статью - отдельное спасибо! Обязательно почитаю! QUOTE (AHTOXA @ Jan 17 2012, 13:09)  А в остальном - нормальный код, руками выйдет практически такой же. ЗЫ. Попробуйте -O2, с ним вроде получше получается местами. Хорошо! QUOTE (Idle @ Jan 17 2012, 13:33)  всё правильно, не бери в голову Может быть действительно переволновался... Опять же, говоря, что код большой, я не могу представить, чего ожидаю увидеть от компилятора... Наверно это чисто эмоциональное восприятие...
--------------------
Выбор.
|
|
|
|
|
Jan 17 2012, 06:02
|
Частый гость
 
Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333

|
Цитата(demiurg_spb @ Jan 17 2012, 09:55)  Вам что в лоб что по лбу. Честное слово! Не тратьте свое время на этого индивида. По-моему об уровне am1808 можно понять по первым ответам в этой теме. Вы же ему даже разжевали все подробно - не помогло.
|
|
|
|
|
Jan 17 2012, 06:03
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337

|
Цитата(demiurg_spb @ Jan 17 2012, 09:55)  Вам что в лоб что по лбу. Честное слово! не нервничайте, уважаемый Цитата(demiurg_spb @ Jan 17 2012, 09:55)  Проверил специально для вас: Разница лишь в том что стало SXTB вместо UXTB Код 00000e b249 SXTB r1,r1;25 так проверьте теперь для int и unsigned int, и сделайте для себя вывод
Сообщение отредактировал am1808 - Jan 17 2012, 06:06
|
|
|
|
|
Jan 17 2012, 06:12
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
И снова здравствуйте! Все варианты исчерпали? За упорство  Код for (int32_t i=0; i<8; i++)// 18324 for (uint32_t i=0; i<8; i++)// 18324 И что?
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 17 2012, 08:26
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337

|
Цитата(sasamy @ Jan 17 2012, 12:07)  У современных ARM нет 8/16 битных регистров и компилятору приходится эмулировать их, в частности переполнение. В некоторых случаях компилятор сглаживает этот факт и не генерирует лишнего кода - но все равно рекомендуется локальные переменные, передаваемые и возвращаемые данные в ф-ции делать соразмерными с регистрами, кроме тех случаев когда нужно именно такое поведение - 8 или 16 битная переменная или когда переменные глобальные (для экономии памяти). на сколько мне известно, все локальные переменные в отличии от 32b, выравниваются по word, т.е. 4 байта. то, что кейл в вышеприведенном примере добавляет инструкцию, это причиндалы самого компилятора, который таким образом пытается занулить память, которая выделилась по причине выравнивания. т.е. получается, что кейл лишний раз себя как бы страхует
|
|
|
|
|
Jan 17 2012, 08:30
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(am1808 @ Jan 17 2012, 10:26)  на сколько мне известно, все локальные переменные в отличии от 32b, выравниваются по word, т.е. 4 байта. то, что кейл в вышеприведенном примере добавляет инструкцию, это причиндалы самого компилятора, который таким образом пытается занулить память, которая выделилась по причине выравнивания. т.е. получается, что кейл лишний раз себя как бы страхует локальные переменные в регистрах хранятся, пока место есть
|
|
|
|
|
Jan 17 2012, 08:39
|
Частый гость
 
Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337

|
Цитата(ViKo @ Jan 17 2012, 12:30)  локальные переменные в регистрах хранятся, пока место есть я не про регистры говорю, а то что выделяется на стеке
|
|
|
|
|
Jan 17 2012, 10:17
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(am1808 @ Jan 17 2012, 12:26)  то, что кейл в вышеприведенном примере добавляет инструкцию, это причиндалы самого компилятора, который таким образом пытается занулить память, которая выделилась по причине выравнивания. т.е. получается, что кейл лишний раз себя как бы страхует Он как раз эмулирует поведение 8 битного регистра - обнуляет старшие разряды, потому что не знает заранее произойдет или нет переполнение 8 бит. Код short sum_v1(char *data) { char i; int sum = 0;
for (i = 0; i<32; i++) sum += *(data++);
return (short)sum; }
short sum_v2(char *data) { char i; short sum = 0;
for (i = 0; i<32; i++) sum += *(data++);
return sum; } Код sasa@sasa-laptop:~/test$ arm-linaro-linux-gnueabi-gcc -c -g -O3 int_vs_short.c && arm-linaro-linux-gnueabi-objdump -d ./int_vs_short.o
./int_vs_short.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <sum_v1>: 0: 2300 movs r3, #0 2: f100 0120 add.w r1, r0, #32 6: f810 2b01 ldrb.w r2, [r0], #1 a: 4288 cmp r0, r1 c: 4413 add r3, r2 e: d1fa bne.n 6 <sum_v1+0x6> 10: b218 sxth r0, r3 12: 4770 bx lr
00000014 <sum_v2>: 14: 2300 movs r3, #0 16: f100 0120 add.w r1, r0, #32 1a: f810 2b01 ldrb.w r2, [r0], #1 1e: 18d3 adds r3, r2, r3 20: 4288 cmp r0, r1 22: b29b uxth r3, r3 @ подготовка к следующей итерации - регистр должен содержать не больше 16 бит 24: d1f9 bne.n 1a <sum_v2+0x6> 26: b218 sxth r0, r3 28: 4770 bx lr 2a: bf00 nop как видишь он заранее знал что char i не переполнится поэтому ничего не сгенерировал и оказался совершенно без понятия о том переполнится или нет short sum, поэтому вынужден всегда занулять старшие разряды.
Сообщение отредактировал sasamy - Jan 17 2012, 10:25
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|