mccoy93@126.com 发表于 2021-7-7 15:07:56

求助各位大神OMP的问题

我现在把一段程序用OpenMP进行编译,在每个线程进行计算时都需要读取一个文件,然后在运行过程中就会报错,现在初步判断可能是在多线程工作时同时读取相同文件导致的错误,这种错误应该怎么解决啊?求助大神们啊

风平老涡 发表于 2021-7-7 20:28:14

并行计算中在同一媒体上进行文件读写一般只能有一个线程/进程。如果你一定需要每个线程进行计算时都需要读取一个文件的话, 用critical, 如下:
!$omp critical
read
!$omp end critical

mccoy93@126.com 发表于 2021-7-9 16:54:38

风平老涡 发表于 2021-7-7 20:28
并行计算中在同一媒体上进行文件读写一般只能有一个线程/进程。如果你一定需要每个线程进行计算时都需要读 ...

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

风平老涡 发表于 2021-7-9 20:00:41

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

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

necrohan 发表于 2021-7-11 14:12:26

把那个文件复制几份,末尾带数字编号,然后用线程号对应的文件名读

mccoy93@126.com 发表于 2021-7-13 14:30:37

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

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

mccoy93@126.com 发表于 2021-7-13 14:31:22

风平老涡 发表于 2021-7-9 20:00
几个线程之间读文件顺序是无规的,先到先读。一个线程在读的时候其他线程必须等待。如果文件在一个机器的 ...

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

风平老涡 发表于 2021-7-13 20:20:32

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

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

mccoy93@126.com 发表于 2021-7-14 11:14:10

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

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

风平老涡 发表于 2021-7-14 21:07:32

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

是的。可以定义一个二维数组,其中一维是文件,另一维是每个文件中的数据。先用单线程读取所有文件到这个二维数组,随后多线程可读取该二维数组。
页: [1] 2
查看完整版本: 求助各位大神OMP的问题