Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Прочитал удвительную статью , в которой говорится, что для уменьшения обращений к памяти желательно работать с выровненными данными: Автор статьиДля выделения выравненной памяти на С/С++ в куче используется функция: void* _mm_malloc(int size, int base) Для переменных на стэке используется атрибут __declspec: __declspec(align(base)) <var> Автор комментарияВ 2015 году было бы неплохо хотя бы упомянуть о alignas . Вместо всяких declspec компиляторозависимых Что- то я в чужих программах не видел никаких громоздких конструкций при объявлении переменных. Действительно ли нужно выполнять выравнивание данных в памяти или компилятор это делает сам под текущую архитектуру? Если надо, то по какой базе выравниваться для современных x64 процессоров: 32 бита или 64 бит? Что насчет new ? Этот оператор создает объекты выровненными или нужно использовать какие-то его аналоги, чтобы объекты создавались по выровненному адресу? Молодой падаван будет рад подсказкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 17:04 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Забей. Это очень специальные случаи до которым молодым падаванам ещё надо дорасти. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 17:10 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЗабей. Это очень специальные случаи до которым молодым падаванам ещё надо дорасти. В приведеной статье пишут, что для векторизации нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 17:12 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLВ приведеной статье пишут, что для векторизации нужно. Да. А векторизация это и есть специальный случай до которой падаванам расти и расти. И даже когда дорастут, компилятор, скорее всего, всё сделает за них. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 17:16 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Затести и с нами поделись результатами. Я в плане выравнивания другое мерил: попадание в кэш-линию проца , на ровном месте можно словить тормоз в 5-7 раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 18:01 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Хорошо, напишу мою ситуацию, чтобы меня можно было более конкретно успокаивать. 1. У меня очень большой массив структур (>1 000 000 элементов), который располагается в памяти, выделенной с помощью malloc. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. sizeof(MyData) = 24 Не получится ли медленный доступ к элементам моего массива (отдельным структурам), если изначально кусок памяти выделен невыровненно (адрес первого бита не кратен машинному слову)? Надо ли применять дополнительное выравнивание ВНУТРИ структуры, чтобы получить более быстрый доступ к полям? Если да, "то по какой базе выравниваться для современных x64 процессоров: 32 бита или 64 бит?" 2. Так как массив очень большой, то он может выместить небольшие (но часто- используемые!) переменные из кеша, которые в свою очередь могут быть невыровненны в памяти. Получится ситуация частого чтения невыровненных данных из памяти, что скажется на производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 20:06 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
1. Не парься, компилятор о тебе позаботится. 2. Не парься, массив такого размера гарантированно вытеснит из всех кэшей всё остальное. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 20:19 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Если нет многопоточного доступа и не обращаешься через SSE>=3 и AVX, то ничего выравнивать не надо, с выравниванием только памяти больше съешь. Но если хочется поиграться, то: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 20:37 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 20:42 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov1. Не парься, компилятор о тебе позаботится. 2. Не парься, массив такого размера гарантированно вытеснит из всех кэшей всё остальное. 1. Хочешь сказать, что компилятор сам производит выравнивание адресов в памяти? 2. Если часто- используемые переменные будут вытеснены из кеша и при этом будут невыровнены, то получится снижение производительности. Чего мне не хочется. Может мелкие переменные, созданные в стеке, тоже стоит выравнивать с помощью alignas? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 20:55 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
1. Да. 2. Ты как-то бредишь о кэше и выравнивании, которые, в общем случае, никак не связаны. Разгреби кашу в голове. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:06 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Вася УткинЕсли нет многопоточного доступа и не обращаешься через SSE>=3 и AVX, то ничего выравнивать не надо, с выравниванием только памяти больше съешь. 1. Честно говоря, не понял при чем тут многопоточный доступ. Разве что предположить, что по выровненным данным работа идет быстрее и взаимные ожидания потоков будут меньше. Но тогда не понятно: если скорость быстрее, то почему не применить это ускорение для однопоточного доступа? 2. Насколько я понял SSE и AVX критичны к выравниванию в регистрах процессора (с помощью которых производятся векторные операции). Другими словами, в случае векторных операций у нас два места хранения данных: память и регистры процессора, и ключевое значение для скорости векторных операций имеет выровненность в регистрах (а выровненность в памяти влияет также как и при обычных невекторных операциях). Спасибо, за пример! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:09 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov1. Да. 2. Ты как-то бредишь о кэше и выравнивании, которые, в общем случае, никак не связаны. Разгреби кашу в голове. 2. Поясню: если переменная будет вымещенна из кеша, то при повторном обращении к ней её придется снова получать из памяти. А если она в памяти не выровненна, то это будет более трудоемкая операция. Таким образом получаем вероятную картину: маленькая невыровненная переменная много раз читается из памяти и тормозит всю программу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:13 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, Это всё не нужно. Включи оптимизацию в компиляторе и наслаждайся. Я полагаю, статья если не устаревшая, то как минимум для очень специального случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:17 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov1. Да. 2. Ты как-то бредишь о кэше и выравнивании, которые, в общем случае, никак не связаны. Разгреби кашу в голове. 1. GCC у меня действительно выравнивает поля в структуре (поэтому мне пришлось слегка попереставлять свои поля, чтобы добиться ее минимального размера). Но относится ли это к выделяемой памяти с помощью malloc и переменным на стеке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:18 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
MasterZivAlekseySQL, Это всё не нужно. Включи оптимизацию в компиляторе и наслаждайся. Я полагаю, статья если не устаревшая, то как минимум для очень специального случая. Можно подробнее: что это за оптимизация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:19 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLMasterZivAlekseySQL, Это всё не нужно. Включи оптимизацию в компиляторе и наслаждайся. Я полагаю, статья если не устаревшая, то как минимум для очень специального случая. Можно подробнее: что это за оптимизация? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:27 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
MasterZivg++ -O3 .... Честно говоря, не нашел в опциях компилятора выравнивания данных (искал по подстроке "alig"). Для O2 есть только: Код: plaintext 1. , но это скорее относится к инструкциям, чем к данным программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 21:51 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLпри повторном обращении к ней её придется снова получать из памяти. А если она в памяти не выровненна, то это будет более трудоемкая операция. Таким образом получаем вероятную картину: маленькая невыровненная переменная много раз читается из памяти и тормозит всю программу. Опять же бредишь. Процессор не кэширует отдельные переменные. Он кэширует куски памяти. Скорость чтения куска совершенно не зависит от того в каком его месте находится твоя переменная. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 22:22 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovОпять же бредишь. Процессор не кэширует отдельные переменные. Он кэширует куски памяти. Скорость чтения куска совершенно не зависит от того в каком его месте находится твоя переменная. Честно говоря, не знаю как происходит процедура кеширования. Процессор читает из памяти машинными словами, и если что-то попадется лишнего, то будет оно отброшено или также закешируется- не знаю. Но как это меняет ситуацию? Предположим моя переменная лежит невыровненно, т.е для ее получения надо считать лишний кусок памяти. Какая разница как переменная поделена между этими кусками? Все равно придется считывать лишний кусок, как бы она там не лежала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 22:43 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЧестно говоря, не знаю как происходит процедура кеширования. Вот поэтому - забей. То, чего ты не знаешь, ты не можешь контролировать. Не созрел ты ещё для низкоуровневой оптимизации, тебе надо азы изучить типа вынесения инвариантов из цикла. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 22:46 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВот поэтому - забей. То, чего ты не знаешь, ты не можешь контролировать. Не созрел ты ещё для низкоуровневой оптимизации, тебе надо азы изучить типа вынесения инвариантов из цикла. Спасибо , за совет! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2018, 22:51 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLВася УткинЕсли нет многопоточного доступа и не обращаешься через SSE>=3 и AVX, то ничего выравнивать не надо, с выравниванием только памяти больше съешь. 1. Честно говоря, не понял при чем тут многопоточный доступ. Разве что предположить, что по выровненным данным работа идет быстрее и взаимные ожидания потоков будут меньше. Но тогда не понятно: если скорость быстрее, то почему не применить это ускорение для однопоточного доступа? 2. Насколько я понял SSE и AVX критичны к выравниванию в регистрах процессора (с помощью которых производятся векторные операции). Другими словами, в случае векторных операций у нас два места хранения данных: память и регистры процессора, и ключевое значение для скорости векторных операций имеет выровненность в регистрах (а выровненность в памяти влияет также как и при обычных невекторных операциях). Спасибо, за пример! 1. При многопоточном доступе код оптимизируют, чтобы потоки работали с разными элементами массива, а чтобы эта оптимизация сработала, нужна ещё одна оптимизация - эти разные элементы массива должны быть в разных кэш-линиях, чтобы избежать false-sharing. 2. На данных не выравненных в памяти инструкции SSE/AVX сохраняющие или загружающие данные из памяти: некоторые будут работать медленно, некоторые быстро, а некоторые совсем откажутся работать : https://software.intel.com/en-us/forums/intel-isa-extensions/topic/752392 Load 256-bits (composed of 4 packed double-precision (64-bit) floating-point elements) from memory into dst. mem_addr must be aligned on a 32-byte boundary or a general-protection exception may be generated . https://en.wikipedia.org/wiki/SSE4 With SSE4a the misaligned SSE feature was also introduced which meant unaligned load instructions were as fast as aligned versions on aligned addresses. It also allowed disabling the alignment check on non-load SSE operations accessing memory.[4] Intel later introduced similar speed improvements to unaligned SSE in their Nehalem processors, but did not introduce misaligned access by non-load SSE instructions until AVX.[5] Вот сколько инструкций загружающих данные из памяти: https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE,SSE2,SSE3,SSSE3,SSE4_1,AVX,AVX2,AVX_512,KNC&expand=3585&cats=Load ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 00:14 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL1. У меня очень большой массив структур (>1 000 000 элементов), который располагается в памяти, выделенной с помощью malloc. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Выше в топике инженеры надавли тебе советов в принципе полезных. И плюсую. Я добавлю. Есть ли пути для оптимизации самой постановки? У тебя более миллиона элементов по 224 байта. Грубо говоря более 224 * 1 000 000 = 213Mb . Wow-wow! Это более чем кеш L3. Дружище. Тебе нужно беспокоитьтся не только о выравнивании но и об общем объеме данных с которыми ты работаешь. Собственно я предлагаю рассмотреть два пути. 1) Минимизация самих данных которые образуют hot-spot в системе. Если к примеру в задаче идет интенсивная работа с полем a1 и a5 то разумно создать копию структуры данных вида Код: plaintext 1. 2. 3. 4. 5. и поработать с этой структурой отдельно. По завершении - снова создать копию обратно или десериализацию и т.п. 2) Можно развернуть структуру данных на 90 градусов. Т.н. vertical arrays. Для многих вендоров DBMS потребовались десятилетия чтобы переосмыслить что построчное хранение данных (rows) не всегда эффективно для аналитики и иногда эффективно работать с колоночным (column-oriented). Здесь имеется в виду не OLTP а именно аналитика. Имплементация пунктов (1) и (2) не меняет порядка обхода твоего массива по индексу. Но позволит улучшить когерентность данных по отношению к кешу. Горячие индексы остаются горячими но находятся физически ближе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 00:47 |
|
||
|
А оно нам надо: выравнивание данных?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLВася УткинЕсли нет многопоточного доступа и не обращаешься через SSE>=3 и AVX, то ничего выравнивать не надо, с выравниванием только памяти больше съешь. 1. Честно говоря, не понял при чем тут многопоточный доступ. Разве что предположить, что по выровненным данным работа идет быстрее и взаимные ожидания потоков будут меньше. Но тогда не понятно: если скорость быстрее, то почему не применить это ускорение для однопоточного доступа? Это не ускорение, а замедление многопоточной работы. Процессор обменивается с памятью кэш-линиями. Кэш-линия - это 64 байта выровненные по 64, т.е. адрес кратен 64-м. Если один поток (ядро) меняет хоть один байт в кэш-линии, то другой поток (точнее другое ядро) при обращении к этой же кэш-линии будет вынужден дождаться когда первое ядро скинет кэш-линию в общий кэш и перечитает ее оттуда. Причем разные потоки могут работать с разными частями кэш-линии, но это все-равно заставит ее постоянно перечитывать. Например: в твоей структуре один поток постоянно меняет a1, второй a2. В итоге будет тормоз, т.к. эти два потока будут мешать друг-другу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2018, 08:48 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39603703&tid=2017967]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 174ms |

| 0 / 0 |
