Я реализовал циклическую очередь, используя массив на C++. Очередь использует две атомарные переменные, переднюю и заднюю, для управления операциями постановки и удаления из очереди. Когда элемент помещается в очередь, задняя часть увеличивается, а когда элемент выводится из очереди, увеличивается передняя часть.
Я создал 16 экземпляров этой циклической очереди, каждый размером 2^23. элементов.
Я тестирую два сценария:
Сценарий 1:
Есть 2 потоки чтения.
Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждое устройство чтения отвечает за 8 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов, за которым следует определенная обработка.
Другой поток помещает элементы в разные циклические очереди.
Сценарий 2:
Имеется 8 потоков чтения.Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждый поток чтения отвечает за 2 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов с последующей определенной обработкой. .
Другой поток ставит элементы в разные циклические очереди.
Метрика:
Основной метрикой для сравнения в обоих сценариях является затраченное время. элементом между постановкой в очередь и удалением из очереди (задержка или время, проведенное пакетом внутри очереди).
Проблема:
Естественно, я ожидал, что увеличение количество потоков чтения уменьшит задержку. Однако я заметил обратное: задержка увеличивалась, когда было задействовано больше читателей.
Кроме того, я заметил, что когда используется больше потоков чтения, некоторые из потоков имеют меньшую загрузку ЦП (около 70 -80%), несмотря на то, что в них присутствует бесконечный цикл while.
Вопрос:
Почему задержка может увеличиваться при добавлении большего количества читателей? Существуют ли в моей реализации конкретные проблемы, связанные с параллелизмом или кешем, которые могли бы объяснить такое поведение?
Что может быть причиной более низкой загрузки ЦП в некоторых потоках, когда используется больше потоков чтения?
Дополнительная информация:
Код написан на C++.
Закрепление и изоляция ядра были выполнены для всех потоков во избежание помех.
Я пытался проверить наличие конфликтов или чего-либо еще, но ничего не нашел.
Подробнее здесь: https://stackoverflow.com/questions/785 ... cular-queu
Неожиданное увеличение задержки при увеличении числа читателей при реализации многопоточной кольцевой очереди на C++ ⇐ C++
Программы на C++. Форум разработчиков
1716191259
Anonymous
Я реализовал циклическую очередь, используя массив на C++. Очередь использует две атомарные переменные, переднюю и заднюю, для управления операциями постановки и удаления из очереди. Когда элемент помещается в очередь, задняя часть увеличивается, а когда элемент выводится из очереди, увеличивается передняя часть.
Я создал 16 экземпляров этой циклической очереди, каждый размером 2^23. элементов.
Я тестирую два сценария:
Сценарий 1:
Есть 2 потоки чтения.
Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждое устройство чтения отвечает за 8 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов, за которым следует определенная обработка.
Другой поток помещает элементы в разные циклические очереди.
Сценарий 2:
Имеется 8 потоков чтения.Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждый поток чтения отвечает за 2 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов с последующей определенной обработкой. .
Другой поток ставит элементы в разные циклические очереди.
Метрика:
Основной метрикой для сравнения в обоих сценариях является затраченное время. элементом между постановкой в очередь и удалением из очереди (задержка или время, проведенное пакетом внутри очереди).
Проблема:
Естественно, я ожидал, что увеличение количество потоков чтения уменьшит задержку. Однако я заметил обратное: задержка увеличивалась, когда было задействовано больше читателей.
Кроме того, я заметил, что когда используется больше потоков чтения, некоторые из потоков имеют меньшую загрузку ЦП (около 70 -80%), несмотря на то, что в них присутствует бесконечный цикл while.
Вопрос:
Почему задержка может увеличиваться при добавлении большего количества читателей? Существуют ли в моей реализации конкретные проблемы, связанные с параллелизмом или кешем, которые могли бы объяснить такое поведение?
Что может быть причиной более низкой загрузки ЦП в некоторых потоках, когда используется больше потоков чтения?
Дополнительная информация:
Код написан на C++.
Закрепление и изоляция ядра были выполнены для всех потоков во избежание помех.
Я пытался проверить наличие конфликтов или чего-либо еще, но ничего не нашел.
Подробнее здесь: [url]https://stackoverflow.com/questions/78505327/unexpected-increase-in-latency-with-more-readers-in-multi-threaded-circular-queu[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия