Numpy: NumPy рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрд┐рдд рдЖрд╡рдВрдЯрдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 26 рдирд╡ре░ 2014  ┬╖  68рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: numpy/numpy

32-рдмрд┐рдЯ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде NumPy 1.9 рдореЗрдВ f2py рдкреНрд░рддрд┐рдЧрдорди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдХреНрдпрд╛ NumPy рдХреЛ рдПрдХ рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЧрд╛рд░рдВрдЯреА рд╕рдВрд░реЗрдЦрдг рджреЗрддрд╛ рд╣реИред

https://github.com/scipy/scipy/issues/4168

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдореИрдВ рдПрдХ FPGA рдбрд┐рд╡рд╛рдЗрд╕ (Altera A10GX) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдЬрд╣рд╛рдБ DMA рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ 64-рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣ рдореЗрд░реЗ рдХреЛрдб рдХреЛ 40x (!!!) рддрдХ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ @nachiket рдореЗрдВ рднреА рдореЗрд░реЗ рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ @eamartin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рд╣реИрдХ рд╣реИред

рд╕рднреА 68 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣рд╛рдВ рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдмреЗрд╢рд░реНрдореА рд╕реЗ рдЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:

https://sites.google.com/site/ruslancray/lab/bookshelf/interview/ci/low-level/write-an-aligned-malloc-free-function

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╕рдорд╛рди рдХреЛрдб рдиреЗрдЯ рдкрд░ рдЪрд╛рд░реЛрдВ рдУрд░ рддреИрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдареАрдХ рд╣реИред (рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ realloc рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред)

рдЗрд╕ рдХреЛрдб рдХреЛ numpy/core/include/numpy/ndarraytypes.h рдЧрд┐рд░рд╛рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣реМрд╕рд▓реЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд ndarrays рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдареАрдХ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИрдВред

рдпрд╣ рдордВрдЪ рд╕реНрд╡рддрдВрддреНрд░ рдХреЛрдб рд╕рдВрднрд╡рддрдГ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ posix_memalign() POSIX рдкрд░ рдФрд░ _aligned_malloc() рд╡рд┐рдВрдбреЛрдЬ рдкрд░ред рд╣рд╛рд▓рд╛рдВрдХрд┐, posix_memalign() realloc() рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рд╣реИред

#define NPY_MEMALIGN 32   /* 16 for SSE2, 32 for AVX, 64 for Xeon Phi */ 

static NPY_INLINE
void *PyArray_realloc(void *p, size_t n)
{
    void *p1, **p2, *base;
    size_t old_offs, offs = NPY_MEMALIGN - 1 + sizeof(void*);    
    if (NPY_UNLIKELY(p != NULL)) {
        base = *(((void**)p)-1);
        if (NPY_UNLIKELY((p1 = PyMem_Realloc(base,n+offs)) == NULL)) return NULL;
        if (NPY_LIKELY(p1 == base)) return p;
        p2 = (void**)(((Py_uintptr_t)(p1)+offs) & ~(NPY_MEMALIGN-1));
        old_offs = (size_t)((Py_uintptr_t)p - (Py_uintptr_t)base);
        memmove(p2,(char*)p1+old_offs,n);    
    } else {
        if (NPY_UNLIKELY((p1 = PyMem_Malloc(n + offs)) == NULL)) return NULL;
        p2 = (void**)(((Py_uintptr_t)(p1)+offs) & ~(NPY_MEMALIGN-1));   
    }
    *(p2-1) = p1;
    return (void*)p2;
}    

static NPY_INLINE
void *PyArray_malloc(size_t n)
{
    return PyArray_realloc(NULL, n);
}

static NPY_INLINE
void *PyArray_calloc(size_t n, size_t s)
{
    void *p;
    if (NPY_UNLIKELY((p = PyArray_realloc(NULL,n*s)) == NULL)) return NULL;
    memset(p, 0, n*s);
    return p;
}

static NPY_INLINE        
void PyArray_free(void *p)
{
    void *base = *(((void**)p)-1);
    PyMem_Free(base);
} 

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╢рд╛рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЧрдардмрдВрдзрди рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЦреЛрджреВрдВрдЧрд╛ред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЕрдЬрдЧрд░ рдЯреНрд░реЗрд╕рдореИрд▓реЛрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рд╡рд┐рд░рд▓ рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ (рдХреЛрдИ align_calloc рдирд╣реАрдВ рд╣реИ)ред
@njsmith рдХреНрдпрд╛ рдЖрдк рдЕрдЬрдЧрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ? рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП calloc рдЬреЛрдбрд╝рд╛, рдЕрдЧрд░ рд╣рдо рдЕрдм рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдПрдХ schame рд╣реЛрдЧрд╛ред

