2011-07-16 44 views
6

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; 
    } 

Trả lời

6

Đây là lỗi trong quá trình triển khai OpenMP. Tôi đã gặp vấn đề tương tự trong gcc trên Windows (MinGW). -mstackrealign tùy chọn dòng lệnh đã giải quyết được sự cố của tôi. Điều này thêm một lệnh vào phần mở đầu của mọi hàm để căn chỉnh lại ngăn xếp tại ranh giới 16-byte. Tôi đã không nhận thấy bất kỳ hình phạt hiệu suất nào. Bạn cũng có thể thử thêm __attribute__ ((force_align_arg_pointer)) vào một khai báo chức năng, sẽ thực hiện tương tự, nhưng chỉ cho một hàm cụ thể. Bạn có thể phải đặt mã SSE trong một hàm riêng biệt mà sau đó bạn gọi từ hàm bằng #pragma omp, để ngăn xếp có cơ hội được sắp xếp lại.

Tôi đã ngừng gặp sự cố khi tôi chuyển sang biên dịch cho mục tiêu 64 bit (MinGW64, chẳng hạn như TDM GCC bản dựng).

Tôi đang phát với hướng dẫn AVX yêu cầu căn chỉnh 32 byte nhưng GCC không hỗ trợ cửa sổ đó. Điều này buộc tôi phải sửa mã lắp ráp được sản xuất bằng cách sử dụng một tập lệnh python, nhưng nó hoạt động.

+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. –

+0

Để 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 ... –

+0

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

2

Tôi ngửi thấy truy cập bộ nhớ unaligned. Mã duy nhất của nó giống như vậy có thể phát nổ (giả sử rằng là mã duy nhất ở đó là). Để điều đó xảy ra, các thanh ghi XMM sẽ không được sử dụng mà là bộ nhớ ngăn xếp, nó chỉ liên kết với 4 byte, tôi đoán là mã omp đang làm rối tung sự sắp xếp của chồng.

Các vấn đề liên quan