Tại sao bộ nhớ được ghim CUDA nhanh như vậy?


83

Tôi quan sát thấy tốc độ truyền dữ liệu tăng lên đáng kể khi tôi sử dụng bộ nhớ được ghim để truyền dữ liệu CUDA. Trên linux, lệnh gọi hệ thống cơ bản để đạt được điều này là mlock. Từ trang chủ của mlock, nó tuyên bố rằng việc khóa trang sẽ ngăn nó bị hoán đổi:

mlock () khóa các trang trong phạm vi địa chỉ bắt đầu từ addr và tiếp tục cho các byte len. Tất cả các trang có chứa một phần của dải địa chỉ được chỉ định được đảm bảo nằm trong RAM khi cuộc gọi trả về thành công;

Trong các thử nghiệm của tôi, tôi có một vài hợp đồng bộ nhớ trống trên hệ thống của mình nên không bao giờ có nguy cơ các trang bộ nhớ có thể bị hoán đổi nhưng tôi vẫn quan sát thấy tốc độ tăng tốc. Bất cứ ai có thể giải thích những gì thực sự đang xảy ra ở đây ?, bất kỳ thông tin chi tiết hoặc thông tin được đánh giá cao.


Bạn đã đo thời gian của chính mlock?
osgx

Không, thời gian thực tế cần thiết để thực hiện lệnh gọi mlock được cho là không đáng kể (nếu đó là những gì bạn đang hỏi). Chi phí thực sự là truyền dữ liệu thực tế, trong thuật toán của tôi là một phần đáng kể của tổng thời gian chu kỳ.
Gearoid Murphy

CPU của bạn là gì? Có thể, các nút hỗ trợ NUMA sẽ không được hưởng lợi từ việc đơn giản mlock().
osgx

AMD Phenom (tm) II X4 970 Processor
Gearoid Murphy

Câu trả lời:


83

CUDA Driver sẽ kiểm tra xem phạm vi bộ nhớ có bị khóa hay không và sau đó nó sẽ sử dụng một đường dẫn mã khác. Bộ nhớ đã khóa được lưu trong bộ nhớ vật lý (RAM), vì vậy thiết bị có thể tìm nạp nó với sự trợ giúp từ CPU (DMA, hay còn gọi là bản sao Async; thiết bị chỉ cần danh sách các trang vật lý). Bộ nhớ không bị khóa có thể tạo ra lỗi trang khi truy cập và nó không chỉ được lưu trữ trong bộ nhớ (ví dụ: nó có thể được hoán đổi), vì vậy trình điều khiển cần truy cập vào mọi trang của bộ nhớ không bị khóa, sao chép nó vào bộ đệm được ghim và chuyển nó sang DMA (Bản sao đồng bộ, từng trang).

Như được mô tả ở đây http://forums.nvidia.com/index.php?showtopic=164661

bộ nhớ máy chủ được sử dụng bởi lệnh gọi sao chép bản ghi nhớ không đồng bộ cần được khóa trang thông qua cudaMallocHost hoặc cudaHostAlloc.

Tôi cũng có thể khuyên bạn nên xem hướng dẫn sử dụng cudaMemcpyAsync và cudaHostAlloc tại developer.download.nvidia.com. HostAlloc nói rằng trình điều khiển cuda có thể phát hiện bộ nhớ được ghim:

Trình điều khiển theo dõi các phạm vi bộ nhớ ảo được cấp phát bằng hàm này (cudaHostAlloc) và tự động tăng tốc các lệnh gọi đến các hàm như cudaMemcpy ().


1
Tôi tự hỏi bạn có thể tạo ra bao nhiêu havok bằng cách yêu cầu một luồng khác cố gắng khóa các trang sau khi phát hành các lệnh sao chép không đồng bộ?
Zan Lynx

1
Zan Lynx, Câu hỏi thú vị. Tại sao bạn muốn mở khóa bộ nhớ này? Có thể có tới 2-4 GB bộ nhớ bị khóa ngay cả trên PC 32 bit và hơn thế nữa khi thẻ PCI-express có quyền truy cập vào 64 bit (ở 40 hoặc 48 bit thực). Sẽ rẻ hơn nhiều nếu mua thêm bộ nhớ sau đó trả tiền cho lập trình viên có thời hạn sử dụng cao (18k đại diện trên SO). Như trong Linux, tôi nghĩ (tin rằng), munlock sẽ bị chặn hoặc sẽ trả về lỗi và không có thiệt hại nào đối với hệ thống.
osgx 20/09/13

Tôi có thể áp dụng cudaHostRegistercho con trỏ tới tệp ánh xạ bộ nhớ không?
Tomilov Anatoliy

15

CUDA sử dụng DMA để chuyển bộ nhớ được ghim sang GPU. Không thể sử dụng bộ nhớ máy chủ có thể hoán đổi với DMA vì chúng có thể nằm trên đĩa. Nếu bộ nhớ không được ghim (tức là bị khóa trang), trước tiên nó được sao chép vào bộ đệm "dàn" khóa trang và sau đó được sao chép sang GPU thông qua DMA. Vì vậy, bằng cách sử dụng bộ nhớ được ghim, bạn tiết kiệm thời gian sao chép từ bộ nhớ máy chủ có thể phân trang sang bộ nhớ máy chủ bị khóa trang.


5

Nếu các trang bộ nhớ chưa được truy cập, chúng có thể không bao giờ được hoán đổi từ đầu . Đặc biệt, các trang mới được phân bổ sẽ là các bản sao ảo của "trang không" phổ quát và không có phiên bản thực cho đến khi chúng được ghi vào. Bản đồ mới của các tệp trên đĩa cũng sẽ hoàn toàn nằm trên đĩa cho đến khi chúng được đọc hoặc ghi.


Tôi nghĩ đó không phải là một trường hợp (tôi viết về nó trong biến thể ban đầu của câu trả lời của tôi), vì nó là một chương trình thực và chương trình diễn ra mlock()nhanh chóng (kiểm tra nhận xét số 2 cho phần Q).
osgx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.