diff --git a/Tests/acc_pqr_list.F90 b/Tests/acc_pqr_list.F90 new file mode 100644 index 0000000..633fd31 --- /dev/null +++ b/Tests/acc_pqr_list.F90 @@ -0,0 +1,246 @@ +! acc_pqr_list.F90 +! +! Feature under test (OpenACC 3.4, Section 1.6, Feb 2026): +! - A pqr-list must contain at least one item. +! - A pqr-list must not have a trailing comma. +! +! Notes: +! T1: int-expr-list is non-empty (single-item list) +! T2: int-expr-list has no trailing comma (multi-item list) +! T3: var-list is non-empty (single-item list) +! T4: var-list has no trailing comma (multi-item list) +! + + +#ifndef T1 +!T1:syntax,pqr-list,runtime,construct-independent,V:3.4- +! int-expr-list non-empty via wait(1) + LOGICAL FUNCTION test1() + USE OPENACC + IMPLICIT NONE + INCLUDE "acc_testsuite.Fh" + INTEGER :: i + REAL(8), DIMENSION(LOOPCOUNT) :: a, b, c + INTEGER :: errors + errors = 0 + + SEEDDIM(1) = 1 +# ifdef SEED + SEEDDIM(1) = SEED +# endif + CALL RANDOM_SEED(PUT=SEEDDIM) + CALL RANDOM_NUMBER(a) + CALL RANDOM_NUMBER(b) + c = 0.0D0 + + !$acc data copyin(a(1:LOOPCOUNT), b(1:LOOPCOUNT)) copy(c(1:LOOPCOUNT)) + !$acc parallel present(a(1:LOOPCOUNT), b(1:LOOPCOUNT), c(1:LOOPCOUNT)) async(1) + !$acc loop + DO i = 1, LOOPCOUNT + c(i) = a(i) + b(i) + END DO + !$acc end parallel + + !$acc wait(1) + !$acc end data + + DO i = 1, LOOPCOUNT + IF (ABS(c(i) - (a(i) + b(i))) .GT. PRECISION) THEN + errors = errors + 1 + END IF + END DO + + test1 = (errors .NE. 0) + END FUNCTION +#endif + +#ifndef T2 +!T2:syntax,pqr-list,runtime,construct-independent,V:3.4- +! int-expr-list no trailing comma via wait(1,2) + LOGICAL FUNCTION test2() + USE OPENACC + IMPLICIT NONE + INCLUDE "acc_testsuite.Fh" + INTEGER :: i + REAL(8), DIMENSION(LOOPCOUNT) :: a, b, c + INTEGER :: errors + errors = 0 + + SEEDDIM(1) = 1 +# ifdef SEED + SEEDDIM(1) = SEED +# endif + CALL RANDOM_SEED(PUT=SEEDDIM) + CALL RANDOM_NUMBER(a) + CALL RANDOM_NUMBER(b) + c = 0.0D0 + + !$acc data copyin(a(1:LOOPCOUNT), b(1:LOOPCOUNT)) copy(c(1:LOOPCOUNT)) + !$acc parallel present(a(1:LOOPCOUNT), b(1:LOOPCOUNT), c(1:LOOPCOUNT)) async(1) + !$acc loop + DO i = 1, LOOPCOUNT + c(i) = a(i) + b(i) + END DO + !$acc end parallel + + !$acc parallel present(c(1:LOOPCOUNT)) async(2) + !$acc loop + DO i = 1, LOOPCOUNT + c(i) = c(i) + END DO + !$acc end parallel + + !$acc wait(1,2) + !$acc end data + + DO i = 1, LOOPCOUNT + IF (ABS(c(i) - (a(i) + b(i))) .GT. PRECISION) THEN + errors = errors + 1 + END IF + END DO + + test2 = (errors .NE. 0) + END FUNCTION +#endif + +#ifndef T3 +!T3:syntax,pqr-list,runtime,construct-independent,V:3.4- +! var-list non-empty via copyin(a(...)) + LOGICAL FUNCTION test3() + USE OPENACC + IMPLICIT NONE + INCLUDE "acc_testsuite.Fh" + INTEGER :: i + REAL(8), DIMENSION(LOOPCOUNT) :: a, c + INTEGER :: errors + errors = 0 + + SEEDDIM(1) = 1 +# ifdef SEED + SEEDDIM(1) = SEED +# endif + CALL RANDOM_SEED(PUT=SEEDDIM) + CALL RANDOM_NUMBER(a) + c = 0.0D0 + + !$acc data copyin(a(1:LOOPCOUNT)) copy(c(1:LOOPCOUNT)) + !$acc parallel present(a(1:LOOPCOUNT), c(1:LOOPCOUNT)) + !$acc loop + DO i = 1, LOOPCOUNT + c(i) = 2.0D0 * a(i) + END DO + !$acc end parallel + !$acc end data + + DO i = 1, LOOPCOUNT + IF (ABS(c(i) - (2.0D0 * a(i))) .GT. PRECISION) THEN + errors = errors + 1 + END IF + END DO + + test3 = (errors .NE. 0) + END FUNCTION +#endif + +#ifndef T4 +!T4:syntax,pqr-list,runtime,construct-independent,V:3.4- +! var-list no trailing comma via copyin(a(...), b(...)) and present(a,b,c) + LOGICAL FUNCTION test4() + USE OPENACC + IMPLICIT NONE + INCLUDE "acc_testsuite.Fh" + INTEGER :: i + REAL(8), DIMENSION(LOOPCOUNT) :: a, b, c + INTEGER :: errors + errors = 0 + + SEEDDIM(1) = 1 +# ifdef SEED + SEEDDIM(1) = SEED +# endif + CALL RANDOM_SEED(PUT=SEEDDIM) + CALL RANDOM_NUMBER(a) + CALL RANDOM_NUMBER(b) + c = 0.0D0 + + !$acc data copyin(a(1:LOOPCOUNT), b(1:LOOPCOUNT)) copy(c(1:LOOPCOUNT)) + !$acc parallel present(a(1:LOOPCOUNT), b(1:LOOPCOUNT), c(1:LOOPCOUNT)) + !$acc loop + DO i = 1, LOOPCOUNT + c(i) = a(i) + b(i) + END DO + !$acc end parallel + !$acc end data + + DO i = 1, LOOPCOUNT + IF (ABS(c(i) - (a(i) + b(i))) .GT. PRECISION) THEN + errors = errors + 1 + END IF + END DO + + test4 = (errors .NE. 0) + END FUNCTION +#endif + + PROGRAM main + IMPLICIT NONE + INCLUDE "acc_testsuite.Fh" + INTEGER :: failcode, testrun + LOGICAL :: failed +#ifndef T1 + LOGICAL :: test1 +#endif +#ifndef T2 + LOGICAL :: test2 +#endif +#ifndef T3 + LOGICAL :: test3 +#endif +#ifndef T4 + LOGICAL :: test4 +#endif + + failcode = 0 + +#ifndef T1 + failed = .FALSE. + DO testrun = 1, NUM_TEST_CALLS + failed = failed .OR. test1() + END DO + IF (failed) THEN + failcode = failcode + 2**0 + END IF +#endif + +#ifndef T2 + failed = .FALSE. + DO testrun = 1, NUM_TEST_CALLS + failed = failed .OR. test2() + END DO + IF (failed) THEN + failcode = failcode + 2**1 + END IF +#endif + +#ifndef T3 + failed = .FALSE. + DO testrun = 1, NUM_TEST_CALLS + failed = failed .OR. test3() + END DO + IF (failed) THEN + failcode = failcode + 2**2 + END IF +#endif + +#ifndef T4 + failed = .FALSE. + DO testrun = 1, NUM_TEST_CALLS + failed = failed .OR. test4() + END DO + IF (failed) THEN + failcode = failcode + 2**3 + END IF +#endif + + CALL EXIT(failcode) + END PROGRAM diff --git a/Tests/acc_pqr_list.c b/Tests/acc_pqr_list.c new file mode 100644 index 0000000..3ee218c --- /dev/null +++ b/Tests/acc_pqr_list.c @@ -0,0 +1,230 @@ +// acc_pqr_list.c +// +// Feature under test (OpenACC 3.4, Section 1.6, Feb 2026): +// - A pqr-list must contain at least one item. +// - A pqr-list must not have a trailing comma. +// +// Notes: +// T1: int-expr-list is non-empty (single-item list) +// T2: int-expr-list has no trailing comma (multi-item list) +// T3: var-list is non-empty (single-item list) +// T4: var-list has no trailing comma (multi-item list) +// + + +#include "acc_testsuite.h" + +#ifndef T1 +int test1(void){ + int err = 0; + srand(SEED); + + real_t *a = (real_t*)malloc(n * sizeof(real_t)); + real_t *b = (real_t*)malloc(n * sizeof(real_t)); + real_t *c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !b || !c){ + free(a); + free(b); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + b[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n], b[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], b[0:n], c[0:n]) async(1) + for (int i = 0; i < n; ++i){ + c[i] = a[i] + b[i]; + } + + #pragma acc wait(1) + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] + b[i])) > PRECISION){ + err++; + } + } + + free(a); + free(b); + free(c); + return err; +} +#endif + +#ifndef T2 +int test2(void){ + int err = 0; + srand(SEED); + + real_t *a = (real_t*)malloc(n * sizeof(real_t)); + real_t *b = (real_t*)malloc(n * sizeof(real_t)); + real_t *c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !b || !c){ + free(a); + free(b); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + b[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n], b[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], b[0:n], c[0:n]) async(1) + for (int i = 0; i < n; ++i){ + c[i] = a[i] + b[i]; + } + + #pragma acc parallel loop present(c[0:n]) async(2) + for (int i = 0; i < n; ++i){ + c[i] = c[i]; + } + + #pragma acc wait(1,2) + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] + b[i])) > PRECISION) err++; + } + + free(a); + free(b); + free(c); + return err; +} +#endif + +#ifndef T3 +int test3(void){ + int err = 0; + srand(SEED); + + real_t *a = (real_t*)malloc(n * sizeof(real_t)); + real_t *c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !c){ + free(a); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], c[0:n]) + for (int i = 0; i < n; ++i){ + c[i] = a[i] * 2; + } + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] * 2)) > PRECISION){ + err++; + } + } + + free(a); + free(c); + return err; +} +#endif + +#ifndef T4 +int test4(void){ + int err = 0; + srand(SEED); + + real_t *a = (real_t*)malloc(n * sizeof(real_t)); + real_t *b = (real_t*)malloc(n * sizeof(real_t)); + real_t *c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !b || !c){ + free(a); + free(b); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + b[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n], b[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], b[0:n], c[0:n]) + for (int i = 0; i < n; ++i){ + c[i] = a[i] + b[i]; + } + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] + b[i])) > PRECISION){ + err++; + } + } + + free(a); + free(b); + free(c); + return err; +} +#endif + +int main(void){ + int failcode = 0; + int failed; + +#ifndef T1 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test1(); + } + if (failed){ + failcode |= (1 << 0); + } +#endif +#ifndef T2 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test2(); + } + if (failed){ + failcode |= (1 << 1); + } +#endif +#ifndef T3 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test3(); + } + if (failed){ + failcode |= (1 << 2); + } +#endif +#ifndef T4 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test4(); + } + if (failed){ + failcode |= (1 << 3); + } +#endif + + return failcode; +} diff --git a/Tests/acc_pqr_list.cpp b/Tests/acc_pqr_list.cpp new file mode 100644 index 0000000..183b57c --- /dev/null +++ b/Tests/acc_pqr_list.cpp @@ -0,0 +1,231 @@ +// acc_pqr_list.cpp +// +// Feature under test (OpenACC 3.4, Section 1.6, Feb 2026): +// - A pqr-list must contain at least one item. +// - A pqr-list must not have a trailing comma. +// +// Notes: +// T1: int-expr-list is non-empty (single-item list) +// T2: int-expr-list has no trailing comma (multi-item list) +// T3: var-list is non-empty (single-item list) +// T4: var-list has no trailing comma (multi-item list) +// + + +#include "acc_testsuite.h" +#include +#include + +#ifndef T1 +int test1(){ + int err = 0; + srand(SEED); + + real_t* a = (real_t*)malloc(n * sizeof(real_t)); + real_t* b = (real_t*)malloc(n * sizeof(real_t)); + real_t* c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !b || !c){ + free(a); + free(b); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + b[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n], b[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], b[0:n], c[0:n]) async(1) + for (int i = 0; i < n; ++i){ + c[i] = a[i] + b[i]; + } + #pragma acc wait(1) + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] + b[i])) > PRECISION){ + err++; + } + } + + free(a); + free(b); + free(c); + return err; +} +#endif + +#ifndef T2 +int test2(){ + int err = 0; + srand(SEED); + + real_t* a = (real_t*)malloc(n * sizeof(real_t)); + real_t* b = (real_t*)malloc(n * sizeof(real_t)); + real_t* c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !b || !c){ + free(a); + free(b); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + b[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n], b[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], b[0:n], c[0:n]) async(1) + for (int i = 0; i < n; ++i){ + c[i] = a[i] + b[i]; + } + #pragma acc parallel loop present(c[0:n]) async(2) + for (int i = 0; i < n; ++i){ + c[i] = c[i]; + } + #pragma acc wait(1,2) + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] + b[i])) > PRECISION){ + err++; + } + } + + free(a); + free(b); + free(c); + return err; +} +#endif + +#ifndef T3 +int test3(){ + int err = 0; + srand(SEED); + + real_t* a = (real_t*)malloc(n * sizeof(real_t)); + real_t* c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !c){ + free(a); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], c[0:n]) + for (int i = 0; i < n; ++i){ + c[i] = a[i] * 2; + } + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] * 2)) > PRECISION){ + err++; + } + } + + free(a); + free(c); + return err; +} +#endif + +#ifndef T4 +int test4(){ + int err = 0; + srand(SEED); + + real_t* a = (real_t*)malloc(n * sizeof(real_t)); + real_t* b = (real_t*)malloc(n * sizeof(real_t)); + real_t* c = (real_t*)malloc(n * sizeof(real_t)); + if (!a || !b || !c){ + free(a); + free(b); + free(c); + return 1; + } + + for (int i = 0; i < n; ++i){ + a[i] = rand() / (real_t)(RAND_MAX / 10); + b[i] = rand() / (real_t)(RAND_MAX / 10); + c[i] = 0; + } + + #pragma acc data copyin(a[0:n], b[0:n]) copyout(c[0:n]) + { + #pragma acc parallel loop present(a[0:n], b[0:n], c[0:n]) + for (int i = 0; i < n; ++i){ + c[i] = a[i] + b[i]; + } + } + + for (int i = 0; i < n; ++i){ + if (fabs(c[i] - (a[i] + b[i])) > PRECISION){ + err++; + } + } + + free(a); + free(b); + free(c); + return err; +} +#endif + +int main(){ + int failcode = 0; + int failed; + +#ifndef T1 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test1(); + } + if (failed){ + failcode |= (1 << 0); + } +#endif +#ifndef T2 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test2(); + } + if (failed){ + failcode |= (1 << 1); + } +#endif +#ifndef T3 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test3(); + } + if (failed){ + failcode |= (1 << 2); + } +#endif +#ifndef T4 + failed = 0; + for (int i = 0; i < NUM_TEST_CALLS; ++i){ + failed += test4(); + } + if (failed){ + failcode |= (1 << 3); + } +#endif + + return failcode; +}