2017-02-13 44 views
0

У меня есть устройство, которое отправляет данные изображения и видеокадр с использованием двух разных объемных каналов на USB.Ошибка кэширования буфера процессора драйвера устройства

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

Я использую тот же буфер для изображений и видеоданных, и этот буфер имеет около 50 блоков, а один блок - 1 МБ. Видеокадры поступают быстро, а затем кадр изображения.

Мой вопрос: есть ли проблема с повреждением памяти в следующем secnario? Кто-нибудь, у кого есть знания в кеше процессора, может мне помочь.

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

Возможно ли это? Итак, я применил volatile к записи видеоданных, и эта проблема выглядит так, как будто она исчезла. Но мне нужно сделать отчет, возможно ли, чтобы этот вышеупомянутый сценарий произошел?

+0

Не уверен, что я полностью понимаю ваш вопрос, но предположим, что вы смешиваете две совершенно несвязанные концепции: модификатор 'volatile' не имеет возможности манипулировать кэшами процессора. 'volatile' просто говорит, что данные могут быть изменены вне контроля ЦП.Если добавление 'volatile' исправляет что-то, это просто означает, что ваш компилятор достаточно умен, чтобы оптимизировать код, который казался ненужным/избыточным, если только данные обрабатывались только процессором. – mfro

+0

Да, он приходит и заполняется извне, из другого потока, однако libusb, поток пользовательского режима. –

+0

Позвольте мне сказать немного более явным, если ошибка потока продолжается, добавив 'volatile', это просто совпадение. Вы не можете полагаться на него, и он может снова сломаться, написав следующую строку кода. – MSalters

ответ

1

Замечания: подпрограмма: две нити, а volatile используется неправильно.

Два потока могут работать на двух ядрах процессора. Хотя ядра обычно используют общую память, они обычно не используют кеш L1. Промежуточные кеши различаются. В результате разыменование дескриптора того же указателя на двух ядрах ЦП может дать разные результаты. Это не проблема для переменных, которые должным образом распределены между потоками; компилятор будет использовать правильные инструкции. Но ключевое слово правильно общий.

Здесь мы сталкиваемся с небольшой проблемой, что вы отметили свой вопрос как C и C++, потому что два языка, разветвленные до потоковой передачи, были стандартизованы на любом языке. Однако два механизма потоковой передачи намеренно подобны, так что пара компиляторов может (как расширение) определять, как взаимодействуют потоки потоков C и потоки C++. Для этого вам необходимо проконсультироваться с вашей документацией.

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

Вернитесь к повреждению памяти, которое вы видите: то, что вы, вероятно, видите, это то, что один поток выписывает свой вид памяти, который, как оказалось, является устаревшими данными в кеше. Если бы вы использовали что-то вроде мьютекса, эти устаревшие данные были бы отмечены и синхронизированы с кешами.

+0

привет, я не понимаю, почему волатильный указатель де-ссылки не решает проблему? –

+0

Мне не нужна нить, чтобы сигнализировать другую тему, потому что я могу гарантировать, что они произойдут по порядку. Реализация libusb сделала это уже для меня. Все-таки мне нужно использовать мьютекс, как концепция C++? –