ฉันกำลังพยายามลดหน่วยความจำที่จำเป็นในการคำนวณลดขนาดโดย_คีย์สำหรับกรณีการใช้งานของฉัน ฉันมีคีย์ที่ไม่ซ้ำกันจำนวนค่อนข้างน้อย (ประมาณ 100-150) เมื่อเทียบกับจำนวนค่า (ประมาณ 16 ล้าน) การลดลงตามคีย์ ตัวอย่าง แสดงให้เห็นว่า device_vectors ที่จัดสรรให้มีผลลัพธ์เป็นของ ขนาดเดียวกับอินพุต จำเป็นต้องทำเช่นนั้นเสมอหรือไม่? เป็นไปได้ไหมที่จะจัดสรรหน่วยความจำให้มากที่สุดเท่าที่จำเป็นเพื่อให้มีเอาต์พุตที่ถูกต้องเท่านั้น
CUDA Thrust ลด_by_key โดยใช้หน่วยความจำน้อยลง
คำตอบ (1)
ขนาดเอาต์พุตของการลดขึ้นอยู่กับข้อมูลอินพุต และโดยทั่วไปจะไม่ทราบค่านี้ก่อนการลด อย่างไรก็ตาม บางครั้งคุณก็รู้ขนาดนี้ ขึ้นอยู่กับปัญหาของคุณ
การใช้งานที่สมเหตุสมผลจะต้องมีองค์ประกอบ จำนวนช่วงคีย์ เป็นอย่างน้อยสำหรับเอาต์พุต และดูเหมือนว่า thrust::reduce_by_key
จะรวมอยู่ในรายการนี้
ตัวอย่าง:
ไม่เรียงลำดับ (กรณีทั่วไป)
ขนาดผลงานคาดเดาได้ยาก
keys 2 2 2 3 3 2 1
values 1 1 1 1 1 1 1
|----------|------|----|---|
4 spans
reduced 3 2 1 1
เรียงลำดับแล้ว (กรณีที่ดีที่สุด)
ขนาดเอาต์พุตเท่ากับจำนวนคีย์เฉพาะ
keys 1 2 2 2 2 3 3
values 1 1 1 1 1 1 1
|--|---------------|------|
3 spans
reduced 1 4 2
สลับกัน ไม่มีคีย์ที่อยู่ติดกันซ้ำ (กรณีที่แย่ที่สุด)
ขนาดเอาต์พุตเท่ากับขนาดอินพุต
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
อีกประการหนึ่งคือ หากคุณไม่ต้องการคีย์ที่จะส่งออก คุณสามารถละทิ้งคีย์เหล่านั้นด้วย thrust::discard_iterator
และประหยัดพื้นที่เพิ่มเติมตามที่อธิบายไว้ ที่นี่
person
Ivan Aksamentov - Drop
schedule
26.08.2015
0 1 0 1
แสดงถึงคีย์ที่ไม่ซ้ำกัน สี่ ในกรณีทั่วไป เมื่อคุณไม่ทราบว่ามีคีย์อยู่กี่คีย์ กรณีที่แย่ที่สุดคือเวกเตอร์เอาต์พุตมีขนาดเท่ากับเวกเตอร์อินพุต - person Robert Crovella   schedule 26.08.2015