OPENMP TRONG C++

01-02-2018 15:12

Mục đích của bài viết này đó là giới thiệu một cách cơ bản nhất về OpenMP, bộ thư viện mở rộng C/C++/Fortran nhằm cho phép thực hiện song song vào scource code mà không phải viết lại nó.

Tầm quan trọng của đa luồng

Khi tốc độ của CPU không cải thiện thêm nhiều được nữa thì hệ thống multicore trở nên phổ biến hơn. Vì vậy, các lập trình viên cần nắm bắt về parallel programming nhiều hơn, đưa ứng dụng thực hiện nhiều công việc hơn cùng lúc.

Các khóa học lập trình 

Khóa học Lập trình website với Java

Thiết kế và lập trình web PHP chuyên nghiệp

Các trình biên dịch hỗ trợ OpenMP

  • GCC: Sử dụng - fopenmp
  • Clang++: Sử dụng - fopenmp
  • Solaris Studio: Sử dụng - xopenmp
  • Intel C Compiler: Sử dụng - openmp
  • Microsoft Visual C++: Sử dụng / openmp

OpenMP trong C++

OpenMP là một tập các chỉ dẫn biên dịch #prama nhằm chỉ dẫn các chương trình hoạt động. Các prama được thiết kế nằm mục đích nếu các trình biên dịch không hỗ trợ thì chương trình vẫn hoạt động bình thường nhưng sẽ không có bất kỳ tác vụ song song nào được thực hiện như khi sử dụng OpenMP.

Đây là ví dụ đơn giản về OpenMP nhằm tăng tốc độ thực hiện vòng lặp for.

Ví dụ về việc sử dụng nhiều Thread thực hiện vòng lặp for

Ví dụ về việc sử dụng nhiều Thread thực hiện vòng lặp for

Ví dụ về việc sử dụng nhiều Thread trên các thiết bị khác (Khởi tạo bảng bằng thực hiện song song)

OpenMP 4.0 hỗ trợ việc offloading code trên các thiết bị khác như GPU.

Ví dụ về việc tính toán hệ số Mandelbrot trên host computer

Các ví dụ trên cho thấy, khi remove #pragma, kết quả tính toán của chương trình vẫn đúng như kỳ vọng.

Chỉ khi trình biên dịch được biên dịch với #pragma thì nó mới trở thành một chương trình chạy song song. Nó có thể thực hiện tính toán N giá trị đồng thời với N là số thread thực hiện.

Cú pháp

Các chỉ dẫn OpenMP trong C/C++ đều được dùng thông qua #pragma omp theo sau là các thông số và kết thúc bằng một ký hiệu xuống dòng. #pragma được áo dụng vào đoạn chương trình ngay sau nó, ngoại trừ lệnh barrier và flush.

Chỉ dẫn parrallel

Chỉ dẫn này bắt đầu một đoạn code thực hiện song song. Nó tạo ra một team bao gồm N threads, các lệnh sử lý tiếp ngay sau #pragma hoặc block tiếp theo (trong giới hạn {}) được thực hiện song song. Sau đoạn này, các thread được join lại về một.

Đoạn code này tạo ra một nhóm threads, mỗi thread thực hiện cùng một đoạn code in ra màn hình dòng chữ “Hello”, số lần in ra màn bằng số thread được tạo ra. Ví dụ: Hệ thống dual-core sẽ in ra màn hình hai lần  “Hello”. Tuy nhiên, nó có thể in ra màn hình đoạn chữ kiểu “HeHlellolo”, tùy vào từng hệ thống vì việc in ra màn hình được thực hiện song song. Sau dấu “}”, các threads được join lại thành một như khi chạy một chương trình thông thường.

GCC thực hiện đoạn chương trình này bằng cách tạo ra hàm ảo và đưa đoạn code vào hàm đó, vì thế các biến được định nghĩa trong block trở thành biến cục bộ của hàm.

Có thể sử dụng điều kiện cho việc xử lý song song như sau:

Nếu parallelism_enabled được đặt giá trị bằng 0 thì số thread được tạo ra cho việc xử lý vòng lặp for là 1.

Chỉ dẫn lặp for

Chỉ dẫn for sẽ chia vòng lặp for mà mỗi thread trong nhóm thread hiện tại thực hiện một phần của vòng lặp

Vòng lặp này sẽ in ra màn hình từ 0..9. Tuy nhiên nó có thể in ra không theo tứ tự, ví dụ

Vòng lặp này có thể hình dung bằng đoạn code tương ứng như sau:

Chú ý rằng #pragma omp for chia các phần của vòng lặp cho các thread khác nhau trong team. Mỗi team là một nhóm các thread thực hiện chương trình. Khi chương trình bắt đầu, team bao gồm duy nhất một thành viên là thread chính đang chạy chương trình.

Để tạo ra một team mới, cần chỉ định rõ từ khóa parrallel

Ban Truyền thông ITPlus Academy

Bài viết cùng chủ đề