powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А оно нам надо: выравнивание данных?
46 сообщений из 46, показаны все 2 страниц
А оно нам надо: выравнивание данных?
    #39603703
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прочитал удвительную статью , в которой говорится, что для уменьшения обращений к памяти желательно работать с выровненными данными:

Автор статьиДля выделения выравненной памяти на С/С++ в куче используется функция:
void* _mm_malloc(int size, int base)
Для переменных на стэке используется атрибут __declspec:
__declspec(align(base)) <var>
Автор комментарияВ 2015 году было бы неплохо хотя бы упомянуть о alignas . Вместо всяких declspec компиляторозависимых

Что- то я в чужих программах не видел никаких громоздких конструкций при объявлении переменных. Действительно ли нужно выполнять выравнивание данных в памяти или компилятор это делает сам под текущую архитектуру? Если надо, то по какой базе выравниваться для современных x64 процессоров: 32 бита или 64 бит?

Что насчет new ? Этот оператор создает объекты выровненными или нужно использовать какие-то его аналоги, чтобы объекты создавались по выровненному адресу?

Молодой падаван будет рад подсказкам.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603704
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забей. Это очень специальные случаи до которым молодым падаванам ещё надо дорасти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603705
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovЗабей. Это очень специальные случаи до которым молодым падаванам ещё надо дорасти.


В приведеной статье пишут, что для векторизации нужно.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603706
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLВ приведеной статье пишут, что для векторизации нужно.

Да. А векторизация это и есть специальный случай до которой падаванам расти и расти. И
даже когда дорастут, компилятор, скорее всего, всё сделает за них.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603715
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Затести и с нами поделись результатами.

Я в плане выравнивания другое мерил: попадание в кэш-линию проца , на ровном месте можно словить тормоз в 5-7 раз.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603742
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, напишу мою ситуацию, чтобы меня можно было более конкретно успокаивать.

1. У меня очень большой массив структур (>1 000 000 элементов), который располагается в памяти, выделенной с помощью malloc.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct MyData
{
        uint32_t a1;
        uint32_t a2;
        uint32_t a3;
        uint32_t a4;
        float a5;
        int8_t a6;
        int8_t a7;
}



sizeof(MyData) = 24

Не получится ли медленный доступ к элементам моего массива (отдельным структурам), если изначально кусок памяти выделен невыровненно (адрес первого бита не кратен машинному слову)? Надо ли применять дополнительное выравнивание ВНУТРИ структуры, чтобы получить более быстрый доступ к полям? Если да, "то по какой базе выравниваться для современных x64 процессоров: 32 бита или 64 бит?"

2. Так как массив очень большой, то он может выместить небольшие (но часто- используемые!) переменные из кеша, которые в свою очередь могут быть невыровненны в памяти. Получится ситуация частого чтения невыровненных данных из памяти, что скажется на производительности.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603746
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Не парься, компилятор о тебе позаботится.
2. Не парься, массив такого размера гарантированно вытеснит из всех кэшей всё остальное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603752
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если нет многопоточного доступа и не обращаешься через SSE>=3 и AVX, то ничего выравнивать не надо, с выравниванием только памяти больше съешь.

Но если хочется поиграться, то:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <stdlib.h>
#include <stdalign.h>
#include <stdio.h>

// cache-line size on x86_64 using C++17
//#define ALIGN_NUM std::hardware_destructive_interference_size
#define ALIGN_NUM 64

struct alignas(ALIGN_NUM) MyData
{
        uint32_t a1;
        uint32_t a2;
        uint32_t a3;
        uint32_t a4;
        float a5;
        int8_t a6;
        int8_t a7;
};

MyData *p = aligned_alloc(ALIGN_NUM, 1024*sizeof(MyData));
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603756
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603759
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov1. Не парься, компилятор о тебе позаботится.
2. Не парься, массив такого размера гарантированно вытеснит из всех кэшей всё остальное.


1. Хочешь сказать, что компилятор сам производит выравнивание адресов в памяти?
2. Если часто- используемые переменные будут вытеснены из кеша и при этом будут невыровнены, то получится снижение производительности. Чего мне не хочется. Может мелкие переменные, созданные в стеке, тоже стоит выравнивать с помощью alignas?
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603763
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Да.
2. Ты как-то бредишь о кэше и выравнивании, которые, в общем случае, никак не связаны.
Разгреби кашу в голове.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603764
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася УткинЕсли нет многопоточного доступа и не обращаешься через SSE>=3 и AVX, то ничего выравнивать не надо, с выравниванием только памяти больше съешь.

