Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
29300 Discussions

OpenMP fails with segmentation fault

send_to_alan
Beginner
1,018 Views
I am learning openMP, wrote a very simple program and tested it on WindowsXP on a 3.06 GHz P4 HT and it works fine, get about 24% speed improvement and 100% CPU utilization instead of the normal 50%.
The same code when i compile on linux using the latest intel fortran compiler it fails to run with a segmentation fault
the linux system is:
p4 1.8GHz (NO HT)
1GB RAM
FC2 (kernel 2.6.7-1.494.2.2)
lates Ifort version, 8.odd
What am i doing wrong??
this is the messages as i compile
[alan@mmg-vig paral]$ /home/alan/bench/paral/compileVig.txt
bench.f90(27) : (col. 6) remark: OpenMP DEFINED SECTION WAS PARALLELIZED.
[alan@mmg-vig paral]$ /home/alan/bench/paral/a.out
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 00C548B7 Unknown Unknown Unknown
a.out 0045A325 Unknown Unknown Unknown
the compile script is simply
ifort -fpp -assume cc_omp -openmp -openmp_report -threads bench.f90
the source code is
Code:
!==============================================================================
!Simple benchmarking program
!By Alan (24th.August.2004)
!==============================================================================

program bench
!..............................................................................
!declarations
implicit none
integer :: i,k,j,i1,k1
real*8 :: y,t1,t2,dt,y1
integer, dimension(8) :: d_t ,d_t2
character (len = 12), dimension (3):: real_clock ,real_clock2 
!..............................................................................



!open output file
open(unit=1, file="out.txt", status="unknown")

!call intial time
call date_and_time (real_clock (1), real_clock (2),real_clock (3), d_t)

!benchmark
!paralel code

!$OMP PARALLEL SECTIONS  
  
!$OMP SECTION
call f(y)
 
!$OMP SECTION
call s(y1)

!$OMP END PARALLEL SECTIONS


!call time after computation
call date_and_time (real_clock2 (1), real_clock2 (2),real_clock2 (3), d_t2)


!compute time difference(simple conversion to seconds,
!this will fail at certain rare occasions)
t1=(d_t(5)*60*60)+(d_t(6)*60)+(d_t(7))+(d_t(8)/1000.0)
t2=(d_t2(5)*60*60)+(d_t2(6)*60)+(d_t2(7))+(d_t2(8)/1000.0)
dt=t2-t1
!..............................................................................

!write outputs 

!to console(comment these out if you are recompiling this code 
!to run on a headless system)
write(*,*)y,y1,'garbage ignore'
write(*,*)
write(*,*)'============================='
write(*,*)"Initial time :"
write(*,10)d_t(5),d_t(6),d_t(7),d_t(8)
write(*,*)'..............................'
write(*,*)"final time :"
write(*,10)d_t2(5),d_t2(6),d_t2(7),d_t2(8)
write(*,*)'-----------------------------'
write(*,*)"Time difference :"
write(*,*)dt,'seconds'
write(*,*)'============================='

!to file
write(1,*)y,y1,'garbage ignore
'
write(1,*)
write(1,*)'============================='
write(1,*)"Initial time :"
write(1,10)d_t(5),d_t(6),d_t(7),d_t(8)
write(1,*)'..............................'
write(1,*)"Final time :"
write(1,10)d_t2(5),d_t2(6),d_t2(7),d_t2(8)
write(1,*)'-----------------------------'
write(1,*)"Time difference :"
write(1,*)dt,'seconds'
write(1,*)'============================='
10 format(i3,'hr',i3,'min',i3,'s',i4,'ms')




!close file
close(1)

!keep console open(comment this on unix/linux/bsd systems as it 
!is not necessary)
pause

!..............................................................................

end program bench

!first subroutine
subroutine f(y)
integer :: i,k
real*8, intent(out):: y
!inital value
x=10000
y=10
    do k=1, 500
        do i=1, 1000000
            y=y+(y**0.5)*x
        end do
    end do
 end subroutine f

!second subroutine 
subroutine s(y1)
integer :: i1,k1
real*8, intent(out):: y1
!inital value
x=20000
y1=20

    do k1=1, 500
        do i1=1, 1000000
            y1=y1+(y1**0.5)*x
        end do
    end do
 end subroutine s

Please help:smileyhappy:
0 Kudos
5 Replies
shiming_chen
Beginner
1,018 Views
How much is your stack size?
Use "ulimit -s" to show your stack size. If you never change stack size, it will be not enough for a bigger OpenMP program, and the situation causes segmentation fault.

There is a more complete instructions in the compiler release note. Because the system is FC2, I think the problem is the stack size, not the library issue.

Shi-ming Chen
0 Kudos
send_to_alan
Beginner
1,018 Views
Hi thanks for the reply, thought no one would reply!
running the comand you state shows 10240
Would that be in bytes?
Thanks
0 Kudos
shiming_chen
Beginner
1,018 Views
This is system default. You can try a bigger value, like "ulimit -s 20480" or even 102400.
Note: some shells can change stacksize only one times in a session. I usually use 102400.

Shi-ming Chen
0 Kudos
shiming_chen
Beginner
1,018 Views
Would that be in bytes?

The ulimit shows that is in kbytes.

Shi-ming Chen
0 Kudos
shiming_chen
Beginner
1,018 Views


send_to_alan wrote:

Would that be in bytes?





The ulimit shows that is in kbytes.

Shi-ming Chen
0 Kudos
Reply