Segnetics

Вернуться   Segnetics > Форум Segnetics > Вопросы о программировании

Вопросы о программировании Вопросы, касающиеся программирования на FBD

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.12.2018, 19:07   #1
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Оптимизируем программы на с++

Если вы используете программы, написанные на с++ (справедливо не только для контроллеров), то вы можете заметно увеличить их производительность (потребление процессорного времени) безболезненно и бесплатно.

Далее я опубликую простое исследование этого вопроса.

1. Создаём простую программу, которая в цикле умножает 2 числа много раз. Посчитаем время выполнения программы.

Код:
  long data = 500;
  long out = 0;
  unsigned int start_time = clock();
  for (int i = 0; i < 10; ++i)
  {
    for (long i = 0; i < 5000000; ++i)
    {
      out = out + data * i;
      out = out<<5;
    }
  }
  unsigned int end_time = clock();
  unsigned int work_time = end_time - start_time;
  printf("Результат = %i\n", out);
  printf("Время работы программы: %i\n", work_time);
Программа выполняет некие вычисления и считает время, сколько она выполнялась, выводит в консоль. Компилируем через makefile (прямо на контроллере) и получаем:

Код:
Результат = -1329249920
Время работы программы: 1009503
--------

Теперь в makefile добавим следующие флаги:

Цитата:
-Ofast -march=native
И снова запустим программу, после перекомпиляции:

Код:
Результат = -1329249920
Время работы программы: 151775
Как видим, время выполнения программы существенно сократилось, хотя результат остался тем же.

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

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

Пишите, пожалуйста, критику и отзывы.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 24.12.2018, 10:39   #2
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 024
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gromov Посмотреть сообщение
Пишите, пожалуйста, критику и отзывы.
У меня этот способ ускорения вылезает первым по запросу "linux считать математику быстрее"

Для получение наилучшего результата я советую подставить разные ключи оптимизации, бывает так, что -Ofast замедляет программы, а не ускоряет их. Бывает и такое, что -Ofast делает программу неработоспособной, если важна точность вычислений, потому что -Ofast включает в себя ключ -ffast-math - обработка математики с понижением точности.

Цитата:
This option is not turned on by any -O option besides -Ofast since it can result in incorrect output for programs that depend on an exact implementation of IEEE or ISO rules/specifications for math functions. It may, however, yield faster code for programs that do not require the guarantees of these specifications.

Например, широко известная проблема

Цитата:
int3 cell;
for(cell.x = 0; cell.x < cells.x; ++cell.x)
for(cell.y = 0; cell.y < cells.y; ++cell.y)
for(cell.z = 0; cell.z < cells.z; ++cell.z)
{
int id = cell.x*cells.y*cells.z + cell.y*cells.z + cell.z;
float3 moment = moments_ram_raw.get(id);
}
Переменная moment будет иметь разные значение с ключом -Ofast и без ключа -Ofast.

Мой совет: никогда не использовать -Ofast, а просто использовать -O3, например.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 24.12.2018, 11:35   #3
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: Оптимизируем программы на с++

Вот ты вроде всех агитируешь за анализ ситуации и конкретных случаев, а сам этим не занимаешься.
Это всё, конечно, имеет место быть, но это справедливо только где идет много работы с плавающей запятой, а таких прог не больно то много, при этом, для большинства задач, даже понижение точности используемых дробных чисел не критично (опенгл). А выигрыш от оптимизации весьма существенный.
А ещё круто помогает -march=native, целевая архитектура. Даёт прекрасные результаты.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 24.12.2018, 11:51   #4
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 024
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gromov Посмотреть сообщение
Вот ты вроде всех агитируешь за анализ ситуации и конкретных случаев, а сам этим не занимаешься.
Занимаюсь и прекрасно видел в твоём примере целочисленные вычисления.

Но:

1) Здесь форум по автоматизации, поэтому я всегда даю советы прежде всего с этой позиции. В автоматизации 99.9%, что присутствует хотя бы один датчик и/или регулятор

Поэтому

