Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Что жрет время процессора ???  (Прочитано 8542 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Thinker
Гость
« : 19-11-2003 14:18 » new

Мы пишем программу (на .НЕТ) рисующую данные снимаемые с карточки. Темп - 40 прерываний в секунду, около 3 МБ в секунду данных. Данные перекачиваются через ДМА порт, карточка - мастер.
Используется принцип continous DMA transfer с двойной буферизацией - kernel mapped and locked buffer из которого копируется в обычный буфер.
Когда мы запускаем систему без отрисовки (все части работают кроме конечного копирования на экран) процессор сьеден на 15 %. Когда мы запускаем систему без драйвера (данные читаются из файла) и отрисовка работает - процессор сьеден на 2-4 %. Когда мы запускаем все систему с драйвером и отрисовкой - процессор сьеден на 40%, и количество page faults - 13К/сек.

Кто виноват и что делать Не понял?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 19-11-2003 18:00 » 

Как интересно.
Вопрос по ходу, вы память случано не теряете???

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

И вопрос не очень правилен, ведь как не видя систему, можно узнать что не работает.
Записан

А птичку нашу прошу не обижать!!!
Thinker
Гость
« Ответ #2 : 19-11-2003 20:22 » 

Цитата

Как интересно.
Вопрос по ходу, вы память случано не теряете???

Вроде не должно ...    Вот такой я вот Все выделено заранее, один буфер еще и "мапнут" в кернел адресное пространство и "локнут" на постоянный физический адрес,а другой просто выделен через С# "new". Кроме того, с такими темпами выделения все бы накрылось довольно быстро. У нас бродит мысль, что дело в большом количестве переходов kernel-user режим, из-за использования GDI+ и обработки прерываний в одном процессе.
Информация к размышлению - Использование в одном месте DrawImage (40 раз в сек) приводит к увеличению времени процессора с 40% до 60%. Если карточка не используется, то независимо от того есть DrawImage или нет, временя процессора = 2-4%.
Система работает устойчиво, ресурсы не растут, только процессор какой-то "чипогрыз" ест.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 19-11-2003 23:32 » 

А как происходит выкладка картинок, все ж таки прикол, но видео мы смотрим и не 60% грузем, а там вывод 24 раза в секунду, может 40 это много слишком, но все же не настолько....
Записан

А птичку нашу прошу не обижать!!!
grozny
Гость
« Ответ #4 : 19-11-2003 23:33 » 

DrawImage - это из GDI+, верно? Или манагед-обёртка над чем-то из GDI+. Он, поди, девайс контекст забирает и  захватывает 16-ти битный мьютекс Улыбаюсь - как и всё в GDI/GDI+. А это смерть всем - пока девайс контекст не отпущен, никто больше не шевелится.

я бы для начала жёсткий цикл написал. К сожалению, это требует расставания с С#.
Как альтернатива - поставь софтайс, там можно время увидеть и кто его ест - (я б заподозрил 1. отрисовку 2. освобождение/выделение памяти - и не обязательно в твоей программе, в либах, например). Ну или VTUNE напустить.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 20-11-2003 06:26 » 

Цитата

Когда мы запускаем систему без отрисовки (все части работают кроме конечного копирования на экран) процессор сьеден на 15 %. Когда мы запускаем систему без драйвера (данные читаются из файла) и отрисовка работает - процессор сьеден на 2-4 %. Когда мы запускаем все систему с драйвером и отрисовкой - процессор сьеден на 40%, и количество page faults - 13К/сек.


По моему надо продумать систему работы драйвера с памятью. Не нагружает ли он пулы ядра? Оперативки-то вобще хватает?
Сначала используйте Intel Vtune и счетчики Perfomance самой системы.
Далее подумайте- сумма двух предыдущих нагузок около 20%, но когда они раздельно работают. Однозначно выделяется драйвер. При подключении видео вероятно происходит отъедание Paged пулов ядра на нужды этого видео, а туда еще что-то от вас спроецировано. Если вы проецировали на NonPaged пулы, то вероятно вы довели систему до  такого расширения этого пула, что для других процессов не хватает памяти и они свопируются постоянно. Вот и начинается борьба. И не только вашего драйвера и видео, но и всей системы. Отсода и 40%, предыдущие 20% плюс 20% связанных с перегрузкой подсистемы памяти.
 Возникает вопрос про  page faults- откуда они лезут? Собственно они и стали наверно причиной загрузки процессора. По сравнению с другими случаями этот  page faults значительно выше? Если да, то вот и ищите подсистему, которая это устроила. По всей вероятности вам не хватает Paged Pool или разросся Non Paged. Драйвер и видеоподсистема перегружают пулы.
Записан
maaaaaad
Гость
« Ответ #6 : 20-11-2003 13:04 » 

Цитата

двойной буферизацией - kernel mapped and locked buffer из которого копируется в обычный буфер.


не нада так делать. Можно обойтись и без буферизации без копирования.
Хм...DrawImage это ваще что то высокоуровненое. Хаха, Вы че на жабе пишите прогу?Не понял =)))) Я не знаю такого в апи. Посмотрите как работает.

Честные методы отрисовки на экран (из апи) - как минимум один раз перенос памяти. Нужно работать с контекстом напрямую.

А главного собстненно не сказали.....процессор то какой?=))  i386 66mhz?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines