Sto provando a creare un programma compilato con GCC e utilizzando elementi intrinseci Qt e SSE. Sembra che quando una delle mie funzioni viene chiamata da Qt, l'allineamento dello stack non viene mantenuto. Ecco un breve esempio per illustrare quello che voglio dire:Qt, GCC, SSE e allineamento stack
#include <cstdio>
#include <emmintrin.h>
#include <QtGui/QApplication.h>
#include <QtGui/QWidget.h>
class Widget: public QWidget {
public:
void paintEvent(QPaintEvent *) {
__m128 a;
printf("a: 0x%08x\n", ((void *) &a));
}
};
int main(int argc, char** argv)
{
QApplication application(argc, argv);
Widget w;
w.paintEvent(NULL); // Called from here, my function behaves correctly
w.show();
w.update();
// Qt will call Widget::paintEvent and my __m128 will not be
// aligned on 16 bytes as it should
application.processEvents();
return 0;
}
ecco l'output:
a: 0x0023ff40 // OK, that's aligned on 16 bytes
a: 0x0023d14c // Not aligned!
Configurazione:
- Intel Core2
- WinXP, SP3
- GCC 4.4 (Mingw incluso nel Qt SDK 2010.01)
ho provato a compilare il programma di esempio con le stesse opzioni come quelli che ho visto nel makefile Qt:
-O2 -Wall -frtti -fexceptions -mthreads
, opzioni di collegamento:
-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads
Ora io non so in cui indicazioni per cercare Eventuali suggerimenti sarebbero apprezzati. Grazie!
Fabien
Grazie! Secondo http://eigen.tuxfamily.org/dox/WrongStackAlignment.html, sembra che sia meglio per le prestazioni utilizzare l'attributo force_align_arg_pointer. L'utilizzo di -mincoming-stack-boundary = 2 potrebbe essere un'altra soluzione (su Windows), in modo che "GCC sappia che è necessario prestare particolare attenzione per onorare l'allineamento a 16 byte". – Fabien