У меня есть сервер udp, который получает данные и вычисляет их.
У меня есть два потока для каждой роли.
В моем процессоре 8 многоядерных процессоров, и я посылаю данные с различной скоростью.
но в Maximun я использую только% 14 процентов от моего двухъядерного процессора 50%. если я отправлю больше данных, мой буфер заполнится и больше не будет использовать процессор.
почему у каждого ядра возникает только 50% и не более?
Я думаю разделить эти две роли на многоядерные.
Я хочу быть уверен, что каждый на другом ядре.
как я могу явно выбрать каждый поток, запущенный на другом ядре?
моя программа работает на c ++ visaul studio 9 и работает на windows7, и я использую boost :: thread.
Планировщик будет иметь дело с тем, где будут работать ваши потоки и т.д. Это зависит от ОС, поэтому, если вы хотите попытаться изменить способ выполнения кода, вам понадобится специфичный для ОС API, который позволит вам установить сходство потоков и т. Д.
Кроме того, от того, как выглядит ваше приложение, зависит его внешний вид от клиентского сервера, поэтому он не полностью связан с процессором. Сколько потоков у вас всего, вы упомянули 2 на роль? Поток может быть запущен только на одном процессоре. Попробуйте создать единицы работы, которые действительно могут работать параллельно, чтобы они могли работать независимо друг от друга, в идеале на разных ядрах.
ОС обычно хорошо справляется с запуском вашего кода, так как у него будет лучшая общая картина.
Вы не можете заставить один поток использовать более одного ядра. Чтобы добиться более эффективного использования ЦП, вам необходимо изменить дизайн своей программы, чтобы создать больше потоков и позволить ОС планировать их для вас. Нет необходимости вручную ограничивать потоки конкретными ядрами. ОС действительно хорошо разбираются в том, как распределять ядра по потокам.
В вашем случае, если задачи по обработке данных нагружены процессором, вы можете создавать новый поток для каждого запроса или иметь пул рабочих потоков, который будет выбирать входящие задачи и обрабатывать их. Это всего лишь одна из идей. Трудно сказать, не зная больше об архитектуре вашего приложения и проблемах, которые он пытается решить.
В каждой теме вы можете использовать SetThreadAffinityMask выбрать процессоры, на которых должен работать ваш поток. Но я предлагаю вам создать новый рабочий поток для каждого входящего запроса (также, если вы используете пул потоков, вы видите значительное повышение производительности)