1

Ich habe eine Reihe von Doppel ausgerichtet auf 32 Byte mitWarum verursacht vmovapd segfault?

double *dst; 
posix_memalign((void**)&dst, 32, 4*sizeof(double)); 

zugewiesen ich _mm256_store_pd(dst,q); später verwenden und gelegentliche segfaults auf Anweisung

vmovapd YMMWORD PTR [rdi],ymm0 

bekommen Warum ein segfault hier stattfindet? Kann vmovapd einen Segmentfehler aus einem anderen Grund als Ausrichtung verursachen?

+1

'Kann vmovapd einen Segfault aus einem anderen Grund als der Ausrichtung verursachen?' Ja, auf NULL-Zeigern (oder anderen ungültigen Zugriffen). Verwenden Sie einen Debugger und sehen Sie sich RDI an der Stelle an, an der es fehlerhaft ist, um festzustellen, ob es falsch ausgerichtet oder einfach ungültig ist. (Versuchen Sie, gdb 'x' Befehl zu verwenden, um den Speicher dort zu entleeren. Wenn gdb ungültigen Zugriff sagt, dann wissen Sie, dass es ein schlechter Zeiger ist, selbst wenn es ausgerichtet ist.) –

+0

@PeterCordes Danke, habe ich überprüft, dass die Zeiger gültig waren. Ich habe einen Core-Dump untersucht und festgestellt, dass ich in einem Fall einen falsch ausgerichteten Zeiger übergeben habe. – stardt

Antwort

1

An einem anderen Ort im Code ist ein Fehler aufgetreten, der die Verwendung eines falsch ausgerichteten Zeigers verursacht hat. Wie Peter Cordes bemerkte, könnte ein anderer Grund ein ungültiger Zeiger gewesen sein.