เทมเพลตประเภทข้อมูล ComputeLibrary

ใน 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 และมีขอบเขตที่กว้างกว่า


person Prunus Persica    schedule 29.12.2018    source แหล่งที่มา
comment
T และอาจใช้คำสั่ง switch และบางอย่างเช่น std::is_same ไม่ วิธีการนั้นจะล้มเหลว เนื่องจาก switch() ได้รับการประเมินที่รันไทม์ วิธีการปกติสำหรับสิ่งเหล่านี้คือ SFINAE และความเชี่ยวชาญพิเศษ ซึ่งสามารถประเมินได้ที่ รวบรวมเวลา   -  person πάντα ῥεῖ    schedule 29.12.2018
comment
ดวงตาของฉันได้เปิดกว้างสู่โลกที่ใหญ่กว่า โดยที่ไม่เคยได้ยินเกี่ยวกับ SFINAE มาก่อน จะสอบสวน ขอบคุณสำหรับคำอธิบายว่าเหตุใดแนวทางของฉันจึงไม่ทำงาน   -  person Prunus Persica    schedule 29.12.2018


คำตอบ (1)


เอ่อ... ประเภท armcl คือถ้าฉันเข้าใจถูกต้อง ค่าแจงนับ

ดังนั้นแนวทางที่เป็นไปได้คือโครงสร้างเทมเพลตที่มีความเชี่ยวชาญเฉพาะด้านโดยมี value อยู่ในนั้น

ฉันหมายถึง... บางอย่างเช่น

template <typename>
struct typeMap;

template <>
struct typeMap<int>
 { static constexpr auto value = armcl::DataType::S8; };

template <>
struct typeMap<float>
 { static constexpr auto value = armcl::DataType::F32; };

// other cases 

คุณสามารถใช้มันได้ดังนี้

template <typename T>
void foo ()
 { bar(typeMap<T>::value); }
person max66    schedule 29.12.2018
comment
นี่เป็นวิธีแก้ปัญหาที่ฉันกำลังมองหา ขอบคุณ! โครงสร้าง typeMap สามารถนำมาใช้ซ้ำได้ และง่ายต่อการเพิ่ม ลายดี - person Prunus Persica; 29.12.2018