рд╕рдВрднрд╡рддрдГ PyMemAllocatorEx рдХреЗ рд╕рдВрджрд░реНрдн рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рдореЗрдВ рдХреЛрдИ рднреА рдкрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рд▓реЗрдХрд┐рди NumPy рдХреЛ 2.6 рдФрд░ рдКрдкрд░ рдХреЗ рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП Python 3.5 рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 3.5 рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рдЕрдЬрдЧрд░ рджреЗрд╡реЛрдВ рд╕реЗ рдЙрд▓рдЭрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ,
рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрд░реЗрдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ
рдирд┐рдХрдЯ рдЕрд╡рдзрд┐ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛ред рдпрд╣ рд╕рдВрднрд╡рддрдГ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрд░рдЪрдирд╛ {
рдбрдмрд▓, рдбрдмрд▓} рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ win32 рдпрд╛ рдкрд░ рдмреЗрд╣рддрд░-рд╕реЗ-рдорд╛рд▓реЛрдХ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рд╕реНрдкрд╛рд░реНрдХ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдпрд╣ рд╕рдЪ рд╣реЛрддрд╛ рддреЛ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ред
26 рдирд╡рдВрдмрд░ 2014 09:10 рдХреЛ, "рдЬреВрд▓рд┐рдпрди рдЯреЗрд▓рд░" рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╢рд╛рдЦрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЧрдардмрдВрдзрди рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЦреЛрджреВрдВрдЧрд╛ред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдк рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ
рдЯреНрд░реЗрд╕рдореИрд▓реЛрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рд╡рд┐рд░рд▓ рдореЗрдореЛрд░реА (рдХреЛрдИ рдПрд▓рд╛рдЗрди_рдХреЙрд▓реЛрдХ рдирд╣реАрдВ рд╣реИ)ред
@njsmith https://github.com/njsmith рдЖрдк рд╕рд╛рде рдЬреБрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗ
рдЕрдЬрдЧрд░ рдлрд┐рд░ рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд▓реЙрдЯ рдореЗрдВ 3.5 рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдФрд░ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рджреЗрд╡рддрд╛ рд╣реИ
рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛? рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреЙрд▓реЛрдХ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдПрдХ schame рд╣реЛрдЧрд╛
рдЕрдм рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312#issuecomment -64534021

F2py рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреНрд░рд╢реНрди рдпрд╣ рдерд╛ рдХрд┐ рдлреЛрд░реНрдЯрди рдХреЛ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд╕реАред рд╕реНрдкреАрдб рдХреА рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХрддрд╛ рднреА рдПрдХ рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдбреЗрдЯрд╛ рдареАрдХ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реИ, рддреЛ рдЕрдиреБрдХреНрд░рдордг рдФрд░ SIMD рджреЛрдиреЛрдВ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрд░реЗрдЦрд┐рдд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдХрд╛рд░рдг рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрддрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ SSE / AVX рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реИ
рд╕рдВрдЧрддрддрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдиреЗ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рджреВрд░ рдХрд░реЗрдЧреА
рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд░реЗрдЦрд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрдеред
ред
f2py рдлреЛрд░рдЯреНрд░рд╛рди рдореЗрдВ рдЖрдИрдПрд╕рдУ рд╕реА рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдорд╛рдирдХ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ
рдХрд╛рдо рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдлреЛрд░рдЯреНрд░рд╛рди рдХреА рдЬрдЧрд╣ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИ
C рдХреЗ рд╕рд╛рде, рд╕рднреА рджреНрд╡рд╛рд░рд╛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЕрдиреБрднрд╡ рдХреЗ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ, рдпрд╣ рд╣реИ
рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдореЙрд▓реЛрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рдВрд░реЗрдЦрдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
рдлреЛрд░рдЯреНрд░рд╛рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ AVX рдХреЗ рд▓рд┐рдП рдЗрдВрдЯреЗрд▓ рджреНрд╡рд╛рд░рд╛ 32-рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрдг рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИ: https://software.intel.com/en-us/articles/practical-intel-avx-optimization-on-2nd-generation-intel-core-processors

Xpon Phi рдХреЗ рд▓рд┐рдП NPY_MEMALIGN рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдкреАрдЫреЗ рдХреА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред

рд╕рдВрд░реЗрдЦрд┐рдд рдЖрд╡рдВрдЯрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдкрд░ рдореБрдЦреНрдп рдЬрдЯрд┐рд▓рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдЯреАрдПрдо рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЯреНрд░реЗрд╕рдореИрд▓реЛрдХ рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рд╣реБрдХ рдпрд╛ рддреЛ рдПрд▓рд╛рдЙрдВрд╕ рдХрд░реЗрдВ, рдЖрд╡рдВрдЯрди рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ,
рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CPython рдЕрдкрд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдордиреНрд╡рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рджреЗрдЦреЗрдВ)

4663)ред

5 рджрд┐рд╕рдВрдмрд░ 2014 рдХреЛ 16:44 рдкрд░, "рд╕реНрдЯрд░реНрд▓рд╛ рдореЛрд▓реНрдбрди" рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@pitrou https://github.com/pitrou рдФрд░ Xeon рдХреЗ рд▓рд┐рдП 64 рдмрд┐рдЯ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ
рдлреАред NPY_MEMALIGN рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдкреАрдЫреЗ рдХреА рдЯрд┐рдкреНрдкрдгреА рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ
рдореЗрд░рд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312#issuecomment -65816753

рддреЛ рд╕реАрдкреАрдереЙрди рдореБрджреНрджрд╛ http://bugs.python.org/issue18835 рдкрд░ рд╣реИред

Realloc () рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, 3.5 рд╕рдордп рд╕реАрдорд╛ рдореЗрдВ CPython рдХреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдирд╛ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред Numpy рдХреЛ рд╕рдВрднрд╡рддрдГ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд░реЗрдЦрд┐рдд рдЖрдмрдВрдЯрд┐рдд рд░реИрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЬреЛ PyMem API рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЯреНрд░реЗрд╕рдЕрд▓реНрдореЙрдХ рдХрд╛ рд▓рд╛рдн рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡реИрд╕реЗ рднреА)ред

рдРрд╕реЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдКрдкрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред рдореБрдЭреЗ @juliantaylor рдХрд╛ рддрд░реНрдХ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛, рд▓реЗрдХрд┐рди рд╡рд╣ рд╢рд╛рдпрдж рдЗрд╕реЗ рдореБрдЭрд╕реЗ рдмреЗрд╣рддрд░ рд╕рдордЭрддрд╛ рд╣реИред

