Arhn - архитектура программирования

Требования к выравниванию и упаковке элементов структуры C++ в ARM

Я хочу сделать форму/макет структуры более «определенной/фиксированной» и менее «на усмотрение компилятора». Макет структуры будет общим при обмене данными между архитектурами x86_64 и ARMv7-A. Да, в целом он не переносим, ​​но для этого более ограниченного случая порядок следования байтов одинаков (и может быть преобразован, если будет решено использовать его на другой платформе).

Существуют ли требования к выравниванию для разных типов/размеров данных в ARMv7-A? (т. е. их неправильное использование является поведением undefined)

Или он может упаковать их в любое выравнивание? (т. е. это все определенное поведение)

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

Я читал о требованиях к упаковке/выравниванию для ARM, но, к сожалению, заметил, что они немного устарели по сравнению с моей архитектурой. http://www.aleph1.co.uk/chapter-10-arm-structured-alignment-faq

Я использую такие заголовки на обеих архитектурах:

#pragma pack(4)
struct foo
{
  uint8_t bar1;        // 1 byte, the 3 padding bytes
  std::array<double,1> bar2;   // 8 bytes
};
#pragma pack()

Я использую кросс-компилятор GCC для ARM: gcc -Wall -Wextra -Wcast-align -march=armv7-a -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a9

Когда я вызываю foo abc; abc.bar2.data(); и компилирую с -fsanitize=undefined -fsanitize=address, возникает ошибка времени выполнения:

runtime error: member call on misaligned address 0xbeeb0c44 for type 'struct array', which requires 8 byte alignment
0xbeeb0c44: note: pointer points here
  01 00 00 00 03 00 00 00  03 00 00 00 01 00 00 00  f4 0d eb be fc 0d eb be  c0 a5 00 00 00 00 db 4b
              ^
/sysroot.../usr/include/c++/5.2.0/array:230:32: runtime error: reference binding to misaligned address 0xbeeb0c44 for type 'const double', which requires 8 byte alignment
0xbeeb0c44: note: pointer points here
  01 00 00 00 03 00 00 00  03 00 00 00 01 00 00 00  f4 0d eb be fc 0d eb be  c0 a5 00 00 00 00 db 4b
              ^

Мне нравится доверять дезинфицирующим средствам, и это заставляет меня думать, что это плохо. Однако, если я отключу дезинфицирующие средства и подниму оптимизацию до -O3, все будет нормально. Однако мне может быть (не) повезло, и этот случай неопределенного поведения, похоже, работает нормально. Я помню, что раньше у меня срабатывало предупреждение -Wcast-align, когда я делал pack(1) вместо pack(4), но я не могу вспомнить, как я обращался к нему, чтобы это сработало. Я предполагаю, что это также указывает на то, что это, вероятно, было неопределенное поведение. Правда ли, что средство очистки адресов и -Wcast-align указывали на неопределенное поведение для этой архитектуры, хотя казалось, что оно работает?

Не рекомендуется ли увеличить до pack(8), чтобы исправить неопределенное поведение? К сожалению, это увеличивает использование памяти.

Наконец, является ли предпочтительным способом сделать это pragma pack(n) или __attribute__((packed)) для каждого объекта структуры? (__attribute__((packed)) является расширением GCC, и, к сожалению, не может указать размер пакета.)


Ответы:


1

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

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

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

22.09.2016
  • На ARM, сбой или нет, может зависеть от настройки таблицы страниц; невыровненный доступ к строго упорядоченной памяти или памяти устройства всегда приводит к ошибке, даже если невыровненный доступ к нормальной памяти работает. Для обычных приложений вряд ли вызовет проблемы, но может быть забавным в программном обеспечении системного уровня. 23.09.2016
  • Спасибо. Однако порядок имеет значение и не может быть произвольно упорядочен. В начале структуры должна быть небольшая контрольная сумма, которая не может изменить положение. Таким образом, возникает вопрос: как узнать требования выравнивания реализации ABI? 23.09.2016
  • @ Isogen74: Ошибка, как ошибка страницы / промах кеша? Или как при сбое ввода/вывода? Пожалуйста, дайте определение терминам строго упорядоченный, память устройства, нормальная память. Спасибо. 23.09.2016
  • Ошибка как ошибка страницы (или ошибка шины); например, он часто отображается как SIGBUS на платформах Linux. Трудно дать краткий ответ о том, что это такое — я бы порекомендовал посмотреть Руководство по архитектуре ARMv7-A. Очень кратко: «Нормальный» — это то, что приложения обычно видят для системной ОЗУ (позволяет кэшировать, переупорядочивать операции чтения и записи, объединять доступы, невыровненные доступ). Память устройства и строгие порядки - это разные варианты того, как вы отображаете отображаемые в памяти регистры, поэтому большинство умных вещей не обсуждаются (без слияния, невыровненного, переупорядочивания, но устройство может быть буферизовано в буферах записи). 23.09.2016
  • Для прикладного программного обеспечения вы обычно можете предположить, что вы получите обычную память, для системного программного обеспечения это зависит от того, что вы делаете. 23.09.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..