U
    iâËd!C  ã                *   @   sX  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlmZmZ d dlZd dlmZmZ d dlmZmZ d dlmZmZ d dlmZmZmZ d dlZe ejd¡Zdd	d
dœZddddœZ ej!e j!gej"e j"gg ej#e j#gej$e j$ge j%ge j&ge j'ge j(gg e j)ge j*gg g g g g ej+e j+ge j,ge j-gg g g g ej.e j.gg g g g ej/e j/gej0e j0gg g g g g g ej1e j1gej2e j2gej3e j3gg dœ)Z4ddddddgZ5dd„ e4 6¡ D ƒZ4dd„ e4 6¡ D ƒZ7dd„ e4 6¡ D ƒZ8d*dd„Z9dd„ Z:dd „ Z;eG d!d"„ d"eƒƒZ<e< =¡  d#d$„ Z>d%d&„ Z?eG d'd(„ d(eƒƒZ@eAd)k�rTe B¡  dS )+é    N)ÚchainÚcombinations)ÚconfigÚcpu)ÚprangeÚnjit)Úcompile_isolatedÚFlags)ÚTestCaseÚtagÚoverride_env_configz"SVML tests need SVML to be presentZnehalemZhaswellúskylake-avx512)é   é   é   Ú ú-prefer-256-bit))ÚsinÚcosÚpowÚexpÚlogÚacosÚacoshÚasinÚasinhÚatan2ÚatanÚatanhZcbrtZcdfnormZ
cdfnorminvÚceilZcosdÚcoshÚerfÚerfcZerfcinvZerfinvZexp10Zexp2Úexpm1ÚfloorÚfmodÚhypotZinvsqrtÚlog10Úlog1pÚlog2ÚlogbZ	nearbyintZrintÚroundZsindÚsinhÚtanÚtanhÚtruncr-   r'   r#   r(   r.   r   c                 C   s"   i | ]\}}t |ƒd kr||“qS )r   )Úlen)Ú.0ÚkÚv© r4   úN/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/tests/test_svml.pyÚ
<dictcomp>T   s       r6   c                 C   s&   g | ]\}}d dd„ |D ƒkr|‘qS )z<ufuncc                 S   s   g | ]}t |ƒ d ¡d ‘qS ©ú r   ©ÚstrÚsplit©r1   Úpr4   r4   r5   Ú
<listcomp>W   s     ú<listcomp>.<listcomp>r4   ©r1   Úfr3   r4   r4   r5   r>   V   s
     ÿ r>   c                 C   s&   g | ]\}}d dd„ |D ƒkr|‘qS )z	<built-inc                 S   s   g | ]}t |ƒ d ¡d ‘qS r7   r9   r<   r4   r4   r5   r>   Y   s     r?   r4   r@   r4   r4   r5   r>   X   s
     ÿ ú        c                 C   s`  |dkr.d  dd„ |D ƒ¡}d||| |f }	np|dkrhd||| d  |¡f }	|	| d¡r`d	| nd
7 }	n6|dks||dks|t‚d  dd„ |D ƒ¡}djf tƒ Ž}	|dkp¬|dk}
|
rº| d n| }|
rÊ|d n|}|rÖdnd}tjrèd| nd| }d|||f }|dk�r|g}d|g}n>|g}g }|dk�rV|
�s<|dk�rV|dd||d |f g7 }|	||fS )zƒ
    For a given function and its usage modes,
    returns python code and assembly patterns it should and should not generate
    Úscalarú,c                 S   s   g | ]}|d  ‘qS )z[0]r4   ©r1   Úar4   r4   r5   r>   d   s     z!func_patterns.<locals>.<listcomp>z%s%s[0] += math.%s(%s)
Únumpyz%s%s += np.%s(%s)Úintz.astype(np.%s)
Ú
Úranger   c                 S   s   g | ]}|d  ‘qS )z[i]r4   rE   r4   r4   r5   r>   k   s     zP{pad}for i in {mode}({res}.size):
{pad}{pad}{res}[i] += math.{func}({arg_list})
Úfloat32Ú	complex64rA   r   r   Z_haz$_ú$z__svml_%s%d%s,Z__svml_r   Úint32z%zmm)ÚjoinÚ
startswithÚAssertionErrorÚformatÚlocalsr   ÚIS_OSX)ÚfuncÚargsÚresÚdtypeÚmodeÚvlenÚfastmathÚpadÚarg_listÚbodyZis_f32rA   r3   Z	prec_suffZscalar_funcZ	svml_funcÚcontainsÚavoidsr4   r4   r5   Úfunc_patterns\   s2    þ

