Я пытаюсь использовать 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 нормально.