简而言之,我试图从python调用一个共享库,更具体地说,从numpy调用.共享库使用sse2指令在C中实现.启用优化,即使用-O2或-O1构建库,当通过ctypes调用共享库时,我面临着奇怪的段错误.禁用优化(-O0),一切都按预期进行,就像直接将库链接到c程序(优化与否)一样.附上你发现一个剪辑,展示了我系统上描绘的行为.启用优化后,gdb将在emmintrin.h:113中的__builtin_ia32_loadupd(__P)中报告段错误.__P的值报告为优化输出.
test.c的:
#include <emmintrin.h>
#include <complex.h>
void test(const int m, const double* x, double complex* y) {
int i;
__m128d _f, _x, _b;
double complex f __attribute__( (aligned(16)) );
double complex b __attribute__( (aligned(16)) );
__m128d* _p;
b = 1;
_b = _mm_loadu_pd( (double *) &b );
_p = (__m128d*) y;
for(i=0; i<m; ++i) {
f = cexp(-I*x[i]);
_f = _mm_loadu_pd( (double *) &f );
_x = _mm_loadu_pd( (double *) &x[i] );
_f = _mm_shuffle_pd(_f, _f, 1);
*_p = _mm_add_pd(*_p, …
Run Code Online (Sandbox Code Playgroud)