2017-05-05 51 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

更好的是你*解釋*錯誤是什麼! –