Trang tài liệu
Khóa học C++ nền tảng
Chương 20. Thư viện
OpenCL

OpenCL

OpenCL (Open Computing Language) là một framework để viết các chương trình cho phép bạn thực thi mã code trên các nền tảng không đồng nhất bao gồm CPU, GPU và các bộ xử lý khác. Nó chủ yếu được sử dụng để lập trình song song và nó có thể được sử dụng để cải thiện hiệu suất của các ứng dụng khác nhau, bao gồm chơi game, kết xuất hình ảnh và video cũng như tính toán khoa học.

Tổng quan

OpenCL cung cấp một giao diện lập trình được tiêu chuẩn hóa, cho phép bạn nhắm mục tiêu các thiết bị khác nhau, chẳng hạn như card đồ họa từ các nhà cung cấp khác nhau. Bạn có thể lập trình bằng C với OpenCL C hoặc C++ với ngôn ngữ hạt nhân OpenCL C++, dựa trên ISO C99 và C++14 tương ứng, với các phần mở rộng, tích hợp sẵn và các tính năng cụ thể để khai thác tính song song của thiết bị.

Ý chính

  • Platform: Tập hợp các thiết bị và tính năng phần mềm do nhà cung cấp cung cấp.
  • Thiết bị: Đơn vị xử lý có thể thực thi mã OpenCL, ví dụ: CPU hoặc GPU.
  • Hàng đợi lệnh: Một chuỗi các lệnh sẽ được thực thi trên thiết bị.
  • Kernel: Một chức năng song song được thực thi trên các thiết bị OpenCL.
  • Bộ đệm: Một đối tượng bộ nhớ lưu trữ một lượng dữ liệu cụ thể (ví dụ: một mảng số nguyên hoặc số thực) mà cả máy chủ và thiết bị đều có thể truy cập được.

Mã code mẫu

Đây là một ví dụ mã code OpenCL đơn giản minh họa cách triển khai phép cộng vecto:

#include <CL/cl.h>
#include <iostream>
#include <vector>
 
const char *kernelSource = "__kernel void vector_add(__global int *A, __global int *B, __global int *C, const int N){"
                            "  int i = get_global_id(0);"
                            "  if(i < N){"
                            "    C[i] = A[i] + B[i];"
                            "  }"
                            "}";
 
int main(){
    // Khởi tạo vectơ dữ liệu
    std::vector<int> A = {1, 2, 3};
    std::vector<int> B = {4, 5, 6};
    std::vector<int> C(A.size());
 
    // Thiết lập môi trường, thiết bị và bối cảnh OpenCL
    // ... bỏ qua cho ngắn gọn ...
 
    // Tạo bộ nhớ đệm cho A, B và C
    // ... bỏ qua cho ngắn gọn ...
 
    // Tạo kernel từ nguồn và đặt đối số kernel
    // ... bỏ qua cho ngắn gọn ...
 
    //Thực thi kernel bằng hàng đợi lệnh và đọc bộ đệm đầu ra
    // ... bỏ qua cho ngắn gọn ...
 
    // Kết quả đầu ra
    for (size_t i = 0; i < A.size(); ++i) {
        std::cout << A[i] << " + " << B[i] << " = " << C[i] << std::endl;
    }
    return 0;
}

Đoạn mã code này thể hiện cấu trúc cơ bản của chương trình OpenCL trong C++. Có các chi tiết bổ sung cần thiết để thiết lập môi trường, thiết bị và ngữ cảnh, cũng như tạo bộ nhớ đệm, nhân và hàng đợi lệnh. Bạn có thể tìm thấy các ví dụ đầy đủ và nhiều thông tin hơn trong Hướng dẫn Lập trình OpenCL chính thức.