ra   c                 C   s   | › d|› |› d|› �S )z, Returns pretty name for given set of modes Ú_r4   )rX   rY   rZ   Únamer4   r4   r5   Úusecase_name‡   s    rd   c              	   C   sÄ   t | |||ƒ}djf tƒ Ž}t|dkr*tntƒ}|  d¡rD| t¡}tƒ }tƒ }|D ]<}	t	|	dgd| |||ƒ\}
}}| 
|¡ ||
7 }| 
|¡ qT|d7 }i }t|tƒ |ƒ ||| _|| ||fS )z? Combine multiple function calls under single umbrella usecase z\def {name}(n):
        x   = np.empty(n*8, dtype=np.{dtype})
        ret = np.empty_like(x)
rG   ÚcomplexÚxÚretz        return ret)rd   rR   rS   ÚsetÚnumpy_funcsÚother_funcsrP   Ú
differenceÚcomplex_funcs_excludera   ÚupdateÚexecÚglobalsÚ__doc__)rX   rY   rZ   r[   rc   r^   Úfuncsr_   r`   rA   ÚbÚcrF   Zldictr4   r4   r5   Úcombo_svml_usecase�   s&    þ



rt   c                   @   sR   e Zd ZdZdZe d dgee	ƒ ¡¡Z
edd„ ƒZedd„ ƒZed	d
„ ƒZdS )ÚTestSVMLGenerationz; Tests all SVML-generating functions produce desired calls Fú|z\$[a-z_]\w+,c                 C   sN   t | |ƒ}z|ƒ \}}W n  tk
r8   t ¡ }d}Y nX | ||dœ¡ d S )NF)ÚstatusÚmsg)ÚgetattrÚ	ExceptionÚ	tracebackÚ
format_excÚput)ÚclsÚtestnameZoutqueueÚmethodÚokrx   r4   r4   r5   Ú	mp_runner°   s    

zTestSVMLGeneration.mp_runnerc           	         s¢   ˆ  d¡rˆdkrd S ˆ  d¡o&ˆdk}tjf‰t‡ ‡‡‡‡‡fdd„ƒ}tˆˆˆˆd ƒ}d|› �‰tˆ ˆ|ƒ t | d	¡‡fd
d„ƒ}tˆ d|› �|ƒ d S )Nre   rG   rH   r   c            	   
      s
  t ˆˆˆˆd ˆd ƒ\} }}tdtˆ ƒ�Z tdtˆ ƒ�@ ztˆˆd ˆd d�| ƒ}W n   td| j ƒ‚Y nX W 5 Q R X W 5 Q R X | ˆ¡‰ ‡ fdd	„|D ƒ}‡ fd
d	„|D ƒ}| oÄ| }d ‡fdd	„ˆ  	d¡D ƒ¡}d|› d|› d|› d| j› �}||fS )Nr[   rc   ÚNUMBA_CPU_NAMEÚNUMBA_CPU_FEATURESÚerror_model©r[   r…   zraised while compiling c                    s   g | ]}|ˆ kr|‘qS r4   r4   ©r1   Úpattern©Úasmr4   r5   r>   Ò   s      zITestSVMLGeneration._inject_test.<locals>.run_template.<locals>.<listcomp>c                    s   g | ]}|ˆ kr|‘qS r4   r4   r‡   r‰   r4   r5   r>   Ó   s      rI   c                    s$   g | ]}ˆ j  |¡rd |kr|‘qS )ú")Ú
asm_filterÚsearch)r1   Úline)r~   r4   r5   r>   Ö   s     ÿzWhile expecting z	 and not z,
it contains:
z
when compiling )
rt   r   Úvlen2cpuÚvlen2cpu_featuresr   rz   rp   Zinspect_asmrO   r;   )	Úfnr_   r`   Z	jitted_fnÚmissedÚfoundr�   Údetailrx   )r~   rX   ÚflagsrY   ÚsigrZ   r‰   r5   Úrun_templateÃ   s2    þ
ÿ
ÿÿ(
ÿÿz5TestSVMLGeneration._inject_test.<locals>.run_templaterc   Zrun_zNot implementedc           	         s¶   t  d¡}| ¡ }|jt| ƒjˆ |gd�}| ¡  |jdd�}|j}|d kr||d kr`|  	d¡ n|dk r||  	d| › d�¡ | j
|dd	d
� | ¡ }|d }|d }| j||d
� d S )NÚspawn)ÚtargetrV   é   )ÚtimeoutzProcess timed out.r   zProcess terminated with signal Ú.zprocess ended unexpectedly)rx   rw   rx   )ÚmpZget_contextÚQueueÚProcessÚtyper‚   ÚstartrO   ÚexitcodeZfailÚassertEqualÚgetÚ
assertTrue)	ÚselfÚctxÚqr=   Zterm_or_timeoutr¢   Úoutrw   rx   )r   r4   r5   Útest_runnerã   s     
z4TestSVMLGeneration._inject_test.<locals>.test_runnerZtest_)rP   ÚnumbaZint64Ústaticmethodrd   ÚsetattrÚunittestÚ
skipUnless)	r~   rX   rY   rZ   r•   Zskippedr—   Zpostfixrª   r4   )r~   rX   r•   rY   r–   r   rZ   r5   Ú_inject_testº   s    
zTestSVMLGeneration._inject_testc                 C   s|   ddddœddddœg}dD ]6}t D ],}|D ]"}dD ]}|  |||t|ƒ¡ q4q,q$qd	D ]}t| |td
ƒt| |ƒƒƒ qXd S )NFrG   Zusecase)r[   r…   rc   TZfastmath_usecase)rL   Úfloat64rK   rN   )rC   rJ   r   rG   )Ztest_int32_range4_usecaseZ	important)r�   r°   Údictr­   r   ry   )r~   Z	flag_listrX   rZ   r•   rY   Únr4   r4   r5   Úautogenerateû   s    ÿÿþzTestSVMLGeneration.autogenerateN)Ú__name__Ú
__module__Ú__qualname__rp   Ú_numba_parallel_test_ÚreÚcompilerO   ÚlistÚ
svml_funcsrŒ   Úclassmethodr‚   r°   r´   r4   r4   r4   r5   ru   §   s   
	
@ru   c                 C   s
   t  | ¡S ©N)Úmathr   )rf   r4   r4   r5   Úmath_sin_scalar  s    rÀ   c                 C   s6   t j| t jd�}t| ƒD ]}t t  |¡¡||< q|S )N©rX   )ÚnpÚemptyr±   rJ   r¿   r   )r³   rg   rf   r4   r4   r5   Úmath_sin_loop  s    rÄ   c                       sd   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Z‡  ZS )ÚTestSVMLz  Tests SVML behaves as expected Fc                    sB   t ƒ | _d| j_t ƒ | _d| j_t d¡| j_tt| ƒj	|Ž  d S )NT)
r	   r•   ZnrtÚ	fastflagsr   ZFastMathOptionsr[   ÚsuperrÅ   Ú__init__)r¦   rV   ©Ú	__class__r4   r5   rÈ   "  s    zTestSVML.__init__c                 O   sB   |rt ‚tdd„ |D ƒƒ}t||| jd�}t||| jd�}||fS )Nc                 S   s   g | ]}t  |¡‘qS r4   )r«   Ztypeof)r1   rf   r4   r4   r5   r>   .  s     z$TestSVML.compile.<locals>.<listcomp>)r•   )rQ   Útupler   r•   rÆ   )r¦   rU   rV   Úkwargsr–   ÚstdÚfastr4   r4   r5   rº   ,  s
    zTestSVML.compilec                 G   sz   |s
t ƒ S g }|D ]^}t|tjƒr4| | d¡¡ qt|tjƒrP| | ¡ ¡ qt|tjƒrh| |¡ qt	dƒ‚qt |ƒS )Nr2   z%Unsupported argument type encountered)
rË   Ú
isinstancerÂ   ZndarrayÚappendÚcopyÚnumberÚnumbersÚNumberÚ
ValueError)r¦   rV   Únew_argsrf   r4   r4   r5   Ú	copy_args5  s    
zTestSVML.copy_argsc              
   O   sú   | j |f|žŽ \}}| dd ¡}| dd ¡}| dd¡}| dd¡}	|| j|Ž Ž }
|j| j|Ž Ž }|j| j|Ž Ž }tjj||
f|Ž tjj||
f|Ž td|ƒ�P td|	ƒ�: | j |f|žŽ \}}|rÒ|  ||¡ |râ|  ||¡ W 5 Q R X W 5 Q R X d S )	NÚstd_patternÚfast_patternÚcpu_namer   Úcpu_featuresr   rƒ   r„   )	rº   Úpopr×   Úentry_pointrÂ   ÚtestingZassert_almost_equalr   Úcheck_svml_presence)r¦   ZpyfuncrV   rÌ   ZjitstdZjitfastrØ   rÙ   rÚ   rÛ   Zpy_expectedZjitstd_resultZjitfast_resultr4   r4   r5   ÚcheckD  s$    ÿzTestSVML.checkc                 C   s   |j  ¡ }|  ||¡ d S r¾   )ZlibraryZget_asm_strZassertIn)r¦   rU   rˆ   rŠ   r4   r4   r5   rß   f  s    
zTestSVML.check_svml_presencec                 C   s2   t jr
dnd}| jtd|d� | jtd|d� d S )Nz$_sinz$sing      @)rØ   )rÙ   )r   rT   rà   rÀ   )r¦   Úpatr4   r4   r5   Útest_scalar_contextj  s    zTestSVML.test_scalar_contextc                 C   s   d}d}| j td||d� d S )Nz__svml_sin8_ha,z__svml_sin8,é
   )rØ   rÙ   )rà   rÄ   )r¦   rÍ   rÎ   r4   r4   r5   Ú	test_svmlp  s    zTestSVML.test_svmlc                 C   sP   d}t jtjd|gt jt jd�}| ¡ \}}|jdkrLtd|j| ¡ f ƒ‚d S )NaÈ  if 1:
            import os
            import numpy as np
            import math

            def math_sin_loop(n):
                ret = np.empty(n, dtype=np.float64)
                for x in range(n):
                    ret[x] = math.sin(np.float64(x))
                return ret

            def check_no_svml():
                try:
                    # ban the use of SVML
                    os.environ['NUMBA_DISABLE_INTEL_SVML'] = '1'

                    # delay numba imports to account for env change as
                    # numba.__init__ picks up SVML and it is too late by
                    # then to override using `numba.config`
                    import numba
                    from numba import config
                    from numba.core import cpu
                    from numba.tests.support import override_env_config
                    from numba.core.compiler import compile_isolated, Flags

                    # compile for overridden CPU, with and without fastmath
                    with override_env_config('NUMBA_CPU_NAME', 'skylake-avx512'),                          override_env_config('NUMBA_CPU_FEATURES', ''):
                        sig = (numba.int32,)
                        f = Flags()
                        f.nrt = True
                        std = compile_isolated(math_sin_loop, sig, flags=f)
                        f.fastmath = cpu.FastMathOptions(True)
                        fast = compile_isolated(math_sin_loop, sig, flags=f)
                        fns = std, fast

                        # assert no SVML call is present in the asm
                        for fn in fns:
                            asm = fn.library.get_asm_str()
                            assert '__svml_sin' not in asm
                finally:
                    # not really needed as process is separate
                    os.environ['NUMBA_DISABLE_INTEL_SVML'] = '0'
                    config.reload_config()
            check_no_svml()
            z-c)ÚstdoutÚstderrr   z/process failed with code %s: stderr follows
%s
)	Ú
subprocessÚPopenÚsysÚ
executableÚPIPEÚcommunicateÚ
returncoderQ   Údecode)r¦   ÚcodeÚpopenr©   Úerrr4   r4   r5   Útest_svml_disabledw  s    .
 þ
ÿÿzTestSVML.test_svml_disabledc                 C   s<   t dhdd�dd„ ƒ}|dƒ |  d| |jd ¡k¡ d S )	NrÎ   rG   r†   c                 S   sL   t j| d t jd�}t  |¡}t|jƒD ]}||  t || ¡7  < q(|S )Nr   rÁ   )rÂ   rÃ   r±   Z
empty_likerJ   Úsizer¿   r    )r³   rf   rg   Úir4   r4   r5   Úimpl°  s
    
z@TestSVML.test_svml_working_in_non_isolated_context.<locals>.implé   Zintel_svmlccr   )r   r¥   Zinspect_llvmZ
signatures)r¦   rõ   r4   r4   r5   Ú)test_svml_working_in_non_isolated_context¯  s    
z2TestSVML.test_svml_working_in_non_isolated_context)rµ   r¶   r·   rp   r¸   rÈ   rº   r×   rà   rß   râ   rä   rò   r÷   Ú__classcell__r4   r4   rÉ   r5   rÅ     s   
	"8rÅ   Ú__main__)rB   )Cr¿   rG   rÂ   rç   rÓ   Ú	importlibré   r¹   r{   Úmultiprocessingr�   Ú	itertoolsr   r   r«   Z
numba.corer   r   r   r   Znumba.core.compilerr   r	   Znumba.tests.supportr
   r   r   r®   r¯   Z
USING_SVMLZ
needs_svmlr�   r�   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r'   r(   r,   r-   r.   r¼   rl   Úitemsri   rj   ra   rd   rt   ru   r´   rÀ   rÄ   rÅ   rµ   Úmainr4   r4   r4   r5   Ú<module>   sž   ÿ










×,
+e  
