我们正在尝试制作不同操作的矢量内在库,其中一个库获取数字的绝对值。但是,我的教授只限于double
。如何使用内在函数对double执行绝对值?
我是相当新的x86的内部函数指令集,所以我希望有人能赐教。
这是我到目前为止有:
void vectorAbs(double *x, double *y, unsigned int N);
int main()
{
double x[] = { -1, -2, -3, -4, -5, -6 };
double y[] = { 2, 2, 2, 2, 2, 2 };
double *pX = x, *pY = y;
vectorAbs(pX, pY, 6);
}
void vectorAbs(double *x, double *y, unsigned int N)
{
__m128d xVar;
__m128d yVar;
printf("\nSquare of x : \n");
for (int i = 0; i < N; i += 2)
{
xVar = _mm_loadu_pd(&x[i]); // load *x[i] to xVar
yVar = _mm_abs_epi16(xVar); // abs of x
_mm_storeu_pd(&y[i], yVar); // store yVar to y[i]
printf("%lf, %lf, ", y[i], y[i + 1]);
}
system("pause");
}
而我得到的错误是:
没有运营商 “=” 匹配这些操作数
操作数类型是: __m128d = __m128i
'_mm_abs_epi16'计算* 16位整数的绝对值* – 2014-08-31 09:32:57
哦,accdg我的小抄,它只能做多达32位整数。但我们需要使用128位。这会成为一个问题吗?因为我的主要问题是如何将我的double转换为int,因此它可以获得绝对值。或基本上如何获得双倍的绝对值。 – nutellafella 2014-08-31 09:38:46
它将128位视为8位有符号16位整数,并计算每一个的绝对值 - 这绝对不是您想要的。转换为整数显然会丢失大量信息。你或许应该实现自己的绝对值在比较初级的操作 - 比较为零,然后否定/从零减去如果是小于零,等 – 2014-08-31 09:50:21