gpt4 book ai didi

python - Cython Memoryview 段错误

转载 作者:行者123 更新时间:2023-11-30 19:25:58 25 4
gpt4 key购买 nike

我在尝试使用 Cython 的内存 View 时遇到段错误。这是我的代码:

def fock_build_init_with_inputs(tei_ints):

# set the number of orbitals
norb = tei_ints.shape[0]

# get memory view of TEIs
cdef double[:,:,:,::1] tei_memview = tei_ints

# get index pairs
prep_ipss_serial(norb, &tei_memview[0,0,0,0])

void prep_ipss_serial(const int n, const double * const tei) {

int p, q, r, s, np;
double maxval;

const double thresh = 1.0e-9;

// first we count the number of index pairs with above-threshold integrals
np = 0;
for (q = 0; q < n; q++)
for (p = q; p < n; p++) {
maxval = 0.0;
for (s = 0; s < n; s++)
for (r = s; r < n; r++) {
maxval = fmax( maxval, fabs( tei[ r + n*s + n*n*p + n*n*n*q ] ) );
}
if ( maxval > thresh )
np++;
}
ipss_np = np;

当我通过调用输入为 numpy.zeros([n,n,n,n]) 的第一个函数来运行代码时,当 n 超过特定数字 (212) 时,我会遇到段错误。有谁知道是什么导致了这个问题以及如何解决它?

谢谢,鲁宁

最佳答案

这看起来像是 32 位整数溢出 - 即 213*213*213*213 它大于最大 32 位整数。您应该使用 64 位整数作为索引(long 或更明确地 int64_t)。

为什么要将内存 View 转换为指针?您不会获得太多速度,并且会丢失有关形状的任何信息(例如,您假设所有维度都相同),您可以让 Cython 为您处理多维索引。将 tei 参数设置为内存 View 而不是指针会好得多。

关于python - Cython Memoryview 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58162070/

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