<Image-selector Example Program>
Program image_selector_example
Implicit None
Real,Allocatable :: a(:,:)[:]
Integer i,image,iset,j,m[*],m_per_image,n[*]
If (This_Image()==1) Then
!
! Read the problem size.
!
Read *,n,m
!
! M vectors of length N.
!
End If
!
! All images allocate the coarray that will hold the data.
! Get N from image 1 before allocation.
! If there are more data sets than images, the data sets
! are spread as evenly as possible: M_PER_IMAGE is the maximum
! number of data sets on any image.
!
Sync All
If (This_Image()>1) Then
n = n[1]
m = m[1]
End If
m_per_image = (m-1)/Num_Images() + 1
Allocate(a(n,m_per_image)[*])
If (This_Image()==1) Then
!
! Image 1 continues to read the data for all images.
!
image = 1
iset = 1
Do i=1,m
Read *,a(:,iset)[image]
If (image==Num_Images()) Then
! Filled up this slot on each image, reset to 1.
image = 1
iset = iset + 1
Else
image = image + 1
End If
End Do
End If
Sync All
!
! All images process all of their data locally.
! Use ISET to keep track of the data set number, so that
! we don't try to process data sets beyond M.
!
iset = This_Image()
Do i=1,m_per_image
If (iset>m) Exit ! Nothing more to do on this image.
! We have the data: calculate the magnitude sum suffix.
a(1,i) = Abs(a(1,i))
Do j=2,n
a(j,i) = a(j-1,i) + Abs(a(j,i))
End Do
iset = iset + Num_Images()
End Do
!
! Wait for everyone to finish.
!
Sync All
If (This_Image()==1) Then
!
! Image one will now report the results.
!
image = 1
iset = 1
Do i=1,m
Print 1,i,(a(j,iset)[image],j=1,n)
1 Format(1X,'Data set ',I0,' magsumsuffix =',999F7.2)
If (image==Num_Images()) Then
! Processed this slot on each image, reset to 1.
image = 1
iset = iset + 1
Else
image = image + 1
End If
End Do
End If
End Program
<Example Input>
5 10
-3.00 4.19 4.80 4.17 3.72
2.80 -.31 2.09 -4.29 -4.29
.59 4.07 3.68 -1.90 .53
-1.29 2.47 -.61 2.06 .25
-4.03 -1.37 -4.89 -2.53 3.22
-3.46 -.16 -3.37 -2.10 -.03
-2.93 3.49 4.03 2.14 -2.24
4.98 1.15 3.56 1.50 .35
-.58 1.54 -.42 -4.02 4.04
-.36 4.51 4.17 .21 1.98
■ Execution Results
Data set 1 magsumsuffix = 3.00 7.19 11.99 16.16 19.88
Data set 2 magsumsuffix = 2.80 3.11 5.20 9.49 13.78
Data set 3 magsumsuffix = 0.59 4.66 8.34 10.24 10.77
Data set 4 magsumsuffix = 1.29 3.76 4.37 6.43 6.68
Data set 5 magsumsuffix = 4.03 5.40 10.29 12.82 16.04
Data set 6 magsumsuffix = 3.46 3.62 6.99 9.09 9.12
Data set 7 magsumsuffix = 2.93 6.42 10.45 12.59 14.83
Data set 8 magsumsuffix = 4.98 6.13 9.69 11.19 11.54
Data set 9 magsumsuffix = 0.58 2.12 2.54 6.56 10.60
Data set 10 magsumsuffix = 0.36 4.87 9.04 9.25 11.23