Semua kata-kata ini jauh lebih erat kaitannya dengan pengembangan ponsel daripada yang terlihat pada pandangan pertama: akselerator heksagonal sudah membantu melatih jaringan saraf pada perangkat seluler; aljabar dan matan berguna untuk mendapatkan pekerjaan di Apple; dan pemrograman GPU tidak hanya memungkinkan Anda untuk mempercepat aplikasi, tetapi juga mengajarkan Anda untuk melihat esensi dari berbagai hal.
Bagaimanapun, demikian kata kepala pengembangan ponsel Prisma
Andrey Volodin . Dan juga tentang bagaimana ide mengalir ke pengembangan mobile dari GameDev, bagaimana perbedaan paradigma, mengapa Android tidak memiliki blur asli - dan lebih banyak lagi, rilis produktif AppsCast telah dirilis. Di bawah potongan, kami akan berbicara tentang laporan Andrey di
AppsConf tanpa spoiler.
AppsCast adalah podcast konferensi pengembang aplikasi AppsConf . Setiap masalah adalah tamu baru. Setiap tamu adalah pembicara dalam konferensi dengan siapa kami mendiskusikan laporannya dan berbicara tentang topik yang terkait dengannya. Podcast dipandu oleh anggota komite program AppsConf, Alexei Kudryavtsev dan Daniil Popov.Alexey Kudryavtsev: Halo semuanya! Andrey, tolong beri tahu kami tentang pengalaman Anda.
Andrey Volodin : Kami di Prisma mengembangkan produk yang terutama terkait dengan pemrosesan foto dan video. Aplikasi andalan kami adalah Prisma. Sekarang kami membuat aplikasi Lensa lain untuk fungsi mirip Facetune.
Saya memimpin pengembangan ponsel, tapi saya pelatih game. Saya memiliki seluruh bagian inti, saya menulis saluran pipa GPU untuk semua aplikasi ini. Saya mengembangkan kerangka kerja inti sehingga algoritme dan neuron yang dikembangkan tim R&D berjalan di perangkat seluler, bekerja secara waktu nyata. Singkatnya, untuk membunuh komputasi server dan semua itu.
Alexei Kudryavtsev: Ini tidak terdengar seperti pengembangan iOS biasa.
Andrey Volodin: Ya, saya memiliki spesifik seperti itu - saya menulis di Swift setiap hari, tetapi pada saat yang sama sangat jauh dari apa yang dianggap pengembangan iOS.
Daniil Popov: Anda menyebutkan pipa-pipa GPU, ada apa?
Andrey Volodin: Ketika Anda membuat editor foto, Anda juga perlu mengkonfigurasi arsitektur dan menguraikan logika, karena aplikasi memiliki alat yang berbeda. Misalnya, di Lensa ada alat bokeh yang mengaburkan latar belakang menggunakan neuron, ada alat retouching yang membuat seseorang lebih cantik. Semua ini perlu bekerja lebih efisien pada GPU. Selain itu, disarankan untuk tidak mentransfer data antara prosesor dan kartu video setiap kali, tetapi untuk pra-membangun satu set operasi, menjalankannya dalam sekali jalan, dan menunjukkan hasil akhir kepada pengguna.
Saluran pipa GPU adalah "gumpalan kecil" dari mana instruksi untuk kartu video dirakit. Kemudian dia melakukan semua ini dengan sangat cepat dan efisien, dan Anda mengambil hasilnya pada suatu waktu, dan tidak setelah setiap instrumen. Saya memastikan bahwa jalur pipa GPU kami secepat mungkin, efisien dan pada prinsipnya ada.
Alexey Kudryavtsev: Katakan, bagaimana Anda sampai pada ini? Pengembang iOS biasa mulai dengan memukau dan cetakan, kemudian pergi ke suatu tempat oleh API dan senang. Bagaimana mungkin Anda melakukan sesuatu yang sama sekali berbeda?
Andrey Volodin: Sebagian besar, ini adalah kebetulan. Sebelum saya mendapat pekerjaan, saya membuat game untuk iOS. Itu selalu menarik bagi saya, tetapi saya mengerti bahwa di Rusia tidak ada tempat khusus untuk berkembang ke arah ini. Kebetulan kami bertemu satu sama lain dengan Prisma. Mereka membutuhkan pengembang iOS yang dapat menulis di Swift dan pada saat yang sama mengetahui GPU, khususnya, Metal, yang baru saja keluar, dan saya pasti cocok dengan deskripsi itu.
Saya menanggapi lowongan itu, kami memiliki sinergi, dan untuk tahun ketiga sekarang saya sudah semakin dalam dalam hal ini. Jika ada yang tidak beres sekarang, maka saya sudah memiliki semua Viper dan MVVM ini - saya bahkan tidak tahu bagaimana itu mendekripsi - saya harus mengerti dari awal.
Apa yang dilakukan Insinyur GPU
Daniil Popov: Profil AppsConf Anda mengatakan Engineer GPU. Apa yang dilakukan GPU Engineer hampir sepanjang hari selain minum kopi?
Andrey Volodin: Di sini perlu disebutkan bagaimana prosesor secara fundamental berbeda dari GPU. Prosesor melakukan operasi seolah-olah berurutan. Bahkan multithreading yang kita miliki sering palsu: prosesor berhenti dan beralih untuk membuat tugas-tugas kecil yang berbeda, dan melakukannya dalam beberapa irisan. GPU bekerja dengan cara sebaliknya. Ada n prosesor yang benar-benar bekerja secara paralel, dan ada paralelisme antara proses dan paralelisme dalam GPU.
Pekerjaan utama saya, selain hal-hal biasa seperti mengoptimalkan pekerjaan dengan memori dan mengatur kembali kode, adalah bahwa saya port algoritma yang ditulis untuk CPU ke kartu video sehingga mereka sejajar. Ini tidak selalu merupakan tugas sepele, karena ada algoritma yang sangat efisien yang sepenuhnya terkait dengan pelaksanaan instruksi secara berurutan. Pekerjaan saya adalah menghasilkan, misalnya, perkiraan untuk suatu algoritma yang mungkin, tidak persis sama, tetapi secara visual hasilnya tidak dapat dibedakan. Sehingga kita bisa mendapatkan akselerasi 100 kali, sedikit mengorbankan kualitas.
Saya juga porting neuron. Ngomong-ngomong, kami akan segera membuat rilis Open Source utama. Bahkan sebelum Core ML muncul, kami memiliki mitra kami sendiri, dan kami akhirnya matang untuk meletakkannya di Open Source. Paradigmanya sedikit berbeda dari Core ML. Saya, termasuk, sedang mengembangkan bagian intinya.
Secara umum, saya melakukan segalanya di sekitar algoritma dan komputasi Vision Komputer.
Alexey Kudryavtsev: Pengumuman yang menarik.
Andrey Volodin: Ini bukan rahasia, kami tidak akan mengumumkannya dengan semacam keriuhan, hanya saja mungkin untuk melihat contoh kerangka kerja yang digunakan di dalam Prisma.
Mengapa mengoptimalkan untuk GPU
Alexei Kudryavtsev: Katakan, tolong, mengapa kita mengoptimalkan algoritma untuk GPU secara umum? Tampaknya sudah cukup untuk menambahkan core ke prosesor atau mengoptimalkan algoritma. Kenapa tepatnya GPU?
Andrey Volodin: Bekerja pada GPU dapat mempercepat algoritme. Misalnya, kami memiliki neuron yang akan berjalan pada prosesor pusat Samsung S10 selama 30 detik, dan pada GPU akan ada 1 frame, mis. 1/60 detik. Ini sangat mengubah pengalaman pengguna. Tidak ada layar pemuatan abadi, Anda dapat melihat hasil dari algoritma yang bekerja pada aliran video, atau memutar slider dan melihat efeknya di sana.
Sama sekali tidak terlalu keren untuk menulis di CPU, jadi kami menulis ulang semua yang ada di GPU. Menggunakan GPU memiliki tujuan transparan - mempercepat segalanya.
Alexei Kudryavtsev: GPU menangani operasi yang mirip satu sama lain secara paralel. Apakah Anda hanya memiliki operasi seperti itu dan karena itu berhasil mencapai kesuksesan seperti itu?
Andrey Volodin: Ya, kesulitan utama bukan pada kode, tetapi untuk membuat algoritma yang ditransfer dengan baik ke GPU. Ini tidak selalu sepele. Kebetulan Anda tahu cara melakukan semuanya dengan keren, tetapi untuk ini Anda memerlukan terlalu banyak titik sinkronisasi. Misalnya, Anda menulis semuanya dalam satu properti, dan ini adalah tanda yang jelas bahwa itu akan paralel dengan buruk. Jika Anda menulis banyak di satu tempat, maka semua utas perlu disinkronkan untuk ini. Tugas kami adalah untuk memperkirakan algoritma sehingga mereka sejajar dengan baik.
Alexei Kudryavtsev: Bagi saya, sebagai pengembang seluler, kedengarannya seperti ilmu roket.
Andrey Volodin: Sebenarnya, tidak begitu sulit. Bagi saya, ilmu roket adalah VIPER.
Chip ketiga
Daniil Popov: Tampaknya pada konferensi Google I / O terakhir mereka mengumumkan sepotong besi untuk TensorFlow dan hal-hal lainnya. Kapan chip ketiga akhirnya muncul di ponsel, TPU atau apa namanya, yang juga akan melakukan semua keajaiban ML pada perangkat?
Andrey Volodin: Kami memiliki hal ini, terhubung melalui USB, dan Anda dapat mengarahkan neuron dari Google di dalamnya. Huawei sudah memiliki ini, kami bahkan menulis perangkat lunak untuk akselerator heksagonal mereka, sehingga neuron segmentasi akan dengan cepat mengejar P20.
Saya harus mengatakan bahwa di iPhone mereka sebenarnya sudah ada. Sebagai contoh, di iPhone XS terbaru ada coprocessor yang disebut NPU (Neural Processing Unit), tetapi sejauh ini hanya Apple yang memiliki akses ke sana. Coprocessor ini sudah memotong GPU di iPhone. Beberapa model Core ML menggunakan NPU dan karenanya lebih cepat daripada bare Metal.
Ini penting, mengingat bahwa selain neuron inferensi terendah, Core ML memerlukan banyak tindakan tambahan. Pertama, Anda perlu mengonversi data input ke format Core ML, itu akan memprosesnya, lalu mengembalikannya dalam formatnya - Anda perlu mengonversinya kembali, dan baru kemudian menunjukkannya kepada pengguna. Ini semua membutuhkan waktu. Kami menulis saluran pipa bebas biaya overhead yang berfungsi dari awal hingga akhir pada GPU, sementara model Core ML lebih cepat justru karena proses perangkat keras ini.
Kemungkinan besar, di WWDC pada bulan Juni mereka akan menunjukkan kerangka kerja untuk bekerja dengan NPU.
Artinya, seperti yang Anda katakan, sudah ada perangkat, hanya pengembang yang belum bisa menggunakannya secara penuh. Hipotesis saya adalah bahwa perusahaan itu sendiri belum memahami bagaimana melakukan ini dengan hati-hati dalam bentuk kerangka kerja. Atau mereka hanya tidak ingin memberikan untuk mendapatkan keuntungan pasar.
Alexei Kudryavtsev: Dengan pemindai sidik jari, hal yang sama ada di IPhone, seingat saya.
Andrey Volodin: Dia bahkan tidak
semurah itu sekarang. Anda dapat menggunakannya tingkat atas, tetapi Anda tidak bisa mendapatkan hasil cetaknya sendiri. Anda bisa meminta Apple untuk membiarkan pengguna menggunakannya. Masih belum akses penuh ke pemindai itu sendiri.
Akselerator Heksagonal
Daniil Popov: Anda menyebutkan istilah akselerator heksagonal. Saya pikir tidak semua orang tahu apa itu.
Andrey Volodin: Ini hanya sepotong arsitektur perangkat keras yang digunakan Huawei. Saya harus mengatakan, dia agak canggih. Hanya sedikit orang yang tahu, tetapi di beberapa Huawei prosesor ini, tetapi tidak digunakan, karena mereka memiliki bug perangkat keras. Huawei merilisnya, dan kemudian menemukan masalah, sekarang di beberapa ponsel chip khusus mati berat. Dalam versi baru, semuanya sudah berfungsi.
Dalam pemrograman, ada paradigma SIMD (Single Instruction, Multiple Data), ketika instruksi yang sama dijalankan secara paralel pada data yang berbeda. Chip dirancang sedemikian rupa sehingga dapat memproses beberapa operasi secara paralel pada beberapa aliran data sekaligus. Secara khusus, heksagonal berarti bahwa pada 6 elemen secara paralel.
Alexei Kudryavtsev: Saya pikir GPU hanya berfungsi seperti ini: ini vectorizes tugas dan melakukan operasi yang sama pada data yang berbeda. Apa bedanya?
Andrey Volodin : GPU adalah tujuan yang lebih umum. Terlepas dari kenyataan bahwa pemrograman untuk GPU adalah level yang agak rendah, sehubungan dengan bekerja dengan coprocessor, itu adalah level yang cukup tinggi. Untuk pemrograman pada GPU, bahasa seperti C digunakan. Di iOS, kode masih dikompilasi dengan LLVM ke dalam instruksi mesin. Dan hal-hal ini untuk koprosesor paling sering ditulis langsung dengan hardcore - dalam assembler, berdasarkan instruksi mesin. Oleh karena itu, ada peningkatan produktivitas yang jauh lebih terlihat, karena mereka dipertajam untuk operasi tertentu. Anda tidak dapat mengandalkan mereka apa pun, tetapi Anda hanya dapat menghitung apa yang semula dimaksudkan untuk mereka.
Alexei Kudryavtsev: Dan mengapa mereka biasanya dirancang?
Andrey Volodin: Sekarang terutama untuk operasi yang paling umum dalam jaringan saraf: konvolusi - konvolusi atau semacam aktivasi perantara. Mereka memiliki fungsi pra-kabel yang bekerja sangat cepat. Jadi mereka jauh lebih cepat pada beberapa tugas daripada GPU, tetapi di semua sisanya mereka tidak berlaku.
Alexei Kudryavtsev: Sepertinya prosesor DSP, yang dulu digunakan untuk audio, dan semua plugin dan efek bekerja dengan sangat cepat. Perangkat keras mahal khusus dijual, tetapi kemudian prosesor tumbuh, dan sekarang kami merekam dan memproses podcast langsung di laptop.
Andrey Volodin: Ya, hampir sama.
GPU tidak hanya untuk grafis
Daniil Popov: Saya mengerti benar bahwa sekarang pada GPU Anda dapat memproses data yang tidak terkait langsung dengan grafik? Ternyata GPU kehilangan tujuan aslinya.
Andrey Volodin: Tepat. Saya sering membicarakan hal ini di konferensi. Yang pertama adalah NVidia, yang memperkenalkan CUDA. Ini adalah teknologi yang membuat GPGPU (Komputasi serba guna pada unit pemrosesan grafik) lebih sederhana. Anda dapat menulis di atasnya sebuah superset dari algoritma C ++ yang diparalelkan pada GPU.
Tetapi orang-orang telah melakukan ini sebelumnya. Sebagai contoh, pengrajin di OpenGL atau bahkan pada DirectX yang lebih tua hanya menulis data ke tekstur - setiap piksel ditafsirkan sebagai data: 4 byte pertama di piksel pertama, 4 byte kedua di kedua. Mereka mengolah tekstur, lalu kembali data dari tekstur diekstraksi dan diinterpretasikan. Itu sangat kaku dan rumit. Sekarang kartu video mendukung logika tujuan umum. Anda dapat memberi makan buffer apa pun dalam GPU, menggambarkan struktur Anda, bahkan hierarki struktur di mana mereka akan merujuk satu sama lain, menghitung sesuatu dan mengembalikannya ke prosesor.
Daniil Popov: Artinya, kita dapat mengatakan bahwa GPU sekarang adalah Data PU.
Andrey Volodin: Ya, grafik pada GPU terkadang diproses kurang dari perhitungan umum.
Alexei Kudryavtsev: Arsitektur CPU dan GPU pada dasarnya berbeda, tetapi Anda dapat mempertimbangkan keduanya di sana dan di sana.
Andrey Volodin : Memang, dalam beberapa hal CPU lebih cepat, dalam beberapa hal GPU. Ini bukan untuk mengatakan bahwa GPU selalu lebih cepat.
Daniil Popov: Sejauh yang saya ingat, jika tugasnya menghitung sesuatu yang sangat berbeda, maka pada CPU bisa jauh lebih cepat.
Andrey Volodin: Itu juga tergantung pada jumlah data. Selalu ada overhead mentransfer data dari CPU ke GPU dan sebaliknya. Jika Anda mempertimbangkan, misalnya, sejuta elemen, maka menggunakan GPU biasanya dibenarkan. Tetapi menghitung seribu elemen pada CPU bisa lebih cepat daripada hanya menyalinnya ke kartu grafis. Karena itu, Anda harus selalu memilih tugas.
Omong-omong, Core ML yang melakukannya. Core ML dapat runtime, menurut Apple, untuk memilih di mana lebih cepat untuk menghitung: pada prosesor atau pada kartu video. Saya tidak tahu apakah ini bekerja dalam kenyataan, tetapi mereka mengatakan ya.
Pengetahuan Hardcore GPU Engineer untuk pengembang seluler
Alexey Kudryavtsev: Mari kita kembali ke pengembangan seluler. Anda adalah Insinyur GPU, Anda memiliki banyak pengetahuan hardcore. Bagaimana pengetahuan ini dapat diterapkan pada pengembang seluler? Misalnya, apa yang Anda lihat di UIKit yang tidak dilihat orang lain?
Andrey Volodin: Saya akan
membicarakan ini secara terperinci di AppsConf. Anda bisa menerapkan banyak hal di mana. Ketika saya melihat, misalnya, bagaimana API UIKit bekerja, saya dapat segera memahami mengapa ini dilakukan dan mengapa. Mengamati penurunan kinerja ketika memberikan beberapa tampilan, saya dapat memahami alasannya, karena saya tahu bagaimana rendering ditulis di dalamnya. Saya mengerti: untuk menampilkan efek yang sebenarnya Gaussian blur lakukan di atas frame buffer, pertama-tama Anda perlu cache seluruh tekstur, menerapkan operasi blur berat untuk itu, mengembalikan hasilnya, menyelesaikan rendering sisa tampilan, dan hanya kemudian menampilkannya di layar. Semua ini harus sesuai dalam 1/60 detik, jika tidak maka akan melambat.
Sangat jelas bagi saya mengapa ini adalah waktu yang lama, tetapi bagi kolega saya ini tidak jelas. Itulah mengapa saya ingin berbagi trik desain yang sering kita gunakan di GameDev, dan wawasan saya tentang bagaimana saya melihat masalah dan mencoba menyelesaikannya. Ini akan menjadi eksperimen, tetapi saya pikir itu harus menarik.
Mengapa Android tidak memiliki blur asli
Daniil Popov: Anda menyebutkan blur, dan saya punya pertanyaan yang membuat saya khawatir, semua pengembang Android: mengapa ada bluer asli di iOS dan bukan di Android.
Andrei Volodin: Saya pikir ini karena arsitektur. Platform Apple menggunakan arsitektur rendering Tiled Shading. Dengan pendekatan ini, bukan seluruh frame diberikan, tetapi ubin kecil - kotak, bagian layar. Ini memungkinkan Anda untuk mengoptimalkan operasi algoritma, karena perolehan kinerja utama saat menggunakan GPU memberikan penggunaan cache yang efisien. Di iOS, frame sering dirender sehingga tidak memakan memori sama sekali. Misalnya, pada iPhone 7 Plus, resolusinya adalah 1920 * 1080, yaitu sekitar 2 juta piksel. Kami kalikan dengan 4 byte per saluran, ternyata sekitar 20 megabyte per frame. 20 MB untuk hanya menyimpan buffer bingkai sistem.
Pendekatan Tiled Shading memungkinkan Anda untuk memecah buffer ini menjadi potongan-potongan kecil dan membuatnya sedikit. Ini sangat meningkatkan jumlah akses cache, karena untuk mengaburkan, Anda perlu membaca piksel yang sudah ditarik dan menghitung distribusi Gaussian pada mereka. Jika Anda membaca seluruh frame, laju cache akan sangat rendah, karena setiap aliran akan membaca tempat yang berbeda. Tetapi jika Anda membaca potongan-potongan kecil, maka tingkat cache akan sangat tinggi, dan produktivitas juga akan tinggi.
Sepertinya saya bahwa kurangnya blur asli di Android terhubung dengan fitur arsitektur. Meskipun, mungkin ini adalah solusi produk.
Daniil Popov: Di Android, ada RenderScript untuk ini, tetapi di sana Anda perlu mencampur, menggambar, menanamkan dengan tangan Anda. Ini jauh lebih rumit daripada mengatur satu kotak centang di iOS.
Andrey Volodin: Kemungkinan besar, kinerja juga lebih rendah.
Daniil Popov: Ya, untuk memuaskan Wishlist desainer, kita harus menurunkan skala gambar, membakarnya, dan kemudian meningkatkan kembali untuk menghemat.
Andrey Volodin: Omong-omong, dengan ini Anda dapat melakukan berbagai trik. Distribusi Gaussian adalah lingkaran kabur. Gauss sigma tergantung pada jumlah piksel yang Anda ingin kumpulkan. Seringkali, sebagai optimasi, Anda dapat menurunkan skala gambar dan sedikit mempersempit sigma, dan ketika Anda mengembalikan skala asli, tidak akan ada perbedaan, karena sigma secara langsung tergantung pada ukuran gambar. Kami sering menggunakan trik ini di dalam untuk mempercepat blur.
Daniil Popov: Namun, RenderScript di Android tidak memungkinkan Anda membuat radius lebih dari 30.
Andrey Volodin: Sebenarnya, jari-jari 30 banyak. , 30 GPU .
GameDev
: , GameDev . , ?
: UIKit , . Entity Component System, . UIKit , , , . GameDev, Component System Thief 98 .
, , Cocos2d, , , , . , Scene graph โ , -, , iOS CGAffineTransform. 4*4, , . .
, UIKit . - โ . : GameDev , UIKit setNeedsLayout, layoutIfNeeded.
โ , - , , Apple.
AppsConf .
: , API Cocos2d iOS ( UI). , ?
: , - . Cocos2d 2008-2009 , UIKit UIKit, . , - , , .
, : core- Cocos2d Apple, Apple Cocos2d, . SpriteKit , Cocos2d. Apple .
: , , UIKit 2009, MacOS, . setNeedsLayout, layoutIfNeeded , .
: , GameDev , MacOS.
: !
: Cocos2d Apple, , GameDev. GameDev , โ . , GameDev , , . , , .
: , - , โ .
: , , , , โ . Protocol-Oriented Programming Swift, , - . GameDev .
: : , . , , , .
GameDev
: : GameDev , GameDev ?
: , , . ยซ , ยป. , . : , , .
GameDev- . : 30 60 , , , . , . โ . -- 1/60 1/30 . , , , GPU , CPU . , .
: ?
: . - , , , . โ . , , , โ - , - , . , , .
. , GPU float, double, - . , , , . CPU , , , GPU .
, , โ .
GameDev,
: , ยซ GameDev, ยป.
, , . , GameDev โ . , . GameDev.
: , enterprise- , GameDev . . , , GameDev, .
, . , 4*4. CGAffineTransform โ , - , .
, , , , .
: ? , UIKit, , ? , , , . , ?
: โ pet project.
, : GPU , . iOS GPU , . iOS , - NVidia AMD- . . API , , .
: API, , Cocos2d Unity, โ - . , , , UIKit ?
: Cocos2d โ Open Source . , , , , . objective-C, .
pet project, , , API, , , -. , API, VHS-. , GPU. , . , . , : ยซ saturation Instagram, lightroom!ยป , , 4 โ .
, .
โ , , . , , - , , , .
: , - . , Cocos2d - โ 5 , , , , . , , , ..
: . , . , , , , , , , , , .
: , . , , .
: . , , . , Apple, ARKit. , , . , , , , .
, , : ยซ, IDE, , , , . ยป.
: โ ?
: , , , .
: , , .
: , , , VR . Project Template Xcode, , , - . , .
: .
: - , GameDev GPU.
: . - , , , . , , , , , UI: , , runtime Objective-C โ , , . . , : , โ , X Y, !
, , - , GameDev GPU- โ .
, . AppsConf 22 23 .