2016-03-20 13 views
0

プログラムの一部をベクトル化していますが、Segmentation faultというエラーが返されます。これには何が問題なのですか?ここでは問題を引き起こす単純化されたセクションです。 j++i++は私が欲しいものです、私はj += 16になりたくありません。なぜこのコードセクションは "セグメンテーションフォールト"エラーを返しますか?

unsigned short int input[256][256] __attribute__((aligned(32)));//global 

for (i = 0; i < 256 - 16; i++) {  
    for (j = 0; j < 256 - 16; j++) { 
     temp_v2 =_mm256_load_si256((__m256i *)&input[i][j]); 
    } 
} 
+0

は独自拡張を使用しないでください。 Cは '_Alignas'指定子を提供します。 – Olaf

+0

あなたのコードは厳密なエイリアシングに違反しています –

+0

gccでは'__attribute __((aligned(X))) 'を使用しています。厳密なエイリアシングのために私は何ができますか? – ADMS

答えて

2

あなたは本当に、あなたは非整列ロード命令を使用する必要があります(あなたが質問に示唆しているように見えるよう)あなただけの1で内部ループをインクリメント負荷を重ねたい場合:

for (i = 0; i < 256; i++) { 
     for (j = 0; j + 16 <= 256; j++) { 
      temp_v2 = _mm256_loadu_si256((__m256i *)&input[i][j]); 
    }      ^^^^^ 
} 

しかし、これはかなり奇妙で非効率なことです。


通常あなただけの全体の配列を反復処理するために、このような何かをするだろう:標準機能が利用可能な場合

for (i = 0; i < 256; i++) { 
     for (j = 0; j < 256; j += 16) { 
      temp_v2 = _mm256_load_si256((__m256i *)&input[i][j]); 
    } 
} 
+1

Paulさん、ありがとう、 '_mm256_loadu_si256'が動作します。 – ADMS

関連する問題