Я пытаюсь выполнить невременную загрузку, используя инструкцию VMOVNTDQA
для массива данных, который был выделен с помощью posix_memalign()
(предположим, что это комбинирование записи путем изменения библиотеки), с выравниванием, выполненным для 16В. Однако я продолжаю получать ошибки. uint64 и uint128 имеют typedef long long и __int128 соответственно. Вот фрагмент кода:
uint64* arr;
posix_memalign((void**) &arr, 16, arr_size * sizeof(uint64))
uint128 b;
//index is a uint64 type and calculated earlier
asm volatile ("vmovntdqa %1, %0" : "=x" (b) : "m" (arr[index]));
//additional code working on b here, result stored back to arr[index]
VMOVNTDQA
spe c говорит, что инструкция имеет тип VMOVNTDQA xmm1, m128
, а адреса должны быть выровнены по 128-битному (16-байтному). Теперь вышеприведенный код выравнивает адреса по 16B. Приведенный выше код работает нормально и не дает никаких ошибок по умолчанию, если arr if типа uint128. Тем не менее, я должен иметь возможность загружать 128-битное значение из 64-битного массива элементов, если он выровнен.
Мой вопрос заключается в том, происходит ли segfault из-за того, что m128 принимает только элементы типа __int128? или это проблема выравнивания? или есть проблема с приведенным выше синтаксисом asm?
Спасибо