powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / не работает ping x64
16 сообщений из 41, страница 2 из 2
не работает ping x64
    #40129006
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
"не надо выпендрежей, используйте packed record и #pragma pack(1)
Мы сейчас говорим не о произвольном коде, а об опубликованном апи. Кстати, у Майкрософт в большинстве случаев packed/не packed не влияет, т.к. они добавляют reserved поля для правильного выравнивания. А вот когда по молодости портировал структуры MySQL и везде повставлял packed - было больно
...
Рейтинг: 0 / 0
не работает ping x64
    #40129009
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Попробуйте sizeof от массива TByteRecord для пущей занимательности.
Будет 4 * Length?

Кстати, для этого есть packed array :)
...
Рейтинг: 0 / 0
не работает ping x64
    #40129011
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
но в исходниках встречается
Спасибо. Буду знать. А то я все по старинке через {$ALIGN}
...
Рейтинг: 0 / 0
не работает ping x64
    #40129012
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Даже FPC в режиме совместимости с дельфями это поддерживает.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129018
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Кстати, у Майкрософт в большинстве случаев packed/не packed не влияет, т.к. они
добавляют reserved поля для правильного выравнивания.

Меньшинство тоже бьёт больно. Я как-то по глупости объявлял packed NumericStruct
для ODBC...

С тех пор при портировании обязательным шагом является тестовая утилита, сверяющая размеры и смещения каждого поля каждой структуры.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129027
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот мне любопытно есть какой-нибудь пример, когда выравнивание структур > 8 байт повышает быстродействие хотя бы на 10%?
А если нет - нафига вообще это выравнивание понадобилось?
...
Рейтинг: 0 / 0
не работает ping x64
    #40129046
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
нафига вообще это выравнивание понадобилось?

https://community.intel.com/t5/Software-Tuning-Performance/Why-should-data-be-aligned-to-16-bytes-for-SSE-instructions/td-p/1164004
...
Рейтинг: 0 / 0
не работает ping x64
    #40129062
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Вот мне любопытно есть какой-нибудь пример, когда выравнивание структур > 8 байт повышает быстродействие хотя бы на 10%?
А если нет - нафига вообще это выравнивание понадобилось?
Речь шла о packed/unpacked записях. Packed/unpacked - это же про выравнивание полей внутри записи.
https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Internal_Data_Formats_(Delphi)#Record_Types
...
Рейтинг: 0 / 0
не работает ping x64
    #40129079
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Соколинский Борис
нафига вообще это выравнивание понадобилось?

https://community.intel.com/t5/Software-Tuning-Performance/Why-should-data-be-aligned-to-16-bytes-for-SSE-instructions/td-p/1164004
Насколько я знаю, SIMD до сих пор не реализован в pas-компиляторе, только через встроенный asm. Можно считать что к дельфовому коду это не относится.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129080
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
Речь шла о packed/unpacked записях. Packed/unpacked - это же про выравнивание полей внутри записи.
Это сравнительно новая "фича", отдельно непонятная за/для/нафига.
В плане передачи параметров к внешним библиотекам - дополнительный аргумент к использованию packed.
Вопрос об эффективности выравнивания остается в силе.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129085
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Насколько я знаю, SIMD до сих пор не реализован в pas-компиляторе, только через встроенный asm. Можно считать что к дельфовому коду это не относится.

Даже если закрыть глаза на то что встроенный ассемблер эти инструкции понимает, данные могут передаваться внешним обработчикам.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129090
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,
Если внешнему обработчику необходимы каким-то образом выровненные данные - он и должен задекларировать их должным образом в виде packed record с явно указанными резервными байтами.
Аналогично в случае SIMD-ов, которые используются в лучшем случае в 1:100000 кодов.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129102
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Если внешнему обработчику необходимы каким-то образом выровненные данные - он и должен задекларировать их должным образом в виде packed record с явно указанными резервными байтами.

Он должен лишь требования о выравнивании обозначить, а подготовить данные это забота приложения.

Соколинский Борис
Аналогично в случае SIMD-ов, которые используются в лучшем случае в 1:100000 кодов.

Ну ведь используются же...
...
Рейтинг: 0 / 0
не работает ping x64
    #40129110
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Он должен лишь требования о выравнивании обозначить, а подготовить данные это забота приложения.
Неважно, по сути это то же самое.

Kazantsev Alexey
Ну ведь используются же...
Ну OK, в случае необходимости SSE можно также явно резервные байты прописать.
Явно не тот случай когда в штатный компилятор нужно автоматически выравнивание добавлять.

Я все еще жажду увидеть пример дельфового кода, где выравнивание адресов/размеров структур увеличивает быстродействие хотя бы на 5%. Любой, даже алгоритмически бессмысленный.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129123
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Ну OK, в случае необходимости SSE можно также явно резервные байты прописать.
Явно не тот случай когда в штатный компилятор нужно автоматически выравнивание добавлять.

Там нужно, в другом месте нужно... Ну так рутину автоматизировать нужно.
...
Рейтинг: 0 / 0
не работает ping x64
    #40129132
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Я все еще жажду увидеть пример дельфового кода, где выравнивание адресов/размеров структур увеличивает быстродействие хотя бы на 5%.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
type
  TRec1 = record
    a: Cardinal;
    b: Word;
    c: Byte;
  end;

  TRec2 = packed record
    a: Cardinal;
    b: Word;
    c: Byte;
  end;

procedure TForm1.Button1Click(Sender: TObject);
const
  CCount = 100000000;
var
  LArr1: array of TRec1;
  LArr2: array of TRec1;
  LSum: Cardinal;
  Li: Integer;
  LStart: Cardinal;
  LDrtn1, LDrtn2: Cardinal;
begin
  LStart := GetTickCount;
  LSum := 0;
  SetLength(LArr1, CCount);
  for Li := 0 to CCount - 1 do begin
    LArr1[Li].a := Random(High(LArr1[Li].a));
    LArr1[Li].b := Random(High(LArr1[Li].b));
    LArr1[Li].c := Random(High(LArr1[Li].c));
    LSum := LSum + LArr1[Li].a + LArr1[Li].b + LArr1[Li].c;
  end;
  LDrtn1 := GetTickCount - LStart;
  SetLength(LArr1, 0);

  LStart := GetTickCount;
  LSum := 0;
  SetLength(LArr2, CCount);
  for Li := 0 to CCount - 1 do begin
    LArr2[Li].a := Random(High(LArr2[Li].a));
    LArr2[Li].b := Random(High(LArr2[Li].b));
    LArr2[Li].c := Random(High(LArr2[Li].c));
    LSum := LSum + LArr2[Li].a + LArr2[Li].b + LArr2[Li].c;
  end;
  LDrtn2 := GetTickCount - LStart;
  SetLength(LArr2, 0);
  ShowMessageFmt('NonPacked: %u, Packed: %u, Delta: %.2f%%', [LDrtn1, LDrtn2, 100 - LDrtn1 * 100 / LDrtn2]);
end;

5.8% у меня иногда давало.

Но вопрос не в этом. Да сейчас возможно (и даже наиболее вероятно) это не имеет никакого смысла. Как и всякие соглашения о вызовах (которые в x64 привели все к единому виду). Но это то наследие, с которым приходится работать
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / не работает ping x64
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]