Многопоточность против многопоточности - PullRequest
0 голосов
/ 20 февраля 2019

Предположим, у меня есть таблица с 100000 строками и скрипт на Python, который последовательно выполняет некоторые операции с каждой строкой этой таблицы.Теперь, чтобы ускорить этот процесс, я должен создать 10 отдельных сценариев и запустить их одновременно, которые обрабатывают последующие 10000 строк таблицы, или я должен создать 10 потоков для обработки строк для лучшей скорости выполнения?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

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

Самым большим фактором производительности в многопоточном исполнении, когда нет блокировки / барьеров, является локальность доступа к данным, например.Ядра умножения матриц.

Предположим, данные хранятся в куче линейным образом, т.е.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 иликупите новый процессор с большим количеством ядер или более высокой частотой.

0 голосов
/ 20 февраля 2019

Threading

  • Из-за Глобальной блокировки интерпретатора потоки Python не являются действительно параллельными.Другими словами, одновременно может быть запущен только один поток.
  • Если вы выполняете задачи, связанные с процессором, то распределение рабочей нагрузки между потоками не ускорит ваши вычисления.Во всяком случае, это замедлит их, потому что интерпретатор может переключаться между большим количеством потоков.
  • Многопоточность гораздо полезнее для задач, связанных с вводом-выводом.Например, если вы одновременно общаетесь с несколькими клиентами / серверами.В этом случае вы можете переключаться между потоками, ожидая ответа от различных клиентов / серверов

Многопроцессорная обработка

  • Как указал Эман Хамед, может быть труднообмениваться объектами при многопроцессорной обработке.

Векторизация

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