Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
В книгах пишут что кэши проца оперируют блоками по 64 байта. В случае если размер данных меньше, то возникает конкуренция за доступ даже в разные ячейки памяти одного блока. Например если разные потоки обращаются к соседним элементам массива int[] то это уже тормозит. Есть массив структур Код: plaintext 1. 2. 3. 4. my_t сборище всякой всячины (от указателей до мутексов), в виндовсе один размер, в линуксе другой. Каждый элемент my_t для отдельного потока. Как правильно выровнять данные в памяти? Есть какой-то специальный синтаксис для этого? Надо ли вообще выравнивать если sizeof(my_t) > 64 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 19:28 |
|
||
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
Появится только в 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 20:39 |
|
||
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
Спасибо. Так тоже нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 20:51 |
|
||
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 20:58 |
|
||
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
Dima TНапример если разные потоки обращаются к соседним элементам массива int[] то это уже тормозит. Не обращайтесь к соседним ячейкам из разных потоков, разделите данные между потоками, чтобы каждый имел свой большой непрерывный блок. Если размер блока >> 64 байт вам не надо беспокоится о выравнивании, так в худшем случае вы сделаете на 2 чтения 64-байтного блока больше. В крайнем случае воспользуйтесь функциями posix_memalign() или memalign(), доступными по ссылке Siemargl. Ни в коем случае не делайте как сказал Вася Уткин (кроме случае когда вы точно понимаете что делаете, например если каждый поток владеет своим экзмемпляром структуры и активно его изменяет), так как в этом случае на чтение каждого экземпляра структуру будет тратится одна операция чтения и вы потеряете преимущество cacheline. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2017, 23:30 |
|
||
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
Sash_xp В крайнем случае воспользуйтесь функциями posix_memalign() или memalign(), доступными по ссылке Siemargl. Ни в коем случае не делайте как сказал Вася Уткин (кроме случае когда вы точно понимаете что делаете, например если каждый поток владеет своим экзмемпляром структуры и активно его изменяет), так как в этом случае на чтение каждого экземпляра структуру будет тратится одна операция чтения и вы потеряете преимущество cacheline. Спасибо за замечание, абсолютно согласен, никогда не используйте стандарт C++, всегда используйте стандарт POSIX, иначе вы потеряете преимущество cacheline. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2017, 00:11 |
|
||
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
Sash_xp, не понял про "тратится одна операция чтения". а сколько операций должно тратиться? разве не этого добавается тс - чтобы за одно чтение прочитать нужные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.02.2017, 21:44 |
|
||
|
Выравнивание структур под кэш проца для многопоточного доступа
|
|||
|---|---|---|---|
|
#18+
alexy_black, За один раз читается cacheline - в один cacheline может поместиться несколько экземпляров структур. То есть если мы последовательно работает с экземплярами структур для второй и последующей не нужно будет заново читать из памяти - они уже будут прочитаны. В этом идея cacheline - при последовательном доступе к памяти мы оптимизируем количество чтений. Если же структура будет выровнена по cacheline - каждый экземпляр придется отдельно читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2017, 01:12 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39410018&tid=2018264]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
171ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 284ms |

| 0 / 0 |
