hebrewsnabla 发表于 2020-6-12 16:24
你这个需求非常适合用MPI解决,可以保证先抽样再演化。
使用openmp的时候最好使并行粒度小一点,例如itr ...
wxhwbh 发表于 2020-6-12 16:44
本身并行的目的就是减少轨迹数大的时候计算所需的时间。如果itraj串行了而里面的sub1和sub2并行的话对结 ...
hebrewsnabla 发表于 2020-6-12 17:43
怎么可能影响结果?结果不对肯定是程序没写对。我举个例子
请问把omp控制命令写在哪个do前面比较省事 ...
wxhwbh 发表于 2020-6-12 18:52
但是,sub2的循环是时间演化,也就是下一次循环需要上一次的信息。这样直接做并行能得到正确的结果吗?
wxhwbh 发表于 2020-6-12 18:52
但是,sub2的循环是时间演化,也就是下一次循环需要上一次的信息。这样直接做并行能得到正确的结果吗?
hebrewsnabla 发表于 2020-6-12 18:59
这个情况用MPI比较好。
非要用omp的话,我重复一下我的疑问:
hebrewsnabla 发表于 2020-6-12 18:59
这个情况用MPI比较好。
非要用omp的话,我重复一下我的疑问:
wxhwbh 发表于 2020-6-12 19:47
我把程序改成这样输出:
用了4个核并行,输出是这样的:
确实采样和演化不在一个线程内。
hebrewsnabla 发表于 2020-6-12 20:42
你这样还是不对,你要检查的是itraj和进程号是不是对应,每次输出进程号的时候要把itraj一起输出。
wxhwbh 发表于 2020-6-12 21:21
比如这样
确实不在一个线程里。
hebrewsnabla 发表于 2020-6-12 21:31
这明明是对的啊
itraj=1时,id一直=0;itraj=1001, id=2; itraj=501, id=1; ...
wxhwbh 发表于 2020-6-12 21:41
原来如此,我发现了解决方法。把OMP PARALLRL DO 改成OMP PARALLRL DO ORDERED结果就对了。虽然没有定义O ...
hebrewsnabla 发表于 2020-6-12 21:47
不需要ordered,你上面输出的结果就是对的;不使用ordered也可以得到这个结果吧?
ordered等于没并行 ...
wxhwbh 发表于 2020-6-12 22:07
不行,不用ORDERED的结果不对,上面那个输出是带ORDERED的。不带的是这样
这样看好像又在一个线程内, ...
hebrewsnabla 发表于 2020-6-12 22:08
是啊,就是在一个线程内。结果不对一定是你别的地方有问题。
用了ordered,等同于串行,结果当然对了 ...
wxhwbh 发表于 2020-6-13 16:12
我再检查了一下发现,可能是采样的问题。我在sub1内部的最后让他输出采样结果,再在sub2内部的开头让它输 ...
万里云 发表于 2020-6-14 11:03
帮楼主用MPI改写了一下:
万里云 发表于 2020-6-14 11:03
帮楼主用MPI改写了一下:
wxhwbh 发表于 2020-6-14 15:41
我试着按这个方法改写了程序,发现可以起到并行的作用,但最后输出的结果是正确结果的1/np倍(np是并行核 ...
万里云 发表于 2020-6-14 16:47
openmp是“多线程”并行,进程还是只有一个,数据在线程间共享。而MPI是“多进程”并行,每个进程都是一个 ...
wxhwbh 发表于 2020-6-15 10:57
谢谢您。程序大部分都没有问题了,但还有一个小问题:演化的第一步会生成一个随机数,但我检查发现MPI并 ...
wxhwbh 发表于 2020-6-15 10:57
谢谢您。程序大部分都没有问题了,但还有一个小问题:演化的第一步会生成一个随机数,但我检查发现MPI并 ...
万里云 发表于 2020-6-15 11:20
MPI每个进程是同时启动的,随机函数生成器读取系统时间做种子值,种子值也是一样的。
试试用这个子程 ...
wxhwbh 发表于 2020-6-15 13:44
谢谢,用了这个后确实能生成不同的随机数。
这个程序是什么原理呢?我好像在别的程序也见过类似的代码。 ...
欢迎光临 计算化学公社 (http://bbs.keinsci.com/) | Powered by Discuz! X3.3 |