2012-09-22 27 views

Trả lời

7

cudaFree() không đồng bộ. Một cuộc gọi đồng bộ được gọi nội bộ khi một cudaFree() được gọi từ Host.

Tôi không hiểu nhu cầu giải phóng bộ nhớ của bạn một cách không đồng bộ.

+4

Hãy tưởng tượng một đường dẫn khởi chạy hạt nhân phụ thuộc, một số yêu cầu phân bổ tạm thời. Nó sẽ được tốt đẹp nếu chủ nhà có thể chèn không đồng bộ 'cudaMalloc's và' cudaFree 'vào một đường ống như vậy. –

+1

Trong trường hợp có vấn đề lớn, bạn có thể sử dụng bộ nhớ giải phóng không đồng bộ để nhường chỗ cho các luồng khác. Nói cách khác, bạn sẽ có thể xử lý các vấn đề lớn với nhiều luồng trong một GPU duy nhất. –

5

cudaFree() là đồng bộ. Nếu bạn thực sự muốn nó không đồng bộ, bạn có thể tạo chuỗi CPU của riêng bạn, cung cấp cho nó hàng đợi công nhân và đăng ký yêu cầu cudaFree từ chuỗi chính của bạn.

Điều đó nói rằng, các giải phóng không đồng bộ có vẻ như một yêu cầu kỳ quặc. Có lẽ bạn có thể giải thích lý do tại sao bạn muốn nó không đồng bộ. Bạn có muốn tự do xảy ra ngay sau khi sự kiện CUDA được kích hoạt không?

+0

Việc giải phóng các luồng CUDA và các sự kiện CUDA đã được thực hiện không đồng bộ kể từ khi chúng được giới thiệu, chính xác vì một số ứng dụng có các chương trình con sử dụng chúng, và có một mong muốn cho các chương trình con đó không làm cho đường dẫn mã của người gọi trở nên đồng bộ. Giải phóng không đồng bộ là một yêu cầu hoàn toàn hợp lý, vì lý do tương tự. CUDA có thể đánh dấu bộ nhớ không đồng bộ một cách không đồng bộ và nếu nó phải đồng bộ hóa với GPU để chỉnh sửa các bảng trang, hãy thực hiện các thao tác đó một cách lười biếng (đợi cho đến khi phần tử kế tiếp). – ArchaeaSoftware

+0

@Archaea: điều đó thật thú vị. Tôi nghĩ rằng các poster cũng quan tâm đến giải phóng bộ nhớ, không chỉ các đối tượng cudaEvent_t. Làm cách nào để liên kết cudaFree với sự kiện hoặc luồng? –

+1

Ông Fooz, câu trả lời của bạn là chính xác (tức là AFAIK cudaFree() là đồng bộ), tôi chỉ đơn thuần chỉ ra rằng nó là hợp lý để muốn nó không đồng bộ. – ArchaeaSoftware

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