2017-01-30 50 views
0

您好我試圖編寫一個代碼向量標量乘法使用AVX桑迪橋處理器i7-3720QM (~2012)。 該代碼是C代碼,編號爲GNU gcc,代碼爲Mac OSX 10.8向量在Mac OSX上的標量乘AVX段錯誤

gcc -mavx -Wa,-q -o bb5 code1.c -lm

我得到Segmentation fault: 11。請幫忙。

輸出:

3.000000 6.000000 9.000000 12.000000 
Segmentation fault: 11 

所以,它看起來像store命令無法正常工作?謝謝。最終我想要做類似 A = A + x*B其中x是標量,AB是向量。函數void matsca(const double* a, double c, double *b)將被再次調用以在大尺寸的double向量上運行,步幅爲8,因爲AVX可以採用4雙元素(256 bits)。謝謝你的幫助。

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <immintrin.h> 

void matsca(const double* a, double c, double *b) 
{ 
    __m256d a0 = _mm256_loadu_pd(a+0); 
    __m256d a1 = _mm256_set1_pd(c); 

    __m256d a2 = _mm256_mul_pd(a0,a1); 

    double* f = (double*)&a2; 
    printf("%f %f %f %f \n",f[0],f[1],f[2],f[3]); 

    _mm256_store_pd(b,a2); 
} 

int main() 
{ 
    double m1[11]={1,2,3,4,5,6,7,8,9,10,11}; 
    double *m3; 
    double m2=3; 
    int i; 

    matsca(&m1[0],m2,&m3[0]); 

    for (i=0; i<3; i=i+1) 
    { 
     printf("%d %f \n",i,m3[i]); 
    } 

    return 0; 
} 
+2

'm3'未初始化,有什麼辦法? –

+1

當你爲'm3'分配了一些內存之後,你還需要將'_mm256_store_pd'改爲'_mm256_storeu_pd'。 –

+0

非常感謝你們。有效。有沒有其他辦法可以更有效地做到這一點? – Guddu

回答

0

這是你原來的matsca的固定/改進版本:

inline void matsca(const double *a, const double c, double *b) 
{ 
    __m256d a0 = _mm256_loadu_pd(a); 
    __m256d a1 = _mm256_set1_pd(c); 
    __m256d a2 = _mm256_mul_pd(a0, a1); 

#if DEBUG > 0 
    double *f = (double *)&a2; 
    printf("%f %f %f %f\n", f[0], f[1], f[2], f[3]); 
#endif 

    _mm256_storeu_pd(b, a2); 
} 

但是你可能要考慮讓這種更一般的,所以它可以載體,例如任何大小處理

inline void matsca(const double *a, const double c, double *b, const size_t n) 
{ 
    const __m256d a1 = _mm256_set1_pd(c); 
    size_t i; 

    for (i = 0; i + 4 <= n; i += 4) 
    { 
     __m256d a0 = _mm256_loadu_pd(&a[i]); 
     __m256d a2 = _mm256_mul_pd(a0, a1); 
     _mm256_storeu_pd(b, &a2[i]); 
    } 
    for (; i < n; ++i) // handle any odd elements at end of vector 
    { 
     a2[i] = a1[i] * a2; 
    } 
} 

您攤銷函數調用的成本,初始化常向量這樣一來,等

+0

你能解釋一下添加'inline void'和'size_t'是什麼意思,你爲什麼要把數組聲明爲'const'?對不起,我是一個新手。謝謝。 – Guddu

+1

使輸入參數爲常量通常是一個好主意。另外,size_t是指定數組或其他數據結構的(無符號)大小的自然類型。內聯是編譯器的一個暗示,以消除小性能關鍵函數的函數調用開銷。 –