[问题] openMP

楼主: ja000123 (Recluse)   2013-02-07 15:26:45
模式想要利用openMP平行化
以下剪一小段副程式的呼叫,可以正常执行
加入!$OMP DO以后 (以下绿色字体部分)
编译没有bug 但程式却也没办法跑
想问一下是哪边设定或逻辑上发生错误?
有想过是不是common或是哪边变量平行化后会产生冲突
但也不知该从何下手
恳请板友们指教了,谢谢!!
以下是程式码
作者: gilocustom   2013-02-07 16:47:00
(1)什么叫做"没办法跑"?(2)建议把平行区块内的各个变量的属性都标明。你的怀疑是合理的,请参考以下连结:https://computing.llnl.gov/tutorials/openMP/#THREADPRIVATE再者,你这样写会导致不同的执行绪同时读/写/开/关同个档案,迟早触发race condition。喔看错,可能会造成困扰的是(只)同时开/关同个档案。又错...同时读也会造成问题。如果只是同时操作同一编号的不同名称档案,只需要改成各执行绪用不同的编号即可。如果是操作同一名称的档案,可以考虑为各执行绪创建不同名称的副本(复制或连结),视需要最后再删除或合并。也可以考虑每到操作档案时限制只有一个执行绪可用。话说回来,除非你用的储存装置够快,快到可以轻松负荷多个执行绪同时读写档案,否则读写就效能来说没有必要平行化,甚至可能会有反效果。你需要先了解变量的属性有哪些以及各自的用途,然后再仔细审视程式码、依照各个变量的需求赋予不同的属性,譬如我上面给的连结就是在说明其中一种你的程式码可能会需要用到的变量属性。da01等变量并不是全域的,而且也不是从主程式传递至副程式,所以在主程式令其为PRIVATE是没有意义的,只会多占用一点点内存。不同路径就是不同档案,除非你是同档案连结到不同路径.主程式的那些字串变量(ch29等)和副程式内同名的变量根本没有关系所以不必给属性,而其实在主程式中根本用不到所以甚至不需要宣告。副程式的那些字串就是另外一个世界了所以也不用动。common的变量如要私有化需要使用THREADPRIVATE属性。max1与max2都是常数所以不需要也不可以给属性。循环用的引数i当然要私有化所以是PRIVATE。inp19的其他变量(nn19~nm119)如果有需要私有化那就私有化,不过主程式乍看根本用不到这些变量所以干脆连传都不要传了,直接省去就不用考虑要用哪种私有化的属性,不然你就还是要视需求慎择属性。最后就是档案编号,再加上i就可以简单避免重复,或者加上执行绪的编号也可以。
作者: Cypresslin (啊哈哈~~)   2013-02-10 00:43:00
楼上平行魔人

Links booklink

Contact Us: admin [ a t ] ucptt.com