Khi tôi chạy chương trình CUDA của tôi mà phân bổ chỉ một lượng nhỏ bộ nhớ toàn cầu (dưới 20 M), tôi nhận được một "ra khỏi bộ nhớ" lỗi. (Từ bài viết của người khác, tôi nghĩ rằng vấn đề là có liên quan đến sự phân mảnh bộ nhớ) Tôi cố gắng tìm hiểu vấn đề này, và nhận ra tôi có một vài câu hỏi liên quan đến quản lý bộ nhớ CUDA.Bộ nhớ CUDA được quản lý như thế nào?
Có khái niệm bộ nhớ ảo trong CUDA không?
Nếu chỉ có một hạt nhân được phép chạy đồng thời trên CUDA, sau khi kết thúc, tất cả bộ nhớ được sử dụng hoặc cấp phát đã được phát hành chưa? Nếu không, khi những bộ nhớ này được phát hành miễn phí?
Nếu có nhiều hơn một hạt nhân được phép chạy trên CUDA, làm thế nào họ có thể chắc chắn rằng bộ nhớ họ sử dụng không trùng nhau?
Có ai giúp tôi trả lời những câu hỏi này không? Cảm ơn
Chỉnh sửa 1: hệ điều hành: x86_64 GNU/Linux Phiên bản CUDA: 4.0 Thiết bị: Geforce 200, Đây là một trong GPUS được gắn vào máy và tôi không nghĩ đó là thiết bị hiển thị.
Chỉnh sửa 2: Sau đây là những gì tôi nhận được sau khi làm một số nghiên cứu. Vui lòng sửa tôi.
CUDA sẽ tạo một ngữ cảnh cho mỗi chuỗi máy chủ. Bối cảnh này sẽ tiếp tục thông tin như những phần của bộ nhớ (bộ nhớ trước khi giao hoặc bộ nhớ cấp phát động) đã được dành riêng cho ứng dụng này để ứng dụng khác không thể chỉnh sửa nó. Khi ứng dụng này kết thúc (không phải hạt nhân), phần bộ nhớ này sẽ được giải phóng.
nhớ CUDA được duy trì bởi một danh sách liên kết. Khi một ứng dụng cần cấp phát bộ nhớ, nó sẽ đi qua danh sách liên kết này để xem nếu có bộ nhớ liên tục có sẵn để phân bổ. Nếu nó không tìm thấy một đoạn như vậy, lỗi "hết bộ nhớ" sẽ báo cáo cho người dùng mặc dù tổng kích thước bộ nhớ có sẵn lớn hơn bộ nhớ được yêu cầu. Và đó là vấn đề liên quan đến phân mảnh bộ nhớ.
cuMemGetInfo sẽ cho bạn biết số lượng bộ nhớ là miễn phí, nhưng không nhất thiết bạn có thể phân bổ bộ nhớ trong phân bổ tối đa do phân mảnh bộ nhớ.
Trên nền tảng Vista (WDDM), có thể thực hiện ảo hóa bộ nhớ GPU. Đó là, nhiều ứng dụng có thể phân bổ gần như toàn bộ bộ nhớ GPU và WDDM sẽ quản lý trao đổi dữ liệu trở lại bộ nhớ chính.
câu hỏi mới: 1. Nếu bộ nhớ dành riêng trong bối cảnh sẽ được phát hành đầy đủ sau khi ứng dụng đã được chấm dứt, phân mảnh bộ nhớ nên không tồn tại. Phải có một số loại dữ liệu còn lại trong bộ nhớ. 2. Có cách nào để cơ cấu lại bộ nhớ GPU không?
Bạn có thể chỉnh sửa câu hỏi để bao gồm hệ điều hành, phiên bản GPU và cuda nào bạn đang sử dụng hay không và liệu GPU có phải là thiết bị hiển thị hay không hiển thị hay không. Nó sẽ mang một câu trả lời đúng cho câu hỏi của bạn. – talonmies
Để trả lời các câu hỏi phụ - phân mảnh có thể quan sát được xảy ra * trong ngữ cảnh *, và không có cách nào thay đổi ánh xạ bộ nhớ trong GPU, tất cả được xử lý bởi trình điều khiển máy chủ. – talonmies
Khi bạn giải thích, phân bổ ngữ cảnh bao gồm phân bổ tĩnh ngữ cảnh, phân bổ người dùng ngữ cảnh và vùng thời gian chạy ngữ cảnh CUDA. Tôi nghĩ rằng kích thước của phân bổ tĩnh ngữ cảnh và phân bổ người dùng ngữ cảnh được quyết định trước. Vì vậy, tôi nghĩ nguyên nhân duy nhất của sự phân mảnh bộ nhớ là heap thời gian chạy theo ngữ cảnh chỉ dựa trên kiến trúc Fermi. Đúng không? Tôi đoán hệ thống sẽ phân bổ trước một đoạn bộ nhớ cho heap thời gian chạy theo ngữ cảnh để phân bổ bộ nhớ động trong hạt nhân được kích hoạt. – xhe8