Tôi cố gắng xây dựng một ứng dụng sử dụng loại pthreads và __m128 SSE. Theo hướng dẫn của GCC, sắp xếp ngăn xếp mặc định là 16 byte. Để sử dụng __m128, yêu cầu là căn chỉnh 16 byte.GCC - Cách sắp xếp lại ngăn xếp?
CPU mục tiêu của tôi hỗ trợ SSE. Tôi sử dụng trình biên dịch GCC không hỗ trợ sắp xếp lại thời gian chạy ngăn xếp (ví dụ: -mstackrealign). Tôi không thể sử dụng bất kỳ phiên bản trình biên dịch GCC nào khác.
ứng dụng thử nghiệm của tôi trông giống như:
#include <xmmintrin.h>
#include <pthread.h>
void *f(void *x){
__m128 y;
...
}
int main(void){
pthread_t p;
pthread_create(&p, NULL, f, NULL);
}
Ứng dụng này tạo ra một ngoại lệ và lối thoát hiểm. Sau khi gỡ lỗi đơn giản (printf "% p", & y), tôi thấy rằng biến y không được căn chỉnh 16 byte.
Câu hỏi của tôi là: làm cách nào tôi có thể căn chỉnh lại ngăn xếp đúng cách (16 byte) mà không sử dụng bất kỳ cờ và thuộc tính GCC nào (chúng không giúp ích gì)? Tôi có nên sử dụng GCC inline Assembler trong hàm này f()?
Nếu bạn phải sử dụng một phiên bản gcc Đặc biệt, xin vui lòng bao gồm phiên bản gcc (ví dụ như gcc 4.3.2 i386), và máy chủ/hệ điều hành đích (ví dụ Debian 5.0 (lenny) Linux 2.6.26 i686). Việc biết nên đề xuất các tùy chọn gcc 4.3 so với 3,4 có thể tạo sự khác biệt hay không. – mctylr