рдореИрдВ рд╕рдордЭ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рд╡рд╣ calloc рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рдерд╛ред рдПрдХ calloc рдмрд╕ рдПрдХ malloc рдФрд░ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ memset рдирд╣реАрдВ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╡реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдВ, рдкрдиреНрдиреЛрдВ рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ OS рдХреЛ OS рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред AFAIK рдХреЛрдИ PyMem_Calloc рдирд╣реАрдВ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ CPython 3.5 рдореЗрдВ PyMem_Calloc рдФрд░ рдорд┐рддреНрд░ рд╣реИрдВред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @juliantaylor OS рдлрд╝рдВрдХреНрд╢рди (posix_memalign, рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИред

рд╡реИрд╕реЗ @sturlamolden , рдЖрдкрдХрд╛ рд╕реНрдирд┐рдкреЗрдЯ PyArray_Malloc рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд░рдгреА рдЖрд╡рдВрдЯрди PyDataMem_NEW рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рд╕рдордЭ рд░рд╣рд╛ рд╣реВрдБ?

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЫреЛрдЯреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрд┐рдд рдЖрд╡рдВрдЯрди рдмреЗрдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдиреАрдЪреЗ рдПрдХ рджрд╣рд▓реАрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдорд╛рдирдХ рдЖрд╡рдВрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрд░реЗрдЦрдг рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ NumPy 1.9 рдореЗрдВ PyArray_malloc рдФрд░ PyArray_free рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред NumPy 1.10 рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдпрдХреАрди рд╣реИ? PyArray_NewFromDescr_int () рдХреЙрд▓ npy_alloc_cache () рдФрд░ npy_alloc_cache () рдХреЙрд▓ PyDataMem_NEW ()ред

Numpy рдореЗрдВ рдХрдИ рдЖрд╡рдВрдЯрди рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ
names. PyArray_malloc / free рдХрд╛ рдЙрдкрдпреЛрдЧ "рдирд┐рдпрдорд┐рдд" рдЖрд╡рдВрдЯрди (рдЬреИрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ) рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
structs)ред рдбреЗрдЯрд╛ рдмрдлрд╝рд░реНрд╕ (ndarray -> рдбреЗрдЯрд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕, рдЕрд╕реНрдерд╛рдпреА рдмрдлрд╝рд░ рдЕрдВрджрд░
ufuncs, рдЖрджрд┐), рд╣рд╛рд▓рд╛рдВрдХрд┐, PyDataMem_NEW рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

Thu рдкрд░, 15 рдЬрдирд╡рд░реА, 2015 рдХреЛ 7:48 PM, Sturla Molden рд╕реВрдЪрдирд╛рдПрдВ @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдЖрд╡рдВрдЯрди рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдХреЛ Numpy 1.9 рдореЗрдВ PyArray_malloc рдФрд░ PyArray_free рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312#issuecomment -70149126ред

рдирд╛рдердирд┐рдпрд▓ рдЬреЗред рд╕реНрдорд┐рде
рдкреЛрд╕реНрдЯрдбреЙрдХреНрдЯрд░рд▓ рд╢реЛрдзрдХрд░реНрддрд╛ - рд╕реВрдЪрдирд╛ рд╡рд┐рдЬреНрдЮрд╛рди - рдПрдбрд┐рдирдмрд░реНрдЧ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп
http://vorpus.org

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ PyDataMem_NEW рдирдВрдмрд░ malloc NumPy 1.9 рдореЗрдВ рд╣реИред
https://github.com/numpy/numpy/blob/3975e095013119cfdbb9405ca95e6c723eb862d3/numpy/core/src/multiarray/alloc.c

@njsmith рд╣рд╛рдБ, рд╣рдореЗрдВ рдХрд┐рд╕реА рджрд┐рди рдЖрд╡рдВрдЯрди рдореИрдХреНрд░реЛ рдХреЛ рддрд░реНрдХрд╕рдВрдЧрдд рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ... рдореИрдВ ndarray (IIRC) рдХреЗ рд▓рд┐рдП рдЖрдпрд╛рдо рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред

рдореИрдВрдиреЗ рдПрдХ рдкреИрдЪ рдХреЗ рд╕рд╛рде PR # 5457 рдмрдирд╛рдпрд╛ред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдЪреНрдЫреА рд╣реЛрдЧреАред

рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рд╕рдВрд░реЗрдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИ
рдЦрд╕рд░рд╛ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛

рд╢реБрдХреНрд░ рдкрд░, 16 рдЬрдирд╡рд░реА, 2015 рдХреЛ 7:15 рдмрдЬреЗ, рдПрдВрдЯреЛрдиреА рдкрд┐рдЯреНрд░реВ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореИрдВрдиреЗ рдПрдХ рдХреЗ рд╕рд╛рде PR # 5457 https://github.com/numpy/numpy/pull/5457 рдмрдирд╛рдпрд╛
рдкреИрдЪред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдЪреНрдЫреА рд╣реЛрдЧреАред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312#issuecomment -70305997

рдирд╛рдердирд┐рдпрд▓ рдЬреЗред рд╕реНрдорд┐рде
рдкреЛрд╕реНрдЯрдбреЙрдХреНрдЯрд░рд▓ рд╢реЛрдзрдХрд░реНрддрд╛ - рд╕реВрдЪрдирд╛ рд╡рд┐рдЬреНрдЮрд╛рди - рдПрдбрд┐рдирдмрд░реНрдЧ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп
http://vorpus.org

