Я встречал очень странное поведение внутренней инструкции AVX _mm256_testc_pd (). Здесь вы можете увидеть описание этой функции https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=AVX,AVX2&text=test&expand=5432
Я использовал его в своем коде 2 раза, ожидая увидеть аналогичные результаты сравнения чего-то с нулевым регистром.
#include <immintrin.h>
#include <stdio.h>
int main(void)
{
unsigned char arr[32] __attribute__ ((aligned (32)));
__m256d a, zero;
int res1, res2;
memset(arr, 0 , 32);
arr[0] = 0xff;
arr[4] = 0xff;
arr[8] = 0xff;
arr[12] = 0xff;
arr[16] = 0xff;
arr[20] = 0xfd;
arr[24] = 0xff;
arr[28] = 0xff;
zero = _mm256_setzero_pd();
a = _mm256_load_pd((double *)arr);
res1 = _mm256_testc_pd(zero, a);
printf("res1 = %d\n" , res1);
memset(arr, 0xff, 32);
a = _mm256_load_pd((double *)arr);
res2 = _mm256_testc_pd(zero, a);
printf("res2 = %d\n" , res2);
return 0;
}
В результате я получил
res1 = 1
res2 = 0
Кто-нибудь понимает, почему это произошло? Я думаю, что в обоих случаях a
не равно нулю.
ОБНОВЛЕНИЕ
После обсуждения в комментариях моя проблема была решена, но у меня есть небольшое недоразумение в функциях _mm256_testc_si256 и _mm256_testz_si256
Например:
unsigned char arr[32] __attribute__ ((aligned (32)));
__m256d a, zero;
int res1, res2;
memset(arr, 0 , 32);
arr[0] = 0x80;
zero = _mm256_setzero_pd();
a = _mm256_load_pd((double *)arr);
res1 = _mm256_testc_si256(_mm256_castpd_si256(zero),_mm256_castpd_si256(a));
res2 = _mm256_testz_si256(_mm256_castpd_si256(zero),_mm256_castpd_si256(a));
printf("res1 = %d\n" , res1);
printf("res2 = %d\n" , res2);
Выход был
res1 = 0
res2 = 1
И я думаю, что только первый правильный. Так почему же эти функции производят другой результат?
arr[20] = 0xfd;
это намеренно? - person Sourav Ghosh   schedule 18.08.20150xff
, такое же поведение. - person AlekseyM   schedule 18.08.2015_CMP_EQ_OQ
(==0
). - person Paul R   schedule 18.08.2015