SIMD инструкции для пользовательских типов данных - PullRequest
2 голосов
/ 19 апреля 2020

Я обнаружил программирование с векторизованными типами данных для SIMD-инструкций (с в этом руководстве ). Из того, что я понимаю, вектор имеет фиксированный размер 16 байтов. Эта схема c подробно описывает это и, кажется, отвечает на мой вопрос:

SIMD vectors

Набор инструкций, включая основные операции c (но также предоставлены еще некоторые подробности c.

Тем не менее, просто из любопытства я хотел бы знать, существует ли способ векторизации «пользовательских данных», и под этим я подразумеваю в основном структуры. Я предполагаю, что если размер структуры находится в пределах 16-байтового диапазона, это возможно, потому что, в конце концов, типы являются только байтовыми размерами, однако набор команд, по-видимому, не позволяет работать непосредственно со структурами, например, для получить поле.

Итак, у меня следующий вопрос: ограничены ли мы простыми стандартными типами C при векторизации и SIMD-операциях? Если нет, как мы будем действовать? Если да, существуют ли методы распараллеливания (кроме многопоточности) для одновременной работы с векторами / массивами структур?

1 Ответ

3 голосов
/ 19 апреля 2020

_mm_loadu_si128 / _mm_storeu_si128 безопасны с точки зрения псевдонимов, так что вы можете использовать их для чего угодно. Эквиваленты для ARM NEON аналогичны.

Если вы знаете структуру структуры (которая является фиксированной для данного ABI), вы наверняка можете загружать / хранить данные большими кусками из структур или массивов структур. например, Быстрое чередование 2-х двойных массивов в массив структур с 2-мя плавающими и 1-м (1 oop инвариантными) элементами с SIMD-преобразованием double-> float? выполняет ли преобразование с уплотнением, затем перемешивать и смешивать. Другой пример: Сортировка 64-битных структур с использованием AVX?

Большая часть того, что вы можете сделать с asm, возможна в C со встроенными функциями.


Если хотя вы хотите делать разные вещи для каждого члена структуры, тогда у вас обычно есть проблема. например, вектор геометрии struct xy { float x,y; }; плохо подходит для SIMD. Добавление - это хорошо (это чисто по вертикали), но точечное произведение или вращение требует объединения компонентов x и y одного геометрического вектора по горизонтали внутри вектора SIMD. Перестановка требует дополнительных инструкций.

Это проблема массива структур , и ее обычно лучше всего решить путем хранения данных в виде одной структуры массивов . Таким образом, у вас будет float x[] и float y[], так что вы можете сделать целый вектор SIMD из четырех точечных продуктов одновременно между x[i + 0..3], y[i + 0..3] и x[j + 0..3], y[j + 0..3].

См. { ссылка } для некоторых ссылок, в частности Слайды: SIMD в Бессоннице c Игры (GD C 2015) , которые также транскрибируют текст доклада вместе с каждым слайдом , Это более постепенное введение в эти понятия, с некоторыми диаграммами.

...