Чтобы проверить распределение памяти, мы заполняем массивы одинарной точности единичными значениями и опрашиваем их с помощью команд SUM
и DOT_PRODUCT
. Эти встроенные функции перестают считать после 16777216 (= 2^24). Как заставить эти команды считать миллиарды элементов? Мы предпочитаем избегать циклов DO
. Это не проблема с массивами более высокой точности.
program allocator
use iso_fortran_env
implicit NONE
integer, parameter :: sp = selected_real_kind ( REAL32 )
integer, parameter :: xlint = selected_int_kind ( INT64 )
integer ( xlint ) :: n = 100000000
real ( sp ), allocatable, dimension ( : ) :: array
integer ( xlint ) :: alloc_status = 0
character ( len = 255 ) :: alloc_msg = ""
! ALLOCATE
allocate ( array ( 1 : n ), stat = alloc_status, errmsg = alloc_msg )
if ( alloc_status /= 0 ) print *, 'allocation error on ', n, ' elements: stat = ', alloc_status, ', errmsg = ', alloc_msg
! POPULATE
array = 1.0_sp
write ( *, '( "number of elements allocated = ", g0 )' ) n
write ( *, '( "sum of elements = ", g0 )' ) sum ( array )
write ( *, '( "dot product = ", g0, / )' ) dot_product ( array, array )
! DEALLOCATE
deallocate ( array, stat = alloc_status, errmsg = alloc_msg )
if ( alloc_status /= 0 ) print *, 'deallocation error on ', n, ' elements: stat = ', alloc_status, ', errmsg = ', alloc_msg
write ( *, '( "compiler version = ", A )' ) compiler_version()
write ( *, '( "compiler options = ", A )' ) trim ( compiler_options() )
end program allocator
Выход:
number of elements allocated = 100000000
sum of elements = 16777216.
dot product = 16777216.
compiler version = GCC version 4.6.2 20111019 (prerelease)
compiler options = -fPIC -mmacosx-version-min=10.6.8 -mtune=core2
-ffpe-trap=precision
, вы увидите, что вы получаете ошибку времени выполненияProgram received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
, потому что вы переполняете вещественное число с одинарной точностью в своемsum
- person casey   schedule 15.08.2014n
, вы хотите указать целочисленный литерал как тип, отличный от значения по умолчанию (100000000000000_xlint
). - person francescalus   schedule 17.08.2014_xlint
выражение имеет целочисленный вид по умолчанию, независимо от того факта, что оно является инициализатором для целого числа видаxlint
. - person francescalus   schedule 18.08.2014