2) Чтобы не гадать, откуда глюки, лучше вообще не использовать упрощённые матбиблиотеки. Не тот объём вычислений в автоматизации, чтобы задумываться на тему оптимизации


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 24.12.2018, 11:54   #5
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: Оптимизируем программы на с++

Разработчики системного меню, о которых теперь либо хорошо, либо ничего, тоже так думали, видимо ))


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 24.12.2018, 12:08   #6
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 024
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gromov Посмотреть сообщение
Разработчики системного меню, о которых теперь либо хорошо, либо ничего, тоже так думали, видимо ))
Сисменю - это не автоматизация. Вероятность, что наши клиенты будут создавать своё сисменю lim x->0.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 24.12.2018, 12:13   #7
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: Оптимизируем программы на с++

Тем не менее, проблема комплексная. То не оптимизировали, это не оптимизировали, и здесь лишние ресурсы используют - так и получается, что нет нормального софта и всё тормозит. Справедливо не только для контроллеров. Потому что каждый разработчик думает, типа "ресурсов-то достаточно, да и не так уж много мне тут надо. Подумаешь, программа жрёт в 50 раз больше, чем могла бы, это всё равно мало!"

В материальном мире такие вещи не работают. Покупаешь за рубль коробок спичек - всё хорошо. Но если он будет стоить 50 рублей - тебя это уже "не порадует". Но ведь и рубль, и 50 - это мало. Вопрос лишь в том, что 50 за коробок спичек - это дофига. Почему к программам нет такого же отношения?


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 24.12.2018, 12:26   #8
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 024
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gromov Посмотреть сообщение
Тем не менее, проблема комплексная
Сниму шляпу перед автоматчиком, алгоритм которого объективно потребует оптимизации по скорости не из-за говнокода, а из-за объёма вычислений.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 24.12.2018, 12:57   #9
Gromov
Уволен из Сегнетикс
 
Регистрация: Nov 2015
Адрес: CПб/ВЛГ
Сообщения: 0
Благодарил(а): 0 раз(а)
Поблагодарили: 1 раз в 1 сообщении
По умолчанию Ответ: Оптимизируем программы на с++

Автоматчики здесь же, на этом же форуме, по этим же самым убеждениям используют язык GO! для своих мелких программ... Не знаю, правда, как оно на практике, хватает ли им места... Но это, на мой взгляд, показатель.


__________________
В сегнетиксе не работаю с самого начала 2019 года.
Gromov вне форума   Ответить с цитированием
Старый 24.12.2018, 13:06   #10
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 024
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gromov Посмотреть сообщение
Автоматчики здесь же, на этом же форуме, по этим же самым убеждениям используют язык GO! для своих мелких программ... Не знаю, правда, как оно на практике, хватает ли им места... Но это, на мой взгляд, показатель.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 24.12.2018, 18:00   #11
Gel
Senior Member
 
Регистрация: Nov 2017
Сообщения: 563
Благодарил(а): 3 раз(а)
Поблагодарили: 38 раз(а) в 30 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gromov Посмотреть сообщение
Если вы используете программы, написанные на с++ (справедливо не только для контроллеров), то вы можете заметно увеличить их производительность (потребление процессорного времени) безболезненно и бесплатно.

...

Пишите, пожалуйста, критику и отзывы.
Посмотрел разницу в результате компиляции для x86_64.

Без флагов используются переменные на стеке и вычисления соответствуют выражению в исходном коде:

Код:
...
.L4:
	movl	-16(%rbp), %eax
	imull	-12(%rbp), %eax
	addl	%eax, -4(%rbp)
	sall	$5, -4(%rbp)
	addl	$1, -12(%rbp)
	cmpl	$4999999, -12(%rbp)
	jle	.L4
...
с оптимизацией переменные разместились в регистрах, а операция умножения была исключена из расчетов:

Код:
...
.L3:
	addl	%eax, %edx
	addl	$500, %eax
	sall	$5, %edx
	cmpl	$-1794967296, %eax
	jne	.L3
