2011-07-25 26 views
5

Tôi đang sử dụng một ứng dụng hiện có để sinh ra một loạt các pthread (linux), và mỗi ứng dụng tạo ra bối cảnh CUDA riêng của nó. (sử dụng cuda 3.2 ngay bây giờ).Luồng và ngữ cảnh của CUDA

Sự cố tôi gặp phải là dường như mỗi luồng có ngữ cảnh riêng của nó tốn rất nhiều bộ nhớ trên GPU. Một cái gì đó giống như 200MB cho mỗi chủ đề, vì vậy điều này thực sự hạn chế tôi.

Tôi có thể đơn giản tạo luồng trong chuỗi chủ, chuyển tham chiếu luồng tới chuỗi công việc, sau đó có thể chuyển tới thư viện CUDA số luồng của chúng và tất cả hoạt động trong cùng ngữ cảnh không?

Chủ đề của nhân viên có tự động biết cùng ngữ cảnh CUDA vì đó là chủ đề gốc không?

Cảm ơn

Trả lời

6

Mỗi ngữ cảnh CUDA có chi phí khá nhiều bộ nhớ thiết bị và tài nguyên của chúng được phân chia chặt chẽ với nhau. Ví dụ, bộ nhớ thiết bị được cấp phát trong ngữ cảnh A không thể được truy cập theo ngữ cảnh B. Các luồng cũng chỉ hợp lệ trong ngữ cảnh mà chúng được tạo ra.

Cách tốt nhất là tạo một ngữ cảnh CUDA cho mỗi thiết bị. Theo mặc định, ngữ cảnh CUDA chỉ có thể được truy cập từ chuỗi CPU đã tạo ra nó. Nếu bạn muốn truy cập ngữ cảnh CUDA từ các chủ đề khác, hãy gọi cuCtxPopCurrent() để bật nó từ luồng đã tạo ra nó. Ngữ cảnh sau đó có thể được đẩy lên bất kỳ ngăn ngữ cảnh hiện tại nào của luồng CPU khác, và các cuộc gọi CUDA tiếp theo sẽ tham chiếu đến ngữ cảnh đó.

Bối cảnh đẩy/pop là hoạt động nhẹ và như của CUDA 3.2, chúng có thể được thực hiện trong các ứng dụng thời gian chạy CUDA. Vì vậy, đề xuất của tôi sẽ là khởi tạo ngữ cảnh CUDA, sau đó gọi cuCtxPopCurrent() để làm cho ngữ cảnh "trôi nổi" trừ khi một số luồng muốn vận hành nó. Xem xét trạng thái "thả nổi" là trạng thái tự nhiên - bất cứ khi nào một luồng muốn thao tác ngữ cảnh, hãy gắn kết sử dụng của nó với cuCtxPushCurrent()/cuCtxPopCurrent().

+0

hiện PopCurrent() có thực sự xóa nó khỏi "hàng đợi" chứa ngữ cảnh để không truy cập được vào các chủ đề khác không? Tôi có thể bật ngữ cảnh hiện tại từ chuỗi máy chủ và chỉ chuyển ngữ cảnh đó đến chuỗi công việc và "đẩy" nó vào ngăn xếp ngữ cảnh không? Âm thanh như bối cảnh sẽ phải ở trong một "hàng đợi đồng thời" và có một mutex, phải không? – Derek

+0

Khi một ngữ cảnh được tạo, nó được đẩy lên một ngăn xếp ngữ cảnh hiện tại. Popping bối cảnh làm cho nó trở thành không có sẵn cho bất kỳ chủ đề CPU cho đến khi nó đã được đẩy lên một ngăn xếp ngữ cảnh hiện tại với cuCtxPushCurrent(). Vì vậy, quy trình làm việc bạn mô tả chính xác là những gì API được thiết kế để bật. Các ngữ cảnh là an toàn chỉ, vì vậy chỉ đồng bộ hóa chủ đề bổ sung mà bạn cần thực hiện sẽ là thực thi một thứ tự hoặc ngữ nghĩa khác khi ứng dụng của bạn cần. – ArchaeaSoftware

+0

Tôi đang sử dụng 'cuCtxSetCurrent (CUcontext ctx)' cho mỗi chuỗi. Điều này cần một cái gì đó để cho nó đi, tương tự như pop sau khi đẩy, khi thread không cần bối cảnh nữa? –

Các vấn đề liên quan