У меня (для меня) очень странная ошибка сегментации. Сначала я думал, что это было вмешательство между моими 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 уйти
Спасибо за ваше время
Как ни странно, кажется, что ошибка сегментации исчезает, если я добавляю maxBins «if r> L». Действительно странно; это уже ограничено maxBins, не так ли? – Daimonie
* Что странно, если я добавляю печать или пишу в любом месте внутри-дела, это работает. * Это часто является признаком либо неспособности совместить манекен процедуры и фактические аргументы, либо доступ к элементу массива вне его объявленного границы. Повторно скомпилируйте и перезапустите с проверкой времени компиляции для первой и проверки времени выполнения для последней. О, и пока я комментирую, вам не нужно »; в конце инструкции, когда это единственное утверждение в строке. Вы запрограммировали на C раньше? –
На самом деле, факт, что segfault влияет на заявление печати, * чрезвычайно распространен *. Это признак коррупции в стеке. Дважды проверьте, правильно ли вы выполняете все свои процедуры. –