Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: RealTime вычисления на Ubuntu 14.04  (Прочитано 1454 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Eduard86

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
RealTime вычисления на Ubuntu 14.04
« : 15 Декабря 2015, 09:08:45 »
Здравствуйте, коллеги. Есть задача, где нужно иметь гарантированное время выполнения кода, например, вычислять число Pi c точностью до десятого знака за всегда одинаковое количество микросекунд/тактов процессора (на эту задержку будет ориентироваться внешняя система). Для решения этой задачи я поставил rt-ядра (3.14.23-rt20 и 3.12.31-rt45), но никакого качественного эффекта по сравнению с generic (3.19 и 3.16) не получил. Немного изменились диаграммы тестов. От администрирования промышленных систем я далек, поэтому есть ощущение что я упускаю что-то принципиальное и вцелом задача решаема, просто я не знаю как. Подскажите куда двигаться. Система x64 на базе Intel Core 2 Quad. Идея такая чтобы выделить потоку, который производит RT-вычисления, одно ядро в монопольное пользование, а остальной ресурс использовать на усмотрение системы. Возможно такое реализовать?

shura1

  • Гость
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #1 : 15 Декабря 2015, 09:36:05 »
Вроде так. COMMAND должна будет выполняться с максимальным приоритетом и в realtime режиме
chrt -f -p 99 COMMANDВот здесь, допустим, можно почитать. Ну и man chrt.
Запускать процесс надо от root-a, обычный пользователь не может запускать realtime-процессы (можно разрешить пользователям или группе - в /etc/security/limits.conf)
« Последнее редактирование: 15 Декабря 2015, 09:38:04 от shura1 »

Оффлайн Eduard86

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #2 : 15 Декабря 2015, 09:47:54 »
применял эту команду, top показывает приоритет процесса rt, и действительно, стандартное отклонение задержки становится несколько лучше, становится меньшей зависимость от общей нагрузки системы. Проблема в том, что это не решает задачу жестко, то есть, я все равно имею некоторую погрешность latency.

shura1

  • Гость
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #3 : 15 Декабря 2015, 09:55:38 »
Можно попробовать на разных ядрах linux-lowlantency-lts-* (trusty, vivid, wily).

Оффлайн Karl500

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2267
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #4 : 15 Декабря 2015, 10:11:28 »
Если цель - точно (естественно, с какой-то погрешностью) отмерить время, то для этого существуют таймеры. Если цель - при вычислении заведомо уложиться в заданное время, то общее направление верное: увеличить приоритет задачи до максимума, закрыть все необязательные процессы, отключить (физически) все ненужные внешние устройства.
Т.е., резюмируя - само вычисление идет всегда за одно и то же количество тактов процессора, но разное количество микросекунд. И с этим ничего не поделать: система постоянно отвлекается на обработку прерываний.

Оффлайн Eduard86

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #5 : 15 Декабря 2015, 10:14:35 »
Не тестировал на работе с сетью, но задержки в приложении на ядрах rt и lowlatency идентичны. Самое забавное, что в Виндовс среде на коротком временном интервале (<0,1 мс) выполнение кода занимает гарантировано одинаковое время, но редкие огронмные выносы делают стандартное отклонение latency больше чем под Ubuntu. В Ubuntu наоборот на длительном интервале время выполнения более менее устойчиво, но локально постоянно гуляет (ровной линии как под виндовс нет).

Пользователь решил продолжить мысль 15 Декабря 2015, 10:22:29:
Если цель - точно (естественно, с какой-то погрешностью) отмерить время, то для этого существуют таймеры. Если цель - при вычислении заведомо уложиться в заданное время, то общее направление верное: увеличить приоритет задачи до максимума, закрыть все необязательные процессы, отключить (физически) все ненужные внешние устройства.
Т.е., резюмируя - само вычисление идет всегда за одно и то же количество тактов процессора, но разное количество микросекунд. И с этим ничего не поделать: система постоянно отвлекается на обработку прерываний.

Кванты времени измеряю при помощи данных с процессора (счетчик тиков возвращает функция ассемблера) поэтому погрешность измерения практически нулевая. Действительно, вся задержка возникаект изза наличия прерываний и она рисует разную диаграмму на разных ядрах и разных ОС. Можно это как то исключить технологически? Например, выделить потоку ядро и вообще не вмешиваться в его работу. Есть какое-то радикальное решение или нет ничего лучше чем вручную убивать конкурирующие процессы и отключать оборудование?
« Последнее редактирование: 15 Декабря 2015, 10:22:29 от Eduard86 »

Оффлайн Karl500

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2267
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #6 : 15 Декабря 2015, 10:51:12 »
В Вашей постановке задача на обычной ОС не решается. Да и на любой ОС (в том числе и ОС реального времени) такое абсолютно точное решение (с точностью до такта процессора) можно получить только имея процессор в единоличном пользовании, когда Вы можете запретить абсолютно все прерывания, т.е. при работе не под операционной системой.

Оффлайн Eduard86

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #7 : 15 Декабря 2015, 11:23:38 »
Карл, почему нельзя привязать процессор (ядро) к потоку в единоличное использование средствами ОС?

Оффлайн Karl500

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2267
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #8 : 15 Декабря 2015, 11:47:15 »
Это не поможет, потому что прерывания ничего не знают о привязке ядра к потоку. Гуглите - прерывания в многоядерных системах. Ну или вот тут посмотрите: https://dev64.wordpress.com/2012/05/23/interrupt-subsystem-architecture/
Вам (при работе под ОС) никто не разрешит запретить прерывания для процессорного ядра. Для того, чтобы это сделать, Вам нужно либо быть ядром ОС, либо выполняться не под ОС.

Оффлайн Eduard86

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #9 : 15 Декабря 2015, 12:06:05 »
Почему нельзя контролировать это на уровне ядра ОС? Например, отключить для одного конкретного ЦП все внешние события, тем временем повесить на него выполнение критически важного RT-потока. Это же подсилу ОС? Может я глупости говорю, просто очень плохо понимаю устройство компьютера на этом уровне.

shura1

  • Гость
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #10 : 15 Декабря 2015, 12:16:34 »
Да. Полностью невозможно, насколько я понял. Но вот тут говориться как можно по максимуму обеспечить работу процесса на одном ядре.

http://stackoverflow.com/questions/13583146/whole-one-core-dedicated-to-single-process

Здесь немного посвежее.

Оффлайн Eduard86

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #11 : 15 Декабря 2015, 12:20:07 »
shura1, спасибо за наводки, буду изучать.

Оффлайн Karl500

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2267
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #12 : 15 Декабря 2015, 12:22:30 »
Я же уже сказал: в исходной постановке задачи (ТОЧНОЕ до такта процессора одинаковое время выполнения вычислений) это невозможно. И никакие "максимально обеспечить" не являются решением исходной (строгой) задачи.

UPD: учтите еще, что при частоте процессора (к примеру) 1ГГц один такт занимает одну наносекунду. И решите, нужна ли Вам такая точность, или достаточно все-таки точности, которую может обеспечить системный таймер (50 или 60 миллисекунд) или высокоточный таймер (одна миллисекунда) (http://z-oleg.com/delphi/systimer.htm).
« Последнее редактирование: 15 Декабря 2015, 12:28:57 от Karl500 »

Оффлайн Eduard86

  • Автор темы
  • Новичок
  • *
  • Сообщений: 24
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #13 : 15 Декабря 2015, 12:42:29 »
Карл, среднестатистическое время выполнения алгоритма 25мкс на процессоре с частотой 2,5 ГГц. Проблема в том, что на таком таймфрейме я имею среднеквадратичное отклонение задержки 5-10мкс, что дает по сути +/-50% точности и это есть смертельно. Жесткое решение предполагает 100% точности, но раз уж его не возможно достичь, тогда хотелось бы получить хотя бы 95-99% точности в этом временном масштабе.

Оффлайн Karl500

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2267
    • Просмотр профиля
Re: RealTime вычисления на Ubuntu 14.04
« Ответ #14 : 15 Декабря 2015, 12:54:36 »
Все-таки непонятно, какова цель. Если цель - точно отмерять интервал времени, то (на мой взгляд) оптимальным решением было бы использование любого подходящего микроконтроллера с запрещенными прерываниями и выполняющего Вашу задачу в монопольном режиме.
Попытка использовать для этого многозадачную (а тем более многопользовательскую) систему с принципиально недетерминируемым поведением ни к чему не приведет. Кстати, еще одно соображение: время проведения вычислений может зависеть от данных. Т.е. если вычислять именно число пи до десятого знака - это одно, а если, например, делить разные числа друг на друга - это другое.

 

Страница сгенерирована за 0.095 секунд. Запросов: 25.