Numba рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ AVX рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЗрд╖реНрдЯрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП 32-рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрд╡реАрдПрдХреНрд╕ рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде рдиреЗрдореНрдкреА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ), рд╕рдВрд░реЗрдЦрдг рдореЗрдВ рднреА рдЕрдВрддрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ рдмрд╛рд╣рд░, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдорд╛рдк рд╣реИ? рдореИрдВ рд╡рд╣рд╛рдВ b / c рдкреВрдЫрддрд╛ рд╣реВрдВ
рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░рдХ рд╣реИрдВ рдЬреЛ рдЗрди рдЪреАрдЬреЛрдВ рдореЗрдВ рдЦреЗрд▓рддреЗ рд╣реИрдВ (рд╡рд┐рднрд┐рдиреНрди рдЙрдкрд░рд┐ / рдЧрддрд┐
рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгреА рдЖрдХрд╛рд░ рдореЗрдВ рдЯреНрд░реЗрдб-рдСрдлрд╝, рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрдЯрд░ рдХрд╛ рд╡рд┐рд╡рд░рдг - рдЬреЛ
рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгреА рдЖрдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдп рднреА рдХрд░рддреЗ рд╣реИрдВ - рдЖрджрд┐) рдЬреЛ рдореБрдЭреЗ рдХрдард┐рди рд▓рдЧрддрд╛ рд╣реИ
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЛрдИ 0.5% рдПрдВрдб-рдЯреВ-рдПрдВрдб рд╕реНрдкреАрдбрдЕрдк рдпрд╛ 50% рдХреА рддрд░рд╣ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ
рдПрдВрдб-рдЯреВ-рдПрдВрдб рд╕реНрдкреАрдбрдЕрдк рдпрд╛ рдХреНрдпрд╛ред

рд╢реБрдХреНрд░ рдкрд░, 16 рдЬрдирд╡рд░реА, 2015 рдХреЛ рд░рд╛рдд 8:16 рдмрдЬреЗ, рдПрдВрдЯреЛрдиреА рдкрд┐рдЯреНрд░реВ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

Numba рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдХрд┐ AVX рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП 32-рдмрд╛рдЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА
рдЗрд╖реНрдЯрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрдгред рдпрджрд┐ рдЖрдк AVX рд╕рдХреНрд╖рдо рдХреЗ рд╕рд╛рде Numpy рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
(рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдХрд▓рдХ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ), рд╕рдВрд░реЗрдЦрдг рдХреЛ рдПрдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЕрдВрддрд░ рднреАред

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312#issuecomment -70315434ред

рдирд╛рдердирд┐рдпрд▓ рдЬреЗред рд╕реНрдорд┐рде
рдкреЛрд╕реНрдЯрдбреЙрдХреНрдЯрд░рд▓ рд╢реЛрдзрдХрд░реНрддрд╛ - рд╕реВрдЪрдирд╛ рд╡рд┐рдЬреНрдЮрд╛рди - рдПрдбрд┐рдирдмрд░реНрдЧ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп
http://vorpus.org

рдореЗрд░реЗ i5-4210u рдкрд░ fwiw рдореБрдЭреЗ 16 рдФрд░ 32 рдмрд╛рдЗрдЯ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд▓реЛрдб рдРрдб рд╕реНрдЯреЛрд░ рдЯреЗрд╕реНрдЯ рдореЗрдВ, рдиреНрдпреВрдирддрдо рдЪрдХреНрд░ рдЧрдгрдирд╛ 5% рд╕реЗ рдХрдо рд▓рдЧрддреА рд╣реИ рд▓реЗрдХрд┐рди рдорд╛рдзреНрдпрд┐рдХрд╛ рдФрд░ 10 рд╡реАрдВ рдкреНрд░рддрд┐рд╢рдд 1% рдХреЗ рд╕рдорд╛рди рд╣реИ

AVX рдХреЗ рд╕рд╛рде рд╣реИ?

@seibert рдиреЗ Numba рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП Numba (рдпрд╛рдиреА LLVM рдХреЗ рд╕рд╛рде рдмрд╕-рдЗрди-рдЯрд╛рдЗрдо рдХреЛрдб рдЬреЗрдирд░реЗрд╢рди) рдХреЗ рд╕рд╛рде рдХреБрдЫ AVX рдорд╛рдк рдХрд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ :-)

рдпрд╣рд╛рдБ рдирд╡реАрдирддрдо Numba рдорд╛рд╕реНрдЯрд░ рдХреЗ рд╕рд╛рде рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИ:

http://nbviewer.ipython.org/gist/seibert/6957baddc067140e55fe

Float32 рд╕рд░рдгрд┐рдпреЛрдВ (рдЖрдХрд╛рд░ = 10000) рдХреЗ рд▓рд┐рдП, a + b * fabs(a) рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ Intel Core i7-4820K CPU @ 3.70GHz (Ivy Bridge) рдкрд░ 40% рдЕрдВрддрд░ рджреЗрдЦрддреЗ рд╣реИрдВред

(рд╣рдо рдереЛрдбрд╝рд╛ рд╣реИрд░рд╛рди рд╣реИрдВ рдХрд┐ рдПрд▓рдПрд▓рд╡реАрдПрдо 3.5 рдСрдЯреЛрд╡реИрдХреНрдЯрд░рд╛рдЗрдЬрд╝рд░ рд╕рдВрд░реЗрдЦрдг рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд▓реВрдк рдЫреАрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬреАрд╕реАрд╕реА рдпрд╛ рдХреНрд▓реИрдВрдЧ рд╕рд╣реА рд╣реИред)

рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╣рдо рд▓рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдХрд┐ рдПрдПрдордбреА рдПрдкреАрдпреВ рдЬреЛ рдПрдЪрдПрд╕рдП рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ), рд╕рдВрд░реЗрдЦрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдЕрдзрд┐рдХ рд╕рдЦреНрдд рд╣реИрдВ, рдУрдкрдирд╕реАрдПрд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП 256 рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрдг рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ 40% рдПрдХ рдЕрддреНрдпрдзрд┐рдХ рджрдВрдб рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ рдПрдХ i5 рд╣реИрд╕рд╡реЗрд▓ рдкрд░ рд╢реВрдиреНрдп рджреЗрдЦрддрд╛ рд╣реВрдВ (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдПрд╡реАрдПрдХреНрд╕ рдкреНрд░рджрд░реНрд╢рди рд╣реИ)
рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЬреЗрдЯ рдХрдВрдкрд╛рдЗрд▓рд░ рд▓реВрдк рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛ рд░рд╣рд╛ рд╣реЛ?
рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рдЕрд╕реЗрдВрдмрд▓реА рд▓реЗрд╡рд▓ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)?

рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯрд░реНрдмреЛ рдмреВрд╕реНрдЯ рджреВрд╕рд░реЗ рд▓реВрдк рдкрд░ рдХрд┐рдХ рдХрд░ рд░рд╣рд╛ рд╣реЛ, рдЗрд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдирд╛ рдпрд╛ рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛ рд╡рд╣ рд╢рд╛рдореВ рдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ

рдЪреВрдВрдХрд┐ рд╣рдо рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ BIOS рдореЗрдВ TurboBoost рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджрд┐рдпрд╛ рд╣реИред

JIT рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓ рд░рд╣реА рд╣реИ (рдПрдХ рдмрд╛рд░ рдЬрдм Numba рджрд┐рдП рдЧрдП рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИ), рдФрд░ JIT рдХреЛ рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдиреЛрдЯрдмреБрдХ рдореЗрдВ рд╕реЗрд▓ 6 рджреНрд╡рд╛рд░рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕рд╣реА рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рджреЗрдЦреВрдВрдЧрд╛ред рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреИрд╕реЗ рдирд┐рднрд╛рдП? (рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдореНрдореАрдж рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдИ-рдмреНрд░рд┐рдЬ рдЙрдкрд▓рдмреНрдз рдПрд▓ 2 рдХреИрд╢ рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреЗ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдХреНрд╖рдореНрдп рдЙрдкрдпреЛрдЧ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рддреЛ рдЖрдЗрд╡реА рдмреНрд░рд┐рдЬ рд╕реЗ рдмреЗрд╣рддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╕рд╡реЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред)

рдЗрдВрдЯреЗрд▓ рдХрд╛ рдпрд╣ рд╢реНрд╡реЗрддрдкрддреНрд░ рдкреГрд╖реНрда 6 рдХреЗ рддрд▓ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдореБрджреНрджреЗ рдкрд░ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ:

https://software.intel.com/sites/default/files/m/d/4/1/d/8/Practical_Optimization_with_AVX.pdf

Unalign 32-byte vectors рдкрд░ Intel AVX рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рд░ рджреВрд╕рд░рд╛ рд▓реЛрдб рдХреИрд╢рд▓рд╛рдЗрди рд╡рд┐рднрд╛рдЬрди рдкрд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреИрд╢ рд▓рд╛рдЗрди 64 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдпрд╣ 16-рдмрд╛рдЗрдЯ рд╡реИрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ Intel SSE рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреИрд╢ рд▓рд╛рдЗрди рд╡рд┐рднрд╛рдЬрди рджрд░ рдХреЛ рджреЛрдЧреБрдирд╛ рдХрд░рддрд╛ рд╣реИред рдореЗрдореЛрд░реА-рдЗрдВрдЯреЗрдВрд╕рд┐рд╡ рдХреЛрдб рдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ рдХреИрд╢-рд▓рд╛рдЗрди рд╕реНрдкреНрд▓рд┐рдЯ рджрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛ рдХрд╛рд░рдг рд╣реИред рдЙрд╕ рдХрд╛рд░рдг рд╕реЗ, рдЗрдВрдЯреЗрд▓ AVX рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ 32 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рд╣реИрд╡реЗрд▓ рдХреЗ рдкрд╛рд╕ рд╕реИрдВрдбреА / рдЖрдЗрд╡реА рдмреНрд░рд┐рдЬ рдХреЗ L2 рдХреИрд╢ рдмреИрдВрдбрд╡рд┐рдбреНрде рдХрд╛ рджреЛрдЧреБрдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдорд┐рд╕рд▓ рдкрд░ рджрд┐рдП рдЧрдП рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдП рдЧрдП рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдорд╣рддреНрд╡рдкреВрд░реНрдг рди рд╣реЛ ...

рдореЗрд░рд╛ рд╕рд░рд▓ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдпрд╣ рд╣реИ:
https://gist.github.com/juliantaylor/68e578d140f427ed80bb
рдЙрд╕ i7 рдкрд░ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛

рдПрдХ рдХреЛрд░ i5-2500K (рд╕реИрдВрдбреА рдмреНрд░рд┐рдЬ) рдкрд░ рдкрд░рд┐рдгрд╛рдо:
4644 6656 7704 10100

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореБрдЭреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рд▓рдВрдмрд╛ рд╡рд╛рд░реНрдордЕрдк рдЪрд░рдг рдЬреЛрдбрд╝рдирд╛ рдерд╛:

    for (i=0; i<10; i++)
        add(a, 1);