...
За счет этого и получилась разница во времени исполнения.
Gel вне форума   Ответить с цитированием
Старый 24.12.2018, 18:13   #12
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 024
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gel Посмотреть сообщение
Посмотрел разницу в результате компиляции для x86_64.
x86 - другая история, это CISC, а не RISC.



Цитата:
Сообщение от Gel Посмотреть сообщение
с оптимизацией переменные разместились в регистрах, а операция умножения была исключена из расчетов:

Код:
...
.L3:
	addl	%eax, %edx
	addl	$500, %eax
	sall	$5, %edx
	cmpl	$-1794967296, %eax
	jne	.L3
...
За счет этого и получилась разница во времени исполнения.
А вот как компилятор умножение на некруглую цифру заменил выделением константы - это внушает уважение и даже некоторые сомнения)) Это точно код нужного участка?

Всё честно для x86: размещение данных в регистрах и выполнение одного цикла тактов за 10 с загрузкой пяти модулей конвейера. Выполняться должно почти мгновенно.


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.

Последний раз редактировалось Arsie, 24.12.2018 в 18:23
Arsie сейчас на форуме   Ответить с цитированием
Старый 24.12.2018, 18:13   #13
Gel
Senior Member
 
Регистрация: Nov 2017
Сообщения: 563
Благодарил(а): 3 раз(а)
Поблагодарили: 38 раз(а) в 30 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Проверил с компиляцией в arm -- ситуация аналогичная: используется оптимизация размещения переменных и оптимизация выражения в цикле, умножение не используется.


Добавлено через 2 минуты

Цитата:
Сообщение от Arsie Посмотреть сообщение
x86 - другая история, это CISC, а не RISC.
Не, без разницы здесь.

Цитата:
А вот как компилятор умножение на некруглую цифру заменил разложением и сдвигом - это внушает уважение.
Здесь тоже ничего не раскладывал. Сдвиг входит в одно из выражений в цикле.

-1794967296 -- это должна быть сумма 1..5000000, помноженная на 500.
Gel вне форума   Ответить с цитированием
Старый 24.12.2018, 18:28   #14
Arsie
Сотрудник Segnetics
 
Аватара для Arsie
 
Регистрация: Jan 2006
Адрес: Russia, SPb
Сообщения: 18 024
Благодарил(а): 15 раз(а)
Поблагодарили: 655 раз(а) в 599 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gel Посмотреть сообщение
-1794967296 -- это должна быть сумма 1..5000000, помноженная на 500.
Типа, решил, что отмотать 500 раз больше сложений это быстрее, чем мотать умножения... Нуу... Учитывая, что современные x86 делают два сложения с той же скоростью, что умножение, я прямо не знаю, быстрее это стало или нет.

В конвейере того же кофелейка два целочисленных сумматора/умножителя плюс один сумматор. Если мне память не изменяет.


PS. Как бы то ни было, к ключу -ffast-math это отношения не имеет)


__________________
Программа делает то что написал программист, а не то что он хотел.

Добро всегда побеждает зло. Кто победил - тот и добрый.
Arsie сейчас на форуме   Ответить с цитированием
Старый 24.12.2018, 18:35   #15
Gel
Senior Member
 
Регистрация: Nov 2017
Сообщения: 563
Благодарил(а): 3 раз(а)
Поблагодарили: 38 раз(а) в 30 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от Gel Посмотреть сообщение
-1794967296 -- это должна быть сумма 1..5000000, помноженная на 500.
Ой, извиняюсь, -1794967296 -- это 5000000 * 500.

-1794967296 == 5000000 * 500 - 2^32
Gel вне форума   Ответить с цитированием
Старый 25.12.2018, 21:35   #16
ujin
Senior Member
 
Аватара для ujin
 
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 762
Благодарил(а): 1 раз(а)
Поблагодарили: 10 раз(а) в 10 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Баян, но мне нравится
www.smart-jokes.org/programmer-evolution.html

High School / Junior High
10 PRINT "HELLO WORLD"
20 END

First Year in College
program Hello(input, output)
begin
writeln('Hello World')
end.

