open mp 并行段错误
open mp并行中private 变量一超过4M就会出现段错误。系统的stack size 已经设为unlimited,单线程也可正常运行。图片中是一个简单的代码示例,我减小数组的大小即可正常运行。
program test
use omp_lib
implicit none
integer*8 i,j,k,m,c(990,522),b(100,100)
real*8 t1,t2
call omp_set_dynamic(0)
!$OMP PARALLEL default(shared) private(i,j,k,c,b) num_threads(24)
!$omp do schedule(dynamic,5000)
do j=1,1000
do i=1,100
do k=1,100
c(k,i)=i+k
b(k,i)=j+k
end do
end do
end do
!$omp end do
!$OMP END PARALLEL
end
补充一下linux系统的相关设置
捕获.JPG
捕获1.JPG 返回小木虫查看更多
今日热帖
为什么要设置c b为private,你这设计的也不合理,一般private最好是索引变量,何况你这用那么多线程
这只是为了测试方便举得一个例子,我在一个稍微复杂一点的程序了需要用到较大的数组,和线程数量应该没有关系,设置成两个线程依然会出现段错误
不要将大数组设为private,如果数组中一个元素计算与其他元素没有关系,不必设为private,如果有,可以参考一下其他的openmp指令,避免计算错误。
谢谢你的回复,但是我的问题是在另一个大的程序里需要用到一些大的数组作为中间变量,因为在一个线程内频繁的读写,如果定义为shared,我就需要给他加锁保护,会严重影响并行效率。而且我觉得在服务器上,private白嫩俩有4M的限制也太少,想问一下是否是哪里设置错了
你需要大数组作为中间变量,你循环一次应该是用的这个数组中的一个值或者几个值,那数组的其他值你都是没用到的,而是在后续才用到,那为什么需要定义为数组呢,为什么不直接定义这几个需要的值为变量就行了,设为private。不知道你的程序具体实现什么样的功能,这个回答不知道适不适合你的程序。
就是在程序中在每个线程内,我需要多次求矩阵的逆,都是调用MKL库函数做的,因此我就是需要把这个数组存储下来然后在线程内做后续计算,我的问题就是我必须要在一个线程内使用一个private变量超过4M,我觉得肯定的是可以因为4M在科学计算中完全不算什么大数组,想问一下是否我哪里的openmp参数没有设置,导致的栈空间不够
,
栈的空间本来就不大的,你一个线程是4M,那你使用两个线程至少就是8M。。具体的我也不是很清楚,我一般用的都很小。