рдХреНрдпрд╛ рд╡рд╣ рдФрд╕рдд / рдордВрдЭрд▓рд╛ / ... рд╣реИ? рдпрд╣ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдВрдЯреЗрд▓ рдиреЗ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ рд▓реВрдк рдореЗрдВ рдХреБрдЫ рд╕реИрдХрдбрд╝реЛрдВ рд░рдиреЛрдВ рдХреЗ рдмрд╛рдж рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реЗ рд▓рдЧрднрдЧ рд╕реНрдерд┐рд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рдкреИрдХ SSE2 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝рд╛, рдпрд╣рд╛рдВ рдЖрдВрдХрдбрд╝реЗ (i5-2500K) рд╣реИрдВ:
4660 6492 7468 5108 10096
(32B рд╕рдВрд░реЗрдЦрд┐рдд AVX, 16B (рд╕рдВрдпреБрдХреНрдд рд░рд╛рд╖реНрдЯреНрд░) рдиреЗ AVX, 8B (рд╕рдВрдпреБрдХреНрдд рд░рд╛рд╖реНрдЯреНрд░) рдХреЛ AVX, рд╕рдВрд░реЗрдЦрд┐рдд SSE2, рд╕реНрдХреЗрд▓ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ред

рдпрд╣рд╛рдБ рдЕрджреНрдпрддрди рд╕реНрд░реЛрдд рд╣реИ: https://gist.github.com/pitrou/892219a7d4c6d37de201

рдХреЛрд░ i5-4200U (рд▓реИрдкрдЯреЙрдк рд╣реИрд╕рд╡реЗрд▓ рд╕реАрдкреАрдпреВ) рд╕реЗ рд▓рдЧрднрдЧ рд╕реНрдерд┐рд░ рдЖрдЙрдЯрдкреБрдЯ:
4120 4152 4148 4260 7308

рдХрдо рд╕реЗ рдХрдо рдпрд╣рд╛рдБ, рдорд┐рд╕ рдПрд╡реАрдПрдХреНрд╕ рдХреЛ рд╕рдорд╛рди рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде SSE2 рд╕реЗ рдмрджрддрд░ рдирд╣реАрдВ рд╣реИред

рдпрд╣рд╛рдБ рдореЗрд░рд╛ MBP (рдХреНрд╡рд╛рдб-рдХреЛрд░ i7-3635QM, 2.4 GHz, Ivy Bridge) рд╣реИ:
5060 4932 5820 5704 5040

рдореБрдЭреЗ avxintrin.h рд╕реЗ immintrin.h рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ рдФрд░ Intel icc рд╕реЗ рд╕рдВрдХрд▓рди рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ gcc 4.8.1 рдиреЗ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ (рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреНрд▓реИрдВрдЧ рдХрд┐рдпрд╛)ред

@sturlamolden , рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдХрд░ рд░рд╣рд╛ рд╣реИ?

(рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕рдВрднрд╡рддрдГ рдХреИрд╢ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЕрдзрд┐рдХ рджрдмрд╛рд╡ рдбрд╛рд▓реЗрдЧрд╛ рдпрджрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдирдкреБрдЯ рдПрд░реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ)

рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред

@sturlamolden рдпрд╣ рдХреЛрдб рдХреБрдЫ SSE2 рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдерд╛ред

рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдПрдХ рдореБрджреНрджрд╛ рдерд╛ (рд╡реАрд╕реА рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдг, рдЬрд┐рд╕рдореЗрдВ 2015 рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ) рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ

memmove((void*)p2,p1+old_offs,n);    

рдЪреВрдБрдХрд┐ рд╡реЗ void* рдкрд░ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЕрд▓реНрдкрд╛рд╡рдзрд┐ рдлрд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЧрдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП char* рдХрд╛рд╕реНрдЯ рдХрд┐рдпрд╛ред рдпрд╣ рд╢рд╛рдпрдж рд╕рд╣реА рдирд╣реАрдВ рд╣реИ - рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреНрдпрд╛ рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛?

рдореЗрд░реА рдЧрд▓рддреАред рд╢реВрдиреНрдп рдкрд░ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд * рдЕрд╡реИрдз рд╣реИред рд╕реАред рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯрд┐рдВрдЧ * рд╕рд╣реА рд╣реИред
рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдореИрдВ 64-рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрд┐рдд рд╕реБрдкреАрд░рд┐рдпрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдВ? Https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.require.html рд╕реЗ 'ALIGNED' рдкрддреЗ рдХреБрдЫ рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рд╕рдВрд░реЗрдЦрдг рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ?

рдореИрдВрдиреЗ рдЕрдкрдирд╛ (рдкрд╛рдЗрдерди) рдПрд▓рд╛рдпрдореЗрдВрдЯ рдПрд▓рд╛рдЯреЗрдЯрд░ рдмрдирд╛рдпрд╛ рдЬреЛ рдирдореНрдкреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ (рдЕрдирд▓рд┐рдЬреНрдб) рдореЗрдореЛрд░реА рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

import numpy as np

def empty_aligned(n, align):
    """                                                                                                                                     
    Get n bytes of memory wih alignment align.                                                                                              
    """

    a = np.empty(n + (align - 1), dtype=np.uint8)
    data_align = a.ctypes.data % align
    offset = 0 if data_align == 0 else (align - data_align)
    return a[offset : offset + n]


def test(n):
    for i in xrange(1, 1024):
        b = empty_aligned(n, i)

        try:
            assert b.ctypes.data % i == 0
            assert b.size == n
        except AssertionError:
            print i, b.ctypes.data % i, b.size

рд╢рд╛рдпрдж рдЗрд╕ рддрд░рд╣ рдПрдХ рдкрд╛рдпрдерди рд╕рдорд╛рдзрд╛рди рдПрдХ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╕рдорд╛рдзрд╛рди рд╣реИ?

@eamartin рдпрд╣ NumPy рдХреЗ рдЖрдВрддрд░рд┐рдХ C рдХреЛрдб рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Fortran рджреНрд╡рд╛рд░рд╛ f2py (рднреА C рдХреЛрдб) рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реИред рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, NumPy рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди NumPy рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдпрджреНрдпрдкрд┐ рдЖрдк рдЕрдкрдиреЗ рдкрд╛рдпрдерди рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@sturlamolden : рдпрд╣ @nachiket рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ред

@sturlamolden :

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдВрд░реЗрдЦрдг рд╡рд┐рдХрд▓реНрдк рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдирдореНрдкреА рдФрд░ рджреЗрд╢реА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмреАрдЪ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╡рд╛рди рд╣реЛрдЧрд╛, рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рддрд░реНрдХреЛрдВ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВред

рдореИрдВ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдлреЗрд╕ am рдореЗрдВ рдмреЗрд╣рддрд░ рд╕рдВрд░реЗрдЦрдг рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ

"рдкрд╛рдпрдерди рдПрд▓рд╛рдпрдВрд╕ рдПрд▓реЛрдХреЗрдЯрд░" рдХрд╛ рд╣рд▓ рдЬреЛ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рдпрд╛ рд╡рд╣ рд╣реИрдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╕реА рд╕реНрддрд░ рдкрд░ рд╕рдВрд░реЗрдЦрдг рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреАред рдореИрдВ рдПрдХ FPGA рдбрд┐рд╡рд╛рдЗрд╕ (Altera A10GX) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рдЬрд╣рд╛рдБ DMA рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛ 64-рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрд░реЗрдЦрд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдпрд╣ рдореЗрд░реЗ рдХреЛрдб рдХреЛ 40x (!!!) рддрдХ рдмрдврд╝рд╛ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ @nachiket рдореЗрдВ рднреА рдореЗрд░реЗ рдЬреИрд╕реА рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ @eamartin рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдереЛрдбрд╝рд╛ рд╣реИрдХ рд╣реИред

рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 64 рдмрд╛рдЗрдЯ рд╕рдВрд░реЗрдЦрдг рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ:

  1. рдпрд╣ рдХреИрд╢ рд▓рд╛рдЗрди рдЖрдХрд╛рд░ рд╣реИ
  2. рдпрд╣ AVX512 рддрдХ рдХреЗ рдХрд┐рд╕реА рднреА SIMD рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ

рдпрд╣рд╛рдВ рд╣рдо рд▓рдЧрднрдЧ 5 рд╕рд╛рд▓ рдмрд╛рдж рд╣реИрдВред

рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдкрд░ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ (64-рдмрд╛рдЗрдЯ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдВрд░реЗрдЦрдг) рдПрдХ рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛??

рдпрд╣ рд╕рд╛рдЗрдерди рдХреЛрдб рдЕрдм NumPy рдореЗрдВ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдореЗрд░реЗ 2cents: рдПрдХ рдЖрдмрдВрдЯрд┐рдд рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдорджрдж рдорд┐рд▓реЗрдЧреА рдЬрдм рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдФрд░ рдХрд░реНрдиреЗрд▓ рд╕реНрддрд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред рдпреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдлрд╝рд░реНрд╕ рдХреЛ рдкреГрд╖реНрдареЛрдВ рдкрд░ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд░реИрдВрдбрдордЧреЗрди рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдореЗрдВ, рд╣рдореЗрдВ PyArray_realloc_aligned рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХрд╛ рдлрд╛рдпрджрд╛ рд╣реБрдЖред рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрди рд░реВрдЯреАрди рдХреЛ numpy/core/include рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛, @mattipред рдХреНрдпрд╛ рдкрд╛рдпрдерди рд╕реЗ рднреА рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

рд░реИрдВрдбрдордЧреЗрди рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдореЗрдВ, рд╣рдореЗрдВ PyArray_realloc_aligned рдФрд░ рджреЛрд╕реНрддреЛрдВ рдХрд╛ рдлрд╛рдпрджрд╛ рд╣реБрдЖред рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрди рд░реВрдЯреАрди рдХреЛ numpy/core/include рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореЗрд░реЗ рдХреЛрдб рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдлрд┐рд░ рдХрд┐рдпрд╛ рдерд╛? ЁЯШВ

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ NumPy er рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд▓реЙрдХрд░ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реВрдВ:

https://github.com/numpy/numpy/blob/v1.17.2/numpy/_build_utils/src/apple_sgemv_fix.c
https://github.com/numpy/numpy/blob/v1.17.2/numpy/random/src/aligned_malloc/aligned_malloc.h

рд╢рд╛рдпрдж рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕реЗ рд╕реБрдиреНрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрджрдо рдореЗрдВ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЦреЛ рдЧрдпрд╛ред рдореИрдВ
рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдерд╛ рдХрд┐ рдпрд╣ рддреБрдореНрд╣рд╛рд░рд╛ рдерд╛ред

рд░рд╡рд┐ рдкрд░, рдирд╡рдВрдмрд░ 17, 2019, 10:29 рд╕реНрдЯрд░реНрд▓рд╛ рдореЛрд▓реНрдбрди рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬрд┐рд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдХреЛрдИ рд▓реЙрдЧрд░ рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИ
NumPy ЁЯзР:

https://github.com/numpy/numpy/blob/v1.17.2/numpy/_build_utils/src/apple_sgemv_fix.c

https://github.com/numpy/numpy/blob/v1.17.2/numpy/random/src/aligned_malloc/aligned_malloc.h

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312?email_source=notifications&email_token=ABKTSRLWKGXUFE4OK53SJMDQUEMJJAFNNNMM4AYDJQ42Y3NVWWKWFDFDFDFDFFDFFDFXFDFDXFDFDF4FDFDF4FD
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABKTSRM7IZIKPGKT4D2W4IDQUEMJJANCNFSM4AYDJQ4Q
ред

рдХреЛрдб рдХрд╛ рдореВрд▓ рд╕реНрд░реЛрдд рдХреНрдпрд╛ рдерд╛?

рд▓рд┐рдВрдХ рдорд░ рдЪреБрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдПрдХ рдПрд▓рд╛рдпрдВрд╕ рдореЙрд▓реЛрдХ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛:

https://tianrunhe.wordpress.com/2012/04/23/aligned-malloc-in-c/

рдпрд╣ рд╕реНрдЯрд░реНрд▓рд╛ рдХреА рдПрдХ рдЧреАрдердм рдкреЛрд╕реНрдЯ рдереАред рдХреЛрдИ рдореВрд▓ рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдереАред

рд░рд╡рд┐ рдкрд░, рдирд╡рдВрдмрд░ 17, 2019, 12:04 рдореИрдЯреА рдкрд┐рдХрд╕ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдХреЛрдб рдХрд╛ рдореВрд▓ рд╕реНрд░реЛрдд рдХреНрдпрд╛ рдерд╛?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312?email_source=notifications&email_token=ABKTSRKKJJC4K6C4C4LW4FFYULQUENDA5CNFM4JDQJJQ42YY3PNVWKH52HFH52HFHHSHHSHHSH52&hl=hi
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABKTSRIVMQFEJ5EP227PXL3QUEXNDANCNFSM4AYDJQ4Q
ред

рдпрд╣ рдПрд▓рд╛рдпрдВрд╕ рдореЙрд▓реЛрдХ рдХреЗ рд▓рд┐рдП рд╣реИред

рд╕реВрд░реНрдп рдкрд░, 17 рдирд╡рдВрдмрд░ 2019, 12:14 рдХреЗрд╡рд┐рди рд╢реЗрдкрд░реНрдб [email protected]
рд▓рд┐рдЦрд╛ рдерд╛:

рдпрд╣ рд╕реНрдЯрд░реНрд▓рд╛ рдХреА рдПрдХ рдЧреАрдердм рдкреЛрд╕реНрдЯ рдереАред рдХреЛрдИ рдореВрд▓ рдХреЛрдб рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдереАред

рд░рд╡рд┐ рдкрд░, рдирд╡рдВрдмрд░ 17, 2019, 12:04 рдореИрдЯреА рдкрд┐рдХрд╕ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдХреЛрдб рдХрд╛ рдореВрд▓ рд╕реНрд░реЛрдд рдХреНрдпрд╛ рдерд╛?

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/numpy/numpy/issues/5312?email_source=notifications&email_token=ABKTSRKKJJC4K6C4C4LW4FFYULQUENDA5CNFM4JDQJJQ42YY3PNVWKH52HFH52HFHHSHHSHHSH52&hl=hi
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABKTSRIVMQFEJ5EP227PXL3QUEXNDANCNFSM4AYDJQ4Q
ред

рдХреНрдпрд╛ рд╣рд░ рдХреЛрдИ рдЬреЛ рдиреЗрдореНрдкреА рдХреЛ рдХреЛрдб рдХреА 50 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ рдЙрд╕реЗ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдХреЙрдкреАрд░рд╛рдЗрдЯ рд╣реЗрдбрд░ рдорд┐рд▓рддрд╛ рд╣реИ? рдореИрдВ рдЕрдкрдиреЗ рдпреЛрдЧрджрд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ :-)

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ NumPy рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рд╣реИ no:

