powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выравнивание структур под кэш проца для многопоточного доступа
8 сообщений из 8, страница 1 из 1
Выравнивание структур под кэш проца для многопоточного доступа
    #39410018
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В книгах пишут что кэши проца оперируют блоками по 64 байта. В случае если размер данных меньше, то возникает конкуренция за доступ даже в разные ячейки памяти одного блока.
Например если разные потоки обращаются к соседним элементам массива int[] то это уже тормозит.

Есть массив структур
Код: plaintext
1.
2.
3.
4.
struct my_t{
  ...
}
std::vector<my_t> v;


my_t сборище всякой всячины (от указателей до мутексов), в виндовсе один размер, в линуксе другой.

Каждый элемент my_t для отдельного потока.

Как правильно выровнять данные в памяти? Есть какой-то специальный синтаксис для этого?

Надо ли вообще выравнивать если sizeof(my_t) > 64 ?
...
Рейтинг: 0 / 0
Выравнивание структур под кэш проца для многопоточного доступа
    #39410039
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Появится только в C++17, а пока можно так.

http://coliru.stacked-crooked.com/a/51cced1bcf874dfa

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include <iostream>
#include <vector>
#include <new>


//alignas(std::hardware_destructive_interference_size)  // C++17
struct alignas(64) my_t {
    int a;
    double b;
    char c;
};

std::vector<my_t> v;

int main() {
	
	std::cout << "sizeof(my_t) = " << sizeof(my_t) << std::endl;

	return 0;
}
...
Рейтинг: 0 / 0
Выравнивание структур под кэш проца для многопоточного доступа
    #39410049
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Так тоже нормально.
...
Рейтинг: 0 / 0
Выравнивание структур под кэш проца для многопоточного доступа
    #39410052
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

>Каждый элемент my_t для отдельного потока.
Это ужасно, если есть доступ на запись.

Выравнивание регулируется опциями компилятора. Но он по дефолту для одиночных переменных
https://software.intel.com/en-us/articles/coding-for-performance-data-alignment-and-structures

Для векторов обсуждается тут
http://stackoverflow.com/questions/8456236/how-is-a-vectors-data-aligned
...
Рейтинг: 0 / 0
Выравнивание структур под кэш проца для многопоточного доступа
    #39411293
Sash_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНапример если разные потоки обращаются к соседним элементам массива int[] то это уже тормозит.

Не обращайтесь к соседним ячейкам из разных потоков, разделите данные между потоками, чтобы каждый имел свой большой непрерывный блок. Если размер блока >> 64 байт вам не надо беспокоится о выравнивании, так в худшем случае вы сделаете на 2 чтения 64-байтного блока больше.

В крайнем случае воспользуйтесь функциями posix_memalign() или memalign(), доступными по ссылке Siemargl.

Ни в коем случае не делайте как сказал Вася Уткин (кроме случае когда вы точно понимаете что делаете, например если каждый поток владеет своим экзмемпляром структуры и активно его изменяет), так как в этом случае на чтение каждого экземпляра структуру будет тратится одна операция чтения и вы потеряете преимущество cacheline.
...
Рейтинг: 0 / 0
Выравнивание структур под кэш проца для многопоточного доступа
    #39411305
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sash_xp В крайнем случае воспользуйтесь функциями posix_memalign() или memalign(), доступными по ссылке Siemargl.

Ни в коем случае не делайте как сказал Вася Уткин
(кроме случае когда вы точно понимаете что делаете, например если каждый поток владеет своим экзмемпляром структуры и активно его изменяет), так как в этом случае на чтение каждого экземпляра структуру будет тратится одна операция чтения и вы потеряете преимущество cacheline.
Спасибо за замечание, абсолютно согласен, никогда не используйте стандарт C++, всегда используйте стандарт POSIX, иначе вы потеряете преимущество cacheline.
...
Рейтинг: 0 / 0
Выравнивание структур под кэш проца для многопоточного доступа
    #39412032
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sash_xp,

не понял про "тратится одна операция чтения". а сколько операций должно тратиться? разве не этого добавается тс - чтобы за одно чтение прочитать нужные данные.
...
Рейтинг: 0 / 0
Выравнивание структур под кэш проца для многопоточного доступа
    #39412090
Sash_xp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_black,

За один раз читается cacheline - в один cacheline может поместиться несколько экземпляров структур. То есть если мы последовательно работает с экземплярами структур для второй и последующей не нужно будет заново читать из памяти - они уже будут прочитаны. В этом идея cacheline - при последовательном доступе к памяти мы оптимизируем количество чтений. Если же структура будет выровнена по cacheline - каждый экземпляр придется отдельно читать.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Выравнивание структур под кэш проца для многопоточного доступа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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