Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 08:39   #1
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
Вопрос Операторы инлайнятся?

скажите, операторы инлайнятся? и насколько эффективно их использовать по сравнению с обычной ф-й?
Код:
program operators;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type vec3=packed record
  procedure values(const _x,_y,_z : Single);
  class operator add(const a, b : vec3):vec3;inline;
  class operator subtract(const a,b: vec3):vec3;inline;


	case byte of
	0: (v: array [0..3] of Single);
	1: (x, y, z: Single);
end;

class operator vec3.add(const a, b : vec3):vec3;
begin
	result.x := a.x + b.x;
	result.y := a.y + b.y;
	result.z := a.z + b.z;
end;
class operator vec3.subtract(const a,b: vec3):vec3;
begin
	result.x := a.x - b.x;
	result.y := a.y - b.y;
	result.z := a.z - b.z;
end;

procedure vec3.values(const _x,_y,_z : Single);
begin
	x:=_x;
	y:=_y;
	z:=_z;
end;

var
	a, b, c:vec3;
begin
a.values(1,2,3);
b.values(2,2,3);
c:=a+b;

writeln(Format('%f %f %f',[c.x, c.y, c.z]));
c.v[0]:=100;
c.z := 55;
writeln(Format('%f %f %f',[c.x, c.y, c.z]));

readln;

end.
Warn вне форума Ответить с цитированием
Старый 29.11.2011, 14:09   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
и насколько эффективно их использовать по сравнению с обычной ф-й?
перегрузка операторов служит лишь улучшению читабельности кода.
вместе
Код:
Matrix3:=Matrix1.Add(Matrix2);
будет
Код:
Matrix3:=Matrix1+Matrix2;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.11.2011, 19:19   #3
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Цитата:
перегрузка операторов служит лишь улучшению читабельности кода.
это понятно, удобство и читабельность... но я про инлайн. меня больше скорость операторов беспокоила , а не удобства.
глянул, что генерирует дельфи в асме, похоже что inline директива делает свое дело. т.е. все гут.

только к чему там wait ?
Цитата:
Команда WAIT переводит процессор в состояние ожидания. Процессор будет оставаться в неактивном состоянии, пока на входной линии TEST микропроцессора не появится сигнал. Эта команда позволяет синхронизировать микропроцессор внешними сигналами без использования запросов на прерывание.
Изображения
Тип файла: gif asm inline.gif (58.9 Кб, 73 просмотров)
Тип файла: jpg asm call op.jpg (38.2 Кб, 74 просмотров)

Последний раз редактировалось Warn; 29.11.2011 в 19:21.
Warn вне форума Ответить с цитированием
Старый 29.11.2011, 20:31   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
к чему там wait ?
борладовский компилятор всегда генерит wait после записи из регистра фпу в память

Кстати, аналогичный код для инлайновой процедуры несколько компактней:

Код:
Project12.dpr.60: c := addv(a, b);
0041C41E D905D03E4200     fld dword ptr [$00423ed0]
0041C424 D805E03E4200     fadd dword ptr [$00423ee0]
0041C42A D95DB0           fstp dword ptr [ebp-$50]
0041C42D 9B               wait 
0041C42E D905D43E4200     fld dword ptr [$00423ed4]
0041C434 D805E43E4200     fadd dword ptr [$00423ee4]
0041C43A D95DB4           fstp dword ptr [ebp-$4c]
0041C43D 9B               wait 
0041C43E D905D83E4200     fld dword ptr [$00423ed8]
0041C444 D805E83E4200     fadd dword ptr [$00423ee8]
0041C44A D95DB8           fstp dword ptr [ebp-$48]
0041C44D 9B               wait 
0041C44E 8D75B0           lea esi,[ebp-$50]
0041C451 BFF03E4200       mov edi,$00423ef0
0041C456 A5               movsd 
0041C457 A5               movsd 
0041C458 A5               movsd 
0041C459 A5               movsd
так что если каждый такт на счету, а красота побоку, лучше операторами не пользоваться )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось mihali4; 01.12.2011 в 12:15.
veniside вне форума Ответить с цитированием
Старый 30.11.2011, 11:34   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Кстати, аналогичный код для инлайновой процедуры несколько компактней:
у вас не метод.
Цитата:
только к чему там wait ?
ну FPU может закончить и позже чем проц, ждем его.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.12.2011, 05:20   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
ну FPU может закончить и позже чем проц, ждем его
тем не менее, компилятор от мс такой фигней не страдает. Насколько я понимаю, с появлением пентиумов, единственное, для чего остался нужен wait — это выброс накопившихся к этому времени исключений фпу. С другой стороны, компилятор от мс маскирует все фпу исключения, в то время как борландовский компиль по старой досовской традиции продолжает их упорно обрабатывать.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось mihali4; 01.12.2011 в 12:15.
veniside вне форума Ответить с цитированием
Старый 01.12.2011, 08:58   #7
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

