【发布时间】:2020-04-06 16:43:56
【问题描述】:
我在通过 cython 尝试 SIMD 内在函数方面取得了一些成功。现在我正在努力让 AVX 中的比较函数工作,因为比较函数需要一个不应转换为 python 对象的参数。
cdef extern from "immintrin.h" nogil: # in this example, we use SSE2
ctypedef float __m256
const int _CMP_GT_OS
__m256 _mm256_loadu_ps (float *__P) nogil
void _mm256_storeu_ps (float *__P, __m256 __A) nogil
__m256 _mm256_set1_ps (__m256 __A) nogil
__m256 _mm256_cmp_ps (__m256 __A, __m256 __B, _CMP_GT_OS) nogil
@cython.boundscheck(False) # turn off bounds-checking for entire function
@cython.wraparound (False) # turn off negative index wrapping for entire function
@cython.cdivision (True )
cdef void Example_v4 (float *A, float *B, float delx) :
### this example for A & B having exactly 8 elements
cdef:
__m256 mA, mB, mdelx, mOut
float *out = <float*> malloc( 8 * sizeof(float))
int i
with nogil:
mdelx = _mm256_set1_ps( delx )
mA = _mm256_loadu_ps( &A[0] )
mB = _mm256_loadu_ps( &B[0] )
mOut = _mm256_cmp_ps ( mA, mB, _CMP_GT_OS )
_mm256_storeu_ps( &out[0], mOut )
print ( " i out " )
for i in range(8):
print ( i, out[i] )
return
问题是当我编译 cython 代码时,我将此部分突出显示为问题。
mOut = _mm256_cmp_ps ( mA, mB, _CMP_GT_OS )
with ^ symbol pointing at _CMP_GT_OS
和消息
Converting to Python object not allowed without gil
我认为问题不在于 gil,内部函数在英特尔官方文档中定义为
__m256 _mm256_cmp_ps (__m256 __A, __m256 __B, const int imm8)
imm8 可以是多种操作类型,_CMP_GT_OS 就是其中之一。 我不知道如何处理第三个参数并阻止它转换为 python,因为内在函数只识别 C/C++ const int。知道如何解决这个问题吗?
【问题讨论】:
-
mOut的cdef类型是什么?我认为这就是为什么它抱怨转换为 python 对象的原因。也许你的意思是mOut1? -
这可能是错字:应该是 mOut1 而不是 mOut(或其他方式)
-
是的,一个错字。对不起,我编辑了一些东西来简化这个问题,忘了改变它。我会编辑它。但问题仍然如我所描述。
-
不确定这是否是您的问题,但
__m256 _mm256_cmp_ps (__m256 __A, __m256 __B, _CMP_GT_OS) nogil中的_CMP_GT_OS看起来很奇怪。不应该是const int吗? -
包装 cmp_ps 时忘记输入第三个参数,cython 假定它是对象
标签: python cython simd intrinsics avx