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?
CUDA Thrust pengurangan_by_key menggunakan lebih sedikit memori
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
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