реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Искусство программирования на Си/си++, Или как правильно объяснить компилятору...
am1808
сообщение Jan 17 2012, 05:51
Сообщение #16


Частый гость
**

Группа: Участник
Сообщений: 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


так что зря вы так, в приведенном вашем примере не влияет РАЗРЯДНОСТЬ, выше я объяснил почему.
так что ваш пример плох и не подтверждает ваше высказывание выше
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 17 2012, 05:55
Сообщение #17


неотягощённый злом
******

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



Вам что в лоб что по лбу. Честное слово!
Проверил специально для вас:
Разница лишь в том что стало SXTB вместо UXTB
Код
00000e  b249              SXTB     r1,r1;25


А вы продолжайте наедятся на безграничные возможности оптимизирующего компилятора.
За сим, откланяюсь. Удачи!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 17 2012, 05:56
Сообщение #18


Познающий...
******

Группа: Свой
Сообщений: 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) *
всё правильно, не бери в голову

Может быть действительно переволновался...

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


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
sparcmaster
сообщение Jan 17 2012, 06:02
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 93
Регистрация: 13-01-12
Из: Гатчина
Пользователь №: 69 333



Цитата(demiurg_spb @ Jan 17 2012, 09:55) *
Вам что в лоб что по лбу. Честное слово!

Не тратьте свое время на этого индивида. По-моему об уровне am1808 можно понять по первым ответам в этой теме. Вы же ему даже разжевали все подробно - не помогло.
Go to the top of the page
 
+Quote Post
am1808
сообщение Jan 17 2012, 06:03
Сообщение #20


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



Цитата(demiurg_spb @ Jan 17 2012, 09:55) *
Вам что в лоб что по лбу. Честное слово!

не нервничайте, уважаемый biggrin.gif
Цитата(demiurg_spb @ Jan 17 2012, 09:55) *
Проверил специально для вас:
Разница лишь в том что стало SXTB вместо UXTB
Код
00000e  b249              SXTB     r1,r1;25

так проверьте теперь для int и unsigned int, и сделайте для себя вывод

Сообщение отредактировал am1808 - Jan 17 2012, 06:06
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 17 2012, 06:12
Сообщение #21


неотягощённый злом
******

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



И снова здравствуйте!
Все варианты исчерпали? За упорство a14.gif
Код
    for (int32_t i=0; i<8; i++)// 18324
    for (uint32_t i=0; i<8; i++)// 18324
И что?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jan 17 2012, 08:07
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(am1808 @ Jan 17 2012, 09:51) *
так что ваш пример плох и не подтверждает ваше высказывание выше


У современных ARM нет 8/16 битных регистров и компилятору приходится эмулировать их, в частности переполнение. В некоторых случаях компилятор сглаживает этот факт и не генерирует лишнего кода - но все равно рекомендуется локальные переменные, передаваемые и возвращаемые данные в ф-ции делать соразмерными с регистрами, кроме тех случаев когда нужно именно такое поведение - 8 или 16 битная переменная или когда переменные глобальные (для экономии памяти).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 17 2012, 08:21
Сообщение #23


Универсальный солдатик
******

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



В закромах была книжка Arm System Developer's Guide.
Настоятельно советую am1808 скачать. Там куча примеров по данной теме.
Go to the top of the page
 
+Quote Post
am1808
сообщение Jan 17 2012, 08:26
Сообщение #24


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



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

на сколько мне известно, все локальные переменные в отличии от 32b, выравниваются по word, т.е. 4 байта.
то, что кейл в вышеприведенном примере добавляет инструкцию, это причиндалы самого компилятора, который таким образом пытается занулить память, которая выделилась по причине выравнивания. т.е. получается, что кейл лишний раз себя как бы страхует
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jan 17 2012, 08:30
Сообщение #25


Универсальный солдатик
******

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



Цитата(am1808 @ Jan 17 2012, 10:26) *
на сколько мне известно, все локальные переменные в отличии от 32b, выравниваются по word, т.е. 4 байта.
то, что кейл в вышеприведенном примере добавляет инструкцию, это причиндалы самого компилятора, который таким образом пытается занулить память, которая выделилась по причине выравнивания. т.е. получается, что кейл лишний раз себя как бы страхует

локальные переменные в регистрах хранятся, пока место есть
Go to the top of the page
 
+Quote Post
am1808
сообщение Jan 17 2012, 08:39
Сообщение #26


Частый гость
**

Группа: Участник
Сообщений: 125
Регистрация: 29-05-11
Из: Nizhny Novgorod, Russian Federation
Пользователь №: 65 337



Цитата(ViKo @ Jan 17 2012, 12:30) *
локальные переменные в регистрах хранятся, пока место есть

я не про регистры говорю, а то что выделяется на стеке
Go to the top of the page
 
+Quote Post
sasamy
сообщение Jan 17 2012, 10:17
Сообщение #27


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 18 2012, 11:31
Сообщение #28


Познающий...
******

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



Скачал материалы, рекомендованные к прочтению. Спасибо!!!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016