Почему большее количество потоков занимает больше времени для обработки? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть код переменного тока, который обрабатывает большой объем данных (80 МБ, U16) в глобальном массиве.Чтобы уменьшить время, я использовал библиотеку pthreads.Процесс умножает каждый элемент на постоянную.Использование двух потоков занимает 50 мсек.При использовании трех потоков это занимает 120 мс (приблизительно).Я также попытался увеличить объем памяти стека, но это не работает.

В коде нет функции rand () или динамического выделения памяти.Просто вызывая простую функцию из 2 или 3 потоков.

Мне интересно, какой фактор ограничивает производительность, если количество потоков увеличивается?Также, пожалуйста, предложите мне, как оптимизировать время выполнения далее.

PS: Моя система имеет 8 ГБ ОЗУ, процессор Intel i3.Запуск в Windows (если это поможет)

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Чаще всего причина заключается в неправильном бенчмаркинге ...

Кроме того, вы должны понимать, что создание / удаление потока является ресурсоемким действием.Это занимает время, ему нужна память.

Это означает, что большее количество потоков не обязательно обеспечивает более быстрое общее выполнение всей программы, а скорее может дать более быстрое выполнение конкретной задачи.Поэтому использование потоков в приложении должно рассматриваться на индивидуальной основе.

0 голосов
/ 25 мая 2018

Предположим, что вы сделали оптимальную реализацию (это может быть действительно сложно в зависимости от проблемы).

Вы разделили блоки без перекрытия и подали их в потоки.

Пока чтохорошо.

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

Но, что я думаю, более важно, может быть то, что у вас есть процессор i3, у многих из них просто есть 2 ядра, и в зависимости от того, активирована ли гиперпоточность, у вас также есть 2логические ядра.И для таких систем вы не можете воспользоваться более чем двумя потоками (если они могут использовать все ресурсы), третий поток может просто помешать двум другим, создавая более длительное время выполнения.

...