2012-06-22 32 views
6

Tôi có một ứng dụng giải quyết một hệ phương trình trong CUDA, tôi biết chắc chắn rằng mỗi luồng có thể tìm thấy tối đa 4 giải pháp, nhưng làm thế nào tôi có thể sao chép sau đó quay lại máy chủ?Cách thu thập dữ liệu hiệu quả từ các chủ đề trong CUDA?

Tôi đang chuyển một mảng lớn với đủ không gian cho tất cả các chuỗi lưu trữ 4 giải pháp (4 đôi cho mỗi giải pháp) và một giải pháp khác cho mỗi giải pháp, tuy nhiên đó là giải pháp ngây thơ và là nút cổ chai hiện tại của hạt nhân của tôi.

Tôi thực sự muốn tối ưu hóa điều này. Vấn đề chính là nối một số lượng các giải pháp cho mỗi luồng trong một mảng đơn lẻ.

+0

Sẽ dễ dàng hơn nhiều nếu tôi biết thêm về chương trình của bạn. với kiến ​​thức của tôi (Đã khoảng một năm kể từ khi tôi lộn xộn với cuda vì vậy tôi có thể sai), memcopies là cách duy nhất để lấy thông tin và chúng chậm. Và phiên bản của cuda trên thẻ gì? – 8bitwide

+0

Tôi có sẵn CUDA 4.0 và 4.2. – RSFalcon7

+0

Mã quá lớn để đặt ở đây. Tôi đồng ý rằng cudaMemCpy đó là cách duy nhất để có được kết quả, nhưng tôi có thể tránh sao chép rác. – RSFalcon7

Trả lời

5

Chức năng bạn đang tìm kiếm được gọi là nén chặt luồng.

Bạn có thể cần cung cấp một mảng chứa 4 giải pháp cho mỗi luồng vì cố gắng lưu trữ trực tiếp kết quả dưới dạng gọn nhẹ có khả năng tạo ra quá nhiều phụ thuộc giữa các chuỗi mà hiệu suất đạt được ít dữ liệu trở lại máy chủ bị mất bởi thời gian thực hiện hạt nhân dài hơn. Ngoại lệ cho điều này là nếu gần như tất cả các chủ đề không tìm thấy giải pháp nào. Trong trường hợp đó, bạn có thể sử dụng một phép toán nguyên tử để duy trì một chỉ mục thành một mảng. Vì vậy, đối với mỗi giải pháp được tìm thấy, bạn sẽ lưu trữ nó trong một mảng tại một chỉ mục và sau đó sử dụng một hoạt động nguyên tử để tăng chỉ mục. Tôi nghĩ rằng sẽ an toàn khi sử dụng atomicAdd() cho việc này. Trước khi lưu trữ một kết quả, luồng sẽ sử dụng atomicAdd() để tăng chỉ mục một. atomicAdd() trả về giá trị cũ và luồng có thể lưu trữ kết quả bằng cách sử dụng giá trị cũ làm chỉ mục.

Tuy nhiên, với tình huống phổ biến hơn, nơi có số lượng kết quả hợp lý, giải pháp tốt nhất là thực hiện thao tác nén như một bước riêng biệt. Một cách để làm điều này là với thrust::copy_if. Xem this question để biết thêm thông tin cơ bản.

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