как запустить каждый поток на другом ядре?

У меня есть сервер udp, который получает данные и вычисляет их.

У меня есть два потока для каждой роли.

В моем процессоре 8 многоядерных процессоров, и я посылаю данные с различной скоростью.

но в Maximun я использую только% 14 процентов от моего двухъядерного процессора 50%. если я отправлю больше данных, мой буфер заполнится и больше не будет использовать процессор.

почему у каждого ядра возникает только 50% и не более?

Я думаю разделить эти две роли на многоядерные.

Я хочу быть уверен, что каждый на другом ядре.

как я могу явно выбрать каждый поток, запущенный на другом ядре?

моя программа работает на c ++ visaul studio 9 и работает на windows7, и я использую boost :: thread.

1

Решение

Планировщик будет иметь дело с тем, где будут работать ваши потоки и т.д. Это зависит от ОС, поэтому, если вы хотите попытаться изменить способ выполнения кода, вам понадобится специфичный для ОС API, который позволит вам установить сходство потоков и т. Д.

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

ОС обычно хорошо справляется с запуском вашего кода, так как у него будет лучшая общая картина.

4

Другие решения

Вы не можете заставить один поток использовать более одного ядра. Чтобы добиться более эффективного использования ЦП, вам необходимо изменить дизайн своей программы, чтобы создать больше потоков и позволить ОС планировать их для вас. Нет необходимости вручную ограничивать потоки конкретными ядрами. ОС действительно хорошо разбираются в том, как распределять ядра по потокам.

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

1

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

1
По вопросам рекламы [email protected]