Вы правы, что нет прямого способа получить маску, которую вы действительно хотите, только перевернутую маску: A gt B
= A nle B
.
Инструкции вектор-НЕ нет, поэтому вам нужен вектор из всех единиц, а также дополнительная инструкция для инвертирования вектора. (Или вектор из всех нулей и _mm256_cmpeq_epi8
, но он не может работать на таком количестве портов исполнения, как _mm256_xor_si256
с вектором из всех единиц.) См. x86 пометить вики для информации о производительности, особенно. Гид Агнера Фога.
Другая побитовая логическая опция, _mm256_andn_si256
, так же хороша, как xor. Это не коммутативно, и немного сложнее мысленно проверить, правильно ли вы поняли. xor-with-all-ones — хорошая идиома для переворачивания всех битов.
Вместо того, чтобы тратить инструкцию на инвертирование маски, в большинстве кодов можно просто использовать ее наоборот.
например если это вход в blendv
, то порядок операндов меняется на бленд. Вместо
_mm256_blendv_epi8(a, b, A_le_B_mask)
используйте
_mm256_blendv_epi8(b, a, A_nle_B_mask)
Если вы собирались _mm_and
что-то с маской, используйте вместо этого _mm_andn
.
Если вы собирались _mm_movemask
и протестировать все нули, вы можете вместо этого проверить все единицы. Он будет компилироваться в инструкцию cmp eax, -1
вместо test eax,eax
, что столь же эффективно. Если вы собирались использовать битскан для первого 1, вам придется инвертировать его. Целочисленная инструкция not
(из-за использования ~
в результате маски перемещения) дешевле, чем выполнение ее для вектора.
У вас есть проблема только в том случае, если вы собираетесь использовать ИЛИ или XOR, потому что эти инструкции не входят в разновидности, которые отрицают один из их входов. (IDK, если Intel просто не хотела добавлять мнемонику PORN
, но, вероятно, PAND
и PANDN
используются чаще, особенно перед инструкциями по смешиванию переменных.
person
Peter Cordes
schedule
26.05.2016
0xF..F
меня беспокоят - person user2399267......seems good   schedule 26.05.2016