2012-09-17 15 views
7

Làm thế nào tôi có thể loại bỏ hiệu quả các giá trị bằng không từ một mảng song song bằng cách sử dụng CUDA. Thông tin về số lượng giá trị bằng không có sẵn trước, nên đơn giản hóa tác vụ này.Làm thế nào để loại bỏ giá trị bằng không từ một mảng song song

Điều quan trọng là các số vẫn được đặt hàng như trong mảng nguồn, khi được sao chép vào mảng kết quả.


Ví dụ:

Mảng sẽ ví dụ chứa các giá trị sau: [0, 0, 19, 7, 0, 3, 5, 0, 0, 1] với thông tin bổ sung 5 giá trị là 0. Kết quả cuối cùng mong muốn sau đó sẽ là một mảng khác có chứa: [19, 7, 3, 5, 1] ​​

+0

chắc chắn bạn muốn loại bỏ số không ? nếu bạn loại bỏ các số không, bạn sẽ nhận được một mảng chỉ số không?! –

+0

yeah đã sửa lỗi đó. Tôi đang tìm một cách hiệu quả để loại bỏ các giá trị số không từ mảng nguồn. –

+0

Tôi muốn thay thế cho vòng lặp thông qua các chủ đề cuda, effectivly parallelizing việc loại bỏ. –

Trả lời

7

Để loại bỏ một số thành phần khỏi mảng bạn có thể sử dụng Thrust Library's compaction operations. Với một vị is_not_zero, mà trả về false cho zero giá trị, và true cho người khác, bạn có thể viết các hoạt động như thế này

thrust::copy_if(in_array, in_array + size, out_array, is_not_zero); 

mảng đầu ra sẽ chỉ bao gồm các giá trị đó là không, bởi vì vị chỉ nên .

Bạn cũng có thể sử dụng "remove_if" chức năng với một vị ngược lại mà trở true cho số không, và false cho người khác ..

thrust::remove_if(in_array, in_array + size, is_zero); 

tôi đề nghị bạn tham gia một cái nhìn vào các ví dụ nén của thư viện Thrust, hoặc chung khái niệm đầm nén.

http://code.google.com/p/thrust/source/browse/examples/stream_compaction.cu

+0

Tôi có thể không sử dụng được lực đẩy trong dự án đó, nhưng nếu tôi có thể sử dụng đề xuất của bạn. Thx để được giúp đỡ của bạn. –

+2

Có các thư viện tương tự và chỉ triển khai hạt nhân để nén chặt. Bạn có thể không cần sử dụng Thrust cho chức năng này, tôi khuyên bạn nên sử dụng nó. Chỉ cần nhìn vào các ví dụ về SDK CUDA. – phoad

0

gì về một biến thể của lẻ thậm chí kết hợp sắp xếp, hoặc trên thực tế bất kỳ thuật toán phân loại, nơi trật tự được xác định bởi a < b === (a != 0 && b == 0)?

+1

Đây là loại sắp xếp một bit, vì vậy, một loại có thể làm tốt hơn nhiều so với loại hợp nhất chung. –

+0

@JaredHoberock: Vâng, tôi đã không thấy bạn đề xuất phương pháp làm việc khác hoạt động tốt hơn rất nhiều. – wilx

+0

Một vấn đề khác với cách tiếp cận sắp xếp là nó sẽ phá hủy đầu vào, mà @ diver_182 muốn giữ lại trong mảng đầu vào.'remove_copy_if' sẽ hoạt động tốt hơn cho trường hợp này dưới dạng ghi chú @phoad ở trên. –