2017-05-05 53 views
-2

我想使用SIMD在AMD64架构上操作包含双类型值的向量。下面是我的问题的简单例子。这工作正常,如果我打印浮动值,但不是双。我需要精确到9位十进制数字。SSE向量类型双操作

#include<stdio.h> 
#include<emmintrin.h> 

typedef union f4vector 
{ 
    __m128d v; 
}float4; 

int main() 
{ 
float4 x,y,z; 
double f0[2]={2334, 5}; 
    double f1[2]={2334.32345324 , 5}; 
double f3[2]; 

x.v=_mm_set_pd(f0[0], f0[1]); 
y.v = _mm_set_pd(f1[0], f1[1]); 
z.v = _mm_mul_pd(x.v , y.v); 

f3[0]=z.v[0]; 
f3[1]=z.v[1]; 

printf("%d, %d\n", f3[0], f3[1]); // doesnt print correct values. 

} 
+1

的'%D'格式说明是整数。如果你不想打印浮动或双打,使用'%f'。 – vordhosbn

+1

除了显而易见的错误,使用常量值,优化器会咀嚼这些数据并将常量传递给'printf'。这里根本不会有任何SIMD操作。 –

回答

0

printf中你已经使用格式说明为%d你需要为你想打印双重价值

1

你有一些错误使用%F:

  1. 使用%d格式说明而不是函数printf中的%f。
  2. 要有效使用SIMD指令,必须使用矢量指令(如_mm_loadu_pd/_mm_storeu_pd)加载和存储数据。内在_mm_set_pd是非常无效的。

下面我写正确的示例:

#include<stdio.h> 
#include<emmintrin.h> 

int main() 
{ 
    double d0[2] = { 2334, 5 }; 
    double d1[2] = { 2334.32345324 , 5 }; 
    double d2[2] = { 0, 0 }; 

    __m128d v0 = _mm_loadu_pd(d0); 
    __m128d v1 = _mm_loadu_pd(d1); 
    __m128d v2 = _mm_mul_pd(v0, v1); 
    _mm_storeu_pd(d2, v2); 

    printf("%f, %f\n", d2[0], d2[1]); 
} 

输出:

5448310.939862, 25.000000 
+2

更好的是你*解释*错误是什么! –