Неожиданное увеличение задержки при увеличении числа читателей при реализации многопоточной кольцевой очереди на C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Неожиданное увеличение задержки при увеличении числа читателей при реализации многопоточной кольцевой очереди на C++

Сообщение Anonymous »

Я реализовал циклическую очередь, используя массив на C++. Очередь использует две атомарные переменные, переднюю и заднюю, для управления операциями постановки и удаления из очереди. Когда элемент помещается в очередь, задняя часть увеличивается, а когда элемент выводится из очереди, увеличивается передняя часть.
Я создал 16 экземпляров этой циклической очереди, каждый размером 2^23. элементов.
Я тестирую два сценария:
Сценарий 1:
Есть 2 потоки чтения.
Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждое устройство чтения отвечает за 8 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов, за которым следует определенная обработка.
Другой поток помещает элементы в разные циклические очереди.
Сценарий 2:
Имеется 8 потоков чтения.Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждый поток чтения отвечает за 2 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов с последующей определенной обработкой. .
Другой поток ставит элементы в разные циклические очереди.
Метрика:
Основной метрикой для сравнения в обоих сценариях является затраченное время. элементом между постановкой в ​​очередь и удалением из очереди (задержка или время, проведенное пакетом внутри очереди).
Проблема:
Естественно, я ожидал, что увеличение количество потоков чтения уменьшит задержку. Однако я заметил обратное: задержка увеличивалась, когда было задействовано больше читателей.
Кроме того, я заметил, что когда используется больше потоков чтения, некоторые из потоков имеют меньшую загрузку ЦП (около 70 -80%), несмотря на то, что в них присутствует бесконечный цикл while.
Вопрос:
Почему задержка может увеличиваться при добавлении большего количества читателей? Существуют ли в моей реализации конкретные проблемы, связанные с параллелизмом или кешем, которые могли бы объяснить такое поведение?
Что может быть причиной более низкой загрузки ЦП в некоторых потоках, когда используется больше потоков чтения?
Дополнительная информация:
Код написан на C++.
Закрепление и изоляция ядра были выполнены для всех потоков во избежание помех.
Я пытался проверить наличие конфликтов или чего-либо еще, но ничего не нашел.


Подробнее здесь: https://stackoverflow.com/questions/785 ... cular-queu
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»