2011-12-05 40 views
5

Tôi đang sử dụng CUDA/Lực đẩy/CUDPP. Theo tôi hiểu, trong Luồng luồng, một số mục nhất định trong một mảng được đánh dấu là không hợp lệ và sau đó "bị xóa".Nén dòng CUDA: hiểu khái niệm

Bây giờ, "xóa" thực sự có ý nghĩa gì ở đây? Giả sử các mảng ban đầu A và có chiều dài 6. Nếu 2 yếu tố này là không hợp lệ (bằng bất cứ điều kiện chúng tôi có thể cung cấp) sau đó

  1. Có hệ thống tạo ra một mới mảng có kích thước 4 trong GPU-bộ nhớ để lưu trữ các yếu tố hợp lệ để có được kết quả cuối cùng?

  2. HOẶC có thực tế loại bỏ các thành phần không hợp lệ khỏi bộ nhớ và thu hẹp mảng gốc A xuống đến kích thước 4 chỉ giữ nguyên tố hợp lệ không?

Đối với cả hai trường hợp, điều đó không có nghĩa là phân bổ bộ nhớ động đang diễn ra dưới mui xe? Nhưng tôi đã nghe nói rằng phân bổ bộ nhớ động là không thể trong thế giới CUDA.

+2

Có một khả năng khác, đó là kích thước của cấp phát bộ nhớ không thay đổi và 4 thành phần đầu tiên hợp lệ, 2 phần tử cuối cùng không được xác định. Nhưng thực sự câu hỏi này là tất cả về các vấn đề thực hiện, và ai nói rằng CUDPP hoặc lực đẩy làm việc như nhau? – talonmies

+0

ArrayFire là một lựa chọn tốt hơn/dễ dàng hơn so với Thrust và cũng miễn phí, ít nhất là cho việc sử dụng GPU đơn lẻ. http://accelereyes.com/arrayfire – arrayfire

Trả lời

4

Đầu tiên, phân bổ bộ nhớ động có thể thực hiện trong CUDA trên các thiết bị có khả năng tính toán 2.0 và các thiết bị cao hơn. Thư viện runtime CUDA hỗ trợ malloc/free và new/delete trong các hàm __device__. Nhưng đó không phải là vấn đề thực sự.

Thông thường một mảng đầu ra đủ lớn được cung cấp (được phân bổ trước, thường có cùng kích thước với mảng đầu vào) và đầu ra được ghi vào nó. Không yêu cầu phân bổ động nhưng có khả năng lưu trữ chất thải. Đây là những gì CUDPP và lực đẩy làm. Một thay thế sẽ là để thực hiện đếm các phần tử hợp lệ đầu tiên, sau đó cấp phát bộ nhớ GPU đầu ra động bằng cách sử dụng cudaMalloc được gọi từ CPU chủ.

+1

Đó không phải là những gì Lực đẩy làm :) Các thuật toán nén trong Lực đẩy (ví dụ: '' 'lực đẩy :: copy_if''') thường yêu cầu một bộ đệm đầu ra. –

+0

Cảm ơn. Đã chỉnh sửa câu trả lời của tôi. Điều gì sẽ xảy ra nếu trình vòng lặp kết quả trỏ đến một phân bổ không đủ lớn? Có kích thước tự động nào không? – harrism

+0

Không; nếu trình vòng lặp trỏ đến một bộ đệm không đủ, hành vi này không được xác định (nghĩa là nó bị treo). –

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