Как правильно использовать std :: arch :: _ mm_loadu_si128 / _mm_storeu_si128 - PullRequest
0 голосов
/ 06 сентября 2018

Обычно следует опасаться превращения (или приведения) указателей в более высокое положение. Тем не менее, интерфейс для вышеуказанных функций требует указателей *const _m128i и *mut _m128i соответственно. Оба они выровнены по SIMD, а это значит, что мои массивы тоже должны быть выровнены по SIMD. С другой стороны, встроенные функции явно предназначены для загрузки / хранения невыровненных данных.

Это безопасно? Разве мы не должны изменить интерфейс? Или хотя бы документировать этот факт?

1 Ответ

0 голосов
/ 06 сентября 2018

Я думаю, что это межъязыковой дубликат Является ли `reinterpret_cast` между указателем аппаратного вектора и соответствующим типом неопределенным поведением? .

Как я объяснил там, Intel определила встроенный API C / C ++ таким образом, что loadu / storeu может безопасно разыменовать указатель с заниженным выравниванием, и что такие указатели безопасно создавать, даже если это UB в ISO C ++ даже для создания подчеркнутых указателей. (Таким образом, реализации, которые предоставляют встроенный API, должны определять поведение).

Версия Rust должна работать идентично. Реализации, обеспечивающие его, должны обеспечивать безопасное создание подчеркнутых __m128i* указателей, если вы не разыменовываете их «вручную».

Другой вариант разработки API должен иметь другую версию типа, которая не подразумевает 16-байтовое выравнивание, например __m128i_u или что-то в этом роде. GNU C делает это с их собственным векторным синтаксисом, но это далеко от темы для Rust.

...