Mavzu: Virtual fayl tizimlari Reja: Virtual fayl tizimlari
Tashqi xotira bilan ishlash
Download 469.5 Kb.
|
Mavzu Virtual fayl tizimlari Reja Virtual fayl tizimlari
Tashqi xotira bilan ishlash.
Tashqi xotirani boshqarish (EMM) plagin interfeysi CUDA Array Interface CUDA qurilmalariga kiradigan turli xil ma`lumotlarni almashish imkoniyatini beradi. Biroq, har bir kutubxona o`z xotirasini boshqalardan farqli ravishda boshqaradi. Masalan: Numba CUDA qurilmalarida CUDA drayveri API bilan o`zaro aloqada bo`lib, cuMemAlloc va cuMemFree kabi funktsiyalarni chaqirish uchun xotirani ajratadi, bu ko`p hollarda foydalanish uchun javob beradi. RAPIDS kutubxonalari (cuDF, cuML va boshqalar) qurilma xotirasini ajratish uchun RAPIDS Memory Manager (RMM) dan foydalanadi. CuPy ikkala qurilma va mahkamlangan xotira uchun xotira fondini dasturini o`z ichiga oladi. Bir nechta CUDA-dan xabardor bo`lgan kutubxonalar birgalikda ishlatilganda, Numba xotirani boshqarish uchun boshqa kutubxonaga qoldirgan ma`qul. EMM Plugin interfeysi Numba-ga barcha ajratmalar va taqsimotlar uchun boshqa CUDA-xabardor bo`lgan kutubxonadan foydalanishga imkon berish orqali buni osonlashtiradi. Xotirani boshqarish uchun tashqi kutubxonadan foydalanishni osonlashtirish uchun EMM plaginidan foydalaniladi. EMM plagini tashqi kutubxonaning bir qismi bo`lishi mumkin yoki alohida kutubxona sifatida amalga oshirilishi mumkin. Tashqi xotirani boshqarish haqida umumiy ma`lumot EMM plaginidan foydalanilganda, Numba plagin orqali xotirani ajratadi. Hech qachon cuMemAlloc, cuMemFree va boshqalar kabi funktsiyalarni to`g`ridan-to`g`ri chaqirmaydi. EMM plaginlari har doim qurilma xotirasini boshqarish uchun javobgarlikni o`z zimmalariga oladi. Biroq, CUDA-xabardor bo`lgan barcha kutubxonalar ham xost xotirasini boshqarishni qo`llab-quvvatlamaydilar, shuning uchun Numba uchun xost xotirasini boshqarishni davom ettirish uchun qurilma xotirasini boshqarish EMM-ga berilganda ta`minlanadi. Deallocation strategiyalariga ta`siri Numbaning ichki taqsimot xatti-harakatlari, muhim miqdor kutilmaguncha, taqsimotlarni keyinga qoldirib, samaradorlikni oshirishga mo`ljallangan. Bundan tashqari, defer_cleanup () kontekst menejeridan foydalanib, juda muhim bo`limlarda taqsimotlarning oldini olish mexanizmini taqdim etadi. EMM plaginidan foydalanilganda, taqsimlash strategiyasi EMM tomonidan amalga oshiriladi va Numbaning ichki taqsimlash mexanizmi ishlatilmaydi. EMM plaginini amalga oshirish mumkin: Numba ajratish xatti-harakatlariga o`xshash strategiya yoki Plagin uchun ko`proq mos keladigan narsa - masalan, ajratilgan xotira darxol xotira fondiga qaytarilishi mumkin. Defer_cleanup kontekst menejeri EMM plaginida boshqacha yo`l tutishi mumkin ya’ni EMM plaginida defer_cleanup kontekst menejeri ishlatilganda uning xatti-harakatlari to`g`risidagi hujjatlar qo`shilishi kerak. Masalan, ajratuvchi har doim kontekst menejeri foydalanilganda ham xotirani darxol qaytarishi mumkin edi, lekin defer_cleanup ishlatilmaguncha bo`sh tanlashi mumkin. Boshqa ob`ektlarni boshqarish xotiradan tashqari Numba hodisalar, oqimlar va modullarni va taqsimlashni boshqaradi (modul bu @ cuda.jit-ted funktsiyalaridan hosil bo`lgan kompilyatsiya qilingan ob`ekt). Jarayonlar, oqimlar va modullarni boshqarish EMM plaginidan foydalangan holda o`zgarmaydi. Asinxron taqsimlash va taqsimlash hozirgi EMM plagin interfeysi asinxron ajratish va ajratishni qo`llab-quvvatlamaydi. Bu interfeysning kelajakdagi versiyasiga qo`shilishi mumkin. EMM plaginini amalga oshirish EMM plaginini BaseCUDAMemoryManager-dan olish orqali amalga oshiriladi. Boshlash usuli NUMBA tomonidan chaqiriladi kontekst uchun EMM plagin ob`ektidan birinchi foydalanishdan oldin Ushbu usul asosiy kutubxonani hozirgi sharoitda ajratmalarga tayyorlash uchun zarur bo`lgan hamma narsani qilishi kerak. Ushbu usul bir necha marta chaqirilishi mumkin va chaqirilganda avvalgi holat bekor qilinmasligi kerak. Qayta tiklash usuli kontekstdagi barcha ajratmalarni tozalash kerak bo`lganda chaqiriladi. Uni ishga tushirishdan oldin ham chaqirish mumkin va EMM plaginini amalga oshirish bundan saqlanishi kerak. GPU o`rtasidagi aloqani qo`llab-quvvatlash uchun get_ipc_handle usuli berilgan MemoryPointer misoli uchun IpcHandle-ni taqdim etishi kerak. Ushbu usul EMM interfeysining bir qismidir (Numba ichida ishlash o`rniga), chunki ajratishning asosiy manzili faqat asosiy kutubxona tomonidan ma`lum. IPC dastagini yopish Numba ichida ichki ishlanadi. get_memory_info usulidan xotira ma`lumotlarini berish ixtiyoriy, bu kontekst uchun qurilmadagi umumiy va bo`sh xotiralarni hisoblashni ta`minlaydi. Usulni amalga oshirish afzalroq, ammo bu barcha taqsimlovchilar uchun amaliy bo`lmasligi mumkin. Agar xotira haqida ma`lumot berilmagan bo`lsa, ushbu usul RuntimeError-ni ko`tarishi kerak. defer_cleanup usuli kontekst menejerini qaytarishi kerak, bu esa faol tozalash paytida qimmat tozalash operatsiyalaridan saqlanishni ta`minlaydi. Buning nuances plaginlari o`rtasida farq qiladi, shuning uchun plagin hujjatlari tozalashni kechiktirishni ajratish va umuman ishlashga qanday ta`sir qilishini tushuntirishni o`z ichiga olishi kerak. interfeys_version xususiyati plagin versiyasining Numba versiyasi tomonidan taqdim etilgan interfeysga mos kelishini ta`minlash uchun ishlatiladi. Hozirgi vaqtda bu har doim 1 bo`lishi kerak. Asosiy sinf uchun to`liq hujjatlar quyidagicha: classnumba.cuda.BaseCUDAMemoryManager (* args, ** kwargs) Tashqi xotirani boshqarish (EMM) plaginlari uchun abstrakt asosiy sinf. memalloc (o`zi, hajmi) Joriy kontekstda qurilmadagi xotirani ajratadi. Parametrlar: size (int) - ajratish hajmi baytlarda Qaytadi: ajratilgan xotiraga egalik qiluvchi xotira ko`rsatkichi misoli Qaytish turi: MemoryPointer memhostalloc (o`zini, o`lchamini, xaritada, ko`chma, wc) Qoplangan xost xotirasini ajratish. Parametrlar: • size (int) - ajratish hajmi baytlarda • mapped (bool) - ajratilgan xotirani CUDA manzil maydoniga solish kerakmi yoki yo`qmi. • portativ (bool) - Xotira faqat kontekst kontekstida emas, balki barcha kontekstlarda bog`langan deb hisoblanadimi. • wc (bool) - xotirani yozish uchun birlashtiriladimi. Qaytadi: ajratilgan xotiraga egalik qiluvchi xotira ko`rsatkichi misoli. Qaytish turi mintaqaning qurilma xotirasida joylashtirilganligiga bog`liq. Qaytish turi: Ajratilgan xotiraga ega bo`lgan xotira ko`rsatkichi misoli. Qaytish turi mintaqaning qurilma xotirasida joylashtirilganligiga bog`liq. Qaytish turi: MappedMemory yoki PinnedMemory mempin (o`zini, egasini, ko`rsatgichini, o`lchamini, xaritada) Oldindan ajratilgan asosiy xotira mintaqasini mahkamlang. Parametrlar: • egasi - xotiraga egalik qiluvchi ob`ekt. • pointer (int) - mintaqaning boshiga belgilash uchun pin. • size (int) - mintaqaning baytdagi kattaligi. •mantiqiy (bool) - Mintaqa qurilma xotirasida ham aks ettirilishi kerakmi. Qaytadi: ajratilgan xotiraga tegishli bo`lgan xotira ko`rsatkichi misoli. Qaytish turi: MappedMemory yoki PinnedMemory ishga tushirish (o`zini) EMM plaginini ishlatishga tayyor bo`lishi uchun zarur bo`lgan har qanday ishga tushirishni bajaring. Qaytish: yo`q get_ipc_handle (o`z-o`zidan, xotira) GPU ajratmasidan IPC tutqichini qaytaring. Parametrlar: xotira (MemoryPointer) - IPC dastagi yaratilishi kerak bo`lgan xotira. Qaytadi: ajratish uchun IPC tutqichi Qaytish turi: IpcHandle get_memory_info (o`zini) Kontekstdagi (bo`sh, jami) xotirani baytda qaytaradi. NotImplementedError-ni ko`tarishi mumkin, agar bunday ma`lumotni qaytarish amaliy bo`lmasa. Xotira haqida ma`lumot Qaytish turi: MemoryInfo asl holatini tiklash (o`zini o`zi) Ushbu kontekstda ajratilgan barcha xotiralarni tozalaydi. Qaytish: yo`q defer_cleanup (o`zini) Kechiktirilgan tozalashni amalga oshirishni ta`minlaydigan kontekst menejerini qaytaradi. Qaytish: Kontekst menejeri interfeys_versiyasi Plaginni amalga oshirish tomonidan qo`llab-quvvatlanadigan EMM Plugin interfeysining versiyasini aniqlaydigan butun sonni qaytaradi. Ushbu spetsifikatsiyaning ushbu versiyasini amalga oshirish uchun har doim 1 qiymatini qaytarishi kerak. Faqat Xost-xotira menejeri Ba`zi bir tashqi xotira menejerlari qurilmadagi xotirani boshqarishni qo`llab-quvvatlaydi, lekin xotirasini emas. Ushbu xotira menejerlaridan biri yordamida EMM plaginlarini amalga oshirish uchun xost tomonini ajratish va biriktirishni amalga oshiradigan plaginning qisman bajarilishi ta`minlanadi. Uni ishlatish uchun BaseCUDAMemoryManager o`rniga HostOnlyCUDAMemoryManager-dan foydalaning. Ushbu sinfdan foydalanish bo`yicha ko`rsatmalar: • Faqatgina xotira menejeri memhostalloc va mempinni amalga oshiradi - EMM plagin hali ham memalloc dasturini amalga oshirishi kerak. • Agar asl holatini tiklash bekor qilingan bo`lsa, u xost ajratmalarini tozalashga imkon berish uchun super (). Reset () ni chaqirishi kerak. • Agar defer_cleanup bekor qilinsa, u super () dan faol kontekst menejerini ushlab turishi kerak. HostOnlyCUDAMemoryManager usullari uchun hujjatlar quyidagicha: classnumba.cuda.HostOnlyCUDAMemoryManager (* args, ** kwargs) Tashqi xotirani boshqarish (EMM) plaginlari uchun asosiy sinf, faqat qurilmada ajratishni amalga oshiradi. Subclass memhostalloc va mempin usullarini amalga oshirishi shart emas. Ushbu sinf shuningdek, reset va defer_cleanup-ni (qarang numba.cuda.BaseCUDAMemoryManager) o`zining ichki boshqaruvi uchun amalga oshiradi. Agar ushbu sinfga asoslangan EMM plaginlari ushbu usullarni amalga oshiradigan bo`lsa, ularni amalga oshirish, shuningdek, HostOnlyCUDAMemoryManager-ga o`zi boshqaradigan xost ajratmalariga kerakli ishlarni bajarish imkoniyatini berish uchun usulni super () dan chaqirishi kerak. Ushbu sinf interfeys_versiyasini amalga oshirmaydi, chunki u har doim u amalga oshirilgan Numba versiyasiga mos keladi. Ushbu sinfning EMM plaginini subklassi o`rniga interfeys_versionini amalga oshirishi kerak. memhostalloc (self, size, mapped = False, portable = False, wc = False) Qoplangan xost xotirasini ajratishni amalga oshiradi. Ushbu usulni EMM Plugin dasturlari tomonidan bekor qilinmasligi tavsiya etiladi - buning o`rniga BaseCUDAMemoryManager-dan foydalaning. mempin (o`zini, egasini, ko`rsatgichini, o`lchamini, xaritada = False) Asosiy xotirani mahkamlashni amalga oshiradi. Ushbu usulni EMM Plugin dasturlari tomonidan bekor qilinmasligi tavsiya etiladi - buning o`rniga BaseCUDAMemoryManager-dan foydalaning. asl holatini tiklash (o`zini o`zi) Joriy kontekstda barcha xost xotirasini (xaritada va / yoki mahkamlangan) tozalaydi. Ushbu usulni bekor qiladigan EMM plaginlari super () chaqirishi kerak. Reset () xost ajratmalarining ham tozalanishini ta`minlash uchun. defer_cleanup (o`zini) Hozirgi kontekstda xaritalangan yoki mahkamlangan xost xotirasini tozalashni o`chiradigan kontekst menejerini qaytaradi. Ushbu usulni bekor qiladigan EMM plaginlari xost ajratmalarining tozalanishi ham kechiktirilishini ta`minlash uchun kontekst menejerini ushbu usuldan olishlari kerak. IPC Handin Mixin GetIipc_handle () funktsiyasining bajarilishi GetIpcHandleMixin sinfida taqdim etiladi. Bu IPC dastagini ochish uchun ajratmaning asosiy manzilini aniqlash uchun drayver API`sidan foydalanadi. Agar ushbu dastur EMM plaginiga mos keladigan bo`lsa, uni GetIpcHandleMixin sinfiga aralashtirish orqali qo`shish mumkin: classnumba.cuda.GetIpcHandleMixin Get_ipc_handle () ning standart bajarilishini ta`minlaydigan sinf. get_ipc_handle (o`zini, xotira) Ajratishning asosiy ko`rsatkichini aniqlash uchun cuMemGetAddressRange yordamida IPC xotira dastagini oching. Cu_ipc_mem_handle turidagi IPC dastagi qurilgan va cuIpcGetMemHandle bilan ishga tushirilgan. Numba.cuda.IpcHandle qaytariladi, asosiy ipc_mem_handle joylashtirilgan. Qaytgan ob`ektlarning sinflari va tuzilmalari Ushbu bo`limda EMM plaginini qurish kerak bo`lgan sinflar va tuzilmalar haqida umumiy ma`lumot berilgan. Malumotlar soni nolga yetganda, finalist chaqiriladi. Konstruktor argumentlari MemoryPointer bilan bir xil. classnumba.cuda.MappedMemory (kontekst, ko`rsatgich, o`lcham, egasi=yo`q, finalizer= yo`q) Qurilma xotirasida joylashtirilgan xostdagi buferga ega bo`lgan xotira ko`rsatkichi. Parametrlar: • kontekst (kontekst) - ko`rsatgich xaritada olingan kontekst. •ko`rsatkich (ctypes.c_void_p) - bufer manzili. •size (int) - buferning baytdagi kattaligi. •egasi (NoneType) - egasi ba`zan ushbu sinfning ichki qismlari tomonidan o`rnatiladi yoki Numbaning ichki xotirasini boshqarish uchun ishlatiladi. MappedMemory sinfining tashqi foydalanuvchisi tomonidan taqdim etilmasligi kerak (masalan, EMM plaginidan); sukut bo`yicha har doim etarli bo`lishi kerak. • yakunlovchi (funktsiya) - buferni bo`shatish kerak bo`lganda chaqiriladigan funktsiya. classnumba.cuda.PinnedMemory (kontekst, ko`rsatgich, o`lcham, egasi = Yo`q, yakunlovchi = Yo`q) Xostdagi mahkamlangan buferga ko`rsatgich. Parametrlar: • kontekst (kontekst) - ko`rsatgich xaritada olingan kontekst. • egasi - Xotiraga ega bo`lgan ob`ekt. EMM plaginini amalga oshirish uchun bu • ko`rsatkich (ctypes.c_void_p) - bufer manzili. • size (int) - buferning baytdagi kattaligi. • egasi - mahkamlangan buferga egalik qiluvchi ob`ekt. EMM plaginini amalga oshirish uchun memhostalloc-da ajratilgan xotira uchun None-ning sukuti etarli bo`ladi - mempin uchun u mempin uslubiga o`tgan egasi bo`lishi kerak. • yakunlovchi (funktsiya) - buferni bo`shatish kerak bo`lganda chaqiriladigan funktsiya. Xotira haqida ma`lumot Agar get_memory_info () dasturining natijasi natija berishi kerak bo`lsa, u MemoryInfo tuple nomini qaytarishi kerak: classnumba.cuda.MemoryInfo (bepul, jami) Qurilma uchun bo`sh va to`liq xotira.Qurilmaning baytdagi xotirasi. jami Qurilmaning umumiy xotirasi baytlarda. IPC IpcHandle-ning misoli get_ipc_ dasturidan qaytarilishi kerak Handle (): classnumba.cuda.IpcHandle (asos, tutqich, o`lcham, source_info = yo`q, ofset = 0) CUDA IPC dastagi. Bu erda CUDA IPC dastagi ob`ektini seriyalash amalga oshiriladi. Parametrlar: • tayanch (MemoryPointer) - uni saqlab qolish uchun asl ajratishga havola • dastak - CUDA IPC tutqichi, baytlar qatori sifatida. • size (int) - Dastlabki ajratmaning hajmi • source_info (dict) - IPC tutqichi ochilgan qurilmaning identifikatori. • ofset (int) - ushbu IPC tutqichida ko`rsatilgan xotiraning asosiy joylashuviga o`tish. EMM plaginini amalga oshirish doirasida IPC dastagini qurish bo`yicha ko`rsatma: • EMM Plugin-ning get_ipc_handle usuliga o`tgan xotira parametri asosiy parametr sifatida qabul qilinishi mumkin. • Tutqich uchun mos tur ctypes.c_byte * sifatida tuzilishi mumkin. Ma`lumotlar asosiy kutubxonaga mos keladigan CUDA IPC tutqichini olish usuli yordamida to`ldirilishi kerak. • hajmi get_ipc_handle-da memory.size yordamida olinishi mumkin bo`lgan dastlabki ajratma hajmiga mos kelishi kerak. • source.info uchun tegishli qiymat self.context.device.get_device_identity () ga qo`ng`iroq qilish orqali yaratilishi mumkin. • Agar asosiy xotira CUDA drayveri yoki ish vaqti API tomonidan qaytarilgan ajratmaning asosiga ishora qilmasa (masalan, hovuz ajratuvchisi ishlatilayotgan bo`lsa), u holda bazadan ofset ta`minlanishi kerak. EMM plaginini sozlash Odatiy bo`lib, Numba ichki xotira boshqaruvidan foydalanadi - agar EMM plaginini ishlatmoqchi bo`lsa, uni sozlash kerak. EMM plaginidan foydalanishni sozlash uchun ikkita mexanizm mavjud: muhit o`zgaruvchisi va funktsiya. Atrof muhit o`zgaruvchisi NUMBA_CUDA_MEMORY_MANAGER muhit o`zgaruvchisida modul nomi berilishi mumkin. Agar bu muhit o`zgaruvchisi o`rnatilgan bo`lsa, Numba modulni import qilishga harakat qiladi va uning _numba_memory_manager global o`zgaruvchisini xotira menejeri sinfi sifatida ishlatadi. Bu birinchi navbatda Numba test paketini EMM plaginida ishlatish uchun foydalidir, masalan: $ NUMBA_CUDA_MEMORY_MANAGER = rmm python -m numba.runtests numba.cuda.tests Funktsiya Set_memory_manager () funktsiyasidan xotira menejerini ish vaqtida sozlash uchun foydalanish mumkin. Buni har qanday kontekstni boshlashdan oldin chaqirish kerak, chunki EMM plaginlari misollari kontekst bilan birgalikda o`rnatiladi. numba.cuda.set_memory_manager (mm_plugin) Tashqi xotirani boshqarish (EMM) plaginini ishlatish uchun Numba-ni sozlang. Agar EMM plagin versiyasi Numba ushbu versiyasi tomonidan qo`llab-quvvatlanadigan versiyaga mos kelmasa, RuntimeError ko`tariladi. Parametrlar: mm_plugin (BaseCUDAMemoryManager) - EMM plaginini amalga oshiruvchi sinf. Qaytish: yo`q Xotira menejerini tiklash Xotira menejeri har qanday CUDA funktsiyasidan foydalanishdan oldin bir marta o`rnatilishi va bajarilishning qolgan qismida o`zgarishsiz qoldirilishi tavsiya etiladi. Xotira menejerini bir necha marta sozlash mumkin, bunda quyidagilar qayd etiladi: • Yaratilish paytida, kontekstlar umr bo`yi xotira menejerining misoli bilan bog`liq. • Xotira menejerini o`zgartirish mavjud kontekstlarga ta`sir qilmaydi - faqat xotira menejeri yangilanganidan so`ng yaratilgan kontekstlar yangi xotira menejeridan foydalanadi. • numba.cuda.close () yordamida xotira menejeri o`rnatilgandan so`ng ularni yangi xotira menejeri bilan qayta yaratish uchun kontekstlarni yo`q qilish mumkin. • Bu kontekstga tegishli bo`lgan har qanday massivlarni, oqimlarni, voqealarni va modullarni bekor qiladi. • Noto`g`ri massivlardan, oqimlardan yoki voqealardan foydalanishga urinish, ehtimol CUDA_ERROR_INVALID_CONTEXT yoki CUDA_ERROR_CONTEXT_IS_DESTROYED qaytish kodini Driver API funktsiyasidan kelib chiqqan holda bekor qilinishi mumkin. •Yaroqsiz moduldan foydalanishga urinish shunga o`xshash holatlarga olib keladi, yoki ba`zi hollarda segmentatsiya xatosi / kirishni buzish. Download 469.5 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling