Инструкция для функции STRLEN в AVX с регистрами YMM - PullRequest
0 голосов
/ 30 октября 2019

я создаю strlen функцию с AVX (не AVX2) ... с AVX возможно получить доступ к (YMM) регистрам, но есть проблема ... инструкции, которые я знаю для функций strlen:

vmovdqu
vpcmpeqb
vpmovmskb

, но эти инструкции работают только для 'XMM' в AVX ... и если я хочу использовать их с (YMM), мне нужно иметь AVX2-CPU ... но я говорю об AVX ... теперь для создания функции strlen с регистрами 'AVX' и 'YMM', какие инструкции я должен использовать?

1 Ответ

3 голосов
/ 30 октября 2019

Нет способа выполнить сравнение байтов с регистрами YMM без AVX2. В AVX1 буквально нет инструкций YMM для байтовых элементов.

AVX1 полезен только для 256-битных векторов с плавающей запятой или для копирования / перестановки произвольных данных. Большинство целочисленных / битовых вещей невозможно до AVX2;именно поэтому AVX2 существует.

Используйте регистры XMM , как если бы вы использовали для SSE2 strlen, при этом AVX1 экономит только на movdqa инструкциях копирования-копирования.

Вы можете гипотетически распаковать байты в float (медленно, с перемешиванием + vinsertf128), а затем сравнить 8 сразу с vcmpps. Но вы можете сравнить 16 байтов одновременно с vpcmpeqb xmm, так что делайте это, как обычный человек, и выполняйте вдвое больше работы для каждого вектора, но при этом получаете преимущество неразрушающего кодирования 3-операндных команд AVX.

...