NVIDIA đã công bố việc phát triển bộ công cụ CUDA Rust, cho phép ngôn ngữ Rust phát triển các nhân chạy trên GPU. Bộ công cụ này đảm bảo an toàn bộ nhớ trong quá trình biên dịch và ngăn ngừa các điều kiện tranh chấp. Năm tới, CUDA Rust dự kiến sẽ được phát triển đến mức độ phù hợp cho các dự án sản xuất, tương tự như bộ công cụ CUDA C++ và CUDA Python.
Bộ công cụ CUDA Rust hỗ trợ hai mô hình phát triển nhân song song: SIMT (Single Instruction, Multiple Threads) và Tile. Mô hình SIMT cho phép định nghĩa ở cấp độ thấp một luồng duy nhất, khởi chạy và quản lý hàng nghìn luồng như vậy. Mô hình Tile cung cấp mức độ trừu tượng cao hơn, trong đó thay vì quản lý rõ ràng từng luồng riêng lẻ, các thuật toán để hoạt động trên các khối dữ liệu (tile) được định nghĩa, và trình biên dịch Tile IR xử lý tất cả việc thao tác luồng, đồng bộ hóa truy cập, quản lý bộ nhớ và phân phối dữ liệu trên các lõi tensor.
Để phát triển ứng dụng bằng ngôn ngữ Rust sử dụng mô hình SIMT, trình biên dịch cuda-oxide đang được phát triển, cho phép biên dịch mã bằng ngôn ngữ Rust, sử dụng hệ thống kiểu chuẩn và mô hình sở hữu Rust, trực tiếp thành các lệnh để thực thi. máy ảo CUDA PTX (Thực thi luồng song song). Các nhân GPU được viết bằng Rust thông thường, nhưng chạy trong môi trường no_std và chỉ có thể sử dụng các hàm từ thư viện libcore và các lớp trừu tượng chuyên dụng của Rust, mà không có quyền truy cập vào thư viện Rust chuẩn (libstd).
Các nhân CUDA được viết bằng Rust cho phép sử dụng bảo vệ kiểu dữ liệu (safe), sử dụng các khối unsafe và truy cập vào các lệnh phần cứng cấp thấp. Để đảm bảo an toàn, kiểu DisjointSlice được đề xuất, đảm bảo rằng mỗi luồng chỉ có quyền truy cập độc quyền vào dữ liệu của riêng nó. Mã nguồn cuda-oxide được cấp phép theo giấy phép Apache 2.0.
Để triển khai mô hình Tail, thư viện cutile-rs được đề xuất. Nó cho phép sử dụng ngôn ngữ Rust chuẩn để tạo mã biên dịch trực tiếp thành nhân CUDA. Cutile-rs áp dụng các quy tắc sở hữu và mượn nghiêm ngặt của Rust cho mã chạy trên GPU. Nhân được triển khai dưới dạng chương trình đơn luồng hoạt động trên một khối dữ liệu, và trình biên dịch tự động chia nhỏ quá trình tính toán thành các luồng và đảm bảo sự đồng bộ hóa của chúng. Các luồng được cấp quyền truy cập chung vào các tensor bất biến, và các tensor có thể thay đổi được phân vùng thành các khối riêng biệt để đảm bảo truy cập an toàn. Mã nguồn cutile-rs được phân phối theo giấy phép Apache 2.0.
Nguồn: opennet.ru
