2013-02-03 39 views
42

OpenMP 4.0 giới thiệu một cấu trúc mới có tên là "omp simd". Lợi ích của việc sử dụng cấu trúc này trên "song song" cũ là gì? Khi nào thì mỗi người sẽ là lựa chọn tốt hơn người kia?Song song với vs omp simd: khi nào sử dụng?

EDIT: Đây là một thú vị paper liên quan đến chỉ thị SIMD.

+0

openmp là SIMD up uintil phiên bản 3.0, sau đó họ đã loại bỏ khái niệm đó. Tôi đoán pragma mới là khả năng tương thích ngược với mã cũ dựa trên một số khía cạnh của SIMD. không nên các tài liệu openmp có gì để nói về điều đó? –

+4

Nó không phải là 'song song simd'; bạn sử dụng 'song'' _or_' simd', gợi ý về sự khác biệt. Xem bên dưới. –

+0

@JD: Đó là một lỗi đánh máy, tất nhiên. Đã sửa lỗi, nhờ –

Trả lời

32

Các liên kết đến các ý kiến ​​tương đối rõ ràng (p 13, đường 19 + 20)

Khi any thread gặp một cấu trúc SIMD, các lần lặp lại của vòng lặp liên quan đến việc xây dựng có thể được thực hiện bởi Các làn SIMD có sẵn cho chuỗi.

SIMD là một chủ đề phụ. Để làm cho nó cụ thể hơn, trên CPU bạn có thể tưởng tượng sử dụng các chỉ thị simd để yêu cầu cụ thể vectơ các đoạn lặp lặp lại thuộc về cùng một chủ đề . Nó phơi bày nhiều mức độ song song tồn tại trong một bộ xử lý đa lõi, theo cách độc lập với nền tảng. Xem ví dụ các cuộc thảo luận (cùng với các công cụ tăng tốc) trên intel blog post này.

Vì vậy, về cơ bản, bạn sẽ muốn sử dụng omp parallel để phân phối tác phẩm lên các luồng khác nhau, sau đó có thể di chuyển sang nhiều lõi; và bạn sẽ muốn sử dụng omp simd để tận dụng các đường ống vector (nói) trong mỗi lõi. Thông thường omp parallel sẽ đi vào "bên ngoài" để đối phó với phân phối song song hạt thô hơn của công việc và omp simd sẽ đi xung quanh vòng chặt chẽ bên trong đó để khai thác song song hạt mịn.

33

Câu trả lời đơn giản:

OpenMP chỉ được sử dụng để khai thác nhiều luồng cho nhiều lõi. Mở rộng simd mới này cho phép bạn sử dụng rõ ràng các hướng dẫn SIM SIMD trên các CPU hiện đại, chẳng hạn như Intel AVX/SSE và NEON của ARM.

(Lưu ý rằng lệnh SIMD được thực hiện trong một luồng đơn và một lõi đơn, theo thiết kế. Tuy nhiên, ý nghĩa của SIMD có thể được mở rộng cho GPGPU. Nhưng, tôi không nghĩ bạn cần xem xét GPGPU cho OpenMP 4.0.)

Vì vậy, một khi bạn biết hướng dẫn SIMD, bạn có thể sử dụng cấu trúc mới này.


Trong một CPU hiện đại, khoảng có ba loại song song: (1) hướng dẫn cấp xử lý song song (ILP), (2) đề cấp xử lý song song (TLP), và (3) hướng dẫn SIMD (chúng tôi có thể nói đây là cấp độ vectơ hoặc hơn).

ILP được thực hiện tự động bởi các CPU không theo đơn đặt hàng hoặc trình biên dịch. Bạn có thể khai thác TLP bằng cách sử dụng Open2's parallel for và các thư viện luồng khác. Vậy, SIMD thì sao? Intrinsics là một cách để sử dụng chúng (cũng như vector hóa tự động của trình biên dịch). Open23's simd là một cách mới để sử dụng SIMD.

Đi một ví dụ rất đơn giản:

for (int i = 0; i < N; ++i) 
    A[i] = B[i] + C[i]; 

Đoạn mã trên sẽ tính toán một tổng của hai vectơ N-chiều.Như bạn có thể dễ dàng thấy, không có (loop-carried) data dependency trên mảng A[]. Vòng lặp này là embarrassingly parallel.

Có thể có nhiều cách để song song vòng lặp này. Ví dụ, cho đến OpenMP 4.0, điều này có thể được song song chỉ sử dụng cấu trúc parallel for. Mỗi chuỗi sẽ thực hiện N/#thread lặp trên nhiều lõi.

