В моем коде python мне нужно много раз решать определенный интеграл, поэтому я реализовал этот интеграл в C, чтобы ускорить процесс. Наиболее простой способ использования этой функции в python - это использование ctypes. Однако при оценке функции в python возникает ошибка сегментации.
Я создал минимальный рабочий пример, чтобы показать ошибку. Я использую cubature для решения интеграла в C (см. https://github.com/stevengj/cubature), что, вероятно, является причиной ошибки сегментации. Файл mwe.c
содержит следующее:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "./Cubature/cubature.h"
// Gaussian function
int f(unsigned ndim, const double *x, void *fdata, unsigned fdim, double *fval) {
double sigma = *((double *) fdata); // we can pass σ via fdata argument
double sum = 0;
unsigned i;
for (i = 0; i < ndim; ++i) sum += x[i] * x[i];
fval[0] = exp(-sigma * sum);
return 0; // success*
}
double gauss (double sigma)
{
// Integration limits, result and error
double xmin[3] = {-2,-2,-2}, xmax[3] = {2,2,2}, val, err;
// Compute integral
hcubature( 1, f, &sigma, 3, xmin, xmax, 0, 0, 1e-4, ERROR_INDIVIDUAL, &val, &err);
// return final result
return val;
}
Это скомпилировано с использованием
gcc -fPIC -shared -o mwe.dll mwe.c "./Cubature/hcubature.c"
в Windows 64-битной системе (G CC версия 7.4.0). Обратите внимание, что mwe работает при добавлении функции main
и непосредственном создании исполняемого файла, только при включении этого в python возникает ошибка. Код python выглядит следующим образом:
# Import ctypes
from ctypes import *
# load C functions
MWE = CDLL('./mwe.dll')
# Set output to double
MWE.gauss.restype=c_double
# Print output
sigma=c_double(0.5)
print(MWE.gauss(sigma))
, который я запускаю с Python 3.7.4, чтобы получить вывод Segmentation fault
.
У кого-нибудь есть идеи, где это произошла ошибка?
PS: я знаю, что существует кубатурный интерфейс python, который я мог бы использовать; тем не менее, фактический интеграл, который мне нужно решить, вычислительно более требователен, чем гауссовский, использованный в примере, и я ожидаю существенного ускорения при его полном вычислении в C.
PPS: я, конечно, не эксперт в C и python, и определенно новичок в ctypes.