Fortran Coder

查看: 2304|回复: 10

[并行] 求助各位大神OMP的问题

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
43 元
贡献
25 点
发表于 2021-7-7 15:07:56 | 显示全部楼层 |阅读模式
我现在把一段程序用OpenMP进行编译,在每个线程进行计算时都需要读取一个文件,然后在运行过程中就会报错,现在初步判断可能是在多线程工作时同时读取相同文件导致的错误,这种错误应该怎么解决啊?求助大神们啊
回复

使用道具 举报

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-7-7 20:28:14 | 显示全部楼层
并行计算中在同一媒体上进行文件读写一般只能有一个线程/进程。如果你一定需要每个线程进行计算时都需要读取一个文件的话, 用critical, 如下:
!$omp critical
read
!$omp end critical

8

帖子

2

主题

0

精华

入门

F 币
43 元
贡献
25 点
 楼主| 发表于 2021-7-9 16:54:38 | 显示全部楼层
风平老涡 发表于 2021-7-7 20:28
并行计算中在同一媒体上进行文件读写一般只能有一个线程/进程。如果你一定需要每个线程进行计算时都需要读 ...

大佬,那用到这句话的时候,几个线程之间读文件是有先后顺序的还是同时的,如果我存在多次读取的情况,那么是不是一个线程在读的时候其他线程在等待?这样貌似效率也很低。有没有可能是搞成多个线程同时读取一个文件

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-7-9 20:00:41 | 显示全部楼层
mccoy93@126.com 发表于 2021-7-9 16:54
大佬,那用到这句话的时候,几个线程之间读文件是有先后顺序的还是同时的,如果我存在多次读取的情况,那 ...

几个线程之间读文件顺序是无规的,先到先读。一个线程在读的时候其他线程必须等待。如果文件在一个机器的磁盘中,无法多个线程同时读取一个文件或多个文件。如果每个线程进行计算时需要读取的是同一个文件,可以改变OMP结构,先让一个线程读文件,随后传输给其他线程。

177

帖子

2

主题

0

精华

宗师

F 币
1375 元
贡献
725 点

规矩勋章

发表于 2021-7-11 14:12:26 | 显示全部楼层
把那个文件复制几份,末尾带数字编号,然后用线程号对应的文件名读

8

帖子

2

主题

0

精华

入门

F 币
43 元
贡献
25 点
 楼主| 发表于 2021-7-13 14:30:37 | 显示全部楼层
necrohan 发表于 2021-7-11 14:12
把那个文件复制几份,末尾带数字编号,然后用线程号对应的文件名读

这个办法好像行不通,我是算一个系统性能,相当于在计算的过程中需要疯狂调用一些不同的文件去插值,但是读取文件的这段代码是dll的我还看不到

8

帖子

2

主题

0

精华

入门

F 币
43 元
贡献
25 点
 楼主| 发表于 2021-7-13 14:31:22 | 显示全部楼层
风平老涡 发表于 2021-7-9 20:00
几个线程之间读文件顺序是无规的,先到先读。一个线程在读的时候其他线程必须等待。如果文件在一个机器的 ...

谢谢大佬! 不过这个方法对于我这个东西好像行不通,我是算一个系统性能,相当于在计算的过程中需要疯狂调用一些不同的文件去插值,但是读取文件的这段代码是dll的我还看不到

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-7-13 20:20:32 | 显示全部楼层
mccoy93@126.com 发表于 2021-7-13 14:31
谢谢大佬! 不过这个方法对于我这个东西好像行不通,我是算一个系统性能,相当于在计算的过程中需要疯狂 ...

有 多少个文件?几百?上千?如果不是太多,可以先读取所有文件到内存变量,这样就可以几个线程同是读取内存变量。

8

帖子

2

主题

0

精华

入门

F 币
43 元
贡献
25 点
 楼主| 发表于 2021-7-14 11:14:10 | 显示全部楼层
风平老涡 发表于 2021-7-13 20:20
有 多少个文件?几百?上千?如果不是太多,可以先读取所有文件到内存变量,这样就可以几个线程同是读取 ...

文件大概有四五十个 数据大概是上千个 目前的样子是这个文件读取这部分代码我看不到,您的意思是我在单线程先读进来,然后储存下来再用是吗?

148

帖子

2

主题

0

精华

宗师

F 币
1299 元
贡献
670 点

规矩勋章

发表于 2021-7-14 21:07:32 | 显示全部楼层
mccoy93@126.com 发表于 2021-7-14 11:14
文件大概有四五十个 数据大概是上千个 目前的样子是这个文件读取这部分代码我看不到,您的意思是我在单线 ...

是的。可以定义一个二维数组,其中一维是文件,另一维是每个文件中的数据。先用单线程读取所有文件到这个二维数组,随后多线程可读取该二维数组。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2021-9-24 11:37

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表