закрепление pthread на одно ядро - PullRequest
0 голосов
/ 29 марта 2012

Я пытаюсь измерить производительность некоторых библиотечных вызовов. Мой основной инструмент измерения - это вызов rdtsc. После некоторого чтения я понимаю, что мне нужно отключить прерывание и прерывания, чтобы получить наиболее точные показания. Может кто-нибудь помочь мне понять, как это сделать? Я знаю, что у pthreads есть механизм «установки сродства». Этого достаточно, чтобы выполнить работу?

Я также где-то читал, что могу делать вызовы в ядро ​​вида

preempt_disable()
raw_local_irq_save(...)

Есть ли польза от использования одного подхода по сравнению с другим? Я попробовал последний подход и получил эту ошибку.

error: 'preempt_disable' was not declared in this scope

, который можно исправить, добавив linux / preempt.h, но компилятор все еще жалуется.

linux/preempt.h: No such file or directory

Очевидно, что я не делал взлома ядра и не мог найти этот файл в своей системе нигде. Я действительно надеюсь, что мне не придется устанавливать новое ядро ​​Linux. :)

Спасибо за ваш вклад.

1 Ответ

3 голосов
/ 30 марта 2012

Прикрепление pthread к одному ЦП можно выполнить с помощью pthread_setaffinity_np

Но то, что вы хотите достичь в конце, не так просто. Я объясню тебе почему.

preempt.h является частью исходного кода ядра Linux. Он расположен здесь . Вы должны иметь исходные коды ядра. В любом случае, вам нужно написать модуль ядра для доступа к нему, вы не можете использовать его из пространства пользователя. Научитесь писать модуль ядра здесь . То же самое происходит с функциями preempt_disable и другими прерываниями, отключающими функции ядра

Теперь дело в том, что pthread-ы находятся в пользовательском пространстве, а ваша функция отключения вытеснения - в пространстве ядра. Как взаимодействовать?

Либо вам нужно написать новый системный вызов , в котором вы делаете свое прерывание и отключаете прерывание и вызываете его из пространства пользователя. Или вам нужно прибегнуть к другим интерфейсам пространства пользователя-ядра , таким как procfs, sysfs, ioctl и т. Д.

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

...