Fortran Coder

标题: 求助各位大神OMP的问题 [打印本页]

作者: mccoy93@126.com    时间: 2021-7-7 15:07
标题: 求助各位大神OMP的问题
我现在把一段程序用OpenMP进行编译,在每个线程进行计算时都需要读取一个文件,然后在运行过程中就会报错,现在初步判断可能是在多线程工作时同时读取相同文件导致的错误,这种错误应该怎么解决啊?求助大神们啊

作者: 风平老涡    时间: 2021-7-7 20:28
并行计算中在同一媒体上进行文件读写一般只能有一个线程/进程。如果你一定需要每个线程进行计算时都需要读取一个文件的话, 用critical, 如下:
!$omp critical
read
!$omp end critical
作者: mccoy93@126.com    时间: 2021-7-9 16:54
风平老涡 发表于 2021-7-7 20:28
并行计算中在同一媒体上进行文件读写一般只能有一个线程/进程。如果你一定需要每个线程进行计算时都需要读 ...

大佬,那用到这句话的时候,几个线程之间读文件是有先后顺序的还是同时的,如果我存在多次读取的情况,那么是不是一个线程在读的时候其他线程在等待?这样貌似效率也很低。有没有可能是搞成多个线程同时读取一个文件
作者: 风平老涡    时间: 2021-7-9 20:00
mccoy93@126.com 发表于 2021-7-9 16:54
大佬,那用到这句话的时候,几个线程之间读文件是有先后顺序的还是同时的,如果我存在多次读取的情况,那 ...

几个线程之间读文件顺序是无规的,先到先读。一个线程在读的时候其他线程必须等待。如果文件在一个机器的磁盘中,无法多个线程同时读取一个文件或多个文件。如果每个线程进行计算时需要读取的是同一个文件,可以改变OMP结构,先让一个线程读文件,随后传输给其他线程。
作者: necrohan    时间: 2021-7-11 14:12
把那个文件复制几份,末尾带数字编号,然后用线程号对应的文件名读
作者: mccoy93@126.com    时间: 2021-7-13 14:30
necrohan 发表于 2021-7-11 14:12
把那个文件复制几份,末尾带数字编号,然后用线程号对应的文件名读

这个办法好像行不通,我是算一个系统性能,相当于在计算的过程中需要疯狂调用一些不同的文件去插值,但是读取文件的这段代码是dll的我还看不到
作者: mccoy93@126.com    时间: 2021-7-13 14:31
风平老涡 发表于 2021-7-9 20:00
几个线程之间读文件顺序是无规的,先到先读。一个线程在读的时候其他线程必须等待。如果文件在一个机器的 ...

谢谢大佬! 不过这个方法对于我这个东西好像行不通,我是算一个系统性能,相当于在计算的过程中需要疯狂调用一些不同的文件去插值,但是读取文件的这段代码是dll的我还看不到
作者: 风平老涡    时间: 2021-7-13 20:20
mccoy93@126.com 发表于 2021-7-13 14:31
谢谢大佬! 不过这个方法对于我这个东西好像行不通,我是算一个系统性能,相当于在计算的过程中需要疯狂 ...

有 多少个文件?几百?上千?如果不是太多,可以先读取所有文件到内存变量,这样就可以几个线程同是读取内存变量。
作者: mccoy93@126.com    时间: 2021-7-14 11:14
风平老涡 发表于 2021-7-13 20:20
有 多少个文件?几百?上千?如果不是太多,可以先读取所有文件到内存变量,这样就可以几个线程同是读取 ...

文件大概有四五十个 数据大概是上千个 目前的样子是这个文件读取这部分代码我看不到,您的意思是我在单线程先读进来,然后储存下来再用是吗?
作者: 风平老涡    时间: 2021-7-14 21:07
mccoy93@126.com 发表于 2021-7-14 11:14
文件大概有四五十个 数据大概是上千个 目前的样子是这个文件读取这部分代码我看不到,您的意思是我在单线 ...

是的。可以定义一个二维数组,其中一维是文件,另一维是每个文件中的数据。先用单线程读取所有文件到这个二维数组,随后多线程可读取该二维数组。
作者: mccoy93@126.com    时间: 2021-7-17 14:47
风平老涡 发表于 2021-7-14 21:07
是的。可以定义一个二维数组,其中一维是文件,另一维是每个文件中的数据。先用单线程读取所有文件到这个 ...

多谢大佬,我试试





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2