1. Честно говоря, не понял при чем тут многопоточный доступ. Разве что предположить, что по выровненным данным работа идет быстрее и взаимные ожидания потоков будут меньше. Но тогда не понятно: если скорость быстрее, то почему не применить это ускорение для однопоточного доступа?
2. Насколько я понял SSE и AVX критичны к выравниванию в регистрах процессора (с помощью которых производятся векторные операции). Другими словами, в случае векторных операций у нас два места хранения данных: память и регистры процессора, и ключевое значение для скорости векторных операций имеет выровненность в регистрах (а выровненность в памяти влияет также как и при обычных невекторных операциях).

Спасибо, за пример!
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603768
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov1. Да.
2. Ты как-то бредишь о кэше и выравнивании, которые, в общем случае, никак не связаны.
Разгреби кашу в голове.


2. Поясню: если переменная будет вымещенна из кеша, то при повторном обращении к ней её придется снова получать из памяти. А если она в памяти не выровненна, то это будет более трудоемкая операция. Таким образом получаем вероятную картину: маленькая невыровненная переменная много раз читается из памяти и тормозит всю программу.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603772
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Это всё не нужно.
Включи оптимизацию в компиляторе и наслаждайся.

Я полагаю, статья если не устаревшая, то как минимум для очень специального случая.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603773
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov1. Да.
2. Ты как-то бредишь о кэше и выравнивании, которые, в общем случае, никак не связаны.
Разгреби кашу в голове.


1. GCC у меня действительно выравнивает поля в структуре (поэтому мне пришлось слегка попереставлять свои поля, чтобы добиться ее минимального размера). Но относится ли это к выделяемой памяти с помощью malloc и переменным на стеке?
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603774
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAlekseySQL,

Это всё не нужно.
Включи оптимизацию в компиляторе и наслаждайся.

Я полагаю, статья если не устаревшая, то как минимум для очень специального случая.

Можно подробнее: что это за оптимизация?
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603779
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZivAlekseySQL,

Это всё не нужно.
Включи оптимизацию в компиляторе и наслаждайся.

Я полагаю, статья если не устаревшая, то как минимум для очень специального случая.

Можно подробнее: что это за оптимизация?


Код: plaintext
1.
g++  -O3 ....
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603797
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivg++ -O3 ....


Честно говоря, не нашел в опциях компилятора выравнивания данных (искал по подстроке "alig"). Для O2 есть только:

Код: plaintext
1.
-falign-functions  -falign-jumps 
-falign-loops  -falign-labels 

, но это скорее относится к инструкциям, чем к данным программы.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603820
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLпри повторном обращении к ней её придется снова получать из памяти. А если она в памяти не
выровненна, то это будет более трудоемкая операция. Таким образом получаем вероятную
картину: маленькая невыровненная переменная много раз читается из памяти и тормозит всю
программу.

Опять же бредишь. Процессор не кэширует отдельные переменные. Он кэширует куски памяти.
Скорость чтения куска совершенно не зависит от того в каком его месте находится твоя
переменная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603829
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovОпять же бредишь. Процессор не кэширует отдельные переменные. Он кэширует куски памяти.
Скорость чтения куска совершенно не зависит от того в каком его месте находится твоя
переменная.


Честно говоря, не знаю как происходит процедура кеширования. Процессор читает из памяти машинными словами, и если что-то попадется лишнего, то будет оно отброшено или также закешируется- не знаю. Но как это меняет ситуацию?

Предположим моя переменная лежит невыровненно, т.е для ее получения надо считать лишний кусок памяти. Какая разница как переменная поделена между этими кусками? Все равно придется считывать лишний кусок, как бы она там не лежала.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603830
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЧестно говоря, не знаю как происходит процедура кеширования.

Вот поэтому - забей. То, чего ты не знаешь, ты не можешь контролировать. Не созрел ты ещё
для низкоуровневой оптимизации, тебе надо азы изучить типа вынесения инвариантов из цикла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603834
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovВот поэтому - забей. То, чего ты не знаешь, ты не можешь контролировать. Не созрел ты ещё
для низкоуровневой оптимизации, тебе надо азы изучить типа вынесения инвариантов из цикла.


