Cython с использованием SIMD intrinsi c вылетает - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь использовать Cython для SIMD (AVX2). Мой процессор поддерживает это. Я нашел этот код здесь, который делает SSE.

https://github.com/Technologicat/cython-sse-example

Так что я сделал это для AVX под названием avx_test5.pyx

from libc.stdlib cimport malloc, free, calloc
cdef extern from "immintrin.h":  # in this example, we use AVX2
    ctypedef float  __m256
    __m256 _mm256_loadu_ps (float *__P) nogil  
    __m256 _mm256_add_ps   (__m256 __A, __m256 __B) nogil
    __m256 _mm256_mul_ps   (__m256 __A, __m256 __B) nogil
    __m256 _mm256_fmadd_ps (__m256 __A, __m256 __B, __m256 __C) nogil
    void   _mm256_store_ps (float *__P, __m256 __A) nogil  

cdef void Example_v1 (float *A, float *B, float *C) :
    ### this example for A and B having exactly 8 elements    
    cdef:
        __m256 mA, mB, mC
        float[8] out1, out2
        int i

    with nogil:
        mA = _mm256_loadu_ps( &A[0] )
        mB = _mm256_loadu_ps( &B[0] )
        mC = _mm256_loadu_ps( &C[0] )
        _mm256_store_ps( &out1[0], _mm256_add_ps  ( mA, mB ) )
        _mm256_store_ps( &out2[0], _mm256_fmadd_ps( mA, mB, mC ) )

    for i in range(8):
        print( "out1  out2 : ", i, out1[i], out2[i], sep=", " ) 

def run1(float [::1] A, float [::1] B, float [::1] C):
    Example_v1( &A[0] , &B[0] , &C[0] )    

В своем коде python я называю их:

import numpy as np

print ("Hello World")
from avx_test7 import run1 

np.random.seed(1)
A =        np.ones(8 , dtype=np.float32)
B = np.random.rand(8).astype(np.float32)
C = np.random.rand(8).astype(np.float32)

print ( A + B)
print ( A * B + C)
run1(A, B, C)       

Когда я запускал их, мой шпион просто разбился или застрял. Никаких сообщений об ошибках, ничего и просто зависает, хотя я могу перезапустить ядро.

Я много раз сканировал файл cython и не вижу ничего плохого. Кто-нибудь может помочь с этим? Я использовал компилятор MSV C 2017 и скомпилированный файл Cython нормально.

...