大家好,我正在尝试像这样使用intel内在函数
void test()
{
uint16_t n1 = 5;
uint16_t n2 = 2;
__m64 vec1, vec2, res;
vec1 = _mm_set_pi16(n1, n1, n1, n1);
vec2 = _mm_set_pi16(n2, n2, n2, n2);
res = _mm_add_pi16(vec1, vec2);
printf("%u %u %u %u \n", vec1[0], vec1[1], vec1[2], vec1[3]);
printf("%u %u %u %u \n", vec2[0], vec2[1], vec2[2], vec2[3]);
printf("%u %u %u %u \n", res[0], res[1], res[2], res[3]);
}
但是我得到这个结果很奇怪:
327685 327685 131074 131074
131074 131074 458759 458759
458759 458759 327685 327685
我正在使用月食火星...并且包括mmintrin.h,xmmintrin.h,emmintrin.h。
请有人可以解释这是怎么回事
引用__m64
数组是非标准的。
我不知道您的编译器如何处理它。
我在Visual Studio中使用“英特尔编译器”,但出现编译错误。uint16
在打印之前,应将元素从MMX寄存器提取到ALU寄存器。
使用_mm_extract_pi16
内在函数来提取值。
不要忘记_mm_empty()
在退出函数之前调用内部函数。
请参见以下代码示例:
#include <stdint.h>
#include <stdio.h>
#include <mmintrin.h>
#include <xmmintrin.h>
#include <emmintrin.h>
static void Test()
{
uint16_t n1=5;
uint16_t n2=2;
__m64 vec1,vec2,res;
vec1 = _mm_set_pi16 (n1 ,n1 ,n1 ,n1);
vec2 = _mm_set_pi16 (n2 ,n2 ,n2 ,n2);
res = _mm_add_pi16 (vec1, vec2);
//uint16_t res0 = _mm_extract_pi16(res, 0);
//uint16_t res1 = _mm_extract_pi16(res, 1);
//uint16_t res2 = _mm_extract_pi16(res, 2);
//uint16_t res3 = _mm_extract_pi16(res, 3);
printf("%u %u %u %u \n",_mm_extract_pi16(vec1, 0),_mm_extract_pi16(vec1, 1),_mm_extract_pi16(vec1, 2),_mm_extract_pi16(vec1, 3));
printf("%u %u %u %u \n",_mm_extract_pi16(vec2, 0),_mm_extract_pi16(vec2, 1),_mm_extract_pi16(vec2, 2),_mm_extract_pi16(vec2, 3));
printf("%u %u %u %u \n",_mm_extract_pi16(res, 0),_mm_extract_pi16(res, 1),_mm_extract_pi16(res, 2),_mm_extract_pi16(res, 3));
_mm_empty();
}
int main()
{
Test();
return 0;
}
输出:
5 5 5 5 2 2 2 2 7 7 7 7
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句