Потоки процессов имеют общий непрерывный (виртуальный) блок памяти, известный как кучи процессов.Потоки также потребляют меньше ресурсов ОС по сравнению с целыми процессами (отдельными скриптами), и переключение контекста не происходит.
Самым большим фактором производительности в многопоточном исполнении, когда нет блокировки / барьеров, является локальность доступа к данным, например.Ядра умножения матриц.
Предположим, данные хранятся в куче линейным образом, т.е.0-я строка в байтах [0-4095], 1-я строка в байтах [4096-8191] и т. Д. Тогда нить-0 должна работать в 0,10,20, ... строки, нить-1 - в 1,11, 21, ... строк и т. Д.
Основная идея заключается в том, чтобы набор из 4 Кб страниц хранился в физической памяти, а 64-байтовые блоки хранились в кеше L3 и работали с ними многократно.Компьютеры обычно предполагают, что если вы «используете» определенную область памяти, то вы также будете использовать смежные, и вы должны сделать все возможное, чтобы сделать это в своей программе.Наихудший сценарий - случайный доступ к ячейкам памяти, которые разносятся на ~ 10 МБ, поэтому не делайте этого.Например.Если размер одной строки равен 1310720 удваивается (64B), то ваши потоки должны работать внутри строки (одна строка), а не между рядами (выше).
Оцените ваш код и в зависимости от ваших результатовЕсли ваш алгоритм может обрабатывать около 21,3 ГБ / с (DDR3-2666 МГц) строк, то у вас есть задача, связанная с памятью.Если ваш код соответствует скорости обработки 1 ГБ / с, то у вас есть задача, связанная с вычислениями, что означает, что выполнение инструкций по данным занимает больше времени, чем выборка данных из ОЗУ, и вам нужно либо оптимизировать свой код, либо достичь более высокого IPC с использованием наборов инструкций AVXx иликупите новый процессор с большим количеством ядер или более высокой частотой.