Senior Year in College
(defun hello
(print
(cons 'Hello (list 'World))))

New professional
#include
void main(void)
{
char *message[] = {"Hello ", "World"};
int i;

for(i = 0; i < 2; ++i)
printf("%s", message[i]);
printf("\n");
}

Seasoned professional
#include <iostream.h>
#include <string.h>
class string
{
private:
int size;
char *ptr;
public:
string() : size(0), ptr(new char('\0')) {}
string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}
~string()
{
delete [] ptr;
}
friend ostream &operator <<(ostream &, const string &);
string &operator=(const char *);
};
ostream &operator <<(ostream &stream, const string &s)
{
return(stream << s.ptr);
}
string &string:perator=(const char *chrs)
{
if (this != &chrs)
{
delete [] ptr;
size = strlen(chrs);
ptr = new char[size + 1];
strcpy(ptr, chrs);
}
return(*this);
}
int main()
{
string str;
str = "Hello World";
cout << str << endl;
return(0);
}

Apprentice Hacker
#!/usr/local/bin/perl
$msg="Hello, world.\n";
if ($#ARGV >= 0) {
while(defined($arg=shift(@ARGV))) {
$outfilename = $arg;
open(FILE, ">" . $outfilename) || die "Can't write $arg: $!\n";
print (FILE $msg);
close(FILE) || die "Can't close $arg: $!\n";
}
}
else {
print ($msg);
}
1;

Experienced Hacker
#include <stdio.h>
#define S "Hello, World\n"
main(){exit(printf(S) == strlen(S) ? 0 : 1);}

Seasoned Hacker
% cc -o a.out ~/src/misc/hw/hw.c
% a.out

Guru Hacker
% cat
Hello, world.
^D

Junior Manager
10 PRINT "HELLO WORLD"
20 END

Middle Manager
mail -s "Hello, world." bob@b12
Bob, could you please write me a program that prints "Hello, world."?
I need it by tomorrow.
^D

Senior Manager
% zmail jim
I need a "Hello, world." program by this afternoon.

Chief Executive
% letter
letter: Command not found.
% mail
To: ^X ^F ^C
% help mail
help: Command not found.
% damn!
!: Event unrecognized
% logout

По теме если рассматривать не только опции компилятора много чего можно предложить
http://graphics.stanford.edu/~seander/bithacks.html


Arsie: я отредактировал ваш почти нечитаемый код))


__________________
В жизни 2 правила успеха:
1 Не говори всего что знаешь
2 ...

Последний раз редактировалось Arsie, 26.12.2018 в 10:53
ujin вне форума   Ответить с цитированием
Старый 26.12.2018, 13:21   #17
ujin
Senior Member
 
Аватара для ujin
 
Регистрация: May 2010
Адрес: Novosibirsk
Сообщения: 762
Благодарил(а): 1 раз(а)
Поблагодарили: 10 раз(а) в 10 сообщениях
По умолчанию Ответ: Оптимизируем программы на с++

Цитата:
Сообщение от ujin Посмотреть сообщение
Arsie: я отредактировал ваш почти нечитаемый код))
Спасибо.
Мало времени. В начале ссылка. По ней читаемо.


__________________
В жизни 2 правила успеха:
1 Не говори всего что знаешь
2 ...
ujin вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать свои сообщения

BB code is Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Индикация старта программы (решено) 4ertjaga_88 SMLogix 2 12.03.2019 15:29
Отладка без перезаливки программы Kamow_Unitechnology SMLogix 25 09.08.2017 17:12
Ищу опытного программиста по SmLogix для обучения на примере простой программы Yogurt Барахолка 17 14.12.2016 18:56
Журнал. Автоматическая очистка при загрузки программы Arsie SMArt 0 01.04.2015 12:22
Как оценить время выполнения программы в контроллере? Arsie ЧаВо - Часто задаваемые Вопросы 0 04.10.2013 16:51


Часовой пояс GMT +4, время: 19:51.


Версия vBulletin: 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Segnetics 2005 - 2023