Конвенция для отображения векторных регистров

Существует ли соглашение для отображения / записи больших регистров, подобных тем, которые доступны в наборе команд Intel AVX?

Например, если у вас есть 1 в младшем значащем байте, 20 в старшем значащем байте и 0 в другом месте вxmm регистр, для побайтного отображения предпочтителен следующий (little-endian):

[1, 0, 0, 0, ..., 0, 20]

или это предпочтительнее:

[20, 0, 0, 0, ..., 0, 1]

Аналогично, при отображении таких регистров, состоящих из более крупных элементов данных, применяется ли такое же правило? Например, чтобы отобразить регистр как DWORD, я предполагаю, что каждый DWORD по-прежнему записывается обычным (с прямым порядком байтов) способом, но каков порядок DWORDS:

[0x1, 0x0, ..., 0x14]

против

[0x14, 0x0, ..., 0x1]
обсуждение

Я думаю, что два самых многообещающих ответа просто "LSE1 first "(т. е. первый вывод в приведенных выше примерах) или" MSE first "(второй вывод). Не зависит ни от порядкового номера платформы, так как, действительно, один раз в регистре данные, как правило, не зависят от порядкового номера (как операции с Регистр GP илиlong или жеint или что-либо в C не зависит от порядка байтов). Endianness появляется в интерфейсе памяти регистра <->, и здесь я спрашиваю о данных, уже находящихся в регистре.

Возможно, что существуют другие ответы, такие как результат, который зависит от порядка байтов (и ответ Пола Р. может быть один, но я не могу сказать).

LSE First

Одним из преимуществ LSE-first, по-видимому, является особенно побайтный вывод: часто байты нумеруются от 0 до N, а LSB равен нулю.2поэтому вывод LSB-first выводит его с увеличением индексов, так же, как если бы вы выводили массив байтов размером N.

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

MSE First

Основное преимущество здесь, по-видимому, заключается в том, что выходные данные для меньших элементов находятся в том же порядке, что и для больших размеров (только с другой группировкой). Например, для 4-байтового вектора в формате MSB[0x4, 0x3, 0x2, 0x1]вывод для байтовых элементов, элементов word и dword будет:

[0x4, 0x3, 0x2, 0x1] [0x0403, 0x0201] [0x04030201]

По сути, даже из байтового вывода вы можете просто «прочитать» слово или слово, или наоборот, так как байты уже находятся в обычном MSB-первом порядке для отображения чисел. С другой стороны, соответствующий вывод для LSE-first:

[0x1, 0x2, 0x3, 0x4] [0x0201, 0x0403] [0x04030201]

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

Этот формат также имеет то преимущество, что на архитектурах BE выходные данные соответствуют представлению в памяти того же вектора, сохраненного в памяти.3.

Intel использует MSE первым в своих руководствах.

1 Наименее значимыйЭлемент

2 Такие нумерации не только для целей документирования - они архитектурно видны, например, в масках случайного воспроизведения.

3 Конечно, это преимущество ничтожно по сравнению с соответствующим преимуществом LSE-first на платформах LE, поскольку BE практически не используется в обычном SIMD-оборудовании.

Ответы на вопрос(0)

Ваш ответ на вопрос