2012-05-01 5 views
0

を取得し、私はいくつかのint temp[5](con*A[r][k])を格納して、行のためにその与えセグメンテーションフォールト以下のコードでいただきました間違ったSIMDでA[j][k]-temp[]をしていますk=0k=100エラーSIMD演算

そのため
A[j][k]=((A[j][k]-con*A[r][k])%2); 

のために計算したいです__m128i m5=_mm_sub_epi32(*m3,*m4);

J、Kの可能な値がなければ
while((k+4)<100) 
{  
    __m128i *m3 = (__m128i*)A[j+k]; 

    temp[0]=con*A[r][k]; 
    temp[1]=con*A[r][k+1]; 
    temp[2]=con*A[r][k+2]; 
    temp[3]=con*A[r][k+3]; 

    __m128i *m4 = (__m128i*)temp; 
    __m128i m5 =_mm_sub_epi32(*m3,*m4); 
    (temp_ptr)=(int*)&m5; 
    printf("%ld,%d,%ld\n",A[j][k],con,A[r][k]); 

    A[j][k] =temp_ptr[0]%2; 
    A[j][k+1]=temp_ptr[1]%2; 
    A[j][k+2]=temp_ptr[2]%2; 
    A[j][k+3]=temp_ptr[3]%2; 

    k=k+4; 
} 

答えて

2

おそらく、あなたはアラインメントをしませんでした。 SIMD命令は、16バイトのアライメントを必要とする(thisの記事を参照)。そうしないと、プログラムがクラッシュします。

いずれかのアラインメント、または間違ったインデックスがどこかにあり、間違ったメモリにアクセスしています。

1

、それはなぜ伝えるのは難しいの研究が、最も可能性の高いあなたがoveriありますあなたの配列の1つを探しています

+0

この行にはエラーが発生しています...... _ m128i m5 = _mm_sub_epi32(* m3、* m4); – abhinav

+0

はインデックス配列に問題はありませんでした。 – abhinav

+0

'A'の次元は何ですか? 'j'と' r'の値は何がありますか? – Attila

0

あなたが実装する場合:

for (k = 0; k < 100; k += 4) 
{ 
    A[j][k] = (A[j][k] - con * A[r][k]) % 2; 
} 

を、あなたはSIMDからいくつかの利点を見てみたい、あなたはすなわち、SIMDおよびスカラコードを混在させないでください、SIMDでそれをすべて行う必要があります。

例えば

(未テスト):

const __m128i vcon = _mm_set1_epi32(con); 
const __m128i vk1 = _mm_set1_epi32(1); 
for (k = 0; k < 100; k += 4) 
{ 
    __m128i v1 = _mm_loadu_si128(&A[j][k]); // load v1 from A[j][k..k+3] (misaligned) 
    __m128i v2 = _mm_loadu_si128(&A[r][k]); // load v2 from A[r][k..k+3] (misaligned) 

    v2 = _mm_mullo_epi32(v2, vcon);   // v2 = con * A[r][k..k+3] 
    v1 = _mm_sub_epi32(v1, v2);    // v1 = A[j][k..k+3] - con * A[r][k..k+3] 
    v1 = _mm_and_si128(v1, vk1);   // v1 = (A[j][k..k+3] - con * A[r][k..k+3]) % 2 

    _mm_storeu_si128(&A[j][k], v1);   // store v1 back to A[j][k..k+3] (misaligned) 
} 

が注:Aの各行が16バイトが整列されることを保証することができるなら、あなたは/整列負荷にミスアライメントロード/ストア(_mm_loadu_si128/_mm_storeu_si128)を変更することができ店舗(_mm_load_si128/_mm_store_si128) - これは、対象とするCPUに応じて、パフォーマンスをいくらか助けます。