2015-03-01 3 views
0

У меня (для меня) очень странная ошибка сегментации. Сначала я думал, что это было вмешательство между моими 4 ядрами из-за openmp, но удаление openmp из уравнения не, что я хочу. Оказывается, когда я это делаю, segfault все еще происходит.Ошибка сегментации после удаления отладочной печати

Что странно, что если добавить печать или написать в любом месте в пределах внутреннего-Пукто, это работает.

subroutine histogrambins(rMatrix, N, L, dr, maxBins, bins) 
    implicit none; 

    double precision, dimension(N,3), intent(in):: rMatrix; 
    integer, intent(in) :: maxBins, N; 
    double precision, intent(in) :: L, dr; 

    integer, dimension(maxBins, 1), intent(out) :: bins; 

    integer :: i, j, b; 
    double precision, dimension(N,3) :: cacheParticle, cacheOther; 
    double precision :: r; 
    do b= 1, maxBins 
     bins(b,1) = 0; 
    end do 
    !$omp parallel do & 
    !$omp default(none) & 
    !$omp firstprivate(N, L, dr, rMatrix, maxBins) & 
    !$omp private(cacheParticle, cacheOther, r, b) & 
    !$omp shared(bins) 
    do i = 1,N 
     do j = 1,N 
      !Check the pair distance between this one (i) and its (j) closest image 
      if (i /= j) then 
       !should be faster, because it doesn't have to look for matrix indices 
       cacheParticle(1, :) = rMatrix(i,:); 
       cacheOther(1, :) = rMatrix(j, :); 

       call inbox(cacheParticle, L); 
       call inbox(cacheOther, L); 
       call closestImage(cacheParticle, cacheOther, L);  
       r = sum((cacheParticle - cacheOther) * (cacheParticle - cacheOther)) ** .5; 
       if (r /= r) then 
        ! r is NaN 
        bins(maxBins,1) = bins(maxBins,1) + 1; 
       else 
        b = floor(r/dr); 
        if (b > maxBins) then 
         b = maxBins; 
        end if  

        bins(b,1) = bins(b,1) + 1; 
       end if 
      end if 
     end do 
    end do 
    !$omp end parallel do 
end subroutine histogramBins 

Я включил -debug-CAPI в f2py команды:

f2py --fcompiler=gfortran --f90flags="-fopenmp -fcheck=all" -lgomp --debug-capi --debug -m -c modulename module.f90; 

Что дает мне это:

debug-capi:Fortran subroutine histogrambins(rmatrix,&n,&l,&dr,&maxbins,bins)' 
At line 320 of file mol-dy.f90 
Fortran runtime error: Aborted 

Это также делает нагрузку другой проверки, список аргументов заданные и другие подпрограммы и т. д.

В любом случае, две подпрограммы, вызываемые внутри, являются непараллельными подпрограммами. Я использую их в нескольких других подпрограммах, и я думал, что лучше не вызывать параллельную подпрограмму с параллельным кодом другой подпрограммы. Таким образом, во время обработки этой функции никакая другая функция не должна быть активной.

Что здесь происходит? Как добавить «печать *,»;»вызвать Segfault уйти

Спасибо за ваше время

+0

Как ни странно, кажется, что ошибка сегментации исчезает, если я добавляю maxBins «if r> L». Действительно странно; это уже ограничено maxBins, не так ли? – Daimonie

+4

* Что странно, если я добавляю печать или пишу в любом месте внутри-дела, это работает. * Это часто является признаком либо неспособности совместить манекен процедуры и фактические аргументы, либо доступ к элементу массива вне его объявленного границы. Повторно скомпилируйте и перезапустите с проверкой времени компиляции для первой и проверки времени выполнения для последней. О, и пока я комментирую, вам не нужно »; в конце инструкции, когда это единственное утверждение в строке. Вы запрограммировали на C раньше? –

+5

На самом деле, факт, что segfault влияет на заявление печати, * чрезвычайно распространен *. Это признак коррупции в стеке. Дважды проверьте, правильно ли вы выполняете все свои процедуры. –

ответ

2

Это не является необычным для операторов печати на воздействие - и либо создать или удалить Segfault Причина?.. заключается в том, что они меняют способ выделения памяти, чтобы освободить место для печатаемой строки, или вы создадите место для временных строк, если вы делаете какое-то форматирование. Это изменение может быть достаточным для того, чтобы ошибка отображалась как авария в первый раз или исчезнуть.

Я вижу, что вы вызываете это из Python. Если вы используете Linux - вы можете попробовать следующее a guide to using a debugger with Fortran called from Python и найти строки и значения данных, которые вызывают авария. Этот метод также работает для OpenMP. Вы также можете попробовать использовать GDB в качестве отладчика.

Без исходного кода к вашей проблеме, я не думаю, что вы, вероятно, получите «ответ» на вопрос, но, надеюсь, вышеупомянутые идеи помогут вам решить это самостоятельно.

Использование отладчика (по моему опыту) значительно реже имеет такое поведение, которое вы теперь видите, а не с помощью операторов печати (почти наверняка, если использовать только один поток).

+0

Спасибо! Я посмотрю на это еще раз в следующем согласии. Функция чудесным образом начала работать, когда я переписал ее. Если я правильно помню, он вызывал некоторые странные вещи (например, b = 0). – Daimonie