2013-12-25 4 views
0

Я написал код Fortran с использованием MPI, так как я новичок в valgrind. Мне не удалось найти проблему. Я получаю эту ошибку при выполнении проверки:FORTRAN-Неверная запись о размере 4

==3040== Invalid write of size 4 
==3040== at 0x804BFE0: MAIN__ (NS.f90:174) 
==3040== by 0x804E190: main (NS.f90:321) 
==3040== Address 0x5746f20 is 0 bytes after a block of size 8 alloc'd 
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==3040== by 0x804C5F3: MAIN__ (NS.f90:198) 
==3040== by 0x804E190: main (NS.f90:321) 
==3040== 
==3041== Invalid write of size 4 
==3041== at 0x804BFE0: MAIN__ (NS.f90:174) 
==3040== Invalid write of size 4 
==3040== at 0x804C036: MAIN__ (NS.f90:175) 
==3040== by 0x804E190: main (NS.f90:321) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== Address 0x5748bbc is 0 bytes after a block of size 12 alloc'd 
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==3040== Address 0x5746f58 is 0 bytes after a block of size 8 alloc'd 
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==3040== by 0x804C729: MAIN__ (NS.f90:198) 
==3040== by 0x804E190: main (NS.f90:321) 
==3040== 
==3041== by 0x804C5F3: MAIN__ (NS.f90:198) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== 
==3040== Invalid write of size 4 
==3040== at 0x804C087: MAIN__ (NS.f90:176) 
==3040== by 0x804E190: main (NS.f90:321) 
==3040== Address 0x5746f90 is 0 bytes after a block of size 8 alloc'd 
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==3040== by 0x804C862: MAIN__ (NS.f90:198) 
==3040== by 0x804E190: main (NS.f90:321) 
==3040== 
==3041== Invalid write of size 4 
==3041== at 0x804C036: MAIN__ (NS.f90:175) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== Address 0x5748bfc is 0 bytes after a block of size 12 alloc'd 
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==3041== by 0x804C729: MAIN__ (NS.f90:198) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== 
==3040== Invalid write of size 4 
==3040== at 0x804C1C5: MAIN__ (NS.f90:178) 
==3040== by 0x804E190: main (NS.f90:321) 
==3040== Address 0x5746fc8 is 0 bytes after a block of size 8 alloc'd 
==3040== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==3040== by 0x804C99B: MAIN__ (NS.f90:198) 
==3040== by 0x804E190: main (NS.f90:321) 
==3040== 
==3041== Invalid write of size 4 
==3041== at 0x804C087: MAIN__ (NS.f90:176) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== Address 0x5748c3c is 0 bytes after a block of size 12 alloc'd 
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 
==3041== by 0x804C862: MAIN__ (NS.f90:198) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== 
==3040== 
==3041== Invalid write of size 4 
==3041== at 0x804C1C5: MAIN__ (NS.f90:178) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== Address 0x5748c7c is 0 bytes after a block of size 12 alloc'd 
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 

Line 174 до 178 содержит этот кусок кода:

A(I) = -0.5 * (0.5 * (1.0 + EPX) * CX(I-1, J) + DX) 
B(I) = (1 + DX + 0.5 * EPX * CX(I, J)) 
C(I) = 0.5 * (0.5 * (1 - EPX) * CX(I+1, J) - DX) 
R(I) = 0.5 * (0.5 * (1 + EPY) * CY(I, J-1) + DY) * OMEGA(I, J-1) + (1 - DY - 0.5 * EPY * CY(I, J)) * OMEGA(I, J) + 0.5 * (-0.5 * (1 - EPY) * CY(I, J+1) + DY) * OMEGA(I, J+1) 

Может кто-нибудь сказать мне, что здесь не так? Я также получаю другие ошибки, как:

==3041== Invalid read of size 4 
==3041== at 0x804C271: MAIN__ (NS.f90:183) 
==3041== by 0x804E190: main (NS.f90:321) 
==3041== Address 0x5748c40 is 4 bytes after a block of size 12 alloc'd 
==3041== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) 

где линии 183 со ссылкой на:

R(N) = R(N) - C(N) * OMEGA(N+1, J) 

Я был бы признателен, если кто-то может сказать мне, где проблема.

Вот блок кода:

A = 0.0 
B = 0.0 
C = 0.0 
R = 0.0 
X = 0.0 
DO J = 1, M 
DO I = 1, N 
IF (U(I, J) > 0.0) THEN 
EPX = 1.0 
ELSE 
EPX = -1.0 
ENDIF 
IF (V(I, J) > 0.0) THEN 
EPY = 1.0 
ELSE 
EPY = -1.0 
ENDIF 
A(I) = -0.5 * (0.5 * (1.0 + EPX) * CX(I-1, J) + DX) 
B(I) = (1 + DX + 0.5 * EPX * CX(I, J)) 
C(I) = 0.5 * (0.5 * (1 - EPX) * CX(I+1, J) - DX) 
R(I) = 0.5 * (0.5 * (1 + EPY) * CY(I, J-1) + DY) * OMEGA(I, J-1) + (1 - DY - 0.5 * EPY * CY(I, J)) * OMEGA(I, J) + 0.5 * (-0.5 * (1 - EPY) * CY(I, J+1) + DY) * OMEGA(I, J+1) 
ENDDO 
R(1) = R(1) - A(1) * OMEGA(0, J) 
R(N) = R(N) - C(N) * OMEGA(N+1, J) 
ENDDO 
+0

Как объявляются/выделены A, B, C, R? – cup

ответ

1

Вполне вероятно, что вы получаете ошибки индекса и вы переполнению границы массива. Это распространенная ошибка, и компиляторы могут помочь в отладке. Для gfortran используйте -fcheck=all, для Intel us -check all. Другие компиляторы также имеют схожие возможности.

После этого вы должны убедиться, что ваши массивы имеют соответствующие размеры, и вы используете петли с правильными верхними и нижними значениями.

Мы не можем сказать, где ошибка в этом случае, потому что вы не показываете объявления своих переменных.

+0

Спасибо вам обоим, я мог бы решить проблему. Это было связано с отсутствием выделения векторов в конце внешнего цикла! – user3134630

Смежные вопросы