file - 如何使用 MPI 使用自定义子数组数据类型从文件中读取子数组?
问题描述
我有 10 GB 文件,它包含数组数据,我想从文件中读取子数组。我想将 MPI_File_read_at 与子数组自定义 MPI 数据类型一起使用。我是 MPI 的新手。如果我使用 MPI 读取子数组还是应该使用 POSIX 读取,我会得到什么好处吗?
program read_mpi
implicit none
include "mpif.h"
integer provided, ierr, psize, rank, filetype,i
integer fh
integer array(2,2)
integer(kind=MPI_OFFSET_KIND) zero_off
integer gsize(2)
integer subsize(2)
integer starts(2)
integer :: status(MPI_STATUS_SIZE)
gsize(1) = 4
gsize(2) = 4
subsize(1) = 2
subsize(2) = 2
starts(1) = 0
starts(2) = 0
call MPI_Init_thread(MPI_THREAD_SINGLE, provided, ierr)
call MPI_Comm_size(MPI_COMM_WORLD, psize, ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
if(rank .eq. 1) then
starts(1) = 2
starts(2) = 0
! zero_off = 8
endif
if(rank .eq. 2) then
starts(1) = 0
starts(2) = 2
! zero_off = 32
endif
if(rank .eq. 3) then
starts(1) = 2
starts(2) = 2
! zero_off = 40
endif
call mpi_type_create_subarray(2, gsize, subsize, starts,
& mpi_order_fortran, MPI_Integer, filetype, ierr)
call mpi_type_commit(filetype,ierr)
call MPI_File_open(MPI_COMM_WORLD,"testfile",MPI_MODE_RDONLY,
& MPI_INFO_NULL,fh,ierr)
zero_off = 0
! reading subarray form file with particular offset.
call mpi_file_read_at(fh,zero_off,array(1,1),1,
& filetype,status, ierr)
write(*,*)array(:,:)
call MPI_File_close(fh,ierr)
call MPI_Finalize(ierr)
end
数组没有按预期获得值。
测试文件:0 1 2 3 4 5 6 7 8 .....测试文件是二进制文件
od -i testfile
0000000 0 1 2 3
0000020 4 5 6 7
0000040 8 9 100 101
0000060 102 103 104 105
0000100 106 107 108 109
0000120 200 201 202 203
0000140 204 205 206 207
0000160 208 209 300 301
0000200 302 303 304 305
0000220 306 307 308 309
0000240
数组 0 1 1312413 13412341 的结果
我想要等级 0 的 0 1 4 5 和等级 1 的 2 3 6 7。
测试文件:https ://drive.google.com/file/d/16vsaBHUWu1VKw_8qR3K6XJ_ya3i0EivW/view?usp=sharing
代码: https ://drive.google.com/file/d/126WyKVpixWozGKO3UPxwDXUKKmbT3rbK/view?usp=sharing
解决方案
推荐阅读
- sql - SQL Server 中的多表约束
- php - 如何强制 composer dump-autoload 从头开始?
- bash - 将许多变量解析到另一个文件包含许多行
- javascript - 搜索框,无法点击结果“a”元素
- python - 如何使用 Scrapy Python 从重定向链接中提取网站 URL
- git - Jenkins,通过标签而不是分支从 Git 获取代码
- c# - 跨 ASP.Net Core Web 应用使用 Azure AD B2C Cookie
- angular - 使用 Keycloak 处理未登录 Angular 应用程序的用户
- python - 在 DataFrame pandas 的列中搜索和替换值
- android - 明文通信 - Android