У меня есть логическое выражение, которое мне удалось реализовать в SSE2. Теперь я хотел бы попробовать реализовать это в AVX, используя дополнительный фактор 2 в увеличении параллелизма (от 128-битного типа SIMD до 256). Однако AVX не поддерживает целочисленные операции (что делает AVX2, но я работаю над процессором Sandy Bridge, поэтому в настоящее время это не вариант). Однако, поскольку существуют Встроенные функции AVX для побитовых операций. Я подумал, что могу попробовать, просто преобразовав свои целочисленные типы в типы с плавающей запятой и посмотрев, работает ли это.
Первый тест прошел успешно:
__m256 ones = _mm256_set_ps(1,1,1,1,1,1,1,1);
__m256 twos = _mm256_set_ps(2,2,2,2,2,2,2,2);
__m256 result = _mm256_and_ps(ones, twos);
Я получаю все 0, как и должен. Одновременно с И вместо этого я получаю результат 2. Но при попытке 11 XOR 4 соответственно:
__m256 elevens = _mm256_set_ps(11,11,11,11,11,11,11,11);
__m256 fours = _mm256_set_ps(4,4,4,4,4,4,4,4);
__m256 result2 = _mm256_xor_ps(elevens, fours);
Результат 6.46e-46 (т.е. близко к 0), а не 15. Одновременное выполнение 11 ИЛИ 4 дает мне значение 22, а не 15, как должно быть. Я не понимаю, почему это так. Это ошибка или какая-то конфигурация, которую я упускаю?
На самом деле я ожидал, что моя гипотеза о работе с float, как если бы они были целыми числами, не сработает, поскольку целое число, инициализированное значением с плавающей запятой, на самом деле может быть не точным значением, а близким приближением. Но даже тогда я удивлен полученным результатом.
У кого-нибудь есть решение этой проблемы, или я должен обновить свой процессор, чтобы включить поддержку AVX2?
printf()
верны? - person 1''   schedule 11.12.2013