Спасибо , за совет! :)
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603858
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603863
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL1. У меня очень большой массив структур (>1 000 000 элементов), который располагается в памяти, выделенной с помощью malloc.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
struct MyData
{
        uint32_t a1;
        uint32_t a2;
        uint32_t a3;
        uint32_t a4;
        float a5;
        int8_t a6;
        int8_t a7;
}


Выше в топике инженеры надавли тебе советов в принципе полезных. И плюсую. Я добавлю.

Есть ли пути для оптимизации самой постановки? У тебя более миллиона элементов по 224 байта.
Грубо говоря более 224 * 1 000 000 = 213Mb . Wow-wow! Это более чем кеш L3. Дружище. Тебе
нужно беспокоитьтся не только о выравнивании но и об общем объеме данных с которыми ты работаешь.

Собственно я предлагаю рассмотреть два пути.

1) Минимизация самих данных которые образуют hot-spot в системе. Если к примеру
в задаче идет интенсивная работа с полем a1 и a5 то разумно создать копию
структуры данных вида
Код: plaintext
1.
2.
3.
4.
5.
struct MyData
{
        uint32_t a1;
        float a5;
}


и поработать с этой структурой отдельно. По завершении - снова создать копию обратно
или десериализацию и т.п.

2) Можно развернуть структуру данных на 90 градусов. Т.н. vertical arrays.
Для многих вендоров DBMS потребовались десятилетия чтобы переосмыслить что
построчное хранение данных (rows) не всегда эффективно для аналитики и иногда
эффективно работать с колоночным (column-oriented). Здесь имеется в виду
не OLTP а именно аналитика.

Имплементация пунктов (1) и (2) не меняет порядка обхода твоего массива по индексу.
Но позволит улучшить когерентность данных по отношению к кешу. Горячие индексы
остаются горячими но находятся физически ближе.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603923
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLВася УткинЕсли нет многопоточного доступа и не обращаешься через SSE>=3 и AVX, то ничего выравнивать не надо, с выравниванием только памяти больше съешь.

1. Честно говоря, не понял при чем тут многопоточный доступ. Разве что предположить, что по выровненным данным работа идет быстрее и взаимные ожидания потоков будут меньше. Но тогда не понятно: если скорость быстрее, то почему не применить это ускорение для однопоточного доступа?
Это не ускорение, а замедление многопоточной работы.

Процессор обменивается с памятью кэш-линиями. Кэш-линия - это 64 байта выровненные по 64, т.е. адрес кратен 64-м. Если один поток (ядро) меняет хоть один байт в кэш-линии, то другой поток (точнее другое ядро) при обращении к этой же кэш-линии будет вынужден дождаться когда первое ядро скинет кэш-линию в общий кэш и перечитает ее оттуда.
Причем разные потоки могут работать с разными частями кэш-линии, но это все-равно заставит ее постоянно перечитывать.

Например: в твоей структуре один поток постоянно меняет a1, второй a2. В итоге будет тормоз, т.к. эти два потока будут мешать друг-другу.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603997
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, ты не видел громоздких конструкций, потому что в этих программах используется выравнивание по умолчанию. Помнится, даже в древнейшем Borland C++ Builder, при создании проекта (32 разрядного, естественно), устанавливалось выравнивание по умолчанию на границу 8 байт. Особенность работы процессоров Intel с оперативной памятью такова, что эти процессоры действительно быстрее работают с выравненными данными, так как если, скажем, процессор читает невыравненное двойное слово, то ему придется дважды выполнить инструкцию чтения из памяти, даже если это двойное слово находится полностью в кэше (два раза обратится к кэшу), а уж если невыравненное двойное слово попадёт на границу линии кеша и одной из линий не окажется в кэше, то возникнет "промах", будет захвачена системная шина и произведена медленная операция чтения из оперативной памяти, при этом, также, могут быть попутно выполнены отложенные инструкции чтения/записи в оперативную память, что приведет к одномоментному резкому снижению производительности.

