Свойство для vmovdqu ymm, [mem]
равно _mm256_loadu_si256( (const __m256i*)any_pointer);
например, _mm256_loadu_si256( (const *__m256i) (arr+i) )
Значение встроенной нагрузки равно _mm256_load_si256();
См. Встроенный искатель Intel https://software.intel.com/sites/landingpage/IntrinsicsGuide/ или другой справочник по встроенным функциям, где вы можете найти подобные вещи.
Если вы выделяете память на месте с помощью _mm_malloc
, попросите 32-байтвыравнивание, а не только 8, так что вы можете использовать выравниваемые нагрузки и гарантированно не иметь каких-либо разбиений строки кэша.
Встроенные целочисленные загрузки / хранения Intel имеют глупые прототипы, которые требуют приведения указателя к __m256i*
даже если не гарантированно правильно выровнено.Компиляторы, которые реализуют встроенные функции Intel, должны обрабатывать это без какого-либо неопределенного поведения.
(В ISO C ++ даже создание невыровненного указателя без разыменования это UB.)
Встроенные функции загрузки / хранения AVX512, наконец, делают это вменяемым, принимая void*
, поэтому вам не нужны все эти шумные / уродливые приведения.