mirror of
https://github.com/QuantumPackage/qp2.git
synced 2024-12-22 11:33:29 +01:00
Improve mmap interface
This commit is contained in:
parent
360ac7b128
commit
4c4c65581a
@ -76,8 +76,7 @@ END_PROVIDER
|
|||||||
ndim8 = ao_num*ao_num*1_8+1
|
ndim8 = ao_num*ao_num*1_8+1
|
||||||
double precision :: wall0,wall1
|
double precision :: wall0,wall1
|
||||||
|
|
||||||
type(c_ptr) :: c_pointer(2)
|
type(mmap_type) :: map
|
||||||
integer :: fd(2)
|
|
||||||
|
|
||||||
PROVIDE nproc ao_cholesky_threshold do_direct_integrals qp_max_mem
|
PROVIDE nproc ao_cholesky_threshold do_direct_integrals qp_max_mem
|
||||||
PROVIDE nucl_coord ao_two_e_integral_schwartz
|
PROVIDE nucl_coord ao_two_e_integral_schwartz
|
||||||
@ -181,8 +180,9 @@ END_PROVIDER
|
|||||||
if (elec_num > 10) then
|
if (elec_num > 10) then
|
||||||
rank_max = min(np,20*elec_num*elec_num)
|
rank_max = min(np,20*elec_num*elec_num)
|
||||||
endif
|
endif
|
||||||
call mmap(trim(ezfio_work_dir)//'cholesky_ao_tmp', (/ ndim8, rank_max /), 8, fd(1), .False., .True., c_pointer(1))
|
|
||||||
call c_f_pointer(c_pointer(1), L, (/ ndim8, rank_max /))
|
call mmap_create_d(trim(ezfio_work_dir)//'cholesky_ao_tmp', (/ ndim8, rank_max /), 8, .False., .True., map)
|
||||||
|
L => map%d2
|
||||||
|
|
||||||
! Deleting the file while it is open makes the file invisible on the filesystem,
|
! Deleting the file while it is open makes the file invisible on the filesystem,
|
||||||
! and automatically deleted, even if the program crashes
|
! and automatically deleted, even if the program crashes
|
||||||
@ -480,7 +480,7 @@ END_PROVIDER
|
|||||||
enddo
|
enddo
|
||||||
!$OMP END PARALLEL DO
|
!$OMP END PARALLEL DO
|
||||||
|
|
||||||
call munmap( (/ ndim8, rank_max /), 8, fd(1), c_pointer(1) )
|
call mmap_destroy(map)
|
||||||
|
|
||||||
cholesky_ao_num = rank
|
cholesky_ao_num = rank
|
||||||
|
|
||||||
|
@ -910,6 +910,7 @@ subroutine copy_psi_bilinear_to_psi(psi, isize)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BEGIN_PROVIDER [ integer*8, singles_alpha_csc_idx, (N_det_alpha_unique+1) ]
|
BEGIN_PROVIDER [ integer*8, singles_alpha_csc_idx, (N_det_alpha_unique+1) ]
|
||||||
&BEGIN_PROVIDER [ integer*8, singles_alpha_csc_size ]
|
&BEGIN_PROVIDER [ integer*8, singles_alpha_csc_size ]
|
||||||
implicit none
|
implicit none
|
||||||
|
@ -2,6 +2,25 @@ module mmap_module
|
|||||||
|
|
||||||
use iso_c_binding
|
use iso_c_binding
|
||||||
|
|
||||||
|
type mmap_type
|
||||||
|
type(c_ptr) :: ptr ! Pointer to the data
|
||||||
|
character*(128) :: filename ! Name of the file
|
||||||
|
integer*8 :: length ! Size of the array in bytes
|
||||||
|
integer :: fd ! File descriptor
|
||||||
|
|
||||||
|
! Pointers to data
|
||||||
|
integer, pointer, dimension (:) :: i1
|
||||||
|
integer, pointer, dimension (:,:) :: i2
|
||||||
|
integer, pointer, dimension (:,:,:) :: i3
|
||||||
|
integer, pointer, dimension (:,:,:,:) :: i4
|
||||||
|
|
||||||
|
! Pointers to data
|
||||||
|
double precision, pointer, dimension (:) :: d1
|
||||||
|
double precision, pointer, dimension (:,:) :: d2
|
||||||
|
double precision, pointer, dimension (:,:,:) :: d3
|
||||||
|
double precision, pointer, dimension (:,:,:,:) :: d4
|
||||||
|
end type mmap_type
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
! File descriptors
|
! File descriptors
|
||||||
@ -82,7 +101,7 @@ module mmap_module
|
|||||||
length = length * shape(i)
|
length = length * shape(i)
|
||||||
enddo
|
enddo
|
||||||
fd_ = fd
|
fd_ = fd
|
||||||
call c_munmap_fortran( length, fd_, map)
|
call c_munmap_fortran(length, fd_, map)
|
||||||
end subroutine
|
end subroutine
|
||||||
|
|
||||||
subroutine msync(shape, bytes, fd, map)
|
subroutine msync(shape, bytes, fd, map)
|
||||||
@ -106,6 +125,122 @@ module mmap_module
|
|||||||
call c_msync_fortran( length, fd_, map)
|
call c_msync_fortran( length, fd_, map)
|
||||||
end subroutine
|
end subroutine
|
||||||
|
|
||||||
|
|
||||||
|
! Functions for the mmap_type
|
||||||
|
|
||||||
|
subroutine mmap_create(filename, shape, bytes, read_only, single_node, map)
|
||||||
|
implicit none
|
||||||
|
character*(*), intent(in) :: filename ! Name of the mapped file
|
||||||
|
integer*8, intent(in) :: shape(:) ! Shape of the array to map
|
||||||
|
integer, intent(in) :: bytes ! Number of bytes per element
|
||||||
|
logical, intent(in) :: read_only ! If true, mmap is read-only
|
||||||
|
logical, intent(in) :: single_node! If true, mmap is on a single node
|
||||||
|
type(mmap_type), intent(out) :: map ! mmap
|
||||||
|
|
||||||
|
integer :: i
|
||||||
|
|
||||||
|
map%filename = filename
|
||||||
|
map%length = int(bytes,8)
|
||||||
|
do i=1,size(shape)
|
||||||
|
map%length = map%length * shape(i)
|
||||||
|
enddo
|
||||||
|
call mmap(map%filename, &
|
||||||
|
shape, &
|
||||||
|
bytes, &
|
||||||
|
map%fd, &
|
||||||
|
read_only, &
|
||||||
|
single_node, &
|
||||||
|
map%ptr)
|
||||||
|
|
||||||
|
map%d1 => NULL()
|
||||||
|
map%d2 => NULL()
|
||||||
|
map%d3 => NULL()
|
||||||
|
map%d4 => NULL()
|
||||||
|
map%i1 => NULL()
|
||||||
|
map%i2 => NULL()
|
||||||
|
map%i3 => NULL()
|
||||||
|
map%i4 => NULL()
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
subroutine mmap_create_d(filename, shape, bytes, read_only, single_node, map)
|
||||||
|
implicit none
|
||||||
|
character*(*), intent(in) :: filename ! Name of the mapped file
|
||||||
|
integer*8, intent(in) :: shape(:) ! Shape of the array to map
|
||||||
|
integer, intent(in) :: bytes ! Number of bytes per element
|
||||||
|
logical, intent(in) :: read_only ! If true, mmap is read-only
|
||||||
|
logical, intent(in) :: single_node! If true, mmap is on a single node
|
||||||
|
type(mmap_type), intent(out) :: map ! mmap
|
||||||
|
|
||||||
|
call mmap_create(filename, shape, bytes, read_only, single_node, map)
|
||||||
|
|
||||||
|
select case (size(shape))
|
||||||
|
case (1)
|
||||||
|
call c_f_pointer(map%ptr, map%d1, shape)
|
||||||
|
case (2)
|
||||||
|
call c_f_pointer(map%ptr, map%d2, shape)
|
||||||
|
case (3)
|
||||||
|
call c_f_pointer(map%ptr, map%d3, shape)
|
||||||
|
case (4)
|
||||||
|
call c_f_pointer(map%ptr, map%d4, shape)
|
||||||
|
case default
|
||||||
|
stop 'mmap: dimension not implemented'
|
||||||
|
end select
|
||||||
|
end subroutine
|
||||||
|
|
||||||
|
subroutine mmap_create_i(filename, shape, bytes, read_only, single_node, map)
|
||||||
|
implicit none
|
||||||
|
character*(*), intent(in) :: filename ! Name of the mapped file
|
||||||
|
integer*8, intent(in) :: shape(:) ! Shape of the array to map
|
||||||
|
integer, intent(in) :: bytes ! Number of bytes per element
|
||||||
|
logical, intent(in) :: read_only ! If true, mmap is read-only
|
||||||
|
logical, intent(in) :: single_node! If true, mmap is on a single node
|
||||||
|
type(mmap_type), intent(out) :: map ! mmap
|
||||||
|
|
||||||
|
call mmap_create(filename, shape, bytes, read_only, single_node, map)
|
||||||
|
|
||||||
|
select case (size(shape))
|
||||||
|
case (1)
|
||||||
|
call c_f_pointer(map%ptr, map%i1, shape)
|
||||||
|
case (2)
|
||||||
|
call c_f_pointer(map%ptr, map%i2, shape)
|
||||||
|
case (3)
|
||||||
|
call c_f_pointer(map%ptr, map%i3, shape)
|
||||||
|
case (4)
|
||||||
|
call c_f_pointer(map%ptr, map%i4, shape)
|
||||||
|
case default
|
||||||
|
stop 'mmap: dimension not implemented'
|
||||||
|
end select
|
||||||
|
end subroutine
|
||||||
|
|
||||||
|
subroutine mmap_destroy(map)
|
||||||
|
implicit none
|
||||||
|
type(mmap_type), intent(inout) :: map
|
||||||
|
|
||||||
|
call c_munmap_fortran(map%length, map%fd, map%ptr)
|
||||||
|
|
||||||
|
map%ptr = C_NULL_PTR
|
||||||
|
map%filename = ''
|
||||||
|
map%length = 0
|
||||||
|
map%fd = 0
|
||||||
|
map%d1 => NULL()
|
||||||
|
map%d2 => NULL()
|
||||||
|
map%d3 => NULL()
|
||||||
|
map%d4 => NULL()
|
||||||
|
map%i1 => NULL()
|
||||||
|
map%i2 => NULL()
|
||||||
|
map%i3 => NULL()
|
||||||
|
map%i4 => NULL()
|
||||||
|
end subroutine
|
||||||
|
|
||||||
|
|
||||||
|
subroutine mmap_sync(map)
|
||||||
|
implicit none
|
||||||
|
type(mmap_type), intent(inout) :: map
|
||||||
|
|
||||||
|
call c_msync_fortran(map%length, map%fd, map%ptr)
|
||||||
|
end subroutine
|
||||||
|
|
||||||
end module mmap_module
|
end module mmap_module
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user