当前位置: 首页 > 程序语言 >open mp 并行段错误

open mp 并行段错误

作者 keep-fighter
来源: 小木虫 400 8 举报帖子
+关注

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系统的相关设置

open mp 并行段错误
捕获.JPG
open mp 并行段错误-1
捕获1.JPG 返回小木虫查看更多

今日热帖
  • 精华评论
  • 1014511134

    为什么要设置c b为private,你这设计的也不合理,一般private最好是索引变量,何况你这用那么多线程

  • keep-fighter

    引用回帖:
    2楼: Originally posted by 1014511134 at 2018-06-24 19:54:11
    为什么要设置c b为private,你这设计的也不合理,一般private最好是索引变量,何况你这用那么多线程

    这只是为了测试方便举得一个例子,我在一个稍微复杂一点的程序了需要用到较大的数组,和线程数量应该没有关系,设置成两个线程依然会出现段错误

  • 1014511134

    引用回帖:
    3楼: Originally posted by keep-fighter at 2018-06-24 22:55:55
    这只是为了测试方便举得一个例子,我在一个稍微复杂一点的程序了需要用到较大的数组,和线程数量应该没有关系,设置成两个线程依然会出现段错误...

    不要将大数组设为private,如果数组中一个元素计算与其他元素没有关系,不必设为private,如果有,可以参考一下其他的openmp指令,避免计算错误。

  • keep-fighter

    引用回帖:
    4楼: Originally posted by 1014511134 at 2018-06-25 09:18:12
    不要将大数组设为private,如果数组中一个元素计算与其他元素没有关系,不必设为private,如果有,可以参考一下其他的openmp指令,避免计算错误。...

    谢谢你的回复,但是我的问题是在另一个大的程序里需要用到一些大的数组作为中间变量,因为在一个线程内频繁的读写,如果定义为shared,我就需要给他加锁保护,会严重影响并行效率。而且我觉得在服务器上,private白嫩俩有4M的限制也太少,想问一下是否是哪里设置错了

  • 1014511134

    引用回帖:
    5楼: Originally posted by keep-fighter at 2018-06-25 09:28:02
    谢谢你的回复,但是我的问题是在另一个大的程序里需要用到一些大的数组作为中间变量,因为在一个线程内频繁的读写,如果定义为shared,我就需要给他加锁保护,会严重影响并行效率。而且我觉得在服务器上,private白 ...

    你需要大数组作为中间变量,你循环一次应该是用的这个数组中的一个值或者几个值,那数组的其他值你都是没用到的,而是在后续才用到,那为什么需要定义为数组呢,为什么不直接定义这几个需要的值为变量就行了,设为private。不知道你的程序具体实现什么样的功能,这个回答不知道适不适合你的程序。

  • keep-fighter

    引用回帖:
    6楼: Originally posted by 1014511134 at 2018-06-25 09:55:40
    你需要大数组作为中间变量,你循环一次应该是用的这个数组中的一个值或者几个值,那数组的其他值你都是没用到的,而是在后续才用到,那为什么需要定义为数组呢,为什么不直接定义这几个需要的值为变量就行了,设为 ...

    就是在程序中在每个线程内,我需要多次求矩阵的逆,都是调用MKL库函数做的,因此我就是需要把这个数组存储下来然后在线程内做后续计算,我的问题就是我必须要在一个线程内使用一个private变量超过4M,我觉得肯定的是可以因为4M在科学计算中完全不算什么大数组,想问一下是否我哪里的openmp参数没有设置,导致的栈空间不够

  • 1014511134

    引用回帖:
    7楼: Originally posted by keep-fighter at 2018-06-25 10:10:56
    就是在程序中在每个线程内,我需要多次求矩阵的逆,都是调用MKL库函数做的,因此我就是需要把这个数组存储下来然后在线程内做后续计算,我的问题就是我必须要在一个线程内使用一个private变量超过4M,我觉得肯定的 ...

    栈的空间本来就不大的,你一个线程是4M,那你使用两个线程至少就是8M。。具体的我也不是很清楚,我一般用的都很小。

猜你喜欢