Низкая пропускная способность памяти в Linux-Embedded ( ARM )

StackOverflow https://stackoverflow.com/questions/1400159

  •  05-07-2019
  •  | 
  •  

Вопрос

Я использую ARM926EJS.Я получаю на 20 % больше скорости памяти в тесте копирования памяти, без Linux (просто как исполняемый файл для начала работы).Но в Linux тот же код работает на 20% медленнее.

Код - это

 
/// Below code just performs burst mode memcopy test.        
void asmcpy(void *a, void *b, int iSize)
{
   do
  {
    asm volatile (
             "ldmia %0!, {r3-r10} \n\t"
             "stmia %0!, {r3-r10} \n\t"
             :"+r"(a), "+r"(b)
             :
             :"r"(r3),"r"(r4),"r"(r5),"r"(r6),"r"(r7),"r"(r8),"r"(r9),"r"(r10)
             );
  }while(size--)
}

Я проверил, что ни один другой процесс не требует процессорного времени в Linux.( Я проверил это с помощью команды time, она показывает в реальном времени это то же самое , что время использования)

Пожалуйста, скажите мне, в чем может быть проблема с linux?

Спасибо и с уважением.

ДОБАВЛЕННЫЙ:

мой тестовый код - это

int main()
{
  int a[320 * 120], b[320 * 120];

 for(int i=0; i != 10000; i++)
 {
   /// Size is divided by 8 because our memcpy function performs 8 integer load stores in the iteration
   asmcpy(a, b, (320 * 120) / 8);
 }
}

Исполняемый файл Getting Started - это bin-файл, который отправляется в оперативную память с помощью последовательного порта и выполняется напрямую путем перехода к этому адресу в оперативной памяти.(без необходимости в операционной системе)

ДОБАВЛЕНО.

Я не видел такой разницы в производительности на других процессорах.Они использовали SD RAM, этот процессор использует DDR Ram.Может ли это быть причиной?

ДОБАВЛЕНО.Кэш данных не включен в getting started code, а кэш данных включен в режиме Linux, поэтому в идеале все данные должны кэшироваться и получать доступ без каких-либо задержек в оперативной памяти, но все равно Linux работает на 20% медленнее.

ДОБАВЛЕННЫЙ:Мой микроконтроллер - LPC3250.Оба теста были протестированы на одной и той же внешней оперативной памяти DDR.

Это было полезно?

Решение

Этот чип имеет MMU, так что Linux, скорее всего, использует его для управления памятью.Возможно, простое включение этого приводит к некоторому снижению производительности.Кроме того, Linux использует стратегию отложенного выделения памяти, назначая страницы памяти процессу только при первом обращении к нему.Если вы копируете большой кусок памяти, MMU сгенерирует ошибки страницы, чтобы попросить ядро выделить страницу внутри вашего цикла.На процессоре низкого уровня все эти переключения контекста вызывают очистку кэша и вносят заметное замедление.

Если ваша система достаточно мала, попробуйте версию Linux без MMU (например uClinux).Возможно, это позволило бы вам использовать более дешевый чип с аналогичной производительностью.Во встроенных системах важен каждый пенни.

Обновить: Некоторые дополнительные детали:

Каждый процесс Linux получает свои собственные сопоставления памяти, сначала это включает только ядро и (возможно) исполняемый код.Все остальные линейные 4 ГБ (на 32 битах) кажутся доступными, но им не назначены страницы оперативной памяти.Как только вы считываете или записываете адрес нераспределенной памяти, MMU сигнализирует о сбое страницы и переключается на ядро.Ядро видит, что у него все еще есть много свободных страниц оперативной памяти, поэтому выбирает одну, присваивает ее точке с ошибкой и возвращается к вашему коду, который завершает прерванную инструкцию.Самый следующий не завершится ошибкой, потому что целая страница (обычно 4 КБ) уже назначена;но через несколько итераций он попадет в другое не назначенное пространство, и MMU снова вызовет ядро.

Другие советы

Как вы соблюдаете хронометраж?В вашем примере нет кода синхронизации.

Вы уверены, что не измеряете время загрузки / выгрузки процесса?

Одинакова ли тактовая частота процессора в обоих случаях?

При использовании внешней SDRAM одинаковы ли тайминги оперативной памяти в обоих случаях?

Включен ли кэш данных в обоих случаях?

Клиффорд

Начало работы - это не "просто исполняемый файл".Должен существовать какой-то код для настройки регистра контроллера DDR.

Если кэш также включен, то таким же должен быть и MMU.Я думаю, что на ARM926EJS у вас не может быть кэша данных без MMU.

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

Вот такой бумага с некоторым аспектом стоимости очистки кэша VIVT при запуске Linux

Какой микроконтроллер (а не только какой процессор ARM) вы используете?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top