Tuy nhiên, bạn có thể nghĩ rằng việc sử dụng nhiều chuỗi để bổ sung đơn giản như vậy sẽ là quá mức cần thiết. Đó là lý do tại sao có vectorization, mà chủ yếu được thực hiện bởi các hướng dẫn SIMD.

Sử dụng một SIMD sẽ là như thế này:

for (int i = 0; i < N/8; ++i) 
    VECTOR_ADD(A + i, B + i, C + i); 

Mã này giả định rằng (1) hướng dẫn SIMD (VECTOR_ADD) là 256-bit hoặc 8-way (8 * 32 bit); và (2) N là bội số của 8.

Lệnh SIMD 8 chiều có nghĩa là 8 mục trong vectơ có thể được thực hiện trong một lệnh máy. Lưu ý rằng AVX mới nhất của Intel cung cấp hướng dẫn vector 8 chiều (32-bit * 8 = 256 bit).

Trong SIMD, bạn vẫn sử dụng một lõi đơn (một lần nữa, điều này chỉ dành cho các CPU thông thường chứ không phải GPU). Tuy nhiên, bạn có thể sử dụng một song song ẩn trong phần cứng. CPU hiện đại dành tài nguyên phần cứng cho hướng dẫn SIMD, trong đó mỗi SIMD lane có thể được thực thi song song.

Bạn có thể sử dụng song song cấp chủ đề cùng một lúc. Ví dụ trên có thể được song song thêm bởi parallel for.

(Tuy nhiên, tôi nghi ngờ có bao nhiêu vòng lặp thực sự có thể được chuyển thành vòng SIMDized. Đặc tả OpenMP 4.0 dường như không rõ ràng về điều này. Vì vậy, hiệu suất thực tế và hạn chế thực tế sẽ phụ thuộc vào việc triển khai trình biên dịch thực tế).


để tóm tắt, simd xây dựng cho phép bạn sử dụng các chỉ lệnh SIMD, đến lượt nó, song song hơn có thể được khai thác cùng với thread-mức xử lý song song. Tuy nhiên, tôi nghĩ rằng việc triển khai thực sự sẽ quan trọng.

+2

"Nhưng, nhưng tôi không nghĩ rằng bạn cần phải xem xét GPGPU cho OpenMP 4.0." Trên thực tế, có một sự hỗ trợ được đề xuất cho GPGPU (và các loại máy gia tốc khác) trong OpenMP 4.0, nhưng nó nằm trong một [TR] riêng biệt (http://www.openmp.org/mp-documents /TR1_167.pdf) và không phải là một phần của văn bản chính (nghĩ rằng họ đã làm điều đó vì văn bản không được đánh bóng như được yêu cầu để được đưa vào văn bản đánh giá chính về thời gian diễn ra hội nghị SC'12). –

+0

Đó là thông tin rất tốt. – minjang

+0

"cấu trúc simd cho phép bạn sử dụng hướng dẫn SIMD" giả định sai rằng không sử dụng cấu trúc simd không cho phép sử dụng các hướng dẫn SIMD. – Jeff

1

Trình biên dịch không bắt buộc phải tối ưu hóa simd trong một vùng song song có điều kiện khi có mệnh đề simd. Trình biên dịch Tôi quen thuộc với việc tiếp tục hỗ trợ các vòng lặp lồng nhau, song song bên ngoài, bên trong vector, giống như trước đây.
Trong quá khứ, chỉ thị OpenMP thường được thực hiện để ngăn chặn tối ưu hóa chuyển mạch vòng lặp liên quan đến vòng lặp song song bên ngoài (nhiều vòng lặp với mệnh đề thu gọn). Điều này dường như đã thay đổi trong một vài trình biên dịch. OpenMP 4 mở ra các khả năng mới bao gồm tối ưu hóa một vòng lặp song song bên ngoài với một vòng lặp bên trong không vector, bởi một loại khai thác dải, khi omp song song làm [for] simd được thiết lập. ifort đôi khi báo cáo nó như vector vòng lặp bên ngoài khi nó được thực hiện mà không có mệnh đề simd. Sau đó nó có thể được tối ưu hóa cho một số lượng nhỏ hơn các chủ đề so với omp song song làm simd, mà dường như cần nhiều chủ đề hơn chiều rộng vector simd để trả hết. Sự phân biệt như vậy có thể được suy ra, như, không có mệnh đề simd, trình biên dịch được yêu cầu ngầm tối ưu hóa cho một số vòng lặp như 100 hoặc 300, trong khi mệnh đề simd yêu cầu tối ưu hóa simd vô điều kiện. gcc 4.9 omp song song cho simd trông khá hiệu quả khi tôi có nền tảng 24 lõi.

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