§
    Û×jª  ã                   óº   — d Z ddlZddlZddlZddlZddlmZ dZdZdZdZ	 G d„ d	ej
        ¦  «        Zd
„ Z G d„ dej
        ¦  «        Zd„ Zdad„ Zd„ Zd„ Zd„ ZdS )z´Read ahead of mapped weights that a drive must read, before copies that split them across threads (Windows): cold_ranges finds them,
prefetch_ranges reads them with large requests.é    N)Útqdmé€   i   i@œ  i   c                   ó2   — e Zd Zdej        fdej        fgZdS )Ú_RangeÚaddressÚsizeN©Ú__name__Ú
__module__Ú__qualname__ÚctypesÚc_void_pÚc_size_tÚ_fields_© ó    ú7C:\Users\johnn\OneDrive\Documents\AI\mmgp\read_ahead.pyr   r      s&   € € € € € Ø˜FœOÐ,¨v°v´Ð.GÐH€H€H€Hr   r   c                  ó8  ‡— t           j        dk    rd S t          j        dd¬¦  «        } 	 | j        Šn# t
          $ r Y d S w xY wt          j        t          j        t          j        t          ¦  «        t          j
        g‰_        t          j        ‰_        ˆfd„}|S )NÚwin32Úkernel32T©Úuse_last_errorc                 óò   •— t          t          | ¦  «        z  d„ | D ¦   «         Ž } ‰t          j        d¦  «        t          |¦  «        |d¦  «        s%t          j        t          j        ¦   «         ¦  «        ‚d S )Nc              3   ó<   K  — | ]\  }}t          ||¦  «        V — Œd S )N)r   )Ú.0r   r   s      r   ú	<genexpr>z6_windows_prefetch.<locals>.prefetch.<locals>.<genexpr>!   s0   è è € Ð([Ð([Á=À7ÈD­°¸Ñ)>Ô)>Ð([Ð([Ð([Ð([Ð([Ð([r   éÿÿÿÿr   )r   Úlenr   r   ÚWinErrorÚget_last_error)ÚrangesÚarrayÚhints     €r   Úprefetchz#_windows_prefetch.<locals>.prefetch    ss   ø€ Ý�#˜f™+œ+Ñ%Ð([Ð([ÐTZÐ([Ñ([Ô([Ð\ˆØˆt•F”O BÑ'Ô'­¨U©¬°U¸AÑ>Ô>ð 	;Ý”/¥&Ô"7Ñ"9Ô"9Ñ:Ô:Ð:ð	;ð 	;r   )ÚsysÚplatformr   ÚWinDLLÚPrefetchVirtualMemoryÚAttributeErrorr   r   ÚPOINTERr   Úc_ulongÚargtypesÚc_intÚrestype)Úkernelr$   r#   s     @r   Ú_windows_prefetchr0      s£   ø€ Ý
„|�wÒÐØˆtÝŒ]˜:°dÐ;Ñ;Ô;€FðØÔ+ˆˆøÝð ð ð Øˆtˆtðøøøå”_¥f¤oµv´~ÅfÑ7MÔ7MÍvÌ~Ð^€D„MÝ”<€D„Lð;ð ;ð ;ð ;ð ;ð €Os   «3 ³
AÁ Ac                   ó2   — e Zd Zdej        fdej        fgZdS )Ú_WorkingSetEntryr   Ú
attributesNr	   r   r   r   r2   r2   '   s&   € € € € € Ø˜FœOÐ,¨|¸V¼_Ð.MÐN€H€H€Hr   r2   c                  óê   ‡— t          ¦   «         } | €d S t          j        dd¬¦  «        j        Št          j        t          j        t          j        g‰_        t          j        ‰_        ˆfd„}d„ }|| |fS )Nr   Tr   c                 ó  •— t          t          | ¦  «        z  d„ | D ¦   «         Ž } ‰t          j        d¦  «        |t          j        |¦  «        ¦  «        s%t          j        t          j        ¦   «         ¦  «        ‚d„ |D ¦   «         S )Nc              3   ó6   K  — | ]}t          |d ¦  «        V — ŒdS )r   N)r2   )r   r   s     r   r   z8_windows_cold_hints.<locals>.resident.<locals>.<genexpr>6   s/   è è € Ð7nÐ7nÐY`Õ8HÈÐRSÑ8TÔ8TÐ7nÐ7nÐ7nÐ7nÐ7nÐ7nr   r   c                 ó"   — g | ]}|j         d z  ‘ŒS ©é   )r3   )r   Úentrys     r   ú
<listcomp>z9_windows_cold_hints.<locals>.resident.<locals>.<listcomp>9   s    € Ð:Ð:Ð:¨�Ô  1Ñ$Ð:Ð:Ð:r   )r2   r   r   r   Úsizeofr   r    )Ú	addressesÚentriesÚquerys     €r   Úresidentz%_windows_cold_hints.<locals>.resident5   s   ø€ Ý#¥c¨)¡n¤nÑ4Ð7nÐ7nÐdmÐ7nÑ7nÔ7nÐoˆØˆu•V”_ RÑ(Ô(¨'µ6´=ÀÑ3IÔ3IÑJÔJð 	;Ý”/¥&Ô"7Ñ"9Ô"9Ñ:Ô:Ð:Ø:Ð:°'Ð:Ñ:Ô:Ð:r   c                 óÂ   — | D ][}t          j        ¦   «         }t          j                             |¦  «        j         t          j        ¦   «         |z
  t          k    r dS Œ\dS )NTF)ÚtimeÚperf_counter_nsr   Úc_charÚfrom_addressÚvalueÚCOLD_TOUCH_NS)r=   r   Ústarts      r   Úon_diskz$_windows_cold_hints.<locals>.on_disk:   sb   € Ø ð 	ð 	ˆGÝÔ(Ñ*Ô*ˆEÝŒM×&Ò& wÑ/Ô/Ô5Ð5ÝÔ#Ñ%Ô%¨Ñ-µÒ=Ð=Ø�t�tð >àˆur   )	r0   r   r'   ÚK32QueryWorkingSetExr   r+   r,   r-   r.   )r$   r@   rI   r?   s      @r   Ú_windows_cold_hintsrK   +   s†   ø€ õ !Ñ"Ô"€HØÐØˆtÝŒM˜*°TÐ:Ñ:Ô:ÔO€EÝ”o¥v¤½¼ÐG€E„NÝ”L€E„Mð;ð ;ð ;ð ;ð ;ð
ð ð ð �X˜wÐ&Ð&r   c                  ób   — t           €"t          j        dk    rt          ¦   «         nd pda t           S )Nr   F)Ú_cold_hintsr%   r&   rK   r   r   r   Ú_hintsrN   M   s1   € åÐÝ03´ÀÒ0GÐ0GÕ*Ñ,Ô,Ð,ÈTÐ[ÐV[ˆÝÐr   c                 ó8   — da t          j        d| › �¦  «         d S )NFzQ[MMGP] Prefetch of the weights not in RAM disabled after an error of the system: )rM   r   Úwrite)Úerrors    r   Ú_disablerR   T   s'   € à€KÝ„JÐjÐchÐjÐjÑkÔkÐkÐkÐkr   c           
      óÚ  — t          ¦   «         }|sg S t          j        }g }| D ]X\  }}||z  |z  ||z   }}t          ||t          ¦  «        D ]/}|                     |t          ||t          z   ¦  «        f¦  «         Œ0ŒY|sg S |\  }	}
}	 g }t          | |	d„ |D ¦   «         ¦  «        ¦  «        D ]j\  \  }}}|rŒ||z   dz
  |z  |z  }|r8||d         d         k    r&t          |d         d         |¦  «        |d         d<   ŒS|                     ||g¦  «         Œk|r* ||d         d         |d         d         |z
  h¦  «        r|ng S # t          $ r}t          |¦  «         g cY d}~S d}~ww xY w)a/  The parts of ranges ((address, byte count), in copy order) that a drive must read, as page-aligned [start, end] lists: empty when all
    of them are in RAM or the system offers no hints. Costs a query of one page per COLD_SEGMENT, and one first touch when some are not
    in the working set (Windows).c                 ó   — g | ]\  }}|‘ŒS r   r   )r   rH   Ú_s      r   r;   zcold_ranges.<locals>.<listcomp>l   s   € Ð<\Ð<\Ð<\ÁxÀuÈa¸UÐ<\Ð<\Ð<\r   r9   r   r   N)rN   ÚmmapÚPAGESIZEÚrangeÚCOLD_SEGMENTÚappendÚminÚzipÚmaxÚOSErrorrR   )r!   ÚhintsÚpageÚsegmentsr   r   rH   ÚendÚsegmentr@   rU   rI   ÚcoldÚpresentrQ   s                  r   Úcold_rangesrf   Z   sã  € õ ‰HŒH€EØð Øˆ	ÝŒ=€DØ€HØð Ið I‰ˆ�Ø ‘_ tÑ+¨W°t©^ˆsˆÝ˜U C­Ñ6Ô6ð 	Ið 	IˆGØ�OŠO˜W¥c¨#¨w½Ñ/EÑ&FÔ&FÐGÑHÔHÐHÐHð	Iàð Øˆ	Ø Ñ€Hˆa�ðØˆÝ%(¨°8°8Ð<\Ð<\ÐS[Ð<\Ñ<\Ô<\Ñ3]Ô3]Ñ%^Ô%^ð 	*ð 	*Ñ!‰LˆU�C˜'Øð ØØ˜‘: ‘> dÑ*¨TÑ1ˆCØð *˜  b¤¨!¤Ò,Ð,Ý! $ r¤(¨1¤+¨sÑ3Ô3��R”˜‘�à—’˜U C˜LÑ)Ô)Ð)Ð)ØÐQ  ¨¨a¬°¬°T¸"´X¸a´[À4Ñ5GÐ(HÑ IÔ IÐQˆtˆtÈrÐQøÝð ð ð Ý�‰ŒˆØˆ	ˆ	ˆ	ˆ	ˆ	ˆ	øøøøðøøøs   ÂB=E Å