Для 64-разрядных приложений, естественно, выравнивание должно выполняться по адресам, кратным 8 байтам.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39603999
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПроцессор обменивается с памятью кэш-линиями. Кэш-линия - это 64 байта выровненные по 64, т.е. адрес кратен 64-м. Если один поток (ядро) меняет хоть один байт в кэш-линии, то другой поток (точнее другое ядро) при обращении к этой же кэш-линии будет вынужден дождаться когда первое ядро скинет кэш-линию в общий кэш и перечитает ее оттуда.
Причем разные потоки могут работать с разными частями кэш-линии, но это все-равно заставит ее постоянно перечитывать.Размер линии кэша, это не константное значение, которое можно определить, если мне не изменяет память, выполнив инструкцию CPUID. На большинстве современных процессоров Intel, размер линии кэша 128 байт.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604006
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devНа большинстве современных процессоров Intel, размер линии кэша 128 байт.
Тут мои замеры За все процы не скажу, самый свежий из проверенных i7 6700K, там 64 байта.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604008
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T1. Честно говоря, не понял при чем тут многопоточный доступ. Разве что предположить, что по выровненным данным работа идет быстрее и взаимные ожидания потоков будут меньше. Но тогда не понятно: если скорость быстрее, то почему не применить это ускорение для однопоточного доступа?
Это не ускорение, а замедление многопоточной работы.

Процессор обменивается с памятью кэш-линиями. Кэш-линия - это 64 байта выровненные по 64, т.е. адрес кратен 64-м. Если один поток (ядро) меняет хоть один байт в кэш-линии, то другой поток (точнее другое ядро) при обращении к этой же кэш-линии будет вынужден дождаться когда первое ядро скинет кэш-линию в общий кэш и перечитает ее оттуда.
Причем разные потоки могут работать с разными частями кэш-линии, но это все-равно заставит ее постоянно перечитывать.

Например: в твоей структуре один поток постоянно меняет a1, второй a2. В итоге будет тормоз, т.к. эти два потока будут мешать друг-другу.[/quot]

У меня нет многопоточной работы с общим массивом. Каждый поток имеет свой массив и работает только с ним. Но за информацию спасибо.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604022
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася Уткин, спасибо за инфу по SSE и AVX!

Насколько я понял современные AVX инструкции также работают с невыровненными данными, только слегка просаживаются по производительности.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604027
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, ты, конечно же, в DOS'е замеры делал? ;) Потому что, если ты делал замеры в операционной системе с вытесняющей многозадачностью не создавая тестирующего драйвера режима ядра с маскированием прерываний, то все эти расчёты, ровным счётом, ничего не значат.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604028
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devAlekseySQL, ты не видел громоздких конструкций, потому что в этих программах используется выравнивание по умолчанию. Помнится, даже в древнейшем Borland C++ Builder, при создании проекта (32 разрядного, естественно), устанавливалось выравнивание по умолчанию на границу 8 байт. Особенность работы процессоров Intel с оперативной памятью такова, что эти процессоры действительно быстрее работают с выравненными данными, так как если, скажем, процессор читает невыравненное двойное слово, то ему придется дважды выполнить инструкцию чтения из памяти, даже если это двойное слово находится полностью в кэше (два раза обратится к кэшу), а уж если невыравненное двойное слово попадёт на границу линии кеша и одной из линий не окажется в кэше, то возникнет "промах", будет захвачена системная шина и произведена медленная операция чтения из оперативной памяти, при этом, также, могут быть попутно выполнены отложенные инструкции чтения/записи в оперативную память, что приведет к одномоментному резкому снижению производительности.

Для 64-разрядных приложений, естественно, выравнивание должно выполняться по адресам, кратным 8 байтам.

Я как раз и пытаюсь докопаться до информации о выравнивании по- умолчанию. Откуда у вас эта информация?

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

Функция malloc и переменные в стеке также по- умолчанию невыровнены, иначе не нужны были бы надстройки с выравниванием.

Кто выравнивает данные по- умолчанию?
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604049
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЯ как раз и пытаюсь докопаться до информации о выравнивании по- умолчанию. Откуда у вас эта информация? Например, Using the GNU Compiler Collection , стр. 475

AlekseySQLНапример, в опциях компилятора я не нашел подобных настроек. Ведь если компилятор это делает выравнивание по- умолчанию, то должен быть ключ отключения этой возможности. А такого ключа нету...Такой ключ есть и не один! Есть даже отдельно ключ для выравнивания по умолчанию членов структур.

AlekseySQLФункция malloc и переменные в стеке также по- умолчанию невыравнены, иначе не нужны были бы надстройки с выравниванием.Еще как выравнены! Во-первых, функция malloc возвращает не адрес выделенной из кучи фрагмента памяти, а адрес, куда программа может поместить свои данные. Этот адрес находится за блоком служебной информации менеджера памяти. Во-вторых, венда, в некоторых случаях, при вызове функций WINAPI может попросту навернуть задачу по исключению, если при входе в API функцию стек не будет выровнен на границу двойного слова.

AlekseySQLКто выравнивает данные по- умолчанию?Компилятор.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604067
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devНапример, Using the GNU Compiler Collection , стр. 475

Код: plaintext
1.
2.
3.
4.
Alternatively, you can leave out the alignment factor and just  ask  the compiler
to align a variable or field to the default alignment for the target architecture
you are compiling for.  The default alignment is sufficient for all scalar types,
but may not be enough for all vector types on a target that supports vector
operations.  The default alignment is fixed for a particular target ABI

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.
-falign-functions  -falign-jumps 
-falign-loops  -falign-labels

Спасибо, за подсказки, я потихоньку продвигаюсь к решению вопроса (осталось только чудо- ключи найти).
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604138
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL(осталось только чудо- ключи найти).

STFW #pragma align
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604147
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел ключи для платформы х86:

Код: plaintext
1.
2.
3.
4.
5.
6.
-malign-data=type
    Control how GCC aligns variables. Supported values for type are ‘compat’ uses increased alignment value compatible uses GCC 4.8 and earlier, ‘abi’ uses alignment value as specified by the psABI, and ‘cacheline’ uses increased alignment value to match the cache line size. ‘compat’ is the default.

-malign-double
-mno-align-double
    Control whether GCC aligns double, long double, and long long variables on a two-word boundary or a one-word boundary. Aligning double variables on a two-word boundary produces code that runs somewhat faster on a Pentium at the expense of more memory.
    On x86-64, -malign-double is enabled by default. 

И для диалекта С++:
Код: plaintext
1.
-faligned-new
    Enable support for C++17 new of types that require more alignment than void* ::operator new(std::size_t) provides. A numeric argument such as -faligned-new=32 can be used to specify how much alignment (in bytes) is provided by that function, but few users will need to override the default of alignof(std::max_align_t). 


Так что насколько я понимаю ситуация такая: если не хочешь зависеть от компилятора, то выравнивай сам с помощью: void* _mm_malloc(int size, int base) и alignas.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604150
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, дополнительно смотри директиву компилятора #pragma pack
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604165
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devAlekseySQL, дополнительно смотри директиву компилятора #pragma pack

Спасибо, уже изучил на Хабре .
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604216
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил я сделать все по- умному и начать пользоваться выравниванием для своих больших массивов (а на мелкие переменный забить). Но не тут- то было! Нет аналога функции realloc с выравниванием, только для malloc... Засада какая- то :-(
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604247
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНет аналога функции realloc с выравниванием

Те, кто занимается оптимизацией на уровне выравнивания ни при каких обстоятельствах не
будут пользоваться таким ужасом как realloc().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604274
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604284
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 и где он заканчивается, т.е. размер кэш-линии в любом случае статистически виден четко, т.к. в хорошем тесте замер происходит сотни тысяч раз и усредняется.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604354
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Довброшу навский ...

Если вы используете или планируете использовать
сериализацию на диск то


Нужно равняться по страницам памяти ОС,
а потом, внутри этого выравнивания, по линейкам кешей.
что бы выравнивание объектов не съезжало с выравнивания
по границам страниц памяти, запрашивать с диска нужно
не конкретный объект, а выровнянный по структуре
хранения на диске и в памяти блок,
из которого через коственую адресацию
получать указатель на нужный объект.

приблизительно так ....

В противном случае, сериализация на диск
польностью убъет все ваши усилия получить профит от выравнивания.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604441
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док. Это без пяти минут dbms.
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604459
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonДок. Это без пяти минут dbms.

Я так невзначай вбросил предупредил,
ковырясь носу :)

Если уж выраниваете, то равняйте так , что бы потом
не перевыравнивать.

Толку мало если вы выиграете на локальном выравнивании, потеряете кучу времени,
но потом, в продуктиве, менеджер виртуальной памяти ОС
съест всю вашу экономию, и даже чуть чуть больше чем вы предполагали :)
...
Рейтинг: 0 / 0
А оно нам надо: выравнивание данных?
    #39604464
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonДок. Это без пяти минут dbms.

Это не dbms

Это толстый намек на длинные массивы и realloc,
которым интересовался автор .
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / А оно нам надо: выравнивание данных?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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