2016-03-20 6 views
0

Ich vektorisieren einen Teil meines Programms, aber es gibt Segmentation fault Fehler zurück. Was ist daran falsch? Hier ist es der vereinfachte Abschnitt, der das Problem verursacht. j++ und i++ ist genau das, was ich will, ich will nicht j += 16 sein.Warum gibt dieser Codeabschnitt den Fehler "Segmentierungsfehler" zurück?

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

nicht proprietäre Erweiterung Verwenden Sie, wenn ein Standard-Feature zur Verfügung steht. C liefert den Spezifizierer '_Alignas'. – Olaf

+0

Ihr Code verstößt gegen striktes Aliasing –

+0

In gcc verwende ich '__attribut __ ((aligned (X))) ', habe so ein Problem noch nicht gesehen. Was kann ich für striktes Aliasing tun? – ADMS

Antwort

2

Wenn Sie wirklich Lasten überlappende wollen, wo man nur die innere Schleife um 1 erhöhen (wie Sie scheinen in der Frage zu was darauf hindeutet), dann müssen Sie Anweisungen unaligned Last verwenden:

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

aber das wäre eine ziemlich seltsame und ineffiziente Sache.


Normalerweise würde man nur etwas tun, wie dies durch das ganze Array zu durchlaufen:

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

Danke Paul, '_mm256_loadu_si256' funktioniert. – ADMS