Gesaan dan konteks
Dua masa jalanan data dalam proses perlu menukar kelompok rekod Arrow pada GPU sambil meminimumkan salinan hos-peranti. Berdasarkan Arrow C Device Data Interface, reka bentuk eksport, penyelarasan, jangka hayat, keserasian peranti dan pengendalian kegagalan.
Arrow C Device Interface memperluaskan C Data Interface dengan jenis peranti, pengecam peranti dan peristiwa penyelarasan supaya memori GPU atau FPGA boleh kekal pada peranti. Spesifikasi ini pada masa ini ditandakan sebagai eksperimen. Ia menyasarkan kebolehoperasian masa jalanan dalam proses, bukan pengangkutan merentas mesin atau ketekalan (persistence).
Perkara yang dinilai oleh penemu duga
Penemu duga mencari perbezaan yang jelas antara skema, tatasusunan, kelompok rekod dan penimbal peranti; penggunaan ArrowDeviceArray yang betul; pengendalian CUDA, ROCm, Metal dan peranti lain; panggilan balik pelepasan; perkongsian baca sahaja; jangka hayat peristiwa; keserasian ABI; dan sandaran CPU yang selamat.
Soalan penjelasan
Sempadan pertukaran
Sahkan sama ada pengeluar dan pengguna berkongsi proses dan konteks peranti, sama ada pemindahan merentas proses atau merentas mesin diperlukan, dan sama ada pengguna melaksanakan Arrow C Device Interface.
Matlamat prestasi dan ketepatan
Jelaskan sama ada matlamatnya adalah untuk mengurangkan salinan hos-peranti, salinan peranti-ke-peranti atau menunggu kernel, kemudian tentukan ketepatan penyelarasan, kos sandaran dan saiz kelompok.
Jenis peranti dan memori
Kenal pasti CUDA, ROCm, Metal, Vulkan atau jenis peranti lain; tentukan cara ID peranti diselesaikan; dan tentukan sama ada memori disatukan (unified memory), memori hos dipinkan (pinned host memory) atau penimbal CPU biasa dibenarkan.
Jawapan 30 saat
“Saya akan mengekalkan skema dan tatasusunan daripada Arrow C Data Interface dan menambah ArrowDeviceArray yang membawa jenis peranti, ID peranti dan peristiwa penyelarasan. Pengeluar memastikan penimbal peranti sah sehingga peristiwa membenarkan pengguna membacanya; kedua-dua pihak menganggap data yang dieksport sebagai tidak boleh ubah dan menggunakan panggilan balik pelepasan untuk menentukan pemilikan. Pengguna mengesahkan konteks peranti dan versi ABI. Peranti atau peristiwa yang tidak disokong akan berbalik kepada ArrowArray CPU atau salinan eksplisit. Disebabkan antara muka ini adalah eksperimen, ujian pelepasan mesti meliputi penyelarasan, pembersihan, kehilangan peranti dan regresi salinan.”
Penyelesaian langkah demi langkah
Langkah 1: Asingkan skema daripada data
ArrowSchema menerangkan jenis lajur, medan dan metadata. ArrowArray menerangkan panjang, ofset, peta bit nol, penimbal data dan anak. Antara muka peranti mengekalkan struktur ini dan membungkus tatasusunan peringkat teratas dengan maklumat peranti; penimbal GPU tidak menghapuskan keperluan untuk skema.
Langkah 2: Terangkan peranti
Pengeluar mengisi jenis peranti dan ID peranti supaya pengguna dapat mencari konteks yang betul. Spesifikasi mentakrifkan makro untuk CPU, CUDA, ROCm, Metal, Vulkan dan peranti lain. Jangan jadikan nilai makro berangka sebagai protokol perniagaan yang tidak dirundingkan; semak keupayaan dan jenis peranti yang dipersetujui.
Langkah 3: Tentukan peristiwa penyelarasan
sync_event memberitahu pengguna masa memori peranti selamat untuk dibaca. Pengeluar memastikan penimbal sah sehingga semantik peristiwa dipenuhi; pengguna menunggu atau mengimport peristiwa yang setara sebelum melancarkan kernel. Pemilikan, keselamatan benang (thread safety), perkaitan konteks dan pemusnahan peristiwa adalah sebahagian daripada kontrak, bukan dalam konvensyen penuding yang tidak didokumenkan.
Langkah 4: Jadikan perkongsian sifar-salinan tidak boleh ubah
Sifar-salinan bermaksud berkongsi penimbal peranti secara langsung, bukan menghantar penuding hos dan berharap masa jalanan mengelakkan salinan. Pengeluar dan pengguna harus menganggap data yang dieksport sebagai tidak boleh ubah. Jika pengguna perlu menulis, ia menyalin ke dalam storan miliknya atau mendapatkan pajakan tulis eksklusif yang jelas.
Langkah 5: Urus jangka hayat
Gunakan panggilan balik pelepasan C Data Interface untuk membebaskan tatasusunan, anak, skema dan sumber peranti selepas pengguna selesai. Pengeluar tidak boleh menggunakan semula atau melepaskan penimbal sebelum panggilan balik, dan pengguna tidak boleh memanggilnya dua kali. Pembatalan, ranap dan tetapan semula peranti memerlukan laluan pembersihan yang boleh diperhatikan.
Langkah 6: Hadkan ABI dan pelaksanaan
Antara muka ini bertujuan untuk definisi C kecil yang boleh didedahkan oleh masa jalanan bukan C/C++ melalui FFI. Ia bersifat eksperimen, jadi tetapkan versi yang disokong, saiz struktur, pemulaan medan simpanan (reserved-field) dan kesahan penuding. Status eksperimen dan perbezaan pelaksanaan kekal sebagai risiko operasi walaupun dengan ABI yang kecil.
Langkah 7: Sandaran dan pengesahan
Apabila jenis peranti, konteks, import peristiwa atau jaminan jangka hayat tidak disokong, sandarkan kepada ArrowArray CPU atau salinan eksplisit dan rekodkan alasannya. Uji peranti, kelompok kosong, lajur bersarang, peta bit nol, susunan pelepasan, tamat masa peristiwa, kehilangan peranti dan garis dasar salinan hos/peranti.
Jawapan model
Saya mula-mula akan mengesahkan bahawa kedua-dua masa jalanan berkongsi proses dan ekosistem peranti yang sama, kemudian menentukan kontrak skema, tatasusunan dan penimbal peranti. Pengeluar mengeksport ArrowDeviceArray dengan jenis peranti, ID peranti dan peristiwa penyelarasan. Pengguna mengesahkan konteksnya, menunggu peristiwa dan membaca data yang tidak boleh ubah. Panggilan balik pelepasan memiliki tatasusunan, anak dan sumber peranti; penimbal tidak boleh digunakan semula sebelum pelepasan. Antara muka ini adalah eksperimen, jadi penggunaan menetapkan versi pelaksanaan dan memulakan medan simpanan. Peranti atau peristiwa yang tidak disokong menggunakan ArrowArray CPU atau salinan eksplisit, manakala telemetri mengukur masa menunggu penyelarasan, bait yang disalin, ralat pelepasan dan kehilangan peranti.
Kesilapan biasa
- Kesilapan: Menganggap penuding peranti sebagai protokol merentas proses atau merentas mesin. → Sebab ia gagal: C Device Interface menyasarkan pertukaran dalam proses dan tidak menyediakan semantik ruang alamat atau ketekalan. → Penyelesaian: Gunakan IPC atau format pengangkutan merentasi sempadan, atau salin secara eksplisit.
- Kesilapan: Hanya menghantar jenis peranti dan mengabaikan penyelarasan. → Sebab ia gagal: Pengguna mungkin membaca semasa pengeluar masih menulis. → Penyelesaian: Tentukan pemilikan peristiwa, konteks, tunggu dan pemusnahan.
- Kesilapan: Membenarkan kedua-dua pihak mengubah penimbal sifar-salinan. → Sebab ia gagal: Penimbal boleh ubah yang dikongsi mewujudkan keadaan perlumbaan (race condition) dan lajur yang tidak konsisten. → Penyelesaian: Jadikan data baca sahaja sebagai lalai dan gunakan storan milik sendiri untuk penulisan.
- Kesilapan: Membebaskan sumber sebaik sahaja panggilan balik pelepasan kelihatan. → Sebab ia gagal: Pengguna mungkin masih menggunakan memori peranti sebelum panggilan balik. → Penyelesaian: Biarkan pemilik melepaskan sekali selepas selesai dan rangkumi pembatalan serta ralat.
Soalan susulan dan jawapan
Mengapakah ArrowSchema masih diperlukan?
Antara muka peranti menerangkan lokasi memori dan penyelarasan, bukan jenis lajur. Pengguna masih memerlukan skema untuk rentetan format, anak, peta bit nol dan metadata medan.
Adakah ID peranti yang sama menjamin perkongsian?
Tidak. Masa jalanan, konteks, pengagih (allocator) dan keserasian peristiwa juga penting. ID peranti mencari sumber; ia tidak menggantikan rundingan keupayaan.
Bilakah anda patut menyalin secara sengaja?
Salin apabila pengguna tidak mempunyai sokongan peranti, tidak boleh mengimport peristiwa, tidak dapat membuktikan jangka hayat atau merentasi sempadan proses. Ukur kos penyalinan sebelum memutuskan sama ada lapisan kebolehoperasian yang lebih mendalam berbaloi.
Bagaimanakah anda membuktikan sifar-salinan adalah benar?
Ukur bait hos-ke-peranti dan peranti-ke-hos, masa menunggu penyelarasan, pendam mula kernel (kernel-start latency) dan pemprosesan hujung-ke-hujung terhadap garis dasar penimbal CPU dan salinan eksplisit. Jumlah masa yang berlalu sahaja tidak dapat membuktikan bahawa salinan tersembunyi tidak wujud.