CUDA Thrust pengurangan_by_key menggunakan lebih sedikit memori

Saya mencoba mengurangi memori yang diperlukan untuk menghitung pengurangan_by_key untuk kasus penggunaan saya. Saya memiliki jumlah kunci unik yang relatif kecil (sekitar 100-150) dibandingkan dengan jumlah nilai (sekitar 16 juta). contoh kunci menunjukkan bahwa vektor_perangkat yang dialokasikan untuk memuat hasilnya adalah dari ukurannya sama dengan inputnya. Apakah hal ini selalu perlu dilakukan? Apakah mungkin untuk mengalokasikan memori sebanyak yang diperlukan untuk menampung keluaran yang benar?


person aatish    schedule 26.08.2015    source sumber
comment
Ukuran vektor keluaran Anda harus dibatasi agar sama atau lebih besar dari jumlah kunci maksimum. Sudahkah Anda mencobanya? Jangan lupa bahwa rangkaian kunci harus berdekatan seperti kunci. Misalnya, urutan berikut: 0 1 0 1 mewakili empat kunci unik. Dalam kasus umum, jika Anda tidak mengetahui berapa banyak kunci yang ada, maka kasus terburuknya adalah vektor keluaran berukuran sama dengan vektor masukan.   -  person Robert Crovella    schedule 26.08.2015


Jawaban (1)


Besar kecilnya pengurangan keluaran bergantung pada data masukan, dan nilai ini biasanya tidak diketahui sebelum pengurangan. Namun, tergantung masalah Anda, terkadang Anda mengetahui ukuran ini.

Implementasi yang masuk akal hanya memerlukan setidaknya jumlah rentang kunci elemen untuk keluarannya. Dan thrust::reduce_by_key tampaknya termasuk dalam daftar ini.


Contoh:

Tidak diurutkan (kasus umum)

Ukuran keluaran sulit diprediksi

keys        2   2   2   3   3   2   1
values      1   1   1   1   1   1   1
           |----------|------|----|---|
                    4 spans

reduced         3       2       1   1

Diurutkan (kasus terbaik)

Ukuran keluaran sama dengan jumlah kunci unik

keys        1   2   2   2   2   3   3
values      1   1   1   1   1   1   1
           |--|---------------|------|
                    3 spans

reduced     1           4         2

Disisipkan, tidak ada kunci yang berdekatan yang diulang (kasus terburuk)

Ukuran keluaran sama dengan ukuran masukan

keys        1   2   3   1   2   3   1
values      1   1   1   1   1   1   1
           |--|---|---|---|---|---|--|
                    7 spans

reduced     1   1   1   1   1   1   1

Hal lainnya adalah jika Anda tidak memerlukan kunci untuk dijadikan keluaran, Anda dapat membuangnya dengan thrust::discard_iterator dan menghemat ruang ekstra, seperti yang dijelaskan di sini.

person Ivan Aksamentov - Drop    schedule 26.08.2015