E*ÅE%ÅE*Å%E*c                 óV  ‡— t          ¦   «         }|r| sdS t          j        Šˆfd„| D ¦   «         } 	 t          dt	          | ¦  «        t
          ¦  «        D ]-} |d         d„ | ||t
          z   …         D ¦   «         ¦  «         Œ.dS # t          $ r}t          |¦  «         Y d}~dS d}~ww xY w)zGReads ranges ([start, end] address pairs) into RAM with large requests.Nc                 óB   •— g | ]\  }}|‰z  ‰z  |‰z   d z
  ‰z  ‰z  f‘ŒS r8   r   )r   rH   rb   r`   s      €r   r;   z#prefetch_ranges.<locals>.<listcomp>€   s>   ø€ Ð_Ð_Ð_É*È%ÐQTˆu˜‰}˜tÑ# c¨D¡j°1¡n¸Ñ%=ÀÑ%DÐEÐ_Ð_Ð_r   r   r9   c                 ó"   — g | ]\  }}|||z
  f‘ŒS r   r   )r   rH   rb   s      r   r;   z#prefetch_ranges.<locals>.<listcomp>ƒ   s%   € Ð^Ð^Ð^©z¨u°c�u˜c E™kÐ*Ð^Ð^Ð^r   )rN   rV   rW   rX   r   Ú
MAX_RANGESr^   rR   )r!   r_   ÚindexrQ   r`   s       @r   Úprefetch_rangesrl   z   sá   ø€ å‰HŒH€EØð ˜ð ØˆÝŒ=€DØ_Ð_Ð_Ð_ÐX^Ð_Ñ_Ô_€FðÝ˜1�c &™kœk­:Ñ6Ô6ð 	`ð 	`ˆEØˆE�!ŒHÐ^Ð^¸VÀEÈ%ÕR\ÑJ\ÐD\Ô=]Ð^Ñ^Ô^Ñ_Ô_Ð_Ð_ð	`ð 	`øåð ð ð Ý�‰Œˆˆˆˆˆˆˆøøøøðøøøs   ±AB Â
B(ÂB#Â#B()Ú__doc__r   rV   r%   rB   r   rj   rY   rG   Ú
COLD_PIECEÚ	Structurer   r0   r2   rK   rM   rN   rR   rf   rl   r   r   r   ú<module>rp      s4  ðð3ð 3à €€€Ø €€€Ø 
€
€
€
Ø €€€à Ð Ð Ð Ð Ð ð €
Ø€Ø€Ø€
ðIð Ið Ið Ið IˆVÔñ Iô Ið Iðð ð ð"Oð Oð Oð Oð O�vÔ'ñ Oô Oð Oð'ð 'ð 'ð2 €ðð ð ðlð lð lðð ð ð@ð ð ð ð r   