2016-11-19 13 views
0

У меня есть простой монофонический нарезкой приложение, которое делает почти чистую обработкуНевозможно выделить исключительно процессор для моего процесса

  1. Он использует два Int буферов одного и того же размера
  2. Он читает один в каждом конкретном один все значения первого буфера
    • каждое значение является случайным индексом во втором буфере
  3. считывает значение в индексе во втором буфере
  4. Он суммирует все значения, взятые из второго буфера
  5. Он делает все предыдущие шаги для больше и больше
  6. В конце концов, я печатаю число вольные и невольные контекст CPU переключается

Если размер буфера станет достаточно большим, мой компьютер начинает замедляться: почему? У меня есть 4 ядра с гиперпотоком, поэтому 3 ядра восстанавливаются. Только один на 100% занят. Это потому, что мой процесс использует почти 100% для «RAM-bus»?

Затем я создал CPU-набор, который я хочу посвятить мой процесс (мой CPU-набор содержит как CPU-потоков одного и того же ядра)

$ cat /sys/devices/system/cpu/cpu3/topology/core_id 
3 
$ cat /sys/devices/system/cpu/cpu7/topology/core_id 
3 

$ cset set -c 3,7 -s my_cpuset 
$ cset set -l 
cset: 
     Name  CPUs-X MEMs-X Tasks Subs Path 
------------ ---------- - ------- - ----- ---- ---------- 
     root  0-7 y  0 y 934 1/
    my_cpuset  3,7 n  0 n  0 0 /my_cpuset 

Это кажется, что абсолютно никаких задач на всех работает на моем CPU-наборе. Я могу возобновить свой процесс и в то время как он работает, я запускаю:

$ taskset -c 7 ./TestCpuset # Here, I launch my process 
... 
$ ps -mo pid,tid,fname,user,psr -p 25244 # 25244 being the PID of my process 
    PID TID COMMAND USER  PSR 
25244  - TestCpus phil  - 
    - 25244 -  phil  7 

PSR = 7: мой процесс хорошо работает на ожидаемом CPU-нить. Я надеюсь, что это только один работает на нем, но в конце концов, мой процесс показывает:

Number of voluntary context switch: 2 
Number of involuntary context switch: 1231 

Если бы я был непроизвольные переключения контекста, то это означает, что другие процессы запущены на моем ядре: Как это возможно? Что я должен сделать, чтобы получить номер непроизвольного контекстного переключателя = 0?

Последний вопрос: Когда мой процесс запущен, если я запускаю

$ cset set -l 
cset: 
     Name  CPUs-X MEMs-X Tasks Subs Path 
------------ ---------- - ------- - ----- ---- ---------- 
     root  0-7 y  0 y 1031 1/
    my_cpuset  3,7 n  0 n  0 0 /my_cpuset 

Еще раз я получаю 0 задания на моем CPU-набора. Но я знаю, что на нем есть процесс: кажется, что задача не является процессом?

ответ

0

Если размер буферов становится довольно большим, мой компьютер начинает замедляться: почему? У меня есть 4 ядра с гиперпотоком, поэтому 3 ядра восстанавливаются. Только один на 100% занят. Это потому, что мой процесс использует почти 100% для «RAM-bus»?

Вы достигли предела производительности оборудования однопоточного приложения, то есть 100% процессорного времени на одном процессоре, на который выделена ваша программа. Ваш поток приложений не будет запускаться более чем на одном CPU за раз (reference).

Что мне делать, чтобы получить номер непроизвольного контекстного переключателя = 0?

Вы не хватает --cpu_exclusive опцию в cset set команде?

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

 Смежные вопросы

  • Нет связанных вопросов^_^