gpt4 book ai didi

python - 当我的共享库由 icc -O3 或 -O2 优化并通过 Python ctypes 使用时,会发生段错误

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:23 24 4
gpt4 key购买 nike

这种行为很奇怪,因为我不会得到段错误

  • 如果共享库是在没有优化或较弱优化(-O0 或 -O1)的情况下编译的
  • 如果共享库是用 gcc 编译的,即使有优化标志 (-O3)
  • 如果我从纯 C 程序运行代码(不是通过 ctypes)

此外,我无法在某些机器上获得段错误。

如果您在我的代码中发现错误更好,但我还有其他更一般的问题:

  1. 可能是 icc 或 ctypes 错误?即使我可以在我的特定环境中重现奇怪的行为,也可以将错误提交到问题跟踪系统吗?
  2. 我尝试调试代码,但由于此错误仅在优化代码时可见,因此当我使用调试器时,我得到了很多“xxx 已定义但未分配(优化掉)”。有没有更好的方法来调试优化代码?

如何重现错误

假设我有库源代码 strange.c 和 hte python 脚本 run.py,我得到了段错误:

icc -O3 -Wall -shared strange.c -o libstrange.so
python run.py

请注意,我可以在我的一台机器上重现此错误

  • uname -m: i868
  • 操作系统:Ubuntu 10.04.2 LTS
  • icc: 12.0.0 20101006
  • python :2.6.5
  • NumPy :1.3.0

  • uname -m: i868
  • 操作系统:Ubuntu 10.10
  • icc: 12.0.3 20110309
  • python :2.6.6
  • NumPy :1.3.0

  • uname -m: x86_64
  • 操作系统:Scientific Linux SL 5.5 版(Boron)
  • icc: 12.0.0 20101006
  • python :2.6.5
  • Numpy:1.5.0b1

代码

请在此处 ( tkf / ctypes_icc / source – Bitbucket ) 或下方找到代码集。您可以找到一个 Makefile 和一个 shell 脚本来运行程序并使用所有优化标志和编译器(gcc 和 icc)检查退出代码。这个程序的原始版本是我研究的模拟程序,但这个程序只是一个无意义的程序。

奇怪的.c:

typedef struct{
int num_n;
double dt, ie, gl, isyn, ssyn, tau1, tau2, lmd1, lmd2, k1_mean, k2_mean;
double *vi, *v0;
} StrangeStruct;


void
func(double * v0, double * vt, double dt,
double gl, double isyn, double ie, double isyn_estimate, int num_n)
{
int i;
for (i = 0; i < num_n; ++i){
v0[i] = vt[i] + dt + gl + isyn + ie + isyn_estimate;
}
}

int
StrangeStruct_func(StrangeStruct *self)
{
double isyn_estimate;
isyn_estimate =
self->ssyn * (self->lmd1 * self->k1_mean - self->lmd2 * self->k2_mean) /
(self->tau1 - self->tau2);
func(self->v0, self->vi, self->dt, self->gl, self->isyn,
self->ie, isyn_estimate, self->num_n);
return 0;
}

运行.py:

from ctypes import POINTER, pointer, c_int, c_double, Structure
import numpy

c_double_p = POINTER(c_double)


class StrangeStruct(Structure):
_fields_ = [
("num_n", c_int),
("dt", c_double),
("ie", c_double),
("gl", c_double),
("isyn", c_double),
("ssyn", c_double),
("tau1", c_double),
("tau2", c_double),
("lmd1", c_double),
("lmd2", c_double),
("k1_mean", c_double),
("k2_mean", c_double),
("vi", c_double_p),
("v0", c_double_p),
]


StrangeStruct_p = POINTER(StrangeStruct)

ifnet_a2a2 = numpy.ctypeslib.load_library('libstrange.so', '.')
ifnet_a2a2.StrangeStruct_func.restype = c_int
ifnet_a2a2.StrangeStruct_func.argtypes = [StrangeStruct_p]


def func(struct):
ifnet_a2a2.StrangeStruct_func(pointer(struct))


if __name__ == '__main__':
ifn = StrangeStruct(
num_n=100, dt=0.1, gl=0.1, vrest=-60, ie=-3.7, th=-40,
ssyn=0.5, tau1=3, tau2=1,
)
v0 = numpy.zeros(ifn.num_n, dtype=float)
vi = numpy.zeros(ifn.num_n, dtype=float)
ifn.v0 = v0.ctypes.data_as(c_double_p)
ifn.vi = vi.ctypes.data_as(c_double_p)

func(ifn)

v0 + vi

最佳答案

通常不可能混合用 gcc 和 icc 编译的二进制文件(在这种情况下,python 是用 gcc 构建的)。您可以尝试使用 icc“gcc 兼容”模式,该模式由 -gcc-version 标志设置。这可能会使其正常工作,但您仍然可能会遇到问题。

关于python - 当我的共享库由 icc -O3 或 -O2 优化并通过 Python ctypes 使用时,会发生段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5809337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com