Cython Memoryview Seg Fault - PullRequest
       6

Cython Memoryview Seg Fault

0 голосов
/ 30 сентября 2019

Я сталкиваюсь с ошибкой сегментации при попытке использовать память Cython. Это мой код:

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). Кто-нибудь знает, что вызывает эту проблему и как ее решить?

Спасибо, Luning

1 Ответ

0 голосов
/ 30 сентября 2019

Это выглядит как 32-битное целочисленное переполнение - т.е. 213*213*213*213 больше максимального 32-битного целого. Вы должны использовать 64-битные целые числа в качестве индексов (long или более явно int64_t).

Почему вы конвертируете ваше представление памяти в указатель? Вы не наберете большой скорости и не потеряете никакой информации о форме (например, у вас есть предположение, что все измерения одинаковы), и вы можете позволить Cython обрабатывать многомерную индексацию за вас. ,Было бы намного лучше сделать аргумент tei просмотром памяти, а не указателем.

...