2011-11-15 12 views
7

Tôi có một chương trình sử dụng bộ hẹn giờ POSIX (timer_create()). Về cơ bản chương trình thiết lập một bộ đếm thời gian và bắt đầu thực hiện một số tính toán dài (có khả năng vô hạn). Khi bộ đếm thời gian hết hạn và trình xử lý tín hiệu được gọi, trình xử lý sẽ in kết quả tốt nhất nhưng đã được tính toán và thoát khỏi chương trình.Xử lý tín hiệu trong chương trình song song OpenMP

Tôi xem xét thực hiện tính toán song song bằng cách sử dụng OpenMP, vì nó sẽ tăng tốc độ.

Trong pthreads, có các chức năng đặc biệt ví dụ để thiết lập mặt nạ tín hiệu cho chủ đề của tôi hoặc hơn. OpenMP có cung cấp điều khiển như vậy không, hoặc tôi có phải chấp nhận thực tế là tín hiệu có thể được gửi đến bất kỳ luồng nào mà OpenMP tạo ra không?

Ngoài ra, trong trường hợp tôi hiện đang ở phần song song của mã của tôi và trình xử lý của tôi được gọi, nó vẫn có thể an toàn xóa ứng dụng (exit(0);) và làm những việc như khóa khóa OpenMP?

+0

Có lẽ, điều này có thể được giải quyết bằng cách sử dụng một khối duy nhất mà bắt lối ra ? – Bort

+0

Đặc tả OpenMP không chứa từ "tín hiệu". – jfs

Trả lời

2

Chuẩn OpenMP 3.1 không nói gì về tín hiệu.

Như tôi biết, mọi triển khai OpenMP phổ biến trên Linux/UNIX đều dựa trên pthreads, do đó, chuỗi OpenMP là chuỗi của pthread. Và các quy tắc chung của pthreads và tín hiệu được áp dụng.

Liệu OpenMP cung cấp kiểm soát như vậy

Không bất kỳ kiểm soát cụ thể; nhưng bạn có thể thử sử dụng điều khiển của pthread. Chỉ có vấn đề là phải biết bao nhiêu chủ đề OpenMP được sử dụng và nơi đặt câu lệnh kiểm soát.

tín hiệu có thể được gửi đến bất kỳ luồng nào mà OpenMP tạo ra?

Theo mặc định, có, nó sẽ được gửi đến bất kỳ chuỗi nào.

xử lý của tôi được gọi,

quy tắc thông thường về xử lý tín hiệu vẫn được áp dụng. Các chức năng được phép trong bộ xử lý tín hiệu được liệt kê tại http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html (ở cuối trang)

printf không được phép (write). Bạn có thể sử dụng printf nếu bạn biết rằng tại thời điểm printf tín hiệu không được sử dụng bởi bất kỳ chủ đề nào (ví dụ: bạn không có printf trong vùng song song).

nó vẫn có thể giết chết một cách an toàn ứng dụng (exit (0);)

Có nó có thể: abort()_exit() được phép từ xử lý.

Linux/Unix sẽ chấm dứt tất cả các chuỗi khi có chuỗi bất kỳ exit hoặc abort.

và làm những việc như khóa khóa OpenMP?

Bạn không nên, nhưng nếu bạn biết rằng khóa này sẽ không bị khóa tại thời điểm xử lý tín hiệu, bạn có thể thử thực hiện việc này.

!! CẬP NHẬT

Có ví dụ về việc áp dụng tín hiệu cho OpenMP http://www.cs.colostate.edu/~cs675/OpenMPvsThreads.pdf ("OpenMP so với luồng trong C/C++"). Trong ngắn hạn: thiết lập một lá cờ trong xử lý và thêm kiểm tra của lá cờ này trong mỗi thread tại mỗi vòng lặp Nth lặp đi lặp lại.

Thích ứng với một cơ chế ngoại lệ tín hiệu dựa trên một vùng song song

Cái gì đó xảy ra nhiều hơn với C C++ ứng dụng/rằng với các ứng dụng Fortran là chương trình sử dụng một giao diện người dùng tinh vi. Genehunter là một ví dụ đơn giản khi người dùng có thể làm gián đoạn việc tính toán một cây gia đình bằng cách nhấn control-C để nó có thể chuyển sang cây hộ gia đình tiếp theo trong cơ sở dữ liệu lâm sàng về bệnh . Việc chấm dứt sớm được xử lý trong phiên bản nối tiếp bằng C++ như cơ chế ngoại lệ liên quan đến bộ xử lý tín hiệu, setjump, và longjump.OpenMP không cho phép kiểm soát không có cấu trúc luồng để vượt qua ranh giới xây dựng song song. Chúng tôi sửa đổi xử lý ngoại lệ trong phiên bản OpenMP bằng cách thay đổi trình xử lý ngắt thành cơ chế bỏ phiếu . Chủ đề bắt tín hiệu điều khiển-C đặt cờ được chia sẻ. Tất cả các chủ đề kiểm tra cờ ở đầu vòng lặp bằng cách gọi thường lệ has_hit_interrupt() và bỏ qua phép lặp nếu được đặt. Khi vòng lặp kết thúc, thầy kiểm tra cờ và có thể dễ dàng thực hiện longjump để hoàn thành cảnh đặc biệt (Xem Hình 1.)