2012-08-28 7 views
5

Este programa se bloquea con Illegal instruction: 4 en MacOSX León y ifort (ifort) 12.1.0 20111011accidente Programa para la gama copiar con ifort

program foo 
     real, pointer :: a(:,:), b(:,:) 
     allocate(a(5400, 5400)) 
     allocate(b(5400, 3600)) 
     a=1.0 
     b(:, 1:3600) = a(:, 1:3600) 

     print *, a 
     print *, b 

     deallocate(a) 
     deallocate(b) 

end program 

El mismo programa trabaja con gfortran. No veo ningún problema Algunas ideas ? Desenrollar la copia y realizar el ciclo explícito sobre las columnas funciona en ambos compiladores.

Tenga en cuenta que con asignable en lugar de puntero no tengo ningún problema.

El comportamiento es el mismo si la declaración está dentro de un módulo o no. confirmo el mismo comportamiento en ifort (ifort) 12.1.3 20120130.

Al parecer, no se presentan problemas con Linux y ifort 12.1.5

traté de aumentar el tamaño de la pila con las opciones siguientes que unen

ifort -Wl,-stack_size,0x40000000,-stack_addr,0xf0000000 test.f90

pero sigo recibiendo el mismo error. Aumentando ulimit -s al duro mismo problema.

Editar 2: Hice algunos más depuración y, aparentemente, el problema ocurre cuando la operación de matriz de corte y empalme

 b(:, 1:3600) = a(:, 1:3600) 

implica un valor sospechosamente cerca de 16 M de los datos.

Estoy comparando los códigos de operación producidos, pero si hay una forma de ver un código intermedio que sea más comunicativo, con mucho gusto lo agradecería.

+0

También recibo "instrucciones ilegales" con ifort 12.1.1.246 en Mac Snow Leopard. Sugiero informar sobre el Fortran Forum de Intel o enviar un informe de error. Tal vez está arreglado en 12.1.5? –

+0

Y lo consigo con ifort 12.0.3 en Mac Snow Leopard. Tal vez este error ha estado allí por un tiempo ... – EMiller

+0

Aparentemente, el problema existe también en (algunos) cuadros de Linux: el código segfaults en CentOS 5.5 y ifort 12.1. –

Respuesta

1

Use "asignable" en lugar de "puntero".

real :: asignable un (:, :), b (:) :,

Asignación de un número de coma flotante a un puntero parece dudosa para mí.

+2

No hay nada de malo en asignar un número a un puntero asignado en fortran.Los punteros Fotran no son como los punteros C, y aparte del operador => y el comportamiento interno asociado se comportan principalmente como matrices asignables. – amaurea

4

Su programa es correcto (aunque preferiría asignarlo al puntero si no necesita poder volver a marcarlo). El problema es que ifort coloca por defecto todas las temporarias de la matriz en la pila, sin importar cuán grandes sean. Y parece necesitar una matriz temporal para la operación de copia que está haciendo aquí. Para evitar el comportamiento predeterminado estúpido de ifort, siempre utilice el indicador -heap-arrays al compilar. Es decir.

ifort -o test test.f90 -heap-arrays 1600 

El número detrás de -heap-arrays es el umbral donde debería comenzar a usar el montón. Para tamaños inferiores a este, se usa la pila. Elegí un número bastante bajo aquí - probablemente puedas usar con seguridad los más altos. En teoría, las matrices de pila son más rápidas, pero la diferencia suele ser totalmente insignificante. Desearía que Intel arreglara este comportamiento. Todos los demás compiladores tienen valores predeterminados razonables para esta configuración.