Mavzu: Virtual fayl tizimlari Reja: Virtual fayl tizimlari


Tashqi xotira bilan ishlash


Download 469.5 Kb.
bet2/12
Sana22.12.2022
Hajmi469.5 Kb.
#1043290
1   2   3   4   5   6   7   8   9   ...   12
Bog'liq
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:
1   2   3   4   5   6   7   8   9   ...   12




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling