Templat tipe data ComputeLibrary

Di ARM ComputeLibrary, kita dapat memiliki berbagai jenis objek Tensor. Saat memilih tipe Tensor, kita meneruskan tipe tersebut ke initalis pengalokasi Tensor, seperti float32 di sini:

my_tensor.allocator()->init(armcl::TensorInfo(shape_my_tensor, 1, armcl::DataType::F32));

Pengenalan yang lebih baik tentang topik alokasi tensor dapat ditemukan di sini.

Ada beberapa jenis ARMCL yang dapat dipilih (lihat di sini untuk daftarnya). Perhatikan bahwa tipe ComputeLibrary bukanlah tipe primitif, meskipun seseorang dapat dengan mudah menyalin data tipe primitif ke tipe tersebut.

Namun, ketika menulis kode C++ yang ditemplat, di mana seseorang dapat memiliki fungsi yang ditentukan untuk tipe arbitrer, "pilihan tipe yang bukan tipe" ini menciptakan masalah desain.

Katakanlah saya ingin menulis fungsi yang mengambil data tipe primitif seperti int, float, atau double. Dalam fungsi templat, tipe ini akan disebut sebagai tipe T (atau apa pun).

Sekarang katakanlah saya ingin menyalin data ini ke Tensor ARMCL dalam lingkup fungsi templat. Tensor ini perlu diinisialisasi ke tipe data yang benar. Kita memerlukan tipe data ini agar cocok dengan tipe T, jadi jika T adalah float, maka ARMCL kita harus bertipe F32, jika T adalah int maka tensor kita harus S8, dan seterusnya.

Kita memerlukan semacam pemetaan antara tipe primitif, dan tipe ARMCL.

Apakah pendekatan yang "bagus" dan masuk akal adalah memiliki fungsi utilitas yang mengambil tipe T dan mungkin menggunakan pernyataan switch, dan sesuatu seperti std::is_same. Pernyataan switch kemudian akan mengembalikan objek DataType ARM Compute Library yang sesuai untuk T? Atau adakah pendekatan lain yang mungkin lebih elegan?

Saya telah mencari-cari dokumen untuk melihat apakah ini benar sudah ditangani, namun belum berhasil. Jika tidak ditangani, mungkin ini bukan pertanyaan spesifik untuk ARMCL, dan cakupannya lebih luas.


person Prunus Persica    schedule 29.12.2018    source sumber
comment
T dan mungkin menggunakan pernyataan switch, dan sesuatu seperti std::is_same. Tidak, pendekatan itu akan gagal, karena switch() dievaluasi saat runtime. Pendekatan yang biasa untuk hal-hal seperti itu adalah SFINAE dan spesialisasi, yang dapat dievaluasi di waktu kompilasi.   -  person πάντα ῥεῖ    schedule 29.12.2018
comment
Mata saya terbuka ke dunia yang lebih besar, belum pernah mendengar tentang SFINAE sebelumnya. akan menyelidiki. terima kasih atas penjelasan mengapa pendekatan saya mungkin tidak berhasil   -  person Prunus Persica    schedule 29.12.2018


Jawaban (1)


Ya... tipe armcl, jika saya mengerti dengan benar, adalah nilai enum.

Jadi pendekatan yang mungkin adalah struct templat, dengan spesialisasi penuh, dengan value di dalamnya.

Maksudku... sesuatu seperti

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 

Anda dapat menggunakannya sebagai berikut

template <typename T>
void foo ()
 { bar(typeMap<T>::value); }
person max66    schedule 29.12.2018
comment
inilah solusi yang saya cari, terima kasih! Struct typeMap secara inheren dapat digunakan kembali, dan mudah untuk ditambahkan. Pola yang bagus - person Prunus Persica; 29.12.2018