получается если все-таки использовать операторы и при этом, если нужна будет эффективность вычислений, нужно описать тело оператора на асме самому и заинлайнить его, так?
Warn вне форума Ответить с цитированием
Старый 01.12.2011, 17:48   #8
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> тело оператора на асме самому и заинлайнить его

асмовские функции (пока?) не инлайнятся.

Вобще, имхо, все это кошкины слёзы.
При больших объёмах вычислений эффективность их зависит в основном от выбранного алгоритма, а не от того, заинлайнится там что-то, или нет.
А при малых объёмах разницу никто не оценит.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.12.2011, 19:36   #9
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

проверил и точно -
[DCC Error] E2426 Inline function must not have asm block ((
Цитата:
Inline functions can not include an asm block. To avoid this error, remove the inline directive from your function or use Pascal code to express the statements in the asm block.
печально(

Цитата:
Вобще, имхо, все это кошкины слёзы.
При больших объёмах вычислений эффективность их зависит в основном от выбранного алгоритма, а не от того, заинлайнится там что-то, или нет.
заинлайном - экономим на вызовах.
и потом, там хоть и С vs asm, но тем не менее отрыв местами впечатляет

И много ли существует алгоритмов сложения двух векторов? умножения двух матриц? по-моему, там вся соль лишь, - будут ли это fpu или sse калькуляции и будет ли это блок или разовая акция.
вообщем пока я еще пишу для себя мат. модуль ака "glm for delphi", а потом выложу на ваш суд может чего подскажете по оптимизации вычислений)
Warn вне форума Ответить с цитированием
Старый 01.12.2011, 21:10   #10
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> будут ли это fpu или sse калькуляции

это да, вот как выглядит аналогичный код в x64 проекте:

Код:
.text:0000000000426A5C                 cvtss2sd xmm0, cs:qword_434238
.text:0000000000426A65                 cvtss2sd xmm1, cs:qword_434248
.text:0000000000426A6E                 addsd   xmm0, xmm1
.text:0000000000426A72                 cvtsd2ss xmm0, xmm0
.text:0000000000426A77                 movss   dword ptr [rbp+80h], xmm0
.text:0000000000426A7F                 cvtss2sd xmm0, cs:qword_434238+4
.text:0000000000426A88                 cvtss2sd xmm1, cs:qword_434248+4
.text:0000000000426A91                 addsd   xmm0, xmm1
.text:0000000000426A95                 cvtsd2ss xmm0, xmm0
.text:0000000000426A9A                 movss   dword ptr [rbp+84h], xmm0
.text:0000000000426AA2                 cvtss2sd xmm0, cs:qword_434240
.text:0000000000426AAB                 cvtss2sd xmm1, cs:qword_434250
.text:0000000000426AB4                 addsd   xmm0, xmm1
.text:0000000000426AB8                 cvtsd2ss xmm0, xmm0
.text:0000000000426ABD                 movss   dword ptr [rbp+88h], xmm0
.text:0000000000426AC5                 lea     rdi, qword_434258
.text:0000000000426ACC                 lea     rsi, [rbp+80h]
.text:0000000000426AD3                 movsq
.text:0000000000426AD5                 movsq
А вобще, с векторами и матрицами лучше всего работать средствами GPU. Вот там действительно отрыв впечатляет, когда 128 шейдерных процессора лопатят вашу матрицу в 128 параллельных потока, это сила. И это на слабеньких карточках.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операторы ziganurov2011 Паскаль, Turbo Pascal, PascalABC.NET 5 24.07.2011 03:04
С++ (операторы) Мари_Ланвейн Помощь студентам 1 23.12.2010 20:35
Операторы ( с ++) violettta Фриланс 13 10.12.2010 14:01
Операторы Viconte Помощь студентам 5 01.11.2010 16:34