ใน ARM ComputeLibrary เราสามารถมีออบเจ็กต์ Tensor ประเภทต่างๆ ได้ เมื่อเลือกประเภทของ Tensors เราจะส่งประเภทไปยังตัวเริ่มต้นของการจัดสรรของ Tensor เช่น float32 ที่นี่:
my_tensor.allocator()->init(armcl::TensorInfo(shape_my_tensor, 1, armcl::DataType::F32));
สามารถดูข้อมูลเบื้องต้นที่ดีกว่าเกี่ยวกับหัวข้อการจัดสรรเทนเซอร์ได้ ที่นี่
มี ARMCL หลายประเภทให้เลือก (ดูรายการที่นี่) โปรดสังเกตว่าประเภท ComputeLibrary ไม่ใช่ประเภทดั้งเดิม แม้ว่าจะสามารถคัดลอกข้อมูลที่พิมพ์ดั้งเดิมไปยังประเภทเหล่านั้นได้อย่างง่ายดาย
อย่างไรก็ตาม เมื่อเขียนโค้ด C++ ที่เป็นเทมเพลต ซึ่งสามารถกำหนดฟังก์ชันสำหรับประเภทต่างๆ ได้ "ตัวเลือกประเภทที่ไม่ใช่ประเภท" นี้จะสร้างปัญหาการออกแบบ
สมมติว่าฉันต้องการเขียนฟังก์ชันที่รับข้อมูลประเภทพื้นฐาน เช่น int
, float
หรือ double
ในฟังก์ชันเทมเพลต ประเภทนี้จะถูกเรียกว่าเป็นประเภท T
(หรืออะไรก็ตาม)
ตอนนี้บอกว่าฉันต้องการคัดลอกข้อมูลนี้ไปยัง ARMCL Tensor ภายในขอบเขตของฟังก์ชันเทมเพลต เทนเซอร์นี้จำเป็นต้องเริ่มต้นให้เป็นประเภทข้อมูลที่ถูกต้อง เราต้องการให้ประเภทข้อมูลนี้เหมาะสมกับประเภท T
ดังนั้นหาก T
เป็น float
ดังนั้น ARMCL ของเราก็ควรเป็นประเภท F32
หาก T
เป็น int
ดังนั้นเทนเซอร์ของเราก็ควรเป็น S8
เป็นต้น
เราต้องการการแมประหว่างประเภทดั้งเดิมและประเภท ARMCL
แนวทางที่ "ดี" และสมเหตุสมผลน่าจะเป็นการมีฟังก์ชันยูทิลิตี้ที่ใช้ประเภท T
และอาจใช้คำสั่ง switch และบางอย่างเช่น std::is_same
คำสั่ง switch จะส่งกลับวัตถุ ARM Compute Library DataType ที่เหมาะสมสำหรับ T
? หรือมีแนวทางอื่นที่อาจดูหรูหรากว่านี้ไหม?
ฉันได้ดู เอกสาร เพื่อดูว่าเป็นเช่นนี้หรือไม่ จัดการไปแล้ว แต่ยังไร้ประโยชน์ หากไม่ได้รับการจัดการ บางทีนี่อาจไม่ใช่คำถามเฉพาะสำหรับ ARMCL และมีขอบเขตที่กว้างกว่า
std::is_same
ไม่ วิธีการนั้นจะล้มเหลว เนื่องจากswitch()
ได้รับการประเมินที่รันไทม์ วิธีการปกติสำหรับสิ่งเหล่านี้คือ SFINAE และความเชี่ยวชาญพิเศษ ซึ่งสามารถประเมินได้ที่ รวบรวมเวลา - person πάντα ῥεῖ   schedule 29.12.2018