On 03/02/2018 09:47 PM, Cesar Philippidis wrote:
two test cases.
Committed as separate patch, while ignoring the warnings "using vector_length \\(32\\), ignoring 128".
Thanks, - Tom
[openacc] Add vector_length 128 testcases 2018-03-27 Cesar Philippidis <ce...@codesourcery.com> Tom de Vries <t...@codesourcery.com> * testsuite/libgomp.oacc-c-c++-common/vred2d-128.c: New test. * testsuite/libgomp.oacc-fortran/gemm.f90: New test. --- .../libgomp.oacc-c-c++-common/vred2d-128.c | 57 +++++++++++ libgomp/testsuite/libgomp.oacc-fortran/gemm.f90 | 109 +++++++++++++++++++++ 3 files changed, 172 insertions(+) diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c new file mode 100644 index 0000000..1dc5fe0 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/vred2d-128.c @@ -0,0 +1,57 @@ +/* Test large vector lengths. */ + +#include <assert.h> + +#define n 10000 +int a1[n], a2[n]; + +#define gentest(name, outer, inner) \ + void name () \ + { \ + long i, j, t1, t2, t3; \ + _Pragma(outer) \ + for (i = 0; i < n; i++) \ + { \ + t1 = 0; \ + t2 = 0; \ + _Pragma(inner) \ + for (j = i; j < n; j++) \ + { \ + t1++; \ + t2--; \ + } \ + a1[i] = t1; \ + a2[i] = t2; \ + } \ + for (i = 0; i < n; i++) \ + { \ + assert (a1[i] == n-i); \ + assert (a2[i] == -(n-i)); \ + } \ + } \ + +gentest (test1, "acc parallel loop gang vector_length (128)", + "acc loop vector reduction(+:t1) reduction(-:t2)") + +gentest (test2, "acc parallel loop gang vector_length (128)", + "acc loop worker vector reduction(+:t1) reduction(-:t2)") + +gentest (test3, "acc parallel loop gang worker vector_length (128)", + "acc loop vector reduction(+:t1) reduction(-:t2)") + +gentest (test4, "acc parallel loop", + "acc loop reduction(+:t1) reduction(-:t2)") + +/* { dg-prune-output "using vector_length \\(32\\), ignoring 128" } */ + + +int +main () +{ + test1 (); + test2 (); + test3 (); + test4 (); + + return 0; +} diff --git a/libgomp/testsuite/libgomp.oacc-fortran/gemm.f90 b/libgomp/testsuite/libgomp.oacc-fortran/gemm.f90 new file mode 100644 index 0000000..62b8a45 --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/gemm.f90 @@ -0,0 +1,109 @@ +! Exercise three levels of parallelism using SGEMM from BLAS. + +! { dg-additional-options "-fopenacc-dim=-:-:128" } + +! Implicitly set vector_length to 128 using -fopenacc-dim. +subroutine openacc_sgemm (m, n, k, alpha, a, b, beta, c) + integer :: m, n, k + real :: alpha, beta + real :: a(k,*), b(k,*), c(m,*) + + integer :: i, j, l + real :: temp + + !$acc parallel loop copy(c(1:m,1:n)) copyin(a(1:k,1:m),b(1:k,1:n)) + do j = 1, n + !$acc loop + do i = 1, m + temp = 0.0 + !$acc loop reduction(+:temp) + do l = 1, k + temp = temp + a(l,i)*b(l,j) + end do + if(beta == 0.0) then + c(i,j) = alpha*temp + else + c(i,j) = alpha*temp + beta*c(i,j) + end if + end do + end do +end subroutine openacc_sgemm + +! Explicitly set vector_length to 128 using a vector_length clause. +subroutine openacc_sgemm_128 (m, n, k, alpha, a, b, beta, c) + integer :: m, n, k + real :: alpha, beta + real :: a(k,*), b(k,*), c(m,*) + + integer :: i, j, l + real :: temp + + !$acc parallel loop copy(c(1:m,1:n)) copyin(a(1:k,1:m),b(1:k,1:n)) vector_length (128) + ! { dg-prune-output "using vector_length \\(32\\), ignoring 128" } + do j = 1, n + !$acc loop + do i = 1, m + temp = 0.0 + !$acc loop reduction(+:temp) + do l = 1, k + temp = temp + a(l,i)*b(l,j) + end do + if(beta == 0.0) then + c(i,j) = alpha*temp + else + c(i,j) = alpha*temp + beta*c(i,j) + end if + end do + end do +end subroutine openacc_sgemm_128 + +subroutine host_sgemm (m, n, k, alpha, a, b, beta, c) + integer :: m, n, k + real :: alpha, beta + real :: a(k,*), b(k,*), c(m,*) + + integer :: i, j, l + real :: temp + + do j = 1, n + do i = 1, m + temp = 0.0 + do l = 1, k + temp = temp + a(l,i)*b(l,j) + end do + if(beta == 0.0) then + c(i,j) = alpha*temp + else + c(i,j) = alpha*temp + beta*c(i,j) + end if + end do + end do +end subroutine host_sgemm + +program main + integer, parameter :: M = 100, N = 50, K = 2000 + real :: a(K, M), b(K, N), c(M, N), d (M, N), e (M, N) + real alpha, beta + integer i, j + + a(:,:) = 1.0 + b(:,:) = 0.25 + + c(:,:) = 0.0 + d(:,:) = 0.0 + e(:,:) = 0.0 + + alpha = 1.05 + beta = 1.25 + + call openacc_sgemm (M, N, K, alpha, a, b, beta, c) + call openacc_sgemm_128 (M, N, K, alpha, a, b, beta, d) + call host_sgemm (M, N, K, alpha, a, b, beta, e) + + do i = 1, m + do j = 1, n + if (c(i,j) /= e(i,j)) call abort + if (d(i,j) /= e(i,j)) call abort + end do + end do +end program main