рдЖрдк рд╣реИрдВ рдФрд░ рд╣рдореЗрд╢рд╛ рд░рд╣реЗрдВрдЧреЗ :)

рдХреНрдпрд╛ рд╣рд░ рдХреЛрдИ рдЬреЛ рдиреЗрдореНрдкреА рдХреЛ рдХреЛрдб рдХреА 50 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрддрд╛ рд╣реИ рдЙрд╕реЗ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдХреЙрдкреАрд░рд╛рдЗрдЯ рд╣реЗрдбрд░ рдорд┐рд▓рддрд╛ рд╣реИ? рдореИрдВ рдЕрдкрдиреЗ рдпреЛрдЧрджрд╛рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ :-)

рдирд╣реАрдВред рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдХреВрдЯрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдмреЗрддрд╣рд╛рд╢рд╛ рдЕрдкреВрд░реНрдг рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдореЗрдВ рдХрдард┐рди рд╣реЛрдЧрд╛ред рд╣рдо рд▓реЛрдЧреЛрдВ рдХреЛ THANKS.txt рдореЗрдВ рдЦреБрдж рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ; рдореИрдВ рдЙрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рдЕрдХреНрд╕рд░ рдорд░реНрдЬ рд╕рдВрдШрд░реНрд╖ рджреЗрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Kreol64 picture Kreol64  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MorBilly picture MorBilly  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kevinzhai80 picture kevinzhai80  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

qualiaa picture qualiaa  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Foadsf picture Foadsf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