Fortran Coder

查看: 22009|回复: 10
打印 上一主题 下一主题

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

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
45 元
贡献
26 点
跳转到指定楼层
楼主
发表于 2021-7-7 15:07:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在把一段程序用OpenMP进行编译,在每个线程进行计算时都需要读取一个文件,然后在运行过程中就会报错,现在初步判断可能是在多线程工作时同时读取相同文件导致的错误,这种错误应该怎么解决啊?求助大神们啊
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

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

8

帖子

2

主题

0

精华

入门

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

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

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

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

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

250

帖子

2

主题

0

精华

宗师

F 币
1730 元
贡献
872 点

规矩勋章

5#
发表于 2021-7-11 14:12:26 | 只看该作者
把那个文件复制几份,末尾带数字编号,然后用线程号对应的文件名读

8

帖子

2

主题

0

精华

入门

F 币
45 元
贡献
26 点
6#
 楼主| 发表于 2021-7-13 14:30:37 | 只看该作者
necrohan 发表于 2021-7-11 14:12
把那个文件复制几份,末尾带数字编号,然后用线程号对应的文件名读

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

8

帖子

2

主题

0

精华

入门

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

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

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

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

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

8

帖子

2

主题

0

精华

入门

F 币
45 元
贡献
26 点
9#
 楼主| 发表于 2021-7-14 11:14:10 | 只看该作者
风平老涡 发表于 2021-7-13 20:20
有 多少个文件?几百?上千?如果不是太多,可以先读取所有文件到内存变量,这样就可以几个线程同是读取 ...

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

213

帖子

2

主题

0

精华

宗师

F 币
2126 元
贡献
875 点

规矩勋章

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

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-19 18:57

Powered by Tencent X3.4

© 2013-2024 Tencent

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