Tôi chỉ mới bắt đầu thử nghiệm thêm OpenMP vào một số mã SSE.Lỗi phân đoạn khi sử dụng OpenMp và SSE
Chương trình thử nghiệm đầu tiên của tôi SOMETIMES treo trong _mm_set_ps, nhưng hoạt động khi tôi đặt if (0).
Dường như đơn giản, tôi phải bỏ lỡ điều gì đó hiển nhiên. Tôi đang biên soạn với gcc -g -fopenmp -march = Core2 -pthreads
#include <stdio.h>
#include <stdlib.h>
#include <immintrin.h>
int main()
{
#pragma omp parallel if (1)
{
#pragma omp sections
{
#pragma omp section
{
__m128 x1 = _mm_set_ps (1.1f, 2.1f, 3.1f, 4.1f);
}
#pragma omp section
{
__m128 x2 = _mm_set_ps (1.2f, 2.2f, 3.2f, 4.2f);
}
} // end omp sections
} //end omp parallel
return 0;
}
Sử dụng -mstackrealign dường như đã giải quyết được sự cố. Và nếu có một hình phạt hiệu suất, nó vẫn tốt hơn là không có hiệu suất! Tôi sẽ xem nó như thế nào với một số mã phức tạp hơn. Cảm ơn bạn đã giúp đỡ. Thật không may, tôi không có một máy 64-bit để chơi, với. Tôi có một máy tính AVX, do đó, nó là một sự xấu hổ mà gcc không hỗ trợ được nêu ra. –
Để chính xác, gcc hỗ trợ AVX, bao gồm Core i7 thế hệ thứ 2 (Sandy Bridge), và từ những gì tôi đọc trực tuyến, nó hoạt động tốt trên Linux. Nhưng tôi đã có rất nhiều vấn đề lỗi phân đoạn trên Windows với MinGW64, vì vậy nó có thể sẽ là lỗi liên quan đến MinGW. Nhưng tôi có thể chỉ làm điều gì sai ... –
Tùy chọn g ++ '-mstackrealign' hoạt động hoàn hảo. Để thay thế, trong trường hợp của tôi, tôi cũng phải thêm thuộc tính 'noinline' để đảm bảo rằng cuộc gọi hàm đã có ở vị trí đầu tiên:' __attribute __ ((force_align_arg_pointer, noinline)) ' – phfaist