gemm-2.f90 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. ! Exercise three levels of parallelism using SGEMM from BLAS.
  2. ! { dg-do run }
  3. ! { dg-additional-options "-fopenacc-dim=::128" }
  4. ! { dg-additional-options -Wuninitialized }
  5. ! Implicitly set vector_length to 128 using -fopenacc-dim.
  6. subroutine openacc_sgemm (m, n, k, alpha, a, b, beta, c)
  7. integer :: m, n, k
  8. real :: alpha, beta
  9. real :: a(k,*), b(k,*), c(m,*)
  10. integer :: i, j, l
  11. real :: temp
  12. ! { dg-note {'temp' was declared here} {} { target *-*-* } .-1 }
  13. !$acc parallel loop copy(c(1:m,1:n)) copyin(a(1:k,1:m),b(1:k,1:n)) firstprivate (temp)
  14. ! { dg-warning {'temp' is used uninitialized} {} { target *-*-* } .-1 }
  15. do j = 1, n
  16. !$acc loop
  17. do i = 1, m
  18. temp = 0.0
  19. !$acc loop reduction(+:temp)
  20. do l = 1, k
  21. temp = temp + a(l,i)*b(l,j)
  22. end do
  23. if(beta == 0.0) then
  24. c(i,j) = alpha*temp
  25. else
  26. c(i,j) = alpha*temp + beta*c(i,j)
  27. end if
  28. end do
  29. end do
  30. end subroutine openacc_sgemm
  31. subroutine host_sgemm (m, n, k, alpha, a, b, beta, c)
  32. integer :: m, n, k
  33. real :: alpha, beta
  34. real :: a(k,*), b(k,*), c(m,*)
  35. integer :: i, j, l
  36. real :: temp
  37. do j = 1, n
  38. do i = 1, m
  39. temp = 0.0
  40. do l = 1, k
  41. temp = temp + a(l,i)*b(l,j)
  42. end do
  43. if(beta == 0.0) then
  44. c(i,j) = alpha*temp
  45. else
  46. c(i,j) = alpha*temp + beta*c(i,j)
  47. end if
  48. end do
  49. end do
  50. end subroutine host_sgemm
  51. program main
  52. integer, parameter :: M = 100, N = 50, K = 2000
  53. real :: a(K, M), b(K, N), c(M, N), d (M, N), e (M, N)
  54. real alpha, beta
  55. integer i, j
  56. a(:,:) = 1.0
  57. b(:,:) = 0.25
  58. c(:,:) = 0.0
  59. d(:,:) = 0.0
  60. e(:,:) = 0.0
  61. alpha = 1.05
  62. beta = 1.25
  63. call openacc_sgemm (M, N, K, alpha, a, b, beta, c)
  64. call host_sgemm (M, N, K, alpha, a, b, beta, e)
  65. do i = 1, m
  66. do j = 1, n
  67. if (c(i,j) /= e(i,j)) stop 1
  68. end do
  69. end do
  70. end program main