Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, ты не видел громоздких конструкций, потому что в этих программах используется выравнивание по умолчанию. Помнится, даже в древнейшем Borland C++ Builder, при создании проекта (32 разрядного, естественно), устанавливалось выравнивание по умолчанию на границу 8 байт. Особенность работы процессоров Intel с оперативной памятью такова, что эти процессоры действительно быстрее работают с выравненными данными, так как если, скажем, процессор читает невыравненное двойное слово, то ему придется дважды выполнить инструкцию чтения из памяти, даже если это двойное слово находится полностью в кэше (два раза обратится к кэшу), а уж если невыравненное двойное слово попадёт на границу линии кеша и одной из линий не окажется в кэше, то возникнет "промах", будет захвачена системная шина и произведена медленная операция чтения из оперативной памяти, при этом, также, могут быть попутно выполнены отложенные инструкции чтения/записи в оперативную память, что приведет к одномоментному резкому снижению производительности. Для 64-разрядных приложений, естественно, выравнивание должно выполняться по адресам, кратным 8 байтам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 10:39 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dima TПроцессор обменивается с памятью кэш-линиями. Кэш-линия - это 64 байта выровненные по 64, т.е. адрес кратен 64-м. Если один поток (ядро) меняет хоть один байт в кэш-линии, то другой поток (точнее другое ядро) при обращении к этой же кэш-линии будет вынужден дождаться когда первое ядро скинет кэш-линию в общий кэш и перечитает ее оттуда. Причем разные потоки могут работать с разными частями кэш-линии, но это все-равно заставит ее постоянно перечитывать.Размер линии кэша, это не константное значение, которое можно определить, если мне не изменяет память, выполнив инструкцию CPUID. На большинстве современных процессоров Intel, размер линии кэша 128 байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 10:42 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
rdb_devНа большинстве современных процессоров Intel, размер линии кэша 128 байт. Тут мои замеры За все процы не скажу, самый свежий из проверенных i7 6700K, там 64 байта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 10:48 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dima T1. Честно говоря, не понял при чем тут многопоточный доступ. Разве что предположить, что по выровненным данным работа идет быстрее и взаимные ожидания потоков будут меньше. Но тогда не понятно: если скорость быстрее, то почему не применить это ускорение для однопоточного доступа? Это не ускорение, а замедление многопоточной работы. Процессор обменивается с памятью кэш-линиями. Кэш-линия - это 64 байта выровненные по 64, т.е. адрес кратен 64-м. Если один поток (ядро) меняет хоть один байт в кэш-линии, то другой поток (точнее другое ядро) при обращении к этой же кэш-линии будет вынужден дождаться когда первое ядро скинет кэш-линию в общий кэш и перечитает ее оттуда. Причем разные потоки могут работать с разными частями кэш-линии, но это все-равно заставит ее постоянно перечитывать. Например: в твоей структуре один поток постоянно меняет a1, второй a2. В итоге будет тормоз, т.к. эти два потока будут мешать друг-другу.[/quot] У меня нет многопоточной работы с общим массивом. Каждый поток имеет свой массив и работает только с ним. Но за информацию спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 10:49 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, спасибо за инфу по SSE и AVX! Насколько я понял современные AVX инструкции также работают с невыровненными данными, только слегка просаживаются по производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 11:01 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dima T, ты, конечно же, в DOS'е замеры делал? ;) Потому что, если ты делал замеры в операционной системе с вытесняющей многозадачностью не создавая тестирующего драйвера режима ядра с маскированием прерываний, то все эти расчёты, ровным счётом, ничего не значат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 11:09 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
rdb_devAlekseySQL, ты не видел громоздких конструкций, потому что в этих программах используется выравнивание по умолчанию. Помнится, даже в древнейшем Borland C++ Builder, при создании проекта (32 разрядного, естественно), устанавливалось выравнивание по умолчанию на границу 8 байт. Особенность работы процессоров Intel с оперативной памятью такова, что эти процессоры действительно быстрее работают с выравненными данными, так как если, скажем, процессор читает невыравненное двойное слово, то ему придется дважды выполнить инструкцию чтения из памяти, даже если это двойное слово находится полностью в кэше (два раза обратится к кэшу), а уж если невыравненное двойное слово попадёт на границу линии кеша и одной из линий не окажется в кэше, то возникнет "промах", будет захвачена системная шина и произведена медленная операция чтения из оперативной памяти, при этом, также, могут быть попутно выполнены отложенные инструкции чтения/записи в оперативную память, что приведет к одномоментному резкому снижению производительности. Для 64-разрядных приложений, естественно, выравнивание должно выполняться по адресам, кратным 8 байтам. Я как раз и пытаюсь докопаться до информации о выравнивании по- умолчанию. Откуда у вас эта информация? Например, в опциях компилятора я не нашел подобных настроек. Ведь если компилятор это делает выравнивание по- умолчанию, то должен быть ключ отключения этой возможности. А такого ключа нету... Функция malloc и переменные в стеке также по- умолчанию невыровнены, иначе не нужны были бы надстройки с выравниванием. Кто выравнивает данные по- умолчанию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 11:10 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ как раз и пытаюсь докопаться до информации о выравнивании по- умолчанию. Откуда у вас эта информация? Например, Using the GNU Compiler Collection , стр. 475 AlekseySQLНапример, в опциях компилятора я не нашел подобных настроек. Ведь если компилятор это делает выравнивание по- умолчанию, то должен быть ключ отключения этой возможности. А такого ключа нету...Такой ключ есть и не один! Есть даже отдельно ключ для выравнивания по умолчанию членов структур. AlekseySQLФункция malloc и переменные в стеке также по- умолчанию невыравнены, иначе не нужны были бы надстройки с выравниванием.Еще как выравнены! Во-первых, функция malloc возвращает не адрес выделенной из кучи фрагмента памяти, а адрес, куда программа может поместить свои данные. Этот адрес находится за блоком служебной информации менеджера памяти. Во-вторых, венда, в некоторых случаях, при вызове функций WINAPI может попросту навернуть задачу по исключению, если при входе в API функцию стек не будет выровнен на границу двойного слова. AlekseySQLКто выравнивает данные по- умолчанию?Компилятор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 11:46 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
rdb_devНапример, Using the GNU Compiler Collection , стр. 475 Код: plaintext 1. 2. 3. 4. rdb_devТакой ключ есть и не один! Есть даже отдельно ключ для выравнивания по умолчанию членов структур. Что это за ключи, которыми можно попросить выровнять данные ("you can leave out the alignment factor and just ask the compiler to align a variable or field to the default alignment")? В опциях О1, О2, О3 есть только выравнивания для инструкций, и нет опций выравнивания данных: Код: plaintext 1. Спасибо, за подсказки, я потихоньку продвигаюсь к решению вопроса (осталось только чудо- ключи найти). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 12:12 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL(осталось только чудо- ключи найти). STFW #pragma align Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 13:32 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Нашел ключи для платформы х86: Код: plaintext 1. 2. 3. 4. 5. 6. И для диалекта С++: Код: plaintext 1. Так что насколько я понимаю ситуация такая: если не хочешь зависеть от компилятора, то выравнивай сам с помощью: void* _mm_malloc(int size, int base) и alignas. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 13:44 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, дополнительно смотри директиву компилятора #pragma pack ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 13:47 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
rdb_devAlekseySQL, дополнительно смотри директиву компилятора #pragma pack Спасибо, уже изучил на Хабре . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 13:55 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Решил я сделать все по- умному и начать пользоваться выравниванием для своих больших массивов (а на мелкие переменный забить). Но не тут- то было! Нет аналога функции realloc с выравниванием, только для malloc... Засада какая- то :-( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 14:39 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНет аналога функции realloc с выравниванием Те, кто занимается оптимизацией на уровне выравнивания ни при каких обстоятельствах не будут пользоваться таким ужасом как realloc(). Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 14:58 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
rdb_devDima T, ты, конечно же, в DOS'е замеры делал? ;) Потому что, если ты делал замеры в операционной системе с вытесняющей многозадачностью не создавая тестирующего драйвера режима ядра с маскированием прерываний, то все эти расчёты, ровным счётом, ничего не значат. Я вообще-то не драйвера пишу. Запустил именно в том режиме, в котором работают мои проги. Не веришь мне, вот прога от MS Coreinfo Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz Intel64 Family 6 Model 94 Stepping 3, GenuineIntel ... Logical Processor to Cache Map: *--- Data Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 *--- Instruction Cache 0, Level 1, 32 KB, Assoc 8, LineSize 64 *--- Unified Cache 0, Level 2, 256 KB, Assoc 4, LineSize 64 **** Unified Cache 1, Level 3, 8 MB, Assoc 16, LineSize 64 -*-- Data Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 -*-- Instruction Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 -*-- Unified Cache 2, Level 2, 256 KB, Assoc 4, LineSize 64 --*- Data Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 --*- Instruction Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 --*- Unified Cache 3, Level 2, 256 KB, Assoc 4, LineSize 64 ---* Data Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Instruction Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Unified Cache 4, Level 2, 256 KB, Assoc 4, LineSize 64 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 15:16 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
rdb_devDima T, ты, конечно же, в DOS'е замеры делал? ;) Потому что, если ты делал замеры в операционной системе с вытесняющей многозадачностью не создавая тестирующего драйвера режима ядра с маскированием прерываний, то все эти расчёты, ровным счётом, ничего не значат. Во всех Intel CPU за последние 12 лет как минимум начиная с Intel Pentium 4 и заканчивая последним SkyLake X размер кэш-линии 64 B/line : http://www.7-cpu.com/ и даже на Intel Itanium 2. А до этого было 32 B/line на Intel Pentium MMX Для замера проседания скорости при попадании в false-sharing не требуется отключать вытесняющую многозадачность если используется число не превышающее количество ядер, т.к. квант времени на поток на современных ОС (Win/Linux) относительно огромен - более 1 мс, а оверхед на переключение контекста менее ~1 мкс - это в 1000 раз меньше, т.е. менее 0.1%. И не требуется отключать(маскировать) прерывания если параллельно с вашим тестом не работает высоко-нагруженное приложение постоянно взаимодействующее с устройствами. И даже если бы было потоков больше, чем ядер, и шел шквал прерываний, то это испортило бы только величину проседания при false-sharing, но не испортило бы понимание где начинается false-sharing и где он заканчивается, т.е. размер кэш-линии в любом случае статистически виден четко, т.к. в хорошем тесте замер происходит сотни тысяч раз и усредняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 15:24 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Довброшу навский ... Если вы используете или планируете использовать сериализацию на диск то Нужно равняться по страницам памяти ОС, а потом, внутри этого выравнивания, по линейкам кешей. что бы выравнивание объектов не съезжало с выравнивания по границам страниц памяти, запрашивать с диска нужно не конкретный объект, а выровнянный по структуре хранения на диске и в памяти блок, из которого через коственую адресацию получать указатель на нужный объект. приблизительно так .... В противном случае, сериализация на диск польностью убъет все ваши усилия получить профит от выравнивания. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 16:18 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Док. Это без пяти минут dbms. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 21:01 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
maytonДок. Это без пяти минут dbms. Я так невзначай вбросил предупредил, ковырясь носу :) Если уж выраниваете, то равняйте так , что бы потом не перевыравнивать. Толку мало если вы выиграете на локальном выравнивании, потеряете кучу времени, но потом, в продуктиве, менеджер виртуальной памяти ОС съест всю вашу экономию, и даже чуть чуть больше чем вы предполагали :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 21:46 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39604008&tid=2017967]: |
0ms |
get settings: |
13ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 271ms |
| total: | 453ms |

| 0 / 0 |
