CUDA Thrust ลด_by_key โดยใช้หน่วยความจำน้อยลง

ฉันกำลังพยายามลดหน่วยความจำที่จำเป็นในการคำนวณลดขนาดโดย_คีย์สำหรับกรณีการใช้งานของฉัน ฉันมีคีย์ที่ไม่ซ้ำกันจำนวนค่อนข้างน้อย (ประมาณ 100-150) เมื่อเทียบกับจำนวนค่า (ประมาณ 16 ล้าน) การลดลงตามคีย์ ตัวอย่าง แสดงให้เห็นว่า device_vectors ที่จัดสรรให้มีผลลัพธ์เป็นของ ขนาดเดียวกับอินพุต จำเป็นต้องทำเช่นนั้นเสมอหรือไม่? เป็นไปได้ไหมที่จะจัดสรรหน่วยความจำให้มากที่สุดเท่าที่จำเป็นเพื่อให้มีเอาต์พุตที่ถูกต้องเท่านั้น


person aatish    schedule 26.08.2015    source แหล่งที่มา
comment
ควรจำกัดขนาดของเวกเตอร์เอาต์พุตให้เท่ากับหรือมากกว่าจำนวนคีย์สูงสุดได้ คุณลองแล้วหรือยัง? อย่าลืมว่าลำดับคีย์จะต้อง ติดกัน เช่นเดียวกับคีย์ ตัวอย่างเช่น ลำดับต่อไปนี้: 0 1 0 1 แสดงถึงคีย์ที่ไม่ซ้ำกัน สี่ ในกรณีทั่วไป เมื่อคุณไม่ทราบว่ามีคีย์อยู่กี่คีย์ กรณีที่แย่ที่สุดคือเวกเตอร์เอาต์พุตมีขนาดเท่ากับเวกเตอร์อินพุต   -  person Robert Crovella    schedule 26.08.2015


คำตอบ (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