diff --git a/.gitignore b/.gitignore index 975e154..cab0436 100644 --- a/.gitignore +++ b/.gitignore @@ -49,7 +49,6 @@ dvm/rts-dvmh/ dvm/tools/projectStructureForFortran/ dvm/tools/pppa/.svn dvm/tools/Zlib/.svn -dvm/tools/tester/ dvm/tools/predictor/ dvm/tools/omp-dbg/ dvm/tools/omp-otc/ diff --git a/dvm/tools/tester/trunk/automation/build-and-test.sh b/dvm/tools/tester/trunk/automation/build-and-test.sh new file mode 100644 index 0000000..a0e04dc --- /dev/null +++ b/dvm/tools/tester/trunk/automation/build-and-test.sh @@ -0,0 +1,104 @@ +#!/bin/sh + +SAVE_DIR=`pwd` +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) + +if [ "$1" = "--continue" ]; then + CONTINUE_FLAG=1 + shift +else + CONTINUE_FLAG=0 +fi +ORIG_DIR="$1" +REV_NUMBER=$2 + +if [ -f "$SAVE_DIR/dvm-tester.config" ]; then + . "$SAVE_DIR/dvm-tester.config" +fi + +if [ -z "$PLATFORMS" ]; then + exit 1 +fi + +if [ -z "$TEST_SUITE" ]; then + exit 1 +fi + +FULL_REP_URL="$PUBL_BASE_URL/r${REV_NUMBER}${PUBL_SUFFIX}/" + +TEST_SUITE=$(cd "$TEST_SUITE" && pwd) + +# Actually, can be taken any temporary name +RESULTS_DIR="$ORIG_DIR.results" +export TMPDIR="$ORIG_DIR.work" +if [ -d "/home/scratch" ]; then + TEMPL_NAME="/home/scratch/$(basename "$TMPDIR").XXX" + TMPDIR=$(mktemp -d "$TEMPL_NAME") +fi +mkdir -p "$TMPDIR" + +# Launch task processor +TASK_FIFO="$(mktemp -u).task-fifo" +mkfifo "$TASK_FIFO" +if [ $CONTINUE_FLAG -eq 0 ]; then + rm -rf "$RESULTS_DIR" +fi +mkdir -p "$RESULTS_DIR" +cd "$SAVE_DIR" +"$MY_DIR/task-processor.sh" "$RESULTS_DIR" <"$TASK_FIFO" & + +# Build DVM-systems for given platforms and sequentially feed task processor from our test-suite +exec 4>"$TASK_FIFO" +for platf in $PLATFORMS; do + WORK_DIR="$ORIG_DIR.$platf" + if [ $CONTINUE_FLAG -eq 0 ]; then + rm -rf "$WORK_DIR" + fi + if [ ! -e "$WORK_DIR" ]; then + cp -r "$ORIG_DIR" "$WORK_DIR" + fi + cd "$WORK_DIR/dvm_sys" + if [ ! -f platforms/$platf ]; then + if [ -f "$SAVE_DIR/$platf" ]; then + cp "$SAVE_DIR/$platf" platforms/ + else + echo "Can not find platform $platf" + fi + fi + if [ -f platforms/$platf ]; then + PLATFORM=$platf ./dvminstall >install.log 2>& 1 + INST_RES=$? + if [ $INST_RES -ne 0 -o ! -f user/dvm ]; then + : + # TODO: Handle errors with building DVM-system + else + cd "$SAVE_DIR" + "$MY_DIR/perform-tests.sh" "$WORK_DIR/dvm_sys" "$TEST_SUITE" 4 + fi + fi +done +exec 4>&- + +# Wait for task processor to finish +wait + +# Cleanup stuff +rm "$TASK_FIFO" +for platf in $PLATFORMS; do + WORK_DIR="$ORIG_DIR.$platf" +# rm -rf "$WORK_DIR" +done + +# Generate final report +cd "$SAVE_DIR" +"$MY_DIR/gen-report.sh" "$TEST_SUITE" "$RESULTS_DIR" "$FULL_REP_URL" $REV_NUMBER + +# Publish the report and send summary e-mail +if [ "$POPULATE_FLAG" = "1" ]; then + cd "$SAVE_DIR" + "$MY_DIR/populate-report.sh" "$RESULTS_DIR" "$REV_NUMBER" +fi + +# Cleanup stuff finally +#rm -rf "$RESULTS_DIR" +#rm -rf "$TMPDIR" diff --git a/dvm/tools/tester/trunk/automation/check-repo.sh b/dvm/tools/tester/trunk/automation/check-repo.sh new file mode 100644 index 0000000..f1c9f80 --- /dev/null +++ b/dvm/tools/tester/trunk/automation/check-repo.sh @@ -0,0 +1,65 @@ +#!/bin/sh + +unset CDPATH + +REPO_URL=http://svn.dvm-system.org/svn/dvmhrepo/dvm +REPO_USER=dvmhuser +REPO_PASS=dvmh2013 +PATHS_OF_INTEREST="cdvm/trunk cdvmh-clang/trunk driver/trunk fdvm/trunk general/examples/trunk general/platforms/trunk general/trunk rts/trunk rts-dvmh/trunk tools/pppa/trunk tools/predictor/trunk" + +SVN_PARAMS="--username $REPO_USER --password $REPO_PASS --non-interactive" + +PREV_REV=`cat latest-seen-revision` +[ "$PREV_REV" -ge 0 ] 2>/dev/null +if [ $? -ne 0 ]; then + PREV_REV=0 +fi + +NEW_REV=`svn info $SVN_PARAMS $REPO_URL | grep "Revision" | awk '{ print $2 }'` +[ "$NEW_REV" -ge 1 ] 2>/dev/null +if [ $? -ne 0 ]; then + NEW_REV=0 +fi + +# If latest-seen-revision is corrupted, then inspect only latest revision +if [ $PREV_REV -eq 0 -a $NEW_REV -gt 0 ]; then + PREV_REV=$(( NEW_REV - 1 )) +fi + +CUR_REV=$(( PREV_REV + 1 )) +while [ $CUR_REV -le $NEW_REV ]; do + TO_TEST=1 + COMMIT_MSG=`svn log $SVN_PARAMS --incremental -c $CUR_REV $REPO_URL | tail -n +4` + IS_INTERMEDIATE=`echo "$COMMIT_MSG" | grep -i "intermediate" | wc -l` + IS_TRIVIAL=`echo "$COMMIT_MSG" | grep -i "trivial" | wc -l` + IS_COSMETICS=`echo "$COMMIT_MSG" | grep -i "cosmetics" | wc -l` + IS_MAJOR=`echo "$COMMIT_MSG" | grep -i "major" | wc -l` + if [ $IS_INTERMEDIATE -ne 0 -o $IS_TRIVIAL -ne 0 -o $IS_COSMETICS -ne 0 ]; then + TO_TEST=0 + elif [ $IS_MAJOR -ne 0 ]; then + TO_TEST=2 + fi + if [ $TO_TEST -ne 0 -a -n "$PATHS_OF_INTEREST" ]; then + NO_TEST=1 + for p in $PATHS_OF_INTEREST; do + WHAT_CHANGED=`svn diff $SVN_PARAMS --summarize -c $CUR_REV $REPO_URL/$p` + if [ -n "$WHAT_CHANGED" ]; then + NO_TEST=0 + break + fi + done + if [ $NO_TEST -ne 0 ]; then + TO_TEST=0 + fi + fi + if [ $TO_TEST -eq 1 ]; then + echo $CUR_REV >>pending-revisions + elif [ $TO_TEST -eq 2 ]; then + echo $CUR_REV >>pending-revisions-full + fi + CUR_REV=$(( CUR_REV + 1 )) +done + +if [ $NEW_REV -gt 0 ]; then + echo $NEW_REV >latest-seen-revision +fi diff --git a/dvm/tools/tester/trunk/automation/dvm-tester.config b/dvm/tools/tester/trunk/automation/dvm-tester.config new file mode 100644 index 0000000..e1ffa48 --- /dev/null +++ b/dvm/tools/tester/trunk/automation/dvm-tester.config @@ -0,0 +1,19 @@ +PLATFORMS="Titan" + +TEST_SUITE="test-suite" +RECIPIENTS="krukov@keldysh.ru, bakhtin@keldysh.ru, pritmick@yandex.ru, alex-w900i@yandex.ru, valex@keldysh.ru, savol@keldysh.ru, socol@keldysh.ru, konov@keldysh.ru" + +REPO_BASE_URL="http://svn.dvm-system.org/svn/dvmhrepo" +REPO_USER="dvmhuser" +REPO_PASS="dvmh2013" + +LIST_SERVER="admdvm@svn.dvm-system.org" +LIST_PATH="/home/admdvm/pending-revisions" + +PUBL_BASE_URL="http://svn.dvm-system.org/dvm-test-results" +PUBL_SERVER="admdvm@svn.dvm-system.org" +PUBL_BASE_PATH="/var/www/html/dvm-test-results" +PUBL_SUFFIX= + +MAIL_SERVER="admdvm@svn.dvm-system.org" +SENDMAIL="/usr/sbin/sendmail" diff --git a/dvm/tools/tester/trunk/automation/dvm-tester.sh b/dvm/tools/tester/trunk/automation/dvm-tester.sh new file mode 100644 index 0000000..170c256 --- /dev/null +++ b/dvm/tools/tester/trunk/automation/dvm-tester.sh @@ -0,0 +1,73 @@ +#!/bin/sh + +unset CDPATH + +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) + +MAX_INVOCATIONS=-1 +WAIT_INTERVAL=60 +WORKING_DIR=`pwd` + +parse_params() { + while [ -n "$1" ]; do + if [ "$1" = "--once" ]; then + MAX_INVOCATIONS=1 + elif [ "$1" = "--max-invocations" ]; then + MAX_INVOCATIONS=$2 + shift + elif [ "$1" = "--working-dir" ]; then + WORKING_DIR="$2" + shift + elif [ "$1" = "--wait-interval" ]; then + WAIT_INTERVAL=$2 + shift + fi + shift + done +} + +parse_params "$@" + +if [ -f "$WORKING_DIR/dvm-tester.config" ]; then + . "$WORKING_DIR/dvm-tester.config" +else + echo "No dvm-tester.config found!" >& 2 + exit 1 +fi + +if [ $MAX_INVOCATIONS -lt 0 ]; then + INF_MODE=1 +else + INF_MODE=0 +fi + +counter=0 +while [ $INF_MODE -ne 0 -o $counter -lt $MAX_INVOCATIONS ]; do + while true; do + if [ -f "$WORKING_DIR/dvm-tester.pause" ] && [ -n "$(cat "$WORKING_DIR/dvm-tester.pause")" ]; then + echo "[$(date)] Paused explicitly (local)" + elif [ -f "$MY_DIR/dvm-tester.pause" ] && [ -n "$(cat "$MY_DIR/dvm-tester.pause")" ]; then + echo "[$(date)] Paused explicitly (global)" + elif [ $(ps aux | grep task-processor.sh | wc -l) -gt 1 ]; then + echo "[$(date)] Waiting existing task-processor.sh process to finish" + else + break + fi + sleep $WAIT_INTERVAL + done + echo "[$(date)] Attempting to get pending revision number" + REV=`ssh $LIST_SERVER "head -n 1 $LIST_PATH && tail -n +2 $LIST_PATH >$LIST_PATH.tmp && mv $LIST_PATH.tmp $LIST_PATH"` + echo "[$(date)] Got '$REV'" + if [ -z "$REV" ]; then + if [ $INF_MODE -ne 0 ]; then + sleep $WAIT_INTERVAL + continue + else + break + fi + fi + "$MY_DIR/test-revision.sh" --working-dir "$WORKING_DIR" --populate $REV + counter=$(( counter + 1 )) +done + +echo "[$(date)] Exiting normally" diff --git a/dvm/tools/tester/trunk/automation/populate-report.sh b/dvm/tools/tester/trunk/automation/populate-report.sh new file mode 100644 index 0000000..ffd5c09 --- /dev/null +++ b/dvm/tools/tester/trunk/automation/populate-report.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +SAVE_DIR=`pwd` +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) + +RESULTS_DIR="$1" +REV_NUMBER=$2 + +if [ -f "$SAVE_DIR/dvm-tester.config" ]; then + . "$SAVE_DIR/dvm-tester.config" +fi + +if [ -z "$RECIPIENTS" ]; then + RECIPIENTS="pritmick@yandex.ru" +fi + +PUBL_PATH="$PUBL_BASE_PATH/r${REV_NUMBER}${PUBL_SUFFIX}" +COPY_PATHS="$PUBL_BASE_PATH/latest${PUBL_SUFFIX}" + +ssh $PUBL_SERVER "mkdir -p \"$PUBL_PATH\"" +scp "$RESULTS_DIR/report/full-report.html" "$PUBL_SERVER:$PUBL_PATH/index.html" +scp "$RESULTS_DIR/report/sources.tgz" "$PUBL_SERVER:$PUBL_PATH/sources.tgz" +for p in $COPY_PATHS; do + ssh $PUBL_SERVER "rm -rf \"$p\"; cp -r \"$PUBL_PATH\" \"$p\"" +done +create_email() +{ + echo "MIME-Version: 1.0" + echo "Content-type: text/html;charset=UTF-8" + echo "From: dvm@keldysh.ru" + echo "To: $RECIPIENTS" + echo "Subject: DVM tester: Test results for revision $REV_NUMBER" + echo + cat "$1" + echo "." + echo +} +create_email "$RESULTS_DIR/report/brief-report.html" | ssh $MAIL_SERVER "$SENDMAIL $RECIPIENTS" diff --git a/dvm/tools/tester/trunk/automation/test-revision.sh b/dvm/tools/tester/trunk/automation/test-revision.sh new file mode 100644 index 0000000..f468693 --- /dev/null +++ b/dvm/tools/tester/trunk/automation/test-revision.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +unset CDPATH + +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) + +POPULATE_FLAG=0 +WORKING_DIR=`pwd` +REV= + +parse_params() { + while [ -n "$1" ]; do + if [ "$1" = "--working-dir" ]; then + WORKING_DIR="$2" + shift + elif [ "$1" = "--populate" ]; then + POPULATE_FLAG=1 + else + REV=$1 + fi + shift + done +} + +parse_params $@ + +if [ -z "$REV" ]; then + exit 1 +fi + +if [ -f "$WORKING_DIR/dvm-tester.config" ]; then + . "$WORKING_DIR/dvm-tester.config" +else + exit 1 +fi + +REPO_URL="$REPO_BASE_URL/dvm/releases/current-trunk" +SVN_PARAMS="--username $REPO_USER --password $REPO_PASS --non-interactive" + +update_test_suite() { + if [ -e "$TEST_SUITE/.svn" ]; then + ( cd "$TEST_SUITE" && svn $SVN_PARAMS update ) + fi +} + +test_revision() { + REV=$1 + echo "[$(date)] Testing revision $REV" + SAVE_DIR=`pwd` + WORK_DIR="$WORKING_DIR/dvm_r$REV" + rm -rf "$WORK_DIR" + svn co $SVN_PARAMS -r $REV "$REPO_URL" "$WORK_DIR" >/dev/null + SVN_RES=$? + while [ $SVN_RES -ne 0 ]; do + sleep 1 + rm -rf "$WORK_DIR" + svn co $SVN_PARAMS -r $REV "$REPO_URL" "$WORK_DIR" >/dev/null + SVN_RES=$? + done + cd "$WORK_DIR" + TMP_FILE=`mktemp` + svn propget svn:externals >$TMP_FILE + SVN_RES=$? + while [ $SVN_RES -ne 0 ]; do + svn propget svn:externals >$TMP_FILE + SVN_RES=$? + done + CHILDREN=`cat $TMP_FILE | sed '/^$/d' | awk '{print $(NF)}'` + rm $TMP_FILE + for d in $CHILDREN; do + cd "$WORK_DIR/$d" + svn up $SVN_PARAMS -r $REV >/dev/null + SVN_RES=$? + while [ $SVN_RES -ne 0 ]; do + sleep 1 + svn cleanup $SVN_PARAMS + svn up $SVN_PARAMS -r $REV >/dev/null + SVN_RES=$? + done + done + rm -rf "$WORK_DIR.tmp" + mv "$WORK_DIR" "$WORK_DIR.tmp" + svn export "$WORK_DIR.tmp" "$WORK_DIR" >/dev/null + SVN_RES=$? + while [ $SVN_RES -ne 0 ]; do + sleep 1 + rm -rf "$WORK_DIR" + svn export "$WORK_DIR.tmp" "$WORK_DIR" >/dev/null + SVN_RES=$? + done + rm -rf "$WORK_DIR.tmp" + cd "$WORKING_DIR" + POPULATE_FLAG=$POPULATE_FLAG "$MY_DIR/build-and-test.sh" "$WORK_DIR" $REV + echo "[$(date)] Testing revision $REV done" +# rm -rf "$WORK_DIR" + cd "$SAVE_DIR" +} + +update_test_suite +test_revision $REV diff --git a/dvm/tools/tester/trunk/main/configure-run.sh b/dvm/tools/tester/trunk/main/configure-run.sh new file mode 100644 index 0000000..857c890 --- /dev/null +++ b/dvm/tools/tester/trunk/main/configure-run.sh @@ -0,0 +1,86 @@ +#!/bin/sh + +# Common part +MAX_PPN=60 +MAX_CPU_SHARING_FACTOR=4 +MAX_CUDA_SHARING_FACTOR=16 + +# Default +NODE_COUNT=1 +MAX_NODES_PER_TASK=1 +INTERACTIVE=1 +HAS_RES_MANAGER=0 + +# Specializations +if [ `hostname` = "k100" ]; then + NODE_COUNT=64 + MAX_NODES_PER_TASK=8 + INTERACTIVE=0 + # Since launch isn't interactive - one must provide is_launched, is_finished, get_elapsed_time, stdout_fn, stderr_fn calls + get_task_dir() { + local n + for n in 1 2 3 4 5 6 7 8 9; do + if [ -d "$1.$n" ]; then + printf %s "$1.$n" + return + fi + done + printf %s "$1" + } + is_launched() { + local STDOUT_FN + STDOUT_FN="$1" + local STDERR_FN + STDERR_FN="$2" + # Add handling for refuses from SUPPZ + echo 1 + } + is_finished() { + if [ "$(tail -n 1 $(get_task_dir "$1")/manager.log)" = "Exiting..." ]; then + echo 1 + else + echo 0 + fi + } + get_elapsed_time() { + local da + local mo + local ye + local dat + local tim + local sec1 + local sec2 + local task_dir + task_dir="$(get_task_dir "$1")" + dat=`grep "started at" <"$task_dir/manager.log" | awk '{print $5}' | sed 's/\./ /g'` + tim=`grep "started at" <"$task_dir/manager.log" | awk '{print $6}'` + da=`echo "$dat" | awk '{print $1}'` + mo=`echo "$dat" | awk '{print $2}'` + ye=`echo "$dat" | awk '{print $3}'` + dat="$ye-$mo-$da $tim" + sec1=`date -d "$dat" +%s` + dat=`grep "done at" <"$task_dir/manager.log" | awk '{print $6}' | sed 's/\./ /g'` + tim=`grep "done at" <"$task_dir/manager.log" | awk '{print $7}'` + da=`echo "$dat" | awk '{print $1}'` + mo=`echo "$dat" | awk '{print $2}'` + ye=`echo "$dat" | awk '{print $3}'` + dat="$ye-$mo-$da $tim" + sec2=`date -d "$dat" +%s` + echo $(( sec2 - sec1 )) + } + stdout_fn() { + echo "$(get_task_dir "$1")/output" + } + stderr_fn() { + echo "$(get_task_dir "$1")/errors" + } + HAS_RES_MANAGER=1 + # Since machine has resource manager (task queue) - one must provide can_launch call + can_launch() { + if [ `mps 2>/dev/null | tail -n +3 | wc -l` -lt 6 ]; then + echo 1 + else + echo 0 + fi + } +fi diff --git a/dvm/tools/tester/trunk/main/default-test-analyzer.sh b/dvm/tools/tester/trunk/main/default-test-analyzer.sh new file mode 100644 index 0000000..49123ff --- /dev/null +++ b/dvm/tools/tester/trunk/main/default-test-analyzer.sh @@ -0,0 +1,26 @@ +#!/bin/sh + +# Requires variables: LAUNCH_EXIT_CODE, STDERR_FN +# Produces variables: TEST_PASSED, RESULT_COMMENT, ERROR_LEVEL + +if [ `grep -E 'Assertion' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Assertion failed" + ERROR_LEVEL=3 +elif [ `grep -E 'RTS fatal' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="RTS fatal" + ERROR_LEVEL=2 +elif [ `grep -E 'RTS err' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="RTS err" + ERROR_LEVEL=1 +elif [ $LAUNCH_EXIT_CODE -ne 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Launch failure" + ERROR_LEVEL=4 +else + TEST_PASSED=1 + RESULT_COMMENT="OK" + ERROR_LEVEL=0 +fi diff --git a/dvm/tools/tester/trunk/main/gen-report.sh b/dvm/tools/tester/trunk/main/gen-report.sh new file mode 100644 index 0000000..3268fda --- /dev/null +++ b/dvm/tools/tester/trunk/main/gen-report.sh @@ -0,0 +1,348 @@ +#!/bin/bash +# Bash is required due to usage of associative arrays + +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) +SAVE_DIR=`pwd` + +TEST_SUITE="$1" +RESULTS_DIR="$2" +FULL_REP_URL="$3" +REV_NUMBER=$4 + +if [ -z "$FULL_REP_URL" ]; then + FULL_REP_URL="full-report.html" +fi + +if [ -z "$REV_NUMBER" ]; then + REV_NUMBER=UNKNOWN +fi + +MAX_LONELY_OK=50 +REPORT_DIR="$RESULTS_DIR/report" +rm -rf "$REPORT_DIR" +RES_FILES=`mktemp` +find "$RESULTS_DIR" -mindepth 1 -type f | LC_ALL=C sort >$RES_FILES +BUGGY_FILE_DIR="$REPORT_DIR/sources" +mkdir -p "$BUGGY_FILE_DIR" +REPORT_FILE="$REPORT_DIR/brief-report.html" +FULL_REPORT_FILE="$REPORT_DIR/full-report.html" + +COL_COUNT=2 +PLATFORMS= +HAS_SUBTESTS=0 +TOTAL_LAUNCHES=0 +TOTAL_ERROR_LAUNCHES=0 + +while IFS= read -r f; do + CUR_DEPTH=0 + TEST_SHORT_PATH=`basename "$f" .result` + TMPSTR=`dirname "$f"` + while [ "$TMPSTR" != "$RESULTS_DIR" ]; do + CUR_DEPTH=$(( $CUR_DEPTH + 1 )) + TEST_SHORT_PATH="$(basename "$TMPSTR")/$TEST_SHORT_PATH" + TMPSTR=`dirname "$TMPSTR"` + done + IS_SUBTEST=0 + if [ ! -e "$TEST_SUITE/$TEST_SHORT_PATH" ]; then + HAS_SUBTESTS=1 + IS_SUBTEST=1 + fi + if [ $(( CUR_DEPTH + 2 )) -gt $COL_COUNT ]; then + COL_COUNT=$(( $CUR_DEPTH + 2 )) + fi + if [ $IS_SUBTEST -eq 0 ]; then + while IFS= read -r lin; do + eval $lin + if [ -z "$PLATFORMS" ]; then + PLATFORMS=$PLATFORM + else + FOUND_FLAG=0 + for platf in $PLATFORMS; do + if [ $platf = $PLATFORM ]; then + FOUND_FLAG=1 + fi + done + if [ $FOUND_FLAG -eq 0 ]; then + PLATFORMS="$PLATFORMS $PLATFORM" + fi + fi + TOTAL_LAUNCHES=$(( $TOTAL_LAUNCHES + 1 )) + if [ "$ERROR_LEVEL" != "0" ]; then + TOTAL_ERROR_LAUNCHES=$(( $TOTAL_ERROR_LAUNCHES + 1 )) + fi + done <"$f" + fi +done <$RES_FILES + +CAT_COUNT=$(( COL_COUNT - 1 - HAS_SUBTESTS - 1 )) + +exec 5>"$REPORT_FILE" +exec 6>"$FULL_REPORT_FILE" + +echo "" >& 5 +echo "" >& 6 +echo "" >& 5 +echo "" >& 6 +echo "Test results for DVM-system. Revision $REV_NUMBER." >& 5 +echo "Test results for DVM-system. Revision $REV_NUMBER." >& 6 +echo "" >& 6 +echo "" >& 6 +echo "" >& 5 +echo "" >& 6 +echo "" >& 5 +echo "" >& 6 +echo "

Test results for DVM-system. Revision $REV_NUMBER.

" >& 5 +echo "

Test results for DVM-system. Revision $REV_NUMBER.

" >& 6 +echo "

Tested on platforms: $PLATFORMS.

" >& 5 +echo "

Tested on platforms: $PLATFORMS.

" >& 6 +echo "

Full report can be seen on $FULL_REP_URL

" >& 5 +echo "

Launches with errors: $TOTAL_ERROR_LAUNCHES / $TOTAL_LAUNCHES

" >& 5 +echo "

Launches with errors: $TOTAL_ERROR_LAUNCHES / $TOTAL_LAUNCHES

" >& 6 +echo "

Download sources of buggy tests

" >& 6 +echo "" >& 5 +echo "
" >& 6 +echo "" >& 5 +echo "" >& 6 +CUR_COL=0 +while [ $CUR_COL -lt $CAT_COUNT ]; do + echo "" >& 5 + echo "" >& 6 + CUR_COL=$(( CUR_COL + 1 )) +done +echo "" >& 5 +echo "" >& 6 +if [ $HAS_SUBTESTS -ne 0 ]; then + echo "" >& 6 +fi +echo "" >& 5 +echo "" >& 6 +echo "" >& 5 +echo "" >& 6 + +output_cat_recursive() +{ + if [ `basename "$1"` != "$1" ]; then + output_cat_recursive `dirname "$1"` + fi + if [ $TO_BRIEF -ne 0 ]; then + echo "" >& 5 + fi + echo "" >& 6 + FILLED_COLS=$(( FILLED_COLS + 1 )) + if [ $FILLED_COLS -eq 1 -a `basename "$1"` = "Performance" ]; then + FORCE_TABLE=1 + fi +} + +output_cat() +{ + FILLED_COLS=0 + output_cat_recursive "$1" + while [ $FILLED_COLS -lt $CAT_COUNT ]; do + if [ $TO_BRIEF -ne 0 ]; then + echo "" >& 5 + fi + echo "" >& 6 + FILLED_COLS=$(( FILLED_COLS + 1 )) + done +} + +nextDetailsId=1 + +while IFS= read -r f; do + CUR_DEPTH=0 + TEST_SHORT_PATH=`basename "$f" .result` + TMPSTR=`dirname "$f"` + while [ "$TMPSTR" != "$RESULTS_DIR" ]; do + CUR_DEPTH=$(( $CUR_DEPTH + 1 )) + TEST_SHORT_PATH="$(basename "$TMPSTR")/$TEST_SHORT_PATH" + TMPSTR=`dirname "$TMPSTR"` + done + SUBTEST_NAME= + if [ ! -e "$TEST_SUITE/$TEST_SHORT_PATH" ]; then + SUBTEST_NAME=`basename "$TEST_SHORT_PATH"` + TEST_SHORT_PATH=`dirname "$TEST_SHORT_PATH"` + fi + HAS_FAILS=0 + if [ `grep "TEST_PASSED=0" <"$f" | wc -l` -gt 0 ]; then + HAS_FAILS=1 + if [ ! -e "$BUGGY_FILE_DIR/$TEST_SHORT_PATH" ]; then + mkdir -p `dirname "$BUGGY_FILE_DIR/$TEST_SHORT_PATH"` + cp -ur "$TEST_SUITE/$TEST_SHORT_PATH" "$BUGGY_FILE_DIR/$TEST_SHORT_PATH" + fi + fi + TO_BRIEF=1 + if [ -n "$SUBTEST_NAME" -o $HAS_FAILS -eq 0 ]; then + TO_BRIEF=0 + fi + if [ $TO_BRIEF -ne 0 ]; then + echo "" >& 5 + fi + echo "" >& 6 + FORCE_TABLE=0 + output_cat `dirname "$TEST_SHORT_PATH"` + if [ $TO_BRIEF -ne 0 ]; then + echo "" >& 5 + fi + if [ -n "$SUBTEST_NAME" ]; then + echo "" >& 6 + echo "" >& 6 + else + echo "" >& 6 + fi + ERROR_LEVELS=$( + while IFS= read -r lin; do + eval $lin + if [ -z "$ERROR_LEVEL" ]; then + ERROR_LEVEL=0 + fi + echo $ERROR_LEVEL + done <"$f" | sort -unr) + if [ $TO_BRIEF -ne 0 ]; then + echo "" >& 5 + echo "" >& 5 + fi + echo "" >& 6 + echo "" >& 6 +done <$RES_FILES + +echo "
CategoryCategoryTest nameTest nameSubtestTest resultTest result
" >& 5 + basename "$1" >& 5 + echo "" >& 6 + basename "$1" >& 6 + echo "  
" >& 5 + echo `basename "$TEST_SHORT_PATH"` >& 5 + echo "" >& 6 + echo `basename "$TEST_SHORT_PATH"` >& 6 + echo "" >& 6 + echo "$SUBTEST_NAME" >& 6 + echo "" >& 6 + echo `basename "$TEST_SHORT_PATH"` >& 6 + echo "" >& 5 + fi + echo "" >& 6 + LAUNCH_COUNT=`wc -l <"$f"` +# echo "$LAUNCH_COUNT total" >& 5 +# echo "$LAUNCH_COUNT total" >& 6 + if [ -n "$ERROR_LEVELS" ]; then + for el in $ERROR_LEVELS; do + unset countByComment + unset passedByComment + declare -A countByComment + declare -A passedByComment + while IFS= read -r lin; do + eval $lin + if [ -z "$ERROR_LEVEL" ]; then + ERROR_LEVEL=0 + fi + if [ "$ERROR_LEVEL" = "$el" ]; then + if [ -z "${countByComment["$RESULT_COMMENT"]}" ]; then + countByComment["$RESULT_COMMENT"]=0 + fi + countByComment["$RESULT_COMMENT"]=$(( countByComment["$RESULT_COMMENT"] + 1 )) + passedByComment["$RESULT_COMMENT"]=$TEST_PASSED + fi + done <"$f" + for cmt in "${!countByComment[@]}"; do + if [ ${passedByComment["$cmt"]} -ne 0 ]; then + DIV_CLASS=passed + DIV_COLOR=green + else + DIV_CLASS=failed + DIV_COLOR=red + fi + if [ $TO_BRIEF -ne 0 ]; then + echo "
" >& 5 + echo "${countByComment[$cmt]} $cmt" >& 5 + echo "
" >& 5 + fi + echo "
" >& 6 + if [ $HAS_FAILS -ne 0 -o $LAUNCH_COUNT -le $MAX_LONELY_OK -o $FORCE_TABLE -ne 0 ]; then + echo "" >& 6 + echo "${countByComment[$cmt]} $cmt" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + echo "" >& 6 + while IFS= read -r lin; do + eval $lin + if [ -z "$ERROR_LEVEL" ]; then + ERROR_LEVEL=0 + fi + if [ "$ERROR_LEVEL" = "$el" -a "$RESULT_COMMENT" = "$cmt" ]; then + echo "" >& 6 + echo "" >& 6 + if [ $NOH_FLAG -ne 0 ]; then + echo "" >& 6 + else + echo "" >& 6 + fi + if [ $AUTOTFM_FLAG -ne 0 ]; then + echo "" >& 6 + else + echo "" >& 6 + fi + if [ -n "$PROC_GRID" ]; then + echo "" >& 6 + else + echo "" >& 6 + fi + if [ -n "$CPUS_PER_PROC" ]; then + echo "" >& 6 + else + echo "" >& 6 + fi + if [ -n "$CUDAS_PER_PROC" ]; then + echo "" >& 6 + else + echo "" >& 6 + fi + if [ -n "$CALC_TIME" ]; then + echo "" >& 6 + else + echo "" >& 6 + fi + echo "" >& 6 + fi + done <"$f" + echo "
PlatformnoHautoTfmGridCPUsGPUsTime
$PLATFORM+-+-$PROC_GRIDN/A$CPUS_PER_PROCN/A$CUDAS_PER_PROCN/A$CALC_TIMEN/A
" >& 6 + nextDetailsId=$(( nextDetailsId + 1 )) + else + echo "${countByComment[$cmt]} $cmt" >& 6 + fi + echo "
" >& 6 + done + done + else + if [ $TO_BRIEF -ne 0 ]; then + echo " " >& 5 + fi + echo " " >& 6 + fi + if [ $TO_BRIEF -ne 0 ]; then + echo "
" >& 5 +echo "" >& 6 +echo "" >& 5 +echo "" >& 6 +echo "" >& 5 +echo "" >& 6 + +exec 5>&- +exec 6>&- + +cd "$REPORT_DIR" +tar -czf "sources.tgz" "sources" +cd "$SAVE_DIR" + +rm $RES_FILES diff --git a/dvm/tools/tester/trunk/main/machine-config.sh b/dvm/tools/tester/trunk/main/machine-config.sh new file mode 100644 index 0000000..5b3e82f --- /dev/null +++ b/dvm/tools/tester/trunk/main/machine-config.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +# Default +# Assuming several identical processors and not counting HT cores +CPUS_PER_NODE=$(( `cat /proc/cpuinfo | grep "cpu cores" | LC_ALL=C sort | uniq | awk '{ print $4 }'` * `cat /proc/cpuinfo | grep "physical id" | LC_ALL=C sort | uniq | wc -l` )) +which nvidia-smi >/dev/null 2>& 1 +if [ $? -eq 0 ]; then + CUDAS_PER_NODE=`nvidia-smi -L 2>/dev/null | wc -l` +else + CUDAS_PER_NODE=0 +fi + +# Specializations +if [ `hostname` = "k100" ]; then + CPUS_PER_NODE=12 + CUDAS_PER_NODE=3 +fi diff --git a/dvm/tools/tester/trunk/main/perform-tests.sh b/dvm/tools/tester/trunk/main/perform-tests.sh new file mode 100644 index 0000000..50724bf --- /dev/null +++ b/dvm/tools/tester/trunk/main/perform-tests.sh @@ -0,0 +1,352 @@ +#!/bin/bash +# Bash is required due to usage of arrays + +SAVE_DIR=`pwd` +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) + +DVMSYS_DIR="$1" +TEST_SUITE="$2" +TASK_PROCESSOR_FD=$3 + +. "$MY_DIR/machine-config.sh" + +if [ -f "$SAVE_DIR/machine-config.sh" ]; then + . "$SAVE_DIR/machine-config.sh" +fi + +. "$MY_DIR/test-utils.sh" + +PLATFORM_CMD=$(grep "PLATFORM=" <"$DVMSYS_DIR/bin/dvm_settings.sh" | sed -s 's/export //g') +eval $PLATFORM_CMD + +SETTINGS_FILE=settings +ANALYZER_FILE=test-analyzer.sh + +prepare_new_dir() { + local TASK_DIR + TASK_DIR=`mktemp -d` + local COMP_OPTS + COMP_OPTS="$1" + local COMPILE_PID + local COMPILE_RES + cd "$TASK_DIR" + echo "#!/bin/sh" >dvm + echo "export dvmarithmloopsize=1000000" >>dvm + echo "exec '$DVMSYS_DIR/bin/dvm_drv' \"\$@\"" >>dvm + chmod a+x dvm + cp "$DVMSYS_DIR/user/usr.par" ./ + set -m + if [ -f "$TEST_FILE" ]; then + cp "$TEST_FILE" "$TEST_NAME" + ./dvm $LANG_COMP -shared-dvm $COMP_OPTS "$TEST_NAME" >"build.log" 2>& 1 & + COMPILE_PID=$! + else + find "$TEST_FILE" -mindepth 1 -maxdepth 1 | xargs cp -r -t . + PATH="$TASK_DIR:$PATH" ./compile.sh $COMP_OPTS >"build.log" 2>& 1 & + COMPILE_PID=$! + fi + proc_killer -$COMPILE_PID 600 & + KILLER_PID=$! + disown + wait $COMPILE_PID + COMPILE_RES=$? + kill -2 $KILLER_PID >/dev/null 2>& 1 + kill -15 $KILLER_PID >/dev/null 2>& 1 + kill -9 $KILLER_PID >/dev/null 2>& 1 + if [ ! -f "$TEST_FILE" ] && [ $COMPILE_RES -eq 0 ] && [ ! -f "$TEST_EXENAME" ]; then + :> "$TEST_EXENAME" + fi + echo "$TASK_DIR" +} + +do_test() { + TEST_FILE="$1" + TEST_NAME=`basename "$TEST_FILE"` + TEST_SHORT_PATH="$TEST_NAME" + TMPSTR=`dirname $TEST_FILE` + while [ "$TMPSTR" != "$TEST_SUITE" ]; do + TEST_SHORT_PATH="$(basename $TMPSTR)/$TEST_SHORT_PATH" + TMPSTR=`dirname $TMPSTR` + done + TEST_EXENAME="${TEST_NAME%.*}" + case ${TEST_NAME##*.} in + c|cdv) IS_FORTRAN=0;; + f|f90|fdv) IS_FORTRAN=1;; + esac + if [ $IS_FORTRAN -ne 0 ]; then + LANG_COMP="f" + else + LANG_COMP="c" + fi + TEST_DIMS= + if [ -n "$DIMENSION_COUNT" ]; then + TEST_DIMS=$DIMENSION_COUNT + else + for t in $DIMENSION_MAP; do + FN=`echo $t | sed 's/=/ /g' | awk '{print $1}'` + DIM=`echo $t | sed 's/=/ /g' | awk '{print $2}'` + if [ "$FN" = "$TEST_NAME" ]; then + TEST_DIMS=$DIM + break + fi + done + fi + if [ -z "$TEST_DIMS" ]; then + # Trying to extract dimension number from filename - it is first digit in it. + TEST_DIMS=`echo "$TEST_EXENAME" | sed 's/[^0-9]//g' | cut -c1` + fi + if [ -z "$TEST_DIMS" ]; then + echo "Can not find information about dimension count for test $TEST_FILE" >& 2 + TEST_DIMS=1 + fi + if [ $MAX_DIM_PROC_COUNT -le 0 ]; then + MAX_DIM_PROC_COUNT=$MAX_PROC_COUNT + fi + while true; do + if [ -f "$SAVE_DIR/dvm-tester.pause" ] && [ "$(cat "$SAVE_DIR/dvm-tester.pause")" = "Immediate" ]; then + echo "Paused explicitly (local)" + elif [ -f "$MY_DIR/dvm-tester.pause" ] && [ "$(cat "$MY_DIR/dvm-tester.pause")" = "Immediate" ]; then + echo "Paused explicitly (global)" + else + break + fi + sleep 60 + done + echo "Compiling $TEST_SHORT_PATH on $PLATFORM platform" + if [ $GPU_ONLY -eq 0 ]; then + # Compile with noH + NOH_DIR=`prepare_new_dir "-noH"` + if [ -f "$NOH_DIR/$TEST_EXENAME" ]; then + ISSUE_NOH=1 + else + ISSUE_NOH=0 + fi + fi + if [ $DVM_ONLY -eq 0 ]; then + # Compile without noH + H_DIR=`prepare_new_dir ""` + if [ -f "$H_DIR/$TEST_EXENAME" ]; then + ISSUE_H=1 + else + ISSUE_H=0 + fi + # And with autoTfm + AUTOTFM_DIR=`prepare_new_dir "-autoTfm"` + if [ -f "$AUTOTFM_DIR/$TEST_EXENAME" ]; then + ISSUE_AUTOTFM=1 + else + ISSUE_AUTOTFM=0 + fi + fi +# cat "$H_DIR/build.log" + echo "Generating tasks for $TEST_SHORT_PATH with $TEST_DIMS dimensions on $PLATFORM platform" + COMMON_PART=$( + echo -n "TASK_TYPE=1" + echo -n " TEST_PLATFORM=$PLATFORM" + echo -n " SHARE_RESOURCES=$SHARE_RESOURCES" + echo -n " TEST_ANALYZER=\"$TEST_ANALYZER\"" + echo -n " TEST_SHORT_PATH=\"$TEST_SHORT_PATH\"" + echo -n " TASK_EXE=\"$TEST_EXENAME\"" + echo -n " TEST_MAX_TIME=$MAX_TIME" + ) + # Additional size number 0 added + i=0 + while [ $i -le $TEST_DIMS ]; do + sizes[$i]=1 + i=$(( i + 1 )) + done + counter=0 + totalSize=1 + while [ $(( sizes[0] )) -eq 1 ]; do + PROC_GRID= + if [ $IS_FORTRAN -eq 0 ]; then + i=1 + while [ $i -le $TEST_DIMS ]; do + PROC_GRID="$PROC_GRID $((sizes[i]))" + i=$(( i + 1 )) + done + else + i=$TEST_DIMS + while [ $i -ge 1 ]; do + PROC_GRID="$PROC_GRID $((sizes[i]))" + i=$(( i - 1 )) + done + fi + if [ $GPU_ONLY -eq 0 ]; then + if [ $ISSUE_NOH -ne 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$NOH_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " TASK_NOH_FLAG=1" >&$TASK_PROCESSOR_FD + echo -n " CPUS_PER_PROC=1" >&$TASK_PROCESSOR_FD + echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD + counter=$(( counter + 1 )) + echo >&$TASK_PROCESSOR_FD + fi + fi + if [ $DVM_ONLY -eq 0 ]; then + # Single-device and single-threaded configurations + if [ $GPU_ONLY -eq 0 ]; then + if [ $ISSUE_H -ne 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " CPUS_PER_PROC=1" >&$TASK_PROCESSOR_FD + echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD + counter=$(( counter + 1 )) + echo >&$TASK_PROCESSOR_FD + fi + fi + if [ $CUDAS_PER_NODE -gt 0 ]; then + if [ $ISSUE_H -ne 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " CUDAS_PER_PROC=1" >&$TASK_PROCESSOR_FD + echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD + counter=$(( counter + 1 )) + echo >&$TASK_PROCESSOR_FD + fi + if [ $ISSUE_AUTOTFM -ne 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$AUTOTFM_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " TASK_AUTOTFM_FLAG=1" >&$TASK_PROCESSOR_FD + echo -n " CUDAS_PER_PROC=1" >&$TASK_PROCESSOR_FD + echo -n " PROC_GRID=\"$PROC_GRID\"" >&$TASK_PROCESSOR_FD + counter=$(( counter + 1 )) + echo >&$TASK_PROCESSOR_FD + fi + fi + # Multi-device and multi-threaded configurations + MAX_DEVS_PER_PROC=$((sizes[1])) + DEVS_PER_PROC=2 + while [ $DEVS_PER_PROC -le $MAX_DEVS_PER_PROC ]; do + if [ $(( MAX_DEVS_PER_PROC % DEVS_PER_PROC )) -ne 0 ]; then + DEVS_PER_PROC=$(( $DEVS_PER_PROC + 1 )) + continue + fi + if [ $IS_FORTRAN -eq 0 ]; then + MD_PROC_GRID=" $((MAX_DEVS_PER_PROC / DEVS_PER_PROC))" + i=2 + while [ $i -le $TEST_DIMS ]; do + MD_PROC_GRID="$MD_PROC_GRID $((sizes[i]))" + i=$(( i + 1 )) + done + else + MD_PROC_GRID= + i=$TEST_DIMS + while [ $i -ge 2 ]; do + MD_PROC_GRID="$MD_PROC_GRID $((sizes[i]))" + i=$(( i - 1 )) + done + MD_PROC_GRID="$MD_PROC_GRID $((MAX_DEVS_PER_PROC / DEVS_PER_PROC))" + fi + if [ $GPU_ONLY -eq 0 ]; then + if [ $ISSUE_H -ne 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " CPUS_PER_PROC=$DEVS_PER_PROC" >&$TASK_PROCESSOR_FD + echo -n " PROC_GRID=\"$MD_PROC_GRID\"" >&$TASK_PROCESSOR_FD + counter=$(( counter + 1 )) + echo >&$TASK_PROCESSOR_FD + fi + fi + if [ $ALLOW_MULTIDEV -ne 0 ] && [ $CUDAS_PER_NODE -gt 0 ]; then + for ((GPUS_PER_PROC=1; GPUS_PER_PROC<=$DEVS_PER_PROC; GPUS_PER_PROC++)); do + if [ $ISSUE_H -ne 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " CPUS_PER_PROC=$(($DEVS_PER_PROC - $GPUS_PER_PROC))" >&$TASK_PROCESSOR_FD + echo -n " CUDAS_PER_PROC=$GPUS_PER_PROC" >&$TASK_PROCESSOR_FD + echo -n " PROC_GRID=\"$MD_PROC_GRID\"" >&$TASK_PROCESSOR_FD + counter=$(( counter + 1 )) + echo >&$TASK_PROCESSOR_FD + fi + if [ $ISSUE_AUTOTFM -ne 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$AUTOTFM_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " TASK_AUTOTFM_FLAG=1" >&$TASK_PROCESSOR_FD + echo -n " CPUS_PER_PROC=$(($DEVS_PER_PROC - $GPUS_PER_PROC))" >&$TASK_PROCESSOR_FD + echo -n " CUDAS_PER_PROC=$GPUS_PER_PROC" >&$TASK_PROCESSOR_FD + echo -n " PROC_GRID=\"$MD_PROC_GRID\"" >&$TASK_PROCESSOR_FD + counter=$(( counter + 1 )) + echo >&$TASK_PROCESSOR_FD + fi + done + fi + DEVS_PER_PROC=$(( $DEVS_PER_PROC + 1 )) + done + fi + # Advance to next configuration + i=$TEST_DIMS + while [ $i -ge 0 ]; do + sizes[$i]=$(( sizes[i] + 1 )) + totalSize=1 + j=1 + while [ $j -le $TEST_DIMS ]; do + totalSize=$(( totalSize * sizes[j] )) + j=$(( j + 1 )) + done + if [ $(( sizes[i] )) -le $MAX_DIM_PROC_COUNT -a $totalSize -le $MAX_PROC_COUNT ]; then + break + elif [ $i -gt 0 ]; then + sizes[$i]=1 + fi + i=$(( i - 1 )) + done + done + echo "Generated $counter tasks" + COMMON_PART=$( + echo -n "TASK_TYPE=0" + echo -n " TEST_PLATFORM=$PLATFORM" + echo -n " TEST_SHORT_PATH=\"$TEST_SHORT_PATH\"" + echo -n " TASK_EXE=\"$TEST_EXENAME\"" + ) + if [ $GPU_ONLY -eq 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$NOH_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " TASK_NOH_FLAG=1" >&$TASK_PROCESSOR_FD + echo >&$TASK_PROCESSOR_FD + fi + if [ $DVM_ONLY -eq 0 ]; then + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$H_DIR\"" >&$TASK_PROCESSOR_FD + echo >&$TASK_PROCESSOR_FD + echo -n "$COMMON_PART" >&$TASK_PROCESSOR_FD + echo -n " TASK_DIR=\"$AUTOTFM_DIR\"" >&$TASK_PROCESSOR_FD + echo -n " TASK_AUTOTFM_FLAG=1" >&$TASK_PROCESSOR_FD + echo >&$TASK_PROCESSOR_FD + fi +} + +traverse_tests() { + CUR_DIR="$1" + if [ -f "$CUR_DIR/$SETTINGS_FILE" ]; then + . "$CUR_DIR/$SETTINGS_FILE" + fi + if [ -f "$CUR_DIR/$ANALYZER_FILE" ]; then + TEST_ANALYZER="$CUR_DIR/$ANALYZER_FILE" + fi + TESTS=`mktemp` + find "$CUR_DIR" -mindepth 1 -maxdepth 1 -regex '.*[.]\(c\|cdv\|f\|f90\|fdv\)' | LC_ALL=C sort >$TESTS + DIRS=`mktemp` + find "$CUR_DIR" -mindepth 1 -maxdepth 1 -type d -regex '.*/[^.]*' | LC_ALL=C sort >$DIRS + while IFS= read -r f; do + ( do_test "$f" ) + done <$TESTS + while IFS= read -r d; do + ( traverse_tests "$d" ) + done <$DIRS + rm $DIRS $TESTS +} + +set_default_settings() { + MAX_PROC_COUNT=1 + MAX_DIM_PROC_COUNT=0 + SHARE_RESOURCES=0 + ALLOW_MULTIDEV=1 + DVM_ONLY=0 + GPU_ONLY=0 + TEST_ANALYZER="$MY_DIR/default-test-analyzer.sh" + MAX_TIME=300 +} + +set_default_settings +(traverse_tests "$TEST_SUITE") diff --git a/dvm/tools/tester/trunk/main/report.css b/dvm/tools/tester/trunk/main/report.css new file mode 100644 index 0000000..73c2b3a --- /dev/null +++ b/dvm/tools/tester/trunk/main/report.css @@ -0,0 +1,24 @@ +th, td { + text-align: center; +} +div.passed, a.passed { + color: green; +} +div.failed, a.failed { + color: red; +} +a.details { + text-decoration: none; + font-size: 50%; + border-bottom: 1px dashed; +} +span.details { + font-size: 200%; + line-height: normal; +} +table.details0 { + display: none; +} +table.details1 { + display: block; +} diff --git a/dvm/tools/tester/trunk/main/report.js b/dvm/tools/tester/trunk/main/report.js new file mode 100644 index 0000000..a06a4fb --- /dev/null +++ b/dvm/tools/tester/trunk/main/report.js @@ -0,0 +1,7 @@ +function toggleElem(id) { + var e = document.getElementById(id); + if(e.style.display == 'block') + e.style.display = 'none'; + else + e.style.display = 'block'; +} diff --git a/dvm/tools/tester/trunk/main/task-processor.sh b/dvm/tools/tester/trunk/main/task-processor.sh new file mode 100644 index 0000000..2c867d8 --- /dev/null +++ b/dvm/tools/tester/trunk/main/task-processor.sh @@ -0,0 +1,366 @@ +#!/bin/bash +# Bash is required due to usage of 'disown' command + +SAVE_DIR=`pwd` +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) + +RESULTS_DIR="$1" + +. "$MY_DIR/machine-config.sh" + +if [ -f "$SAVE_DIR/machine-config.sh" ]; then + . "$SAVE_DIR/machine-config.sh" +fi + +. "$MY_DIR/configure-run.sh" + +if [ -f "$SAVE_DIR/configure-run.sh" ]; then + . "$SAVE_DIR/configure-run.sh" +fi + +. "$MY_DIR/test-utils.sh" + +if [ $INTERACTIVE -ne 0 ]; then + stdout_fn() { + echo "$1.stdout" + } + stderr_fn() { + echo "$1.stderr" + } +fi + +if [ $HAS_RES_MANAGER -eq 0 ]; then + RES_MAN_DIR=`mktemp -d` +fi + +resources_freed() { + FN=`mktemp` + if [ $SHARE_RESOURCES -eq 0 ]; then + FREED_CPUS=$(( CPUS_PER_NODE * MAX_CPU_SHARING_FACTOR )) + FREED_CUDAS=$(( CUDAS_PER_NODE * MAX_CUDA_SHARING_FACTOR )) + else + FREED_CPUS=$(( totalProcs * CPUS_PER_PROC )) + FREED_CUDAS=$(( totalProcs * CUDAS_PER_PROC )) + fi + echo "FREED_CPUS=$FREED_CPUS" >>$FN + echo "FREED_CUDAS=$FREED_CUDAS" >>$FN +# echo "rm $FN" >>$FN + mv $FN $RES_MAN_DIR/ +} + +interactive_launcher() { + cd "$LAUNCH_DIR" + STDOUT_FN=`stdout_fn "$LAUNCH_NAME"` + STDERR_FN=`stderr_fn "$LAUNCH_NAME"` + :>$STDOUT_FN + :>$STDERR_FN + set -m +# echo ./dvm run $PROC_GRID "$TASK_EXE" + START_T=`date +%s` + if [ -f "run.sh" ]; then + PATH="$LAUNCH_DIR:$PATH" PROC_GRID="$PROC_GRID" DVMH_PPN=$LAUNCH_PPN DVMH_NUM_THREADS=$CPUS_PER_PROC DVMH_NUM_CUDAS=$CUDAS_PER_PROC ./run.sh "$STDOUT_FN" 2>"$STDERR_FN" & + LAUNCH_PID=$! + else + DVMH_PPN=$LAUNCH_PPN DVMH_NUM_THREADS=$CPUS_PER_PROC DVMH_NUM_CUDAS=$CUDAS_PER_PROC ./dvm run $PROC_GRID "$TASK_EXE" "$STDOUT_FN" 2>"$STDERR_FN" & + LAUNCH_PID=$! + fi + if [ $TEST_MAX_TIME -gt 0 ]; then +# echo "Setting proc_killer to process $LAUNCH_PID for $TEST_MAX_TIME" + proc_killer -$LAUNCH_PID $TEST_MAX_TIME /dev/null 2>& 1 & + KILLER_PID=$! + disown + fi + wait $LAUNCH_PID + START_RES=$? + END_T=`date +%s` + CALC_TIME=$(( END_T - START_T )) + if [ $TEST_MAX_TIME -gt 0 ]; then + kill -2 $KILLER_PID >/dev/null 2>& 1 + kill -15 $KILLER_PID >/dev/null 2>& 1 + kill -9 $KILLER_PID >/dev/null 2>& 1 + fi + if [ $HAS_RES_MANAGER -eq 0 ]; then + resources_freed + fi + echo "$START_RES $CALC_TIME" >"$TASK_EXE.finished" +} + +non_interactive_launcher() { + cd "$LAUNCH_DIR" + STDOUT_FN=`mktemp` + STDERR_FN=`mktemp` +# echo ./dvm run $PROC_GRID "$TASK_EXE" + if [ $TEST_MAX_TIME -gt 0 ]; then + export maxtime=$(( (TEST_MAX_TIME + 59) / 60)) + fi + if [ -f "run.sh" ]; then + PATH="$LAUNCH_DIR:$PATH" PROC_GRID="$PROC_GRID" DVMH_PPN=$LAUNCH_PPN DVMH_NUM_THREADS=$CPUS_PER_PROC DVMH_NUM_CUDAS=$CUDAS_PER_PROC ./run.sh >$STDOUT_FN 2>$STDERR_FN + START_RES=$? + else + DVMH_PPN=$LAUNCH_PPN DVMH_NUM_THREADS=$CPUS_PER_PROC DVMH_NUM_CUDAS=$CUDAS_PER_PROC ./dvm run $PROC_GRID "$TASK_EXE" >$STDOUT_FN 2>$STDERR_FN + START_RES=$? + fi + unset maxtime + :>"$TASK_EXE.committed" + IS_LAUNCHED=`is_launched $STDOUT_FN $STDERR_FN` + rm $STDOUT_FN $STDERR_FN + if [ $START_RES -eq 0 -a $IS_LAUNCHED -ne 0 ]; then + while [ `is_finished "$LAUNCH_NAME"` -eq 0 ]; do + sleep 1 + done + CALC_TIME=`get_elapsed_time "$LAUNCH_NAME"` + fi + if [ $HAS_RES_MANAGER -eq 0 ]; then + resources_freed + fi + echo "$START_RES $CALC_TIME" >"$TASK_EXE.finished" +} + +already_analyzed() { +# echo -n "PLATFORM=\"$TEST_PLATFORM\"" +# echo -n " NOH_FLAG=$TASK_NOH_FLAG" +# echo -n " AUTOTFM_FLAG=$TASK_AUTOTFM_FLAG" +# echo -n " PROC_GRID=\"$PROC_GRID\"" +# echo -n " CPUS_PER_PROC=$CPUS_PER_PROC" +# echo -n " CUDAS_PER_PROC=$CUDAS_PER_PROC" + local res + res=0 + if [ -f "$RESULTS_DIR/$TEST_SHORT_PATH.result" ]; then + if [ $( cat "$RESULTS_DIR/$TEST_SHORT_PATH.result" | grep "PLATFORM=\"$TEST_PLATFORM\"" | grep "NOH_FLAG=$TASK_NOH_FLAG" | grep "AUTOTFM_FLAG=$TASK_AUTOTFM_FLAG" | grep "PROC_GRID=\"$PROC_GRID\"" | grep "CPUS_PER_PROC=$CPUS_PER_PROC" | grep "CUDAS_PER_PROC=$CUDAS_PER_PROC" | wc -l ) -gt 0 ]; then + res=1 + fi + fi + echo $res +} + +launcher() { + counter=0 + if [ $HAS_RES_MANAGER -eq 0 ]; then + if [ $MAX_NODES_PER_TASK -gt 1 ]; then + echo "Can manage resources only for one-node system" + MAX_NODES_PER_TASK=1 + fi + FREE_CPUS=$(( CPUS_PER_NODE * MAX_CPU_SHARING_FACTOR )) + FREE_CUDAS=$(( CUDAS_PER_NODE * MAX_CUDA_SHARING_FACTOR )) + fi + exec 4>$1 + while IFS= read -r TASK_SPEC; do + TEST_PLATFORM=Unknown + TASK_NOH_FLAG=0 + TASK_AUTOTFM_FLAG=0 + PROC_GRID=0 + CPUS_PER_PROC=0 + CUDAS_PER_PROC=0 + eval $TASK_SPEC + LAUNCHED_FLAG=0 + ALREADY_ANALYZED=$( already_analyzed ) + if [ $TASK_TYPE -eq 1 -a $ALREADY_ANALYZED -eq 0 ]; then + CAN_CPUS=$CPUS_PER_NODE + CAN_CUDAS=$CUDAS_PER_NODE + if [ $SHARE_RESOURCES -ne 0 ]; then + CAN_CPUS=$(( CAN_CPUS * MAX_CPU_SHARING_FACTOR )) + CAN_CUDAS=$(( CAN_CUDAS * MAX_CUDA_SHARING_FACTOR )) + fi + LAUNCH_PPN=$MAX_PPN + CUR_PPN=$LAUNCH_PPN + if [ $CPUS_PER_PROC -gt 0 ]; then + CUR_PPN=$(( CAN_CPUS / $CPUS_PER_PROC )) + fi + if [ $CUR_PPN -lt $LAUNCH_PPN ]; then + LAUNCH_PPN=$CUR_PPN + fi + if [ $CUDAS_PER_PROC -gt 0 ]; then + CUR_PPN=$(( CAN_CUDAS / $CUDAS_PER_PROC )) + fi + if [ $CUR_PPN -lt $LAUNCH_PPN ]; then + LAUNCH_PPN=$CUR_PPN + fi + totalProcs=1 + for proc in $PROC_GRID; do + totalProcs=$(( totalProcs * proc )) + done + if [ $LAUNCH_PPN -gt 0 ]; then + USE_NODES=$(( ( totalProcs + LAUNCH_PPN - 1 ) / LAUNCH_PPN )) + else + LAUNCH_PPN=1 + USE_NODES=$(( MAX_NODES_PER_TASK + 1 )) + fi + NEED_CPUS=$(( totalProcs * CPUS_PER_PROC )) + NEED_CUDAS=$(( totalProcs * CUDAS_PER_PROC )) + if [ $USE_NODES -le $MAX_NODES_PER_TASK ]; then + # Launch + counter=$(( counter + 1 )) + LAUNCH_DIR=`mktemp -d` + cp -r $TASK_DIR/* $LAUNCH_DIR/ + TASK_SPEC=$( echo -n "$TASK_SPEC" ; echo " LAUNCH_DIR=\"$LAUNCH_DIR\"" ) + if [ $HAS_RES_MANAGER -eq 0 ]; then + LAUNCH_NAME="$LAUNCH_DIR/$TASK_EXE" + else + LAUNCH_NAME="$LAUNCH_DIR/$TASK_EXE.$totalProcs.1" + fi + TASK_SPEC=$( echo -n "$TASK_SPEC" ; echo " LAUNCH_NAME=\"$LAUNCH_NAME\"" ) + while true; do + if [ -f "$SAVE_DIR/dvm-tester.pause" ] && [ "$(cat "$SAVE_DIR/dvm-tester.pause")" = "Immediate" ]; then + : + elif [ -f "$MY_DIR/dvm-tester.pause" ] && [ "$(cat "$MY_DIR/dvm-tester.pause")" = "Immediate" ]; then + : + else + break + fi + sleep 60 + done + if [ $HAS_RES_MANAGER -ne 0 ]; then + while [ `can_launch` -eq 0 ]; do + sleep 1 + done + else + if [ $SHARE_RESOURCES -eq 0 ]; then + NEED_CPUS=$(( CPUS_PER_NODE * MAX_CPU_SHARING_FACTOR )) + NEED_CUDAS=$(( CUDAS_PER_NODE * MAX_CUDA_SHARING_FACTOR )) + fi + cd "$RES_MAN_DIR" + while [ $FREE_CPUS -lt $NEED_CPUS -o $FREE_CUDAS -lt $NEED_CUDAS ]; do + FOUND_SMTH=0 + for f in `ls`; do + FREED_CPUS= + FREED_CUDAS= + . ./$f + if [ -n "$FREED_CPUS" -a -n "$FREED_CUDAS" ]; then + FOUND_SMTH=1 + FREE_CPUS=$(( FREE_CPUS + FREED_CPUS )) + FREE_CUDAS=$(( FREE_CUDAS + FREED_CUDAS )) + rm $f + fi + done + if [ $FOUND_SMTH -eq 0 ]; then + sleep 1 + fi + done + FREE_CPUS=$(( FREE_CPUS - NEED_CPUS )) + FREE_CUDAS=$(( FREE_CUDAS - NEED_CUDAS )) + fi + # Actually launch + if [ $INTERACTIVE -ne 0 ]; then + interactive_launcher & + else + non_interactive_launcher & + if [ $HAS_RES_MANAGER -ne 0 ]; then + while [ ! -f "$LAUNCH_DIR/$TASK_EXE.committed" ]; do + sleep 1 + done + fi + fi + LAUNCHED_FLAG=1 + else + # Can not launch such big task + echo "Discarding too big task: $TASK_SPEC" + fi + elif [ $TASK_TYPE -eq 0 ]; then + LAUNCHED_FLAG=1 + else + echo "Discarding task: $TASK_SPEC" + fi + if [ $LAUNCHED_FLAG -ne 0 ]; then + echo "$TASK_SPEC" >& 4 + fi + done + echo ":" >& 4 + exec 4>&- + echo "Total tasks launched: $counter" +} + +print_result_line() { + echo -n "PLATFORM=\"$TEST_PLATFORM\"" + echo -n " NOH_FLAG=$TASK_NOH_FLAG" + echo -n " AUTOTFM_FLAG=$TASK_AUTOTFM_FLAG" + echo -n " PROC_GRID=\"$PROC_GRID\"" + echo -n " CPUS_PER_PROC=$CPUS_PER_PROC" + echo -n " CUDAS_PER_PROC=$CUDAS_PER_PROC" + echo -n " CALC_TIME=$TASK_CALC_TIME" + echo -n " TEST_PASSED=$TEST_PASSED" + echo -n " RESULT_COMMENT=\"$RESULT_COMMENT\"" + echo " ERROR_LEVEL=$ERROR_LEVEL" +} + +analyzer() { + counter=0 + FIFO_NAME="$1" + while IFS= read -r TASK_SPEC; do + if [ "$TASK_SPEC" = ":" ]; then + break + fi + CPUS_PER_PROC=0 + CUDAS_PER_PROC=0 + TASK_NOH_FLAG=0 + TASK_AUTOTFM_FLAG=0 + eval $TASK_SPEC + if [ $TASK_TYPE -eq 0 ]; then + if [ ! -f "$TASK_DIR/$TASK_EXE" ]; then + # Report compilation error + if [ `basename "$TEST_SHORT_PATH"` != "$TEST_SHORT_PATH" ]; then + mkdir -p "$RESULTS_DIR/$(dirname "$TEST_SHORT_PATH")" + fi + PROC_GRID= + CPUS_PER_PROC= + CUDAS_PER_PROC= + TASK_CALC_TIME= + TEST_PASSED=0 + RESULT_COMMENT="Compilation error" + ERROR_LEVEL=255 + print_result_line >>"$RESULTS_DIR/$TEST_SHORT_PATH.result" + fi + # Cleanup all the test's stuff + rm -rf "$TASK_DIR" + else + counter=$(( counter + 1 )) + cd "$LAUNCH_DIR" + while [ ! -f "$TASK_EXE.finished" ]; do + sleep 1 + done + read LAUNCH_EXIT_CODE TASK_CALC_TIME <"$TASK_EXE.finished" + STDOUT_FN=`stdout_fn "$LAUNCH_NAME"` + STDERR_FN=`stderr_fn "$LAUNCH_NAME"` + SUBTEST_COUNT=0 + . $TEST_ANALYZER + if [ `basename "$TEST_SHORT_PATH"` != "$TEST_SHORT_PATH" ]; then + mkdir -p "$RESULTS_DIR/$(dirname "$TEST_SHORT_PATH")" + fi + print_result_line >>"$RESULTS_DIR/$TEST_SHORT_PATH.result" + if [ $SUBTEST_COUNT -gt 0 ]; then + mkdir -p $RESULTS_DIR/$TEST_SHORT_PATH + for i in `seq $SUBTEST_COUNT`; do + SUBTEST_NAME=$i + analyze_subtest $i + print_result_line >>"$RESULTS_DIR/$TEST_SHORT_PATH/$SUBTEST_NAME.result" + done + fi +# if [ $LAUNCH_EXIT_CODE -ne 0 -o "$RESULT_COMMENT" = "Crash" ]; then +# echo "Test's $TEST_SHORT_PATH stdout:" +# cat "$STDOUT_FN" +# echo "Test's $TEST_SHORT_PATH stderr:" +# cat "$STDERR_FN" +# fi + rm -rf "$LAUNCH_DIR" + fi + done <$FIFO_NAME + echo "Total tasks analyzed: $counter" +} + +FIFO_NAME="$(mktemp -u).launch-fifo" +mkfifo $FIFO_NAME + +analyzer $FIFO_NAME & +launcher $FIFO_NAME + +wait + +rm $FIFO_NAME + +if [ $HAS_RES_MANAGER -eq 0 ]; then + cd "$RES_MAN_DIR" + for f in `ls`; do + . ./$f + done + cd "$SAVE_DIR" + rm -rf "$RES_MAN_DIR" +fi diff --git a/dvm/tools/tester/trunk/main/test-system.sh b/dvm/tools/tester/trunk/main/test-system.sh new file mode 100644 index 0000000..cdaea50 --- /dev/null +++ b/dvm/tools/tester/trunk/main/test-system.sh @@ -0,0 +1,103 @@ +#!/bin/sh + +unset CDPATH + +SAVE_DIR=`pwd` +MY_DIR=$(cd "$(dirname "$(which "$0")")" && pwd) + +DVMSYS_DIR= +if [ -f ./dvm ]; then + DVMSYS_DIR_CMD="DVMSYS_DIR=$(grep 'dvmdir=' <./dvm | sed -s 's/export //g' | sed -s 's/dvmdir=//g')" + eval $DVMSYS_DIR_CMD +fi +TEST_SUITE=test-suite +RESULTS_DIR= +APPEND_RESULTS=0 + +parse_params() { + while [ -n "$1" ]; do + if [ "$1" = "--dvm_sys" ]; then + DVMSYS_DIR="$2" + shift + elif [ "$1" = "--test-suite" ]; then + TEST_SUITE="$2" + shift + elif [ "$1" = "--append-results" ]; then + APPEND_RESULTS=1 + RESULTS_DIR="$2" + shift + else + echo "Unknown option '$1'" + exit 1 + fi + shift + done +} + +parse_params $@ || exit 1 + +# Check settings +cd "$SAVE_DIR" +if [ ! -d "$DVMSYS_DIR" -o ! -d "$DVMSYS_DIR/user" -o ! -f "$DVMSYS_DIR/user/dvm" -o ! -d "$TEST_SUITE" ]; then + MY_NAME=`basename "$0"` + echo "Usage: $0 []" + echo " --dvm_sys Directory of already installed DVM-system. Note that it is a directory, which contains directory 'user' directly. Usually it is .../dvm_current/dvm_sys. By default $MY_NAME searches for 'dvm' file in current directory and makes attempt to use its DVM-system" + echo " --test-suite Directory with test suite, which is formed in special way. By default 'test-suite' directory is used." + echo " --append-results Directory with partial results, which will be appended. By default new directory will be created." + echo "Exiting" + exit 1 +fi + +# Make them global paths +DVMSYS_DIR=$(cd "$DVMSYS_DIR" && pwd) +TEST_SUITE=$(cd "$TEST_SUITE" && pwd) + +if [ $APPEND_RESULTS -eq 0 ]; then + RESULTS_DIR="$SAVE_DIR/$(basename "$TEST_SUITE").results" +else + RESULTS_DIR=$(cd "$RESULTS_DIR" && pwd) +fi +export TMPDIR="$SAVE_DIR/$(basename "$TEST_SUITE").work" +if [ -d "/home/scratch" ]; then + TEMPL_NAME="/home/scratch/$(basename "$TMPDIR").XXX" + TMPDIR=$(mktemp -d "$TEMPL_NAME") +fi +mkdir -p "$TMPDIR" + +# Launch task processor +TASK_FIFO="$(mktemp -u).task-fifo" +mkfifo "$TASK_FIFO" +if [ $APPEND_RESULTS -eq 0 ]; then + if [ -e "$RESULTS_DIR" ]; then + echo -n "$RESULTS_DIR already exists. Do you want to rewrite it (Y/n)? " + ans=n + read ans + if [ "$ans" != "y" -a "$ans" != "Y" ]; then + echo "Exiting" + exit 1 + fi + fi + rm -rf "$RESULTS_DIR" +fi +mkdir -p "$RESULTS_DIR" +cd "$SAVE_DIR" +"$MY_DIR/task-processor.sh" "$RESULTS_DIR" <"$TASK_FIFO" & + +# Sequentially feed task processor from our test-suite +exec 4>"$TASK_FIFO" +cd "$SAVE_DIR" +"$MY_DIR/perform-tests.sh" "$DVMSYS_DIR" "$TEST_SUITE" 4 +exec 4>&- + +# Wait for task processor to finish +wait + +# Cleanup stuff +rm "$TASK_FIFO" + +# Generate final report +cd "$SAVE_DIR" +"$MY_DIR/gen-report.sh" "$TEST_SUITE" "$RESULTS_DIR" + +echo "Results can be seen in $RESULTS_DIR directory" +rm -rf "$TMPDIR" diff --git a/dvm/tools/tester/trunk/main/test-utils.sh b/dvm/tools/tester/trunk/main/test-utils.sh new file mode 100644 index 0000000..a260849 --- /dev/null +++ b/dvm/tools/tester/trunk/main/test-utils.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +proc_killer() { + local PROC + local TIMEOUT + local counter + PROC="$1" + TIMEOUT=$2 + counter=0 + while [ $counter -lt $TIMEOUT ]; do + sleep 10 + counter=$(( counter + 10 )) + done + kill -2 $PROC >/dev/null 2>& 1 + sleep 10 + kill -15 $PROC >/dev/null 2>& 1 + sleep 10 + kill -9 $PROC >/dev/null 2>& 1 +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr014.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr014.cdv new file mode 100644 index 0000000..541b849 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr014.cdv @@ -0,0 +1,1228 @@ +/* ACR014 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAYS A(N), A(N, M, K, L) ARE TO HAVE NO DISTRIBUTED DIMENSIONS AND DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void ACR0101(); +static void ACR0102(); +static void ACR0103(); +static void ACR0104(); +static void ACR0105(); +static void ACR0106(); +static void ACR0107(); +static void ACR0108(); +static void ACR0109(); +static void ACR0110(); + +static void acr0401(); +static void acr0402(); +static void acr0403(); +static void acr0404(); +static void acr0405(); +static void acr0406(); +static void acr0407(); +static void acr0408(); +static void acr0409(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i, j, ii, jj; + +int main(int an, char **as) +{ + printf("===START OF ACR014========================\n"); + /* ---------------------------------------- */ + ACR0101(); + /* ---------------------------------------- */ + ACR0102(); + /* ---------------------------------------- */ + ACR0103(); + /* ---------------------------------------- */ + ACR0104(); + /* ---------------------------------------- */ + ACR0105(); + /* ---------------------------------------- */ + ACR0106(); + /* ---------------------------------------- */ + ACR0107(); + /* ---------------------------------------- */ + ACR0108(); + /* ---------------------------------------- */ + ACR0109(); + /* ---------------------------------------- */ + ACR0110(); + /* ---------------------------------------- */ + + /* ---------------------------------------- */ + acr0401(); + /* ---------------------------------------- */ + acr0402(); + /* ---------------------------------------- */ + acr0403(); + /* ---------------------------------------- */ + acr0404(); + /* ---------------------------------------- */ + acr0405(); + /* ---------------------------------------- */ + acr0406(); + /* ---------------------------------------- */ + acr0407(); + /* ---------------------------------------- */ + acr0408(); + /* ---------------------------------------- */ + acr0409(); + /* ---------------------------------------- */ + + printf("=== END OF ACR014 =========================\n"); + return 0; +} +/* ---------------------------------------------ACR0101*/ +void ACR0101() +{ + #define N 8 + #define NL 1000 + char tname[] = "ACR0101 "; + int nloop; + #pragma dvm array distribute[*] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 1; i++) + C[i] = C[i - 1] + C[i + 1]; + + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[1:1]) + for (i = 1; i < N - 1; i++) + A[i] = A[i - 1] + A[i + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0102 */ +void ACR0102() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR0102 "; + int nloop; + #pragma dvm array distribute[*] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 1; i++) + C[i] = C[i - 1] + C[i + 1]; + + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[0:1]) + for (i = 1; i < N - 1; i++) + A[i] = A[i - 1] + A[i + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0103 */ +void ACR0103() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR0103 "; + int nloop; + #pragma dvm array distribute[*] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 1; i++) + C[i] = C[i - 1] + C[i + 1]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[1:0]) + for (i = 1; i < N - 1; i++) + A[i] = A[i - 1] + A[i + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0104 */ +void ACR0104() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR0104 "; + int nloop; + #pragma dvm array distribute[*], shadow[2:2] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 2; i < N - 2; i++) + C[i] = C[i - 1] + C[i + 1] + C[i + 2] + C[i - 2]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[2:2]) + for (i = 2; i < N - 2; i++) + A[i] = A[i - 1] + A[i + 1] + A[i + 2] + A[i - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 2; i < N - 2; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0105 */ +void ACR0105() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR0105 "; + int nloop; + #pragma dvm array distribute[*], shadow[2:2] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 2; i++) + C[i] = C[i + 1] + C[i + 2]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[0:2]) + for (i = 1; i < N - 2; i++) + A[i] = A[i + 1] + A[i + 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 2; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0106 */ +void ACR0106() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR0106 "; + int nloop; + #pragma dvm array distribute[*], shadow[2:2] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 2; i < N; i++) + C[i] = C[i - 1] + C[i - 2]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[2:0]) + for (i = 2; i < N; i++) + A[i] = A[i - 1] + A[i - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 2; i < N; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0107 */ +void ACR0107() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR0107 "; + int nloop; + #pragma dvm array distribute[*], shadow[3:3] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 3; i < N - 3; i++) + C[i] = C[i - 1] + C[i + 1] + C[i + 2] + C[i - 2] + C[i - 3] + C[i + 3]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[3:3]) + for (i = 3; i < N - 3; i ++) + A[i] = A[i - 1] + A[i + 1] + A[i + 2] + A[i - 2] + A[i - 3] + A[i + 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 3; i < N - 3; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0108 */ +void ACR0108() +{ + #define N 24 + #define NL 1000 + char tname[] = "ACR0108 "; + int nloop; + #pragma dvm array distribute[*], shadow[3:3] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 3; i++) + C[i] = C[i + 1] + C[i + 2] + C[i + 3]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[0:3]) + for (i = 1; i < N - 3; i ++) + A[i] = A[i + 1] + A[i + 2] + A[i + 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 3; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0109 */ +void ACR0109() +{ + #define N 24 + #define NL 1000 + char tname[] = "ACR0109 "; + int nloop; + #pragma dvm array distribute[*], shadow[3:3] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 3; i < N; i++) + C[i] = C[i - 1] + C[i - 2] + C[i - 3]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[3:0]) + for (i = 3; i < N; i ++) + A[i] = A[i - 1] + A[i - 2] + A[i - 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 3; i < N; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0110 */ +void ACR0110() +{ + #define N 60 + #define NL 1000 + char tname[] = "ACR0110 "; + int nloop; + #pragma dvm array distribute[*], shadow[11:11] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 11; i < N - 11; i++) + C[i] = C[i - 9] + C[i + 9] + C[i + 10] + C[i - 10] + C[i - 11] + C[i + 11]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[11:11]) + for (i = 11; i < N - 11; i ++) + A[i] = A[i - 9] + A[i + 9] + A[i + 10] + A[i - 10] + A[i - 11] + A[i + 11]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 11; i < N - 11; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR0401*/ +void acr0401() +{ + #define NL 1000 + #define N 16 + #define M 8 + #define K 8 + #define L 8 + char tname[] = "ACR0401 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + printf("1234r5\n"); + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + C[i][j][ii][jj] = C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[1:1][1:1][1:1][1:1]) + for (jj = 1; jj < L - 1; jj++) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + A[i][j][ii][jj] = A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 1; jj < L - 1; jj++) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0402*/ +void acr0402() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR0402 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 2] + C[i - 1][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 1] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii][jj + 1] + C[i][j - 1][ii][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[1:2][2:2][2:1][1:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 2] + A[i - 1][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 1] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii][jj + 1] + A[i][j - 1][ii][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0403*/ +void acr0403() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR0403 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 2] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:0][2:2][2:0][2:0]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 2] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0404*/ +void acr0404() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR0404 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i + 1][j][ii][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region in(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:2][2:0][2:0][0:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i + 1][j][ii][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0405*/ +void acr0405() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR0405 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[2:2][2:0][0:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:2][2:0][0:2][2:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0406*/ +void acr0406() +{ + #define NL 1000 + #define N 32 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR0406 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[3:3][3:3][3:3][3:3] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj + 3] + C[i - 3][j][ii][jj] + C[i][j - 3][ii][jj] + C[i][j][ii - 3][jj] + C[i][j][ii][jj - 3] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[3:3][3:3][3:3][3:3]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj + 3] + A[i - 3][j][ii][jj] + A[i][j - 3][ii][jj] + A[i][j][ii - 3][jj] + A[i][j][ii][jj - 3] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0407*/ +void acr0407() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR0407 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[0:3][3:3][0:3][0:3] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj + 3] + C[i][j - 3][ii][jj] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i][j - 2][ii][jj] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i][j - 1][ii][jj]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[0:3][3:3][0:3][0:3]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj + 3] + A[i][j - 3][ii][jj] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i][j - 2][ii][jj] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i][j - 1][ii][jj]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0408*/ +void acr0408() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR0408 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[0:3][3:3][0:3][3:0] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj - 3] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[0:3][0:3][0:3][3:0]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj - 3] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR0409*/ +void acr0409() +{ + #define NL 1000 + #define N 59 + #define M 59 + #define K 59 + #define L 59 + char tname[] = "ACR0409 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][*][*][*], shadow[11:11][11:11][11:11][11:11] + int (*A)[M][K][L]; + int (*C)[M][K][L]; + int NNL = NL; + A = malloc(N * M * K * L * sizeof(int)); + C = malloc(N * M * K * L * sizeof(int)); + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + for (ii = 11; ii < K - 11; ii++) + for (jj = 11; jj < L - 11; jj++) + C[i][j][ii][jj] = C[i + 11][j][ii][jj] + C[i][j + 11][ii][jj] + C[i][j][ii + 11][jj] + C[i][j][ii][jj + 11] + C[i - 11][j][ii][jj] + C[i][j - 11][ii][jj] + C[i][j][ii - 11][jj] + C[i][j][ii][jj - 11]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region in(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[11:11][11:11][11:11][11:11]) + for (jj = 11; jj < L - 11; jj++) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + A[i][j][ii][jj] = A[i + 11][j][ii][jj] + A[i][j + 11][ii][jj] + A[i][j][ii + 11][jj] + A[i][j][ii][jj + 11] + A[i - 11][j][ii][jj] + A[i][j - 11][ii][jj] + A[i][j][ii - 11][jj] + A[i][j][ii][jj - 11]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 11; jj < L - 11; jj++) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr11.cdv new file mode 100644 index 0000000..867ed75 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr11.cdv @@ -0,0 +1,538 @@ +/* ACR11 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAY A(N) IS TO HAVE DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void acr1101(); +static void acr1102(); +static void acr1103(); +static void acr1104(); +static void acr1105(); +static void acr1106(); +static void acr1107(); +static void acr1108(); +static void acr1109(); +static void acr1110(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i; + +int main(int an, char **as) +{ + printf("===START OF ACR11========================\n"); + /* ---------------------------------------- */ + acr1101(); + /* ---------------------------------------- */ + acr1102(); + /* ---------------------------------------- */ + acr1103(); + /* ---------------------------------------- */ + acr1104(); + /* ---------------------------------------- */ + acr1105(); + /* ---------------------------------------- */ + acr1106(); + /* ---------------------------------------- */ + acr1107(); + /* ---------------------------------------- */ + acr1108(); + /* ---------------------------------------- */ + acr1109(); + /* ---------------------------------------- */ + acr1110(); + /* ---------------------------------------- */ + + printf("=== END OF ACR11 =========================\n"); + return 0; +} +/* ---------------------------------------------ACR1101*/ +void acr1101() +{ + #define N 8 + #define NL 1000 + char tname[] = "ACR1101 "; + int nloop; + #pragma dvm array distribute[block] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 1; i++) + C[i] = C[i - 1] + C[i + 1]; + + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[1:1]) + for (i = 1; i < N - 1; i++) + A[i] = A[i - 1] + A[i + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1102 */ +void acr1102() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR1102 "; + int nloop; + #pragma dvm array distribute[block] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 1; i++) + C[i] = C[i] + C[i + 1]; + + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[0:1]) + for (i = 1; i < N - 1; i++) + A[i] = A[i] + A[i + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1103 */ +void acr1103() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR1103 "; + int nloop; + #pragma dvm array distribute[block] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 1; i++) + C[i] = C[i - 1] + C[i]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[1:0]) + for (i = 1; i < N - 1; i++) + A[i] = A[i - 1] + A[i]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1104 */ +void acr1104() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR1104 "; + int nloop; + #pragma dvm array distribute[block], shadow[2:2] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 2; i < N - 2; i++) + C[i] = C[i - 1] + C[i + 1] + C[i + 2] + C[i - 2]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[2:2]) + for (i = 2; i < N - 2; i++) + A[i] = A[i - 1] + A[i + 1] + A[i + 2] + A[i - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 2; i < N - 2; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1105 */ +void acr1105() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR1105 "; + int nloop; + #pragma dvm array distribute[block], shadow[2:2] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 2; i++) + C[i] = C[i + 1] + C[i + 2]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[0:2]) + for (i = 1; i < N - 2; i++) + A[i] = A[i + 1] + A[i + 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 2; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1106 */ +void acr1106() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR1106 "; + int nloop; + #pragma dvm array distribute[block], shadow[2:2] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 2; i < N; i++) + C[i] = C[i - 1] + C[i - 2]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[2:0]) + for (i = 2; i < N; i++) + A[i] = A[i - 1] + A[i - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 2; i < N; i++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1107 */ +void acr1107() +{ + #define N 16 + #define NL 1000 + char tname[] = "ACR1107 "; + int nloop; + #pragma dvm array distribute[block], shadow[3:3] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 3; i < N - 3; i++) + C[i] = C[i - 1] + C[i + 1] + C[i + 2] + C[i - 2] + C[i - 3] + C[i + 3]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[3:3]) + for (i = 3; i < N - 3; i ++) + A[i] = A[i - 1] + A[i + 1] + A[i + 2] + A[i - 2] + A[i - 3] + A[i + 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 3; i < N - 3; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1108 */ +void acr1108() +{ + #define N 24 + #define NL 1000 + char tname[] = "ACR1108 "; + int nloop; + #pragma dvm array distribute[block], shadow[3:3] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 1; i < N - 3; i++) + C[i] = C[i + 1] + C[i + 2] + C[i + 3]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[0:3]) + for (i = 1; i < N - 3; i ++) + A[i] = A[i + 1] + A[i + 2] + A[i + 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 1; i < N - 3; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1109 */ +void acr1109() +{ + #define N 24 + #define NL 1000 + char tname[] = "ACR1109 "; + int nloop; + #pragma dvm array distribute[block], shadow[3:3] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 3; i < N; i++) + C[i] = C[i - 1] + C[i - 2] + C[i - 3]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[3:0]) + for (i = 3; i < N; i ++) + A[i] = A[i - 1] + A[i - 2] + A[i - 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 3; i < N; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ---------------------------------------------ACR1110 */ +void acr1110() +{ + #define N 60 + #define NL 1000 + char tname[] = "ACR1110 "; + int nloop; + #pragma dvm array distribute[block], shadow[11:11] + int *A; + A = (int (*))malloc(N * sizeof(int)); + int *C; + C = (int (*))malloc(N * sizeof(int)); + int NNL = NL; + + for (i = 0; i < N; i++) + C[i] = NNL + i; + nloop = NL; + + for (i = 11; i < N - 11; i++) + C[i] = C[i - 9] + C[i + 9] + C[i + 10] + C[i - 10] + C[i - 11] + C[i + 11]; + #pragma dvm actual(nloop) + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) across(A[11:11]) + for (i = 11; i < N - 11; i ++) + A[i] = A[i - 9] + A[i + 9] + A[i + 10] + A[i - 10] + A[i - 11] + A[i + 11]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i] on A[i]) reduction(min(nloop)) + for (i = 11; i < N - 11; i ++) + if (A[i] != C[i]) + nloop = Min(nloop, i); + #pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef N + #undef NL +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr12.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr12.cdv new file mode 100644 index 0000000..62b721f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr12.cdv @@ -0,0 +1,939 @@ +/* ACR12 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAY A(N, M) IS TO HAVE 1 DISTRIBUTED DIMENSION AND DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void acr1201(); +static void acr1202(); +static void acr1203(); +static void acr1204(); +static void acr1205(); +static void acr1206(); +static void acr1207(); +static void acr1208(); +static void acr1209(); +static void acr1210(); +static void acr1211(); +static void acr1212(); +static void acr1213(); +static void acr1214(); +static void acr1215(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i, j; + +int main(int an, char **as) +{ + printf("===START OF ACR12========================\n"); + /* ---------------------------------------- */ + acr1201(); + /* ---------------------------------------- */ + acr1202(); + /* ---------------------------------------- */ + acr1203(); + /* ---------------------------------------- */ + acr1204(); + /* ---------------------------------------- */ + acr1205(); + /* ---------------------------------------- */ + acr1206(); + /* ---------------------------------------- */ + acr1207(); + /* ---------------------------------------- */ + acr1208(); + /* ---------------------------------------- */ + acr1209(); + /* ---------------------------------------- */ + acr1210(); + /* ---------------------------------------- */ + acr1211(); + /* ---------------------------------------- */ + acr1212(); + /* ---------------------------------------- */ + acr1213(); + /* ---------------------------------------- */ + acr1214(); + /* ---------------------------------------- */ + acr1215(); + /* ---------------------------------------- */ + + printf("=== END OF ACR12 =========================\n"); + return 0; +} +/* ---------------------------------------------acr1201*/ +void acr1201() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1201 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block] + int (*A)[M]; + A = (int (*)[M])malloc(N * sizeof(int[M])); + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i + 1][j] + C[i][j + 1] + C[i - 1][j] + C[i][j - 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[1:1][1:1]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i + 1][j] + A[i][j + 1] + A[i - 1][j] + A[i][j - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1202*/ +void acr1202() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1202 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][*] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i + 1][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][0:0]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i + 1][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1203*/ +void acr1203() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1203 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i - 1][j] + C[i][j + 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[1:0][0:1]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i - 1][j] + A[i][j + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1204*/ +void acr1204() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1204 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][*], shadow[1:1][0:1] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i + 1][j] + C[i][j + 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][0:1]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i + 1][j] + A[i][j + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi, nloopj) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1205*/ +void acr1205() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1205 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block], shadow[0:1][1:1] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i][j - 1] + C[i + 1][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][1:0]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i][j - 1] + A[i + 1][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1206*/ +void acr1206() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1206 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][*], shadow[2:2][2:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i + 2][j] + C[i][j + 2] + C[i + 2][j] + C[i - 2][j] + C[i][j - 2]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[2:2][2:2]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i + 2][j] + A[i][j + 2] + A[i + 2][j] + A[i - 2][j] + A[i][j - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1207*/ +void acr1207() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1207 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block], shadow[2:2][2:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i + 2][j] + C[i][j + 2] + C[i][j - 2]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:2][2:2]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i + 2][j] + A[i][j + 2] + A[i][j - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1208*/ +void acr1208() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1208 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][*], shadow[2:2][2:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i - 1][j] + C[i][j - 1] + C[i - 2][j] + C[i + 2][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[2:2][2:0]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i - 1][j] + A[i][j - 1] + A[i - 2][j] + A[i + 2][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1209*/ +void acr1209() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1209 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block], shadow[2:2][0:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i][j + 2] + C[i + 1][j] + C[i + 2][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[2:2][0:2]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i][j + 2] + A[i + 1][j] + A[i + 2][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1210*/ +void acr1210() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1210 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][*], shadow[3:3][3:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + C[i][j] = C[i + 1][j] + C[i][j + 2] + C[i + 3][j] + C[i][j -3 ] + C[i - 2][j] + C[i][j - 1]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[3:3][3:3]) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + A[i][j] = A[i + 1][j] + A[i][j + 2] + A[i + 3][j] + A[i][j - 3] + A[i - 2][j] + A[i][j - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1211*/ +void acr1211() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1211 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block], shadow[3:3][0:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i][j] + C[i][j + 1]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:0][0:1]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i][j] + A[i][j + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1212*/ +void acr1212() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1212 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][*], shadow[0:3][3:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i][j] + C[i + 1][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][0:0]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i][j] + A[i + 1][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1213*/ +void acr1213() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1213 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block], shadow[3:3][3:0] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + C[i][j] = C[i][j - 3] + C[i + 3][j] + C[i - 3][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[3:3][3:0]) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + A[i][j] = A[i][j - 3] + A[i + 3][j] + A[i - 3][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1214*/ +void acr1214() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "acr1214 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][*], shadow[3:0][3:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + C[i][j] = C[i - 3][j] + C[i][j + 3]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[3:0][3:3]) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + A[i][j] = A[i - 3][j] + A[i][j + 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------acr1215*/ +void acr1215() +{ + #define NL 1000 + #define N 59 + #define M 59 + char tname[] = "acr1215 "; + int nloopi, nloopj; + #pragma dvm array distribute[*][block], shadow[11:11][11:11] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + C[i][j] = C[i + 11][j] + C[i][j + 10] + C[i + 9][j] + C[i][j - 11] + C[i - 10][j] + C[i][j - 9]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[10:11][11:10]) + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + A[i][j] = A[i + 11][j] + A[i][j + 10] + A[i + 9][j] + A[i][j - 11] + A[i - 10][j] + A[i][j - 9]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr22.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr22.cdv new file mode 100644 index 0000000..a742575 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr22.cdv @@ -0,0 +1,939 @@ +/* ACR22 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void acr2201(); +static void acr2202(); +static void acr2203(); +static void acr2204(); +static void acr2205(); +static void acr2206(); +static void acr2207(); +static void acr2208(); +static void acr2209(); +static void acr2210(); +static void acr2211(); +static void acr2212(); +static void acr2213(); +static void acr2214(); +static void acr2215(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i, j; + +int main(int an, char **as) +{ + printf("===START OF ACR22========================\n"); + /* ---------------------------------------- */ + acr2201(); + /* ---------------------------------------- */ + acr2202(); + /* ---------------------------------------- */ + acr2203(); + /* ---------------------------------------- */ + acr2204(); + /* ---------------------------------------- */ + acr2205(); + /* ---------------------------------------- */ + acr2206(); + /* ---------------------------------------- */ + acr2207(); + /* ---------------------------------------- */ + acr2208(); + /* ---------------------------------------- */ + acr2209(); + /* ---------------------------------------- */ + acr2210(); + /* ---------------------------------------- */ + acr2211(); + /* ---------------------------------------- */ + acr2212(); + /* ---------------------------------------- */ + acr2213(); + /* ---------------------------------------- */ + acr2214(); + /* ---------------------------------------- */ + acr2215(); + /* ---------------------------------------- */ + + printf("=== END OF ACR22 =========================\n"); + return 0; +} +/* ---------------------------------------------ACR2201*/ +void acr2201() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2201 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block] + int (*A)[M]; + A = (int (*)[M])malloc(N * sizeof(int[M])); + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i + 1][j] + C[i][j + 1] + C[i - 1][j] + C[i][j - 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[1:1][1:1]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i + 1][j] + A[i][j + 1] + A[i - 1][j] + A[i][j - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2202*/ +void acr2202() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2202 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i + 1][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][0:0]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i + 1][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2203*/ +void acr2203() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2203 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i - 1][j] + C[i][j + 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[1:0][0:1]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i - 1][j] + A[i][j + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2204*/ +void acr2204() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2204 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[1:1][0:1] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i + 1][j] + C[i][j + 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][0:1]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i + 1][j] + A[i][j + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi, nloopj) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2205*/ +void acr2205() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2205 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[0:1][1:1] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + C[i][j] = C[i][j - 1] + C[i + 1][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][1:0]) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + A[i][j] = A[i][j - 1] + A[i + 1][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2206*/ +void acr2206() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2206 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[2:2][2:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i + 2][j] + C[i][j + 2] + C[i + 2][j] + C[i - 2][j] + C[i][j - 2]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[2:2][2:2]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i + 2][j] + A[i][j + 2] + A[i + 2][j] + A[i - 2][j] + A[i][j - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2207*/ +void acr2207() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2207 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[2:2][2:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i + 2][j] + C[i][j + 2] + C[i][j - 2]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:2][2:2]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i + 2][j] + A[i][j + 2] + A[i][j - 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2208*/ +void acr2208() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2208 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[2:2][2:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i - 1][j] + C[i][j - 1] + C[i - 2][j] + C[i + 2][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[2:2][2:0]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i - 1][j] + A[i][j - 1] + A[i - 2][j] + A[i + 2][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2209*/ +void acr2209() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2209 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[2:2][0:2] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i][j + 2] + C[i + 1][j] + C[i + 2][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[2:2][0:2]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i][j + 2] + A[i + 1][j] + A[i + 2][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2210*/ +void acr2210() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2210 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[3:3][3:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + C[i][j] = C[i + 1][j] + C[i][j + 2] + C[i + 3][j] + C[i][j -3 ] + C[i - 2][j] + C[i][j - 1]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[3:3][3:3]) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + A[i][j] = A[i + 1][j] + A[i][j + 2] + A[i + 3][j] + A[i][j - 3] + A[i - 2][j] + A[i][j - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2211*/ +void acr2211() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2211 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[3:3][0:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i][j] + C[i][j + 1]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:0][0:1]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i][j] + A[i][j + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2212*/ +void acr2212() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2212 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[0:3][3:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + C[i][j] = C[i][j] + C[i + 1][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[0:1][0:0]) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + A[i][j] = A[i][j] + A[i + 1][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2213*/ +void acr2213() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2213 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[3:3][3:0] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + C[i][j] = C[i][j - 3] + C[i + 3][j] + C[i - 3][j]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[3:3][3:0]) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + A[i][j] = A[i][j - 3] + A[i + 3][j] + A[i - 3][j]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2214*/ +void acr2214() +{ + #define NL 1000 + #define N 16 + #define M 16 + char tname[] = "ACR2214 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[3:0][3:3] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + C[i][j] = C[i - 3][j] + C[i][j + 3]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[3:0][3:3]) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + A[i][j] = A[i - 3][j] + A[i][j + 3]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ---------------------------------------------ACR2215*/ +void acr2215() +{ + #define NL 1000 + #define N 59 + #define M 59 + char tname[] = "ACR2215 "; + int nloopi, nloopj; + #pragma dvm array distribute[block][block], shadow[11:11][11:11] + int A[N][M]; + int (*C)[M]; + C = (int (*)[M])malloc(N * sizeof(int[M])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + C[i][j] = NNL + i + j; + nloopi = NL; + nloopj = NL; + + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + C[i][j] = C[i + 11][j] + C[i][j + 10] + C[i + 9][j] + C[i][j - 11] + C[i - 10][j] + C[i][j - 9]; + + #pragma dvm actual(nloopi, nloopj) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) across(A[10:11][11:10]) + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + A[i][j] = A[i + 11][j] + A[i][j + 10] + A[i + 9][j] + A[i][j - 11] + A[i - 10][j] + A[i][j - 9]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + if (A[i][j] != C[i][j]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + #undef NL + #undef N + #undef M +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr23.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr23.cdv new file mode 100644 index 0000000..9c87451 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr23.cdv @@ -0,0 +1,675 @@ +/* ACR23 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void acr2301(); +static void acr2302(); +static void acr2303(); +static void acr2304(); +static void acr2305(); +static void acr2306(); +static void acr2307(); +static void acr2308(); +static void acr2309(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i, j, ii; + +int main(int an, char **as) +{ + printf("===START OF ACR23========================\n"); + /* ---------------------------------------- */ + acr2301(); + /* ---------------------------------------- */ + acr2302(); + /* ---------------------------------------- */ + acr2303(); + /* ---------------------------------------- */ + acr2304(); + /* ---------------------------------------- */ + acr2305(); + /* ---------------------------------------- */ + acr2306(); + /* ---------------------------------------- */ + acr2307(); + /* ---------------------------------------- */ + acr2308(); + /* ---------------------------------------- */ + acr2309(); + /* ---------------------------------------- */ + + printf("=== END OF ACR23 =========================\n"); + return 0; +} +/* ---------------------------------------------ACR2301*/ +void acr2301() +{ + #define NL 1000 + #define N 16 + #define M 8 + #define K 8 + char tname[] = "ACR2301 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[*][block][block] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + C[i][j][ii] = C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1] + C[i - 1][j][ii] + C[i][j - 1][ii] + C[i][j][ii - 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[1:1][1:1][1:1]) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + A[i][j][ii] = A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1] + A[i - 1][j][ii] + A[i][j - 1][ii] + A[i][j][ii - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2302*/ +void acr2302() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR2302 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][*][block], shadow[2:2][2:2][2:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j - 2][ii] + C[i][j][ii - 1] + C[i - 1][j][ii] + C[i + 1][j][ii] + C[i][j - 1][ii] + C[i][j + 2][ii] + C[i][j][ii + 2]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[1:2][2:2][1:2]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j - 2][ii] + A[i][j][ii - 1] + A[i - 1][j][ii] + A[i + 1][j][ii] + A[i][j - 1][ii] + A[i][j + 2][ii] + A[i][j][ii + 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2303*/ +void acr2303() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR2303 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][*], shadow[2:2][2:2][2:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i][j - 2][ii] + C[i][j - 1][ii] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[0:2][2:2][0:2]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i][j - 2][ii] + A[i][j - 1][ii] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2304*/ +void acr2304() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR2304 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[*][block][block], shadow[2:2][2:2][2:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j][ii - 2] + C[i - 2][j][ii] + C[i][j - 2][ii] + C[i - 1][j][ii] + C[i][j - 1][ii] + C[i][j][ii - 1] + C[i + 1][j][ii]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[2:2][2:0][2:0]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j][ii - 2] + A[i - 2][j][ii] + A[i][j - 2][ii] + A[i - 1][j][ii] + A[i][j - 1][ii] + A[i][j][ii - 1] + A[i + 1][j][ii]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2305*/ +void acr2305() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR2305 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][*][block], shadow[0:2][2:2][0:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i][j - 2][ii] + C[i][j - 1][ii] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[0:2][2:2][0:2]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i][j - 2][ii] + A[i][j - 1][ii] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2306*/ +void acr2306() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + char tname[] = "ACR2306 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][*], shadow[3:3][3:3][3:3] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + C[i][j][ii] = C[i + 3][j][ii] + C[i][j + 3][ii] + C[i][j][ii + 3] + C[i - 3][j][ii] + C[i][j - 3][ii] + C[i][j][ii - 3] + C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i - 2][j][ii] + C[i][j - 2][ii] + C[i][j][ii - 2] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1] + C[i - 1][j][ii] + C[i][j - 1][ii] + C[i][j][ii - 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[3:3][3:3][3:3]) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii] = A[i + 3][j][ii] + A[i][j + 3][ii] + A[i][j][ii + 3] + A[i - 3][j][ii] + A[i][j - 3][ii] + A[i][j][ii - 3] + A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i - 2][j][ii] + A[i][j - 2][ii] + A[i][j][ii - 2] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1] + A[i - 1][j][ii] + A[i][j - 1][ii] + A[i][j][ii - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2307*/ +void acr2307() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + char tname[] = "ACR2307 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[*][block][block], shadow[3:3][0:3][3:0] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + C[i][j][ii] = C[i + 3][j][ii] + C[i][j + 3][ii] + C[i - 3][j][ii] + C[i][j][ii - 3] + C[i + 2][j][ii] + C[i][j + 2][ii] + C[i - 2][j][ii] + C[i][j][ii - 2] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i - 1][j][ii] + C[i][j][ii - 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[3:3][0:3][3:0]) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii] = A[i + 3][j][ii] + A[i][j + 3][ii] + A[i - 3][j][ii] + A[i][j][ii - 3] + A[i + 2][j][ii] + A[i][j + 2][ii] + A[i - 2][j][ii] + A[i][j][ii - 2] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i - 1][j][ii] + A[i][j][ii - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2308*/ +void acr2308() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + char tname[] = "ACR2308 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][*][block], shadow[0:3][0:3][0:3] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 0; i < N - 3; i++) + for (j = 0; j < M - 3; j++) + for (ii = 0; ii < K - 3; ii++) + C[i][j][ii] = C[i + 3][j][ii] + C[i][j + 3][ii] + C[i][j][ii + 3] + C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[0:3][0:3][0:3]) + for (ii = 0; ii < K - 3; ii++) + for (j = 0; j < M - 3; j++) + for (i = 0; i < N - 3; i++) + A[i][j][ii] = A[i + 3][j][ii] + A[i][j + 3][ii] + A[i][j][ii + 3] + A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 0; ii < K - 3; ii++) + for (j = 0; j < M - 3; j++) + for (i = 0; i < N - 3; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR2309*/ +void acr2309() +{ + #define NL 1000 + #define N 59 + #define M 59 + #define K 59 + char tname[] = "ACR2309 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][*], shadow[11:11][11:11][11:11] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + for (ii = 11; ii < K - 11; ii++) + C[i][j][ii] = C[i + 11][j][ii] + C[i][j + 11][ii] + C[i][j][ii + 11] + C[i - 11][j][ii] + C[i][j - 11][ii] + C[i][j][ii - 11] + C[i + 10][j][ii] + C[i][j + 10][ii] + C[i][j][ii + 10] + C[i - 10][j][ii] + C[i][j - 10][ii] + C[i][j][ii - 10] + C[i - 9][j][ii] + C[i][j - 9][ii] + C[i][j][ii - 9] + C[i + 9][j][ii] + C[i][j + 9][ii] + C[i][j][ii + 9]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[11:11][11:11][11:11]) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + A[i][j][ii] = A[i + 11][j][ii] + A[i][j + 11][ii] + A[i][j][ii + 11] + A[i - 11][j][ii] + A[i][j - 11][ii] + A[i][j][ii - 11] + A[i + 10][j][ii] + A[i][j + 10][ii] + A[i][j][ii + 10] + A[i - 10][j][ii] + A[i][j - 10][ii] + A[i][j][ii - 10] + A[i - 9][j][ii] + A[i][j - 9][ii] + A[i][j][ii - 9] + A[i + 9][j][ii] + A[i][j + 9][ii] + A[i][j][ii + 9]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr33.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr33.cdv new file mode 100644 index 0000000..7e4aee2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr33.cdv @@ -0,0 +1,675 @@ +/* ACR33 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void acr3301(); +static void acr3302(); +static void acr3303(); +static void acr3304(); +static void acr3305(); +static void acr3306(); +static void acr3307(); +static void acr3308(); +static void acr3309(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i, j, ii; + +int main(int an, char **as) +{ + printf("===START OF ACR33========================\n"); + /* ---------------------------------------- */ + acr3301(); + /* ---------------------------------------- */ + acr3302(); + /* ---------------------------------------- */ + acr3303(); + /* ---------------------------------------- */ + acr3304(); + /* ---------------------------------------- */ + acr3305(); + /* ---------------------------------------- */ + acr3306(); + /* ---------------------------------------- */ + acr3307(); + /* ---------------------------------------- */ + acr3308(); + /* ---------------------------------------- */ + acr3309(); + /* ---------------------------------------- */ + + printf("=== END OF ACR33 =========================\n"); + return 0; +} +/* ---------------------------------------------ACR3301*/ +void acr3301() +{ + #define NL 1000 + #define N 16 + #define M 8 + #define K 8 + char tname[] = "ACR3301 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + C[i][j][ii] = C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1] + C[i - 1][j][ii] + C[i][j - 1][ii] + C[i][j][ii - 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[1:1][1:1][1:1]) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + A[i][j][ii] = A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1] + A[i - 1][j][ii] + A[i][j - 1][ii] + A[i][j][ii - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3302*/ +void acr3302() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR3302 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[2:2][2:2][2:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j - 2][ii] + C[i][j][ii - 1] + C[i - 1][j][ii] + C[i + 1][j][ii] + C[i][j - 1][ii] + C[i][j + 2][ii] + C[i][j][ii + 2]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[1:2][2:2][1:2]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j - 2][ii] + A[i][j][ii - 1] + A[i - 1][j][ii] + A[i + 1][j][ii] + A[i][j - 1][ii] + A[i][j + 2][ii] + A[i][j][ii + 2]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3303*/ +void acr3303() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR3303 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[2:2][2:2][2:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i][j - 2][ii] + C[i][j - 1][ii] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[0:2][2:2][0:2]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i][j - 2][ii] + A[i][j - 1][ii] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3304*/ +void acr3304() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR3304 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[2:2][2:2][2:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j][ii - 2] + C[i - 2][j][ii] + C[i][j - 2][ii] + C[i - 1][j][ii] + C[i][j - 1][ii] + C[i][j][ii - 1] + C[i + 1][j][ii]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[2:2][2:0][2:0]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j][ii - 2] + A[i - 2][j][ii] + A[i][j - 2][ii] + A[i - 1][j][ii] + A[i][j - 1][ii] + A[i][j][ii - 1] + A[i + 1][j][ii]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3305*/ +void acr3305() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + char tname[] = "ACR3305 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[0:2][2:2][0:2] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + C[i][j][ii] = C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i][j - 2][ii] + C[i][j - 1][ii] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region in(C) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[0:2][2:2][0:2]) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii] = A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i][j - 2][ii] + A[i][j - 1][ii] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3306*/ +void acr3306() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + char tname[] = "ACR3306 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[3:3][3:3][3:3] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + C[i][j][ii] = C[i + 3][j][ii] + C[i][j + 3][ii] + C[i][j][ii + 3] + C[i - 3][j][ii] + C[i][j - 3][ii] + C[i][j][ii - 3] + C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i - 2][j][ii] + C[i][j - 2][ii] + C[i][j][ii - 2] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1] + C[i - 1][j][ii] + C[i][j - 1][ii] + C[i][j][ii - 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[3:3][3:3][3:3]) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii] = A[i + 3][j][ii] + A[i][j + 3][ii] + A[i][j][ii + 3] + A[i - 3][j][ii] + A[i][j - 3][ii] + A[i][j][ii - 3] + A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i - 2][j][ii] + A[i][j - 2][ii] + A[i][j][ii - 2] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1] + A[i - 1][j][ii] + A[i][j - 1][ii] + A[i][j][ii - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3307*/ +void acr3307() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + char tname[] = "ACR3307 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[3:3][0:3][3:0] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + C[i][j][ii] = C[i + 3][j][ii] + C[i][j + 3][ii] + C[i - 3][j][ii] + C[i][j][ii - 3] + C[i + 2][j][ii] + C[i][j + 2][ii] + C[i - 2][j][ii] + C[i][j][ii - 2] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i - 1][j][ii] + C[i][j][ii - 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[3:3][0:3][3:0]) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii] = A[i + 3][j][ii] + A[i][j + 3][ii] + A[i - 3][j][ii] + A[i][j][ii - 3] + A[i + 2][j][ii] + A[i][j + 2][ii] + A[i - 2][j][ii] + A[i][j][ii - 2] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i - 1][j][ii] + A[i][j][ii - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3308*/ +void acr3308() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + char tname[] = "ACR3308 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[0:3][0:3][0:3] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 0; i < N - 3; i++) + for (j = 0; j < M - 3; j++) + for (ii = 0; ii < K - 3; ii++) + C[i][j][ii] = C[i + 3][j][ii] + C[i][j + 3][ii] + C[i][j][ii + 3] + C[i + 2][j][ii] + C[i][j + 2][ii] + C[i][j][ii + 2] + C[i + 1][j][ii] + C[i][j + 1][ii] + C[i][j][ii + 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[0:3][0:3][0:3]) + for (ii = 0; ii < K - 3; ii++) + for (j = 0; j < M - 3; j++) + for (i = 0; i < N - 3; i++) + A[i][j][ii] = A[i + 3][j][ii] + A[i][j + 3][ii] + A[i][j][ii + 3] + A[i + 2][j][ii] + A[i][j + 2][ii] + A[i][j][ii + 2] + A[i + 1][j][ii] + A[i][j + 1][ii] + A[i][j][ii + 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 0; ii < K - 3; ii++) + for (j = 0; j < M - 3; j++) + for (i = 0; i < N - 3; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ---------------------------------------------ACR3309*/ +void acr3309() +{ + #define NL 1000 + #define N 59 + #define M 59 + #define K 59 + char tname[] = "ACR3309 "; + int nloopi, nloopj, nloopii; + #pragma dvm array distribute[block][block][block], shadow[11:11][11:11][11:11] + int (*A)[M][K]; + A = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int (*C)[M][K]; + C = (int (*)[M][K])malloc(N * sizeof(int[M][K])); + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + C[i][j][ii] = NNL + i + j + ii; + nloopi = NL; + nloopj = NL; + nloopii = NL; + + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + for (ii = 11; ii < K - 11; ii++) + C[i][j][ii] = C[i + 11][j][ii] + C[i][j + 11][ii] + C[i][j][ii + 11] + C[i - 11][j][ii] + C[i][j - 11][ii] + C[i][j][ii - 11] + C[i + 10][j][ii] + C[i][j + 10][ii] + C[i][j][ii + 10] + C[i - 10][j][ii] + C[i][j - 10][ii] + C[i][j][ii - 10] + C[i - 9][j][ii] + C[i][j - 9][ii] + C[i][j][ii - 9] + C[i + 9][j][ii] + C[i][j + 9][ii] + C[i][j][ii + 9]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii] = NL + i + j + ii; + + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) across(A[11:11][11:11][11:11]) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + A[i][j][ii] = A[i + 11][j][ii] + A[i][j + 11][ii] + A[i][j][ii + 11] + A[i - 11][j][ii] + A[i][j - 11][ii] + A[i][j][ii - 11] + A[i + 10][j][ii] + A[i][j + 10][ii] + A[i][j][ii + 10] + A[i - 10][j][ii] + A[i][j - 10][ii] + A[i][j][ii - 10] + A[i - 9][j][ii] + A[i][j - 9][ii] + A[i][j][ii - 9] + A[i + 9][j][ii] + A[i][j + 9][ii] + A[i][j][ii + 9]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([ii][j][i] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + if (A[i][j][ii] != C[i][j][ii]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr34.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr34.cdv new file mode 100644 index 0000000..a58a683 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr34.cdv @@ -0,0 +1,723 @@ +/* ACR34 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void acr3401(); +static void acr3402(); +static void acr3403(); +static void acr3404(); +static void acr3405(); +static void acr3406(); +static void acr3407(); +static void acr3408(); +static void acr3409(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i, j, ii, jj; + +int main(int an, char **as) +{ + printf("===START OF ACR34========================\n"); + /* ---------------------------------------- */ + acr3401(); + /* ---------------------------------------- */ + acr3402(); + /* ---------------------------------------- */ + acr3403(); + /* ---------------------------------------- */ + acr3404(); + /* ---------------------------------------- */ + acr3405(); + /* ---------------------------------------- */ + acr3406(); + /* ---------------------------------------- */ + acr3407(); + /* ---------------------------------------- */ + acr3408(); + /* ---------------------------------------- */ + acr3409(); + /* ---------------------------------------- */ + + printf("=== END OF ACR34 =========================\n"); + return 0; +} +/* ---------------------------------------------ACR3401*/ +void acr3401() +{ + #define NL 1000 + #define N 16 + #define M 8 + #define K 8 + #define L 8 + char tname[] = "ACR3401 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + printf("1234r5\n"); + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + C[i][j][ii][jj] = C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[1:1][1:1][1:1][1:1]) + for (jj = 1; jj < L - 1; jj++) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + A[i][j][ii][jj] = A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 1; jj < L - 1; jj++) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3402*/ +void acr3402() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR3402 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 2] + C[i - 1][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 1] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii][jj + 1] + C[i][j - 1][ii][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[1:2][2:2][2:1][1:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 2] + A[i - 1][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 1] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii][jj + 1] + A[i][j - 1][ii][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3403*/ +void acr3403() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR3403 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 2] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:0][2:2][2:0][2:0]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 2] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3404*/ +void acr3404() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR3404 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i + 1][j][ii][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region in(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:2][2:0][2:0][0:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i + 1][j][ii][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3405*/ +void acr3405() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR3405 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[2:2][2:0][0:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:2][2:0][0:2][2:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3406*/ +void acr3406() +{ + #define NL 1000 + #define N 32 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR3406 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[3:3][3:3][3:3][3:3] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj + 3] + C[i - 3][j][ii][jj] + C[i][j - 3][ii][jj] + C[i][j][ii - 3][jj] + C[i][j][ii][jj - 3] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[3:3][3:3][3:3][3:3]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj + 3] + A[i - 3][j][ii][jj] + A[i][j - 3][ii][jj] + A[i][j][ii - 3][jj] + A[i][j][ii][jj - 3] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3407*/ +void acr3407() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR3407 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[0:3][3:3][0:3][0:3] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj + 3] + C[i][j - 3][ii][jj] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i][j - 2][ii][jj] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i][j - 1][ii][jj]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[0:3][3:3][0:3][0:3]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj + 3] + A[i][j - 3][ii][jj] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i][j - 2][ii][jj] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i][j - 1][ii][jj]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3408*/ +void acr3408() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR3408 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[0:3][3:3][0:3][3:0] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj - 3] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[0:3][0:3][0:3][3:0]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj - 3] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR3409*/ +void acr3409() +{ + #define NL 1000 + #define N 59 + #define M 59 + #define K 59 + #define L 59 + char tname[] = "ACR3409 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[*][block][block][block], shadow[11:11][11:11][11:11][11:11] + int (*A)[M][K][L]; + int (*C)[M][K][L]; + int NNL = NL; + A = malloc(N * M * K * L * sizeof(int)); + C = malloc(N * M * K * L * sizeof(int)); + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + for (ii = 11; ii < K - 11; ii++) + for (jj = 11; jj < L - 11; jj++) + C[i][j][ii][jj] = C[i + 11][j][ii][jj] + C[i][j + 11][ii][jj] + C[i][j][ii + 11][jj] + C[i][j][ii][jj + 11] + C[i - 11][j][ii][jj] + C[i][j - 11][ii][jj] + C[i][j][ii - 11][jj] + C[i][j][ii][jj - 11]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region in(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[11:11][11:11][11:11][11:11]) + for (jj = 11; jj < L - 11; jj++) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + A[i][j][ii][jj] = A[i + 11][j][ii][jj] + A[i][j + 11][ii][jj] + A[i][j][ii + 11][jj] + A[i][j][ii][jj + 11] + A[i - 11][j][ii][jj] + A[i][j - 11][ii][jj] + A[i][j][ii - 11][jj] + A[i][j][ii][jj - 11]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 11; jj < L - 11; jj++) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr44.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr44.cdv new file mode 100644 index 0000000..f6a6d92 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/acr44.cdv @@ -0,0 +1,723 @@ +/* ACR44 + + TESTING OF THE ACROSS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT + FLOW-DEP-LENGTH ON BOTH SIDES */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void acr4401(); +static void acr4402(); +static void acr4403(); +static void acr4404(); +static void acr4405(); +static void acr4406(); +static void acr4407(); +static void acr4408(); +static void acr4409(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int i, j, ii, jj; + +int main(int an, char **as) +{ + printf("===START OF ACR44========================\n"); + /* ---------------------------------------- */ + acr4401(); + /* ---------------------------------------- */ + acr4402(); + /* ---------------------------------------- */ + acr4403(); + /* ---------------------------------------- */ + acr4404(); + /* ---------------------------------------- */ + acr4405(); + /* ---------------------------------------- */ + acr4406(); + /* ---------------------------------------- */ + acr4407(); + /* ---------------------------------------- */ + acr4408(); + /* ---------------------------------------- */ + acr4409(); + /* ---------------------------------------- */ + + printf("=== END OF ACR44 =========================\n"); + return 0; +} +/* ---------------------------------------------ACR4401*/ +void acr4401() +{ + #define NL 1000 + #define N 16 + #define M 8 + #define K 8 + #define L 8 + char tname[] = "ACR4401 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + printf("1234r5\n"); + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + C[i][j][ii][jj] = C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[1:1][1:1][1:1][1:1]) + for (jj = 1; jj < L - 1; jj++) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + A[i][j][ii][jj] = A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 1; jj < L - 1; jj++) + for (ii = 1; ii < K - 1; ii++) + for (j = 1; j < M - 1; j++) + for (i = 1; i < N - 1; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4402*/ +void acr4402() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR4402 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 2] + C[i - 1][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 1] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii][jj + 1] + C[i][j - 1][ii][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[1:2][2:2][2:1][1:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 2] + A[i - 1][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 1] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii][jj + 1] + A[i][j - 1][ii][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4403*/ +void acr4403() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR4403 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 2] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, nloopj, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:0][2:2][2:0][2:0]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 2] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4404*/ +void acr4404() +{ + #define NL 1000 + #define N 16 + #define M 10 + #define K 10 + #define L 10 + char tname[] = "ACR4404 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i + 1][j][ii][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region in(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:2][2:0][2:0][0:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i + 1][j][ii][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4405*/ +void acr4405() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR4405 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[2:2][2:0][0:2][2:2] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + C[i][j][ii][jj] = C[i + 2][j][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[2:2][2:0][0:2][2:2]) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + A[i][j][ii][jj] = A[i + 2][j][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 2; jj < L - 2; jj++) + for (ii = 2; ii < K - 2; ii++) + for (j = 2; j < M - 2; j++) + for (i = 2; i < N - 2; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4406*/ +void acr4406() +{ + #define NL 1000 + #define N 32 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR4406 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[3:3][3:3][3:3][3:3] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj + 3] + C[i - 3][j][ii][jj] + C[i][j - 3][ii][jj] + C[i][j][ii - 3][jj] + C[i][j][ii][jj - 3] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i - 2][j][ii][jj] + C[i][j - 2][ii][jj] + C[i][j][ii - 2][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i - 1][j][ii][jj] + C[i][j - 1][ii][jj] + C[i][j][ii - 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[3:3][3:3][3:3][3:3]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj + 3] + A[i - 3][j][ii][jj] + A[i][j - 3][ii][jj] + A[i][j][ii - 3][jj] + A[i][j][ii][jj - 3] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i - 2][j][ii][jj] + A[i][j - 2][ii][jj] + A[i][j][ii - 2][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i - 1][j][ii][jj] + A[i][j - 1][ii][jj] + A[i][j][ii - 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4407*/ +void acr4407() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR4407 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[0:3][3:3][0:3][0:3] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj + 3] + C[i][j - 3][ii][jj] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj + 2] + C[i][j - 2][ii][jj] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj + 1] + C[i][j - 1][ii][jj]; + + #pragma dvm actual(nloopi) + #pragma dvm region + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[0:3][3:3][0:3][0:3]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj + 3] + A[i][j - 3][ii][jj] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj + 2] + A[i][j - 2][ii][jj] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj + 1] + A[i][j - 1][ii][jj]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4408*/ +void acr4408() +{ + #define NL 1000 + #define N 16 + #define M 16 + #define K 16 + #define L 16 + char tname[] = "ACR4408 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[0:3][3:3][0:3][3:0] + int A[N][M][K][L]; + int C[N][M][K][L]; + int NNL = NL; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + C[i][j][ii][jj] = C[i + 3][j][ii][jj] + C[i][j + 3][ii][jj] + C[i][j][ii + 3][jj] + C[i][j][ii][jj - 3] + C[i + 2][j][ii][jj] + C[i][j + 2][ii][jj] + C[i][j][ii + 2][jj] + C[i][j][ii][jj - 2] + C[i + 1][j][ii][jj] + C[i][j + 1][ii][jj] + C[i][j][ii + 1][jj] + C[i][j][ii][jj - 1]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region inout(C), out(A) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[0:3][0:3][0:3][3:0]) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + A[i][j][ii][jj] = A[i + 3][j][ii][jj] + A[i][j + 3][ii][jj] + A[i][j][ii + 3][jj] + A[i][j][ii][jj - 3] + A[i + 2][j][ii][jj] + A[i][j + 2][ii][jj] + A[i][j][ii + 2][jj] + A[i][j][ii][jj - 2] + A[i + 1][j][ii][jj] + A[i][j + 1][ii][jj] + A[i][j][ii + 1][jj] + A[i][j][ii][jj - 1]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 3; jj < L - 3; jj++) + for (ii = 3; ii < K - 3; ii++) + for (j = 3; j < M - 3; j++) + for (i = 3; i < N - 3; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------ACR4409*/ +void acr4409() +{ + #define NL 1000 + #define N 59 + #define M 59 + #define K 59 + #define L 59 + char tname[] = "ACR4409 "; + int nloopi, nloopj, nloopii, nloopjj; + #pragma dvm array distribute[block][block][block][block], shadow[11:11][11:11][11:11][11:11] + int (*A)[M][K][L]; + int (*C)[M][K][L]; + int NNL = NL; + A = malloc(N * M * K * L * sizeof(int)); + C = malloc(N * M * K * L * sizeof(int)); + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NNL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + for (i = 11; i < N - 11; i++) + for (j = 11; j < M - 11; j++) + for (ii = 11; ii < K - 11; ii++) + for (jj = 11; jj < L - 11; jj++) + C[i][j][ii][jj] = C[i + 11][j][ii][jj] + C[i][j + 11][ii][jj] + C[i][j][ii + 11][jj] + C[i][j][ii][jj + 11] + C[i - 11][j][ii][jj] + C[i][j - 11][ii][jj] + C[i][j][ii - 11][jj] + C[i][j][ii][jj - 11]; + + #pragma dvm actual(nloopi, C) + #pragma dvm region in(C) + { + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) + for (jj = 0; jj < L; jj++) + for (ii = 0; ii < K; ii++) + for (j = 0; j < M; j++) + for (i = 0; i < N; i++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) across(A[11:11][11:11][11:11][11:11]) + for (jj = 11; jj < L - 11; jj++) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + A[i][j][ii][jj] = A[i + 11][j][ii][jj] + A[i][j + 11][ii][jj] + A[i][j][ii + 11][jj] + A[i][j][ii][jj + 11] + A[i - 11][j][ii][jj] + A[i][j - 11][ii][jj] + A[i][j][ii - 11][jj] + A[i][j][ii][jj - 11]; + } + #pragma dvm get_actual(A) + #pragma dvm parallel([jj][ii][j][i] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (jj = 11; jj < L - 11; jj++) + for (ii = 11; ii < K - 11; ii++) + for (j = 11; j < M - 11; j++) + for (i = 11; i < N - 11; i++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + nloopi = Min(nloopi, i); + nloopj = Min(nloopj, j); + nloopii = Min(nloopii, ii); + nloopjj = Min(nloopjj, jj); + } + + #pragma dvm get_actual(nloopi) + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); + + free(C); + free(A); + #undef NL + #undef N + #undef M + #undef K + #undef L +} +/* ----------------------------------------------- */ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/settings b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/settings new file mode 100644 index 0000000..fd6919c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ACROSS/settings @@ -0,0 +1 @@ +ALLOW_MULTIDEV=0 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align11.cdv new file mode 100644 index 0000000..c87bdec --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align11.cdv @@ -0,0 +1,415 @@ +/* ALIGN11 +TESTING align CLAUSE */ + +#include +#include +#include + +static void align111(); +static void align1111(); +static void align1112(); +static void align112(); +static void align113(); +static void align114(); +static void align115(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF ALIGN11 ======================\n"); + /* ALIGN arrB[i] WITH arrA[i] normal*/ + align111(); + /* ALIGN arrB[i] WITH arrA[i] small array*/ + align1111(); + /* ALIGN arrB[i] WITH arrA[2 * i+3] small array*/ + align1112(); + /* ALIGN arrB[i] WITH arrA[i + 4] shift along i*/ + align112(); + /* ALIGN arrB[i] WITH arrA[-i + 7] reverse on i*/ +// align113(); + /* ALIGN arrB[i] WITH arrA[2 * i + 8] stretching along i*/ + align114(); + /* ALIGN arrB[] WITH arrA[]*/ + align115(); + + printf("=== END OF ALIGN11 ========================\n"); + return 0; +} +/* ---------------------------------------------ALIGN111*/ +/* ALIGN arrB[i] WITH arrA[i] normal*/ +void align111() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + #define AN1 8 + #define BN1 8 + int k1i = 1; + int li = 0; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + char tname[] = "align111 "; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------ALIGN1111*/ +/* ALIGN arrB[i] WITH arrA[i] small array*/ +void align1111() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + #define AN1 5 + #define BN1 2 + int k1i = 1; + int li = 0; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + char tname[] = "align1111"; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------ALIGN1112*/ +/* ALIGN arrB[i] WITH arrA[2 * i + 1] small array*/ +void align1112() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + #define AN1 5 + #define BN1 2 + int k1i = 2; + int li = 1; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + char tname[] = "align1112"; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------ALIGN112*/ +/* ALIGN arrB[i] WITH arrA[i + 4] shift along i*/ +void align112() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + #define AN1 8 + #define BN1 4 + int k1i = 1; + int li = 4; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + char tname[] = "align112 "; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------ALIGN113*/ +/* ALIGN arrB[i] WITH arrA[-i + 7] reverse on i*/ +void align113() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + #define AN1 8 + #define BN1 8 + int k1i = -1; + int li = 7; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + char tname[] = "align113 "; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------ALIGN114*/ +/* ALIGN arrB[i] WITH arrA[2 * i + 8] stretching along i*/ +void align114() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + #define AN1 24 + #define BN1 8 + int k1i = 2; + int li = 8; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + char tname[] = "align114 "; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A1, B1), inout(erri) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------ALIGN115*/ +/* ALIGN arrB[] WITH arrA[]*/ +void align115() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + #define AN1 24 + #define BN1 8 + int k1i = 0; + int li = 0; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([] with A1[]) + int B1[BN1]; + char tname[] = "align115 "; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i; + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), private(j) + for (i = 0; i < AN1; i++) + for (j = 0; j < BN1; j++) + if (B1[j] != (j)) + if (erri > j) erri = j; + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef BN1 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align12.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align12.cdv new file mode 100644 index 0000000..a3060e4 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align12.cdv @@ -0,0 +1,228 @@ +/* ALIGN12 +TESTING align CLAUSE*/ + +#include +#include +#include + +static void align121(); +static void align122(); +static void align123(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int s, cs, erri, i, j, ia, ja, ib, jb; + +int main(int an, char **as) +{ + printf("=== START OF ALIGN12 ======================\n"); +/* ALIGN arrB[][i] WITH arrA[i]*/ + align121(); +/* ALIGN arrB[i][] WITH arrA[2 * i + 1]*/ + align122(); +/* ALIGN arrB[][] WITH arrA[]*/ + align123(); + + printf("=== END OF ALIGN12 ========================\n"); + return 0; +} +/* ---------------------------------------------ALIGN121*/ +/* ALIGN arrB[][i] WITH arrA[i]*/ +void align121() +{ +/* parameters for ALIGN arrB[][i] WITH arrA[k1i * i + li]*/ + #define AN1 8 + #define AN2 0 + #define BN1 4 + #define BN2 4 + int k1i = 1; + int li = 0; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([][i] with A1[k1i * i + li]) + int B2[BN1][BN2]; + char tname[] = "align121"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A1, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib, jb, j) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + for (j = 0; j < BN1; j++) + { + if (((i - li) ==(((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN2)) + { + ib = j; + jb = (i - li) / k1i; + B2[ib][jb] = ib * NL + jb; + } + } + }; + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j; + s = s + B2[i][j]; + if (B2[i][j] != i * NL + j) + if (erri > val) erri = val; + } + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL + j; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN122*/ +/* ALIGN arrB[i][] WITH arrA[2 * i + 1]*/ +void align122() +{ +/* parameters for ALIGN arrB[i][] WITH arrA[k1i * i + li]*/ + #define AN1 16 + #define AN2 0 + #define BN1 4 + #define BN2 4 + int k1i = 2; + int li = 1; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i][] with A1[k1i * i + li]) + int B2[BN1][BN2]; + char tname[] = "align122"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A1, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib, jb, j) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + for (j = 0; j < BN1; j++) + { + if (((i - li) ==(((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN2)) + { + jb = j; + ib = (i - li) / k1i; + B2[ib][jb] = ib * NL + jb; + } + } + } + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j; + s = s + B2[i][j]; + if (B2[i][j] != (i * NL + j)) + if (erri > val) erri = val; + } + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL + j; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN123*/ +/* ALIGN arrB[][] WITH arrA[]*/ +void align123() +{ +/* parameters for ALIGN arrB[][] WITH arrA[]*/ + #define AN1 16 + #define AN2 0 + #define BN1 4 + #define BN2 4 + int k1i = 0; + int li = 0; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([][] with A1[]) + int B2[BN1][BN2]; + char tname[] = "align123"; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A1, B2) + { + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = i * NL + j; + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), private(ib, jb) + for (i = 0; i < AN1; i++) + for (ib = 0; ib < BN1; ib++) + for (jb = 0; jb < BN2; jb++) + { + int val = i * NL / 10 + j; + if (B2[ib][jb] != ib * NL + jb) + if (erri > val) erri = val; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} + +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align214.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align214.cdv new file mode 100644 index 0000000..9b64ce6 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align214.cdv @@ -0,0 +1,727 @@ +/* ALIGN214 +TESTING align CLAUSE*/ + +#include +#include +#include + +static void align211(); +static void align212(); +static void align213(); +static void align214(); + +static void align241(); +static void align2421(); +static void align2422(); +static void align243(); +static void align244(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int s, cs, erri, i, j, n, m, k, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue; + +int main(int an, char **as) +{ + printf("=== START OF ALIGN214 ======================\n"); + +/* ALIGN arrB[i] WITH arrA[1][i] vector arrB on section + (the first line of arrA)*/ + align211(); +/* ALIGN arrB[i] WITH arrA[2 * i + 2][2] vector arrB on section + (the second column of arrA) with stretching and shift*/ + align212(); +/* ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA*/ + align213(); +/* ALIGN arrB[i] WITH arrA[2 * i + 2][] vector arrB on replication on + every column of arrA with stretching and shift*/ + align214(); + +/* ALIGN arrB[i][j][][] WITH arrA[i][j] + matrix compression*/ + align241(); +/* ALIGN arrB[][i][][j] WITH arrA[j+4][2*i] matrix compression*/ + align2421(); +/* ALIGN arrB[][i][][j] WITH arrA[j+1][2*i] small array*/ + align2422(); +/* ALIGN arrB[][][i][] WITH arrA[1][i] matrix compression + and replication*/ + align243(); +/* ALIGN arrB[][][][i] WITH arrA[i][] matrix compression + and replication*/ + align244(); + + printf("=== END OF ALIGN214 ========================\n"); + return 0; +} +/* ---------------------------------------------ALIGN211 */ +/* ALIGN arrB[i] WITH arrA[1][i] vector arrB on section + (the first line of arrA)*/ +void align211() +{ +/* parameters for ALIGN arrB[i] WITH arrA[1][i]*/ + #define AN1 8 + #define AN2 8 + #define BN1 4 + int k1i = 0, k2i = 0, li = 1; + int k1j = 1, k2j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i] with A2[1][i]) + int B1[BN1]; + char tname[] = "align211"; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A2, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if ((i == 1) && (j < BN1)) + { + ib = j; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = 1; + ja = i; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 +} +/* ---------------------------------------------ALIGN212*/ +/* ALIGN arrB[i] WITH arrA[2*i+2][2] vector arrB on section + (the second column of arrA) with stretching and shift*/ +void align212() +{ + /* parameters for ALIGN arrB[i] WITH arrA[2*i+2][2]*/ + #define AN1 14 + #define AN2 3 + #define BN1 6 + int k1i = 2, k2i = 0, li = 2; + int k1j = 0, k2j = 0, lj = 2; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i] with A2[k1i * i + li][lj]) + int B1[BN1]; + char tname[] = "align212"; + + erri = ER; + #pragma dvm actual(erri) + #pragma dvm region local(A2, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (j == lj){ + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + ja = lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 +} +/* ---------------------------------------------ALIGN213*/ +/* ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA*/ +void align213() +{ +/* parameters for ALIGN arrB[i] WITH arrA[][k1j * i + lj]*/ + #define AN1 8 + #define AN2 8 + #define BN1 6 + int k1i = 0, k2i = 0, li = 0; + int k1j = 1, k2j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i] with A2[][k1j * i + lj]) + int B1[BN1]; + char tname[] = "align213"; + + erri = ER; + s = 0; + #pragma dvm actual(erri, s) + #pragma dvm region local(A2, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i; + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), private(ib) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((j - lj) == (((j - lj) / k1j) * k1j)) && + (((j - lj) / k1j) >= 0) && + (((j - lj) / k1j) < BN1)) + { + ib = (j - lj) / k1j; + if (B1[ib] != ib) + if (erri > ib) erri = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + { + s = s + B1[i]; + if (B1[i] != i) + if (erri > i) erri = i; + } + } + #pragma dvm get_actual(erri, s) + + cs = (0 + BN1-1) * BN1 / 2; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + { + ansno(tname); +// printf("%d, %d, %d\n", erri, s, cs); + } + #undef AN1 + #undef AN2 + #undef BN1 +} +/* ---------------------------------------------ALIGN214*/ +/* ALIGN arrB[i] WITH arrA[2*i+2][ ] vector arrB on replication on + every column of arrA with stretching and shift*/ +void align214() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li][]*/ + #define AN1 28 + #define AN2 8 + #define BN1 5 + int k1i = 2, k2i = 0, li = 2; + int k1j = 0, k2j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i] with A2[k1i * i + li][]) + int B1[BN1]; + char tname[] = "align214"; + + erri = ER; + s = 0; + #pragma dvm actual(erri, s) + #pragma dvm region local(A2, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i; + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), private(ib) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + if (B1[ib] != ib) + if (erri > i) erri = i; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(sum(s)) + for (i = 0; i < BN1; i++) + s = s + B1[i]; + } + #pragma dvm get_actual(erri, s) + + cs = (0 + BN1-1) * BN1 / 2; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 +} +/* ---------------------------------------------ALIGN241 */ +/* ALIGN arrB[i][j][][] WITH arrA[i][j] + matrix compression*/ +void align241() +{ +/* parameters for ALIGN arrB[i][j][][] WITH arrA[k1i*i+li][k2j*j+lj]*/ + #define AN1 5 + #define AN2 5 + #define BN1 2 + #define BN2 2 + #define BN3 2 + #define BN4 2 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j][][] with A2[k1i*i+li][k2j*j+lj]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align241 "; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A2, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb, n, m, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL / 10 + j; + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = n; + mb = m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN2421*/ +/* ALIGN arrB[][i][][j] WITH arrA[j+4][2*i] matrix compression*/ +void align2421() +{ +/* parameters for ALIGN arrB[][i][][j] WITH arrA[k2i*j+li][k1j*i+lj]*/ + #define AN1 12 + #define AN2 9 + #define BN1 4 + #define BN2 4 + #define BN3 4 + #define BN4 4 + int k1i = 0, k2i = 1, k3i = 0, k4i = 0, li = 4; + int k1j = 2, k2j = 0, k3j = 0, k4j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([][i][][j] with A2[k2i*j+li][k1j*i+lj]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align2421"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A2, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb, n, m, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL / 10 + j; + for (n = 0; n < BN1; n++) + for (m = 0; m < BN3; m++) + { + if (((i - li) == (((i - li) / k2i) * k2i)) && + ((j - lj) == (((j - lj) / k1j) * k1j)) && + (((i - li) / k2i) >= 0) && + (((j - lj) / k1j) >= 0) && + (((i - li) / k2i) < BN4) && + (((j - lj) / k1j) < BN2)) + { + ib = n; + jb = (j - lj) / k1j; + nb = m; + mb = (i - li) / k2i; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN2422*/ +/* ALIGN arrB[][i][][j] WITH arrA[j+1][2*i] small array*/ +void align2422() +{ +/* parameters for ALIGN arrB[][i][][j] WITH arrA[k2i*j+li][k1j*i+lj]*/ + #define AN1 3 + #define AN2 4 + #define BN1 2 + #define BN2 2 + #define BN3 2 + #define BN4 2 + int k1i = 0, k2i = 1, k3i = 0, k4i = 0, li = 1; + int k1j = 2, k2j = 0, k3j = 0, k4j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([][i][][j] with A2[k2i*j+li][k1j*i+lj]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align2422"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A2, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb, n, m, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL / 10 + j; + for (n = 0; n < BN1; n++) + for (m = 0; m < BN3; m++) + { + if (((i - li) == (((i - li) / k2i) * k2i)) && + ((j - lj) == (((j - lj) / k1j) * k1j)) && + (((i - li) / k2i) >= 0) && + (((j - lj) / k1j) >= 0) && + (((i - li) / k2i) < BN4) && + (((j - lj) / k1j) < BN2)) + { + ib = n; + jb = (j - lj) / k1j; + nb = m; + mb = (i - li) / k2i; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN243*/ +/* ALIGN arrB[][][i][] WITH arrA[1][i] matrix compression + and replication*/ +void align243() +{ +/* parameters for ALIGN arrB[][][i][] WITH arrA[li][k1j*i+lj]*/ + #define AN1 3 + #define AN2 4 + #define BN1 2 + #define BN2 2 + #define BN3 2 + #define BN4 2 + int k1i = 0, k2i = 0, k3i = 0, k4i = 0, li = 1; + int k1j = 1, k2j = 0, k3j = 0, k4j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([][][i][] with A2[li][k1j*i+lj]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align243 "; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A2, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb, k, n, m, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL / 10 + j; + if (i == li) + for (n = 0; n < BN1; n++) + for (m = 0; m < BN2; m++) + for (k = 0; k < BN4; k++) + { + if (((j - lj) == (((j - lj) / k1j) * k1j)) && + (((j - lj) / k1j) >= 0) && + (((j - lj) / k1j) < BN3)) + { + ib = n; + jb = m; + nb = ((j - lj) / k1j); + mb = k; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN244*/ +/* ALIGN arrB[][][][i] WITH arrA[i][] matrix compression + and replication*/ +void align244() +{ +/* parameters for ALIGN arrB[][][i][] WITH arrA[k1i*i+li][]*/ + #define AN1 12 + #define AN2 9 + #define BN1 4 + #define BN2 4 + #define BN3 4 + #define BN4 4 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 0, k3j = 0, k4j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([][][i][] with A2[k1i * i + li][]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align244 "; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A2, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), private(ib, jb, m, n, k, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL / 10 + j; + for (n = 0; n < BN1; n++) + for (m = 0; m < BN2; m++) + for (k = 0; k < BN4; k++) + { + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN3)) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + ib = n; + jb = m; + nb = ((i - li) / k1i); + mb = k; + if (B4[ib][jb][nb][mb] != ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb) + if (erri > val) erri = val; + } + } + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align22.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align22.cdv new file mode 100644 index 0000000..d03cef9 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align22.cdv @@ -0,0 +1,600 @@ +/* ALIGN22 +TESTING align CLAUSE*/ + +#include +#include +#include + +static void align221(); +static void align222(); +static void align223(); +static void align224(); +static void align225(); +static void align2251(); +static void align226(); +static void align227(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int s, cs, erri, i, j, ia, ja, ib, jb; + +int main(int an, char **as) +{ + printf("=== START OF ALIGN22 ======================\n"); + /* ALIGN arrB[i][j] WITH arrA[i][j] normal*/ + align221(); + /* ALIGN arrB[i][j] WITH arrA[i][2 * j] stretching along j*/ + align222(); + /* ALIGN arrB[i][j] WITH arrA[i + 4][j] shift along i*/ + align223(); + /* ALIGN arrB[i][j] WITH arrA[-i + 9][j] reverse on i*/ +// align224(); + /* ALIGN arrB[i][j] WITH arrA[i + 4][j + 4] shift along i and j*/ + align225(); + /* */ + align2251(); + /* ALIGN arrB[i][j] WITH arrA[j][i] rotation*/ + align226(); + /* ALIGN arrB[i][j] WITH arrA[j + 1][i] rotation and shift*/ + align227(); + + printf("=== END OF ALIGN22 ========================\n"); + return 0; +} +/* ---------------------------------------------ALIGN221*/ +/* ALIGN arrB[i][j] WITH arrA[i][j] normal*/ +void align221() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj]*/ + #define AN1 8 + #define AN2 8 + #define BN1 8 + #define BN2 8 + int k1i = 1, k2i = 0, li = 0; + int k1j = 0, k2j = 1, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + char tname[] = "align221 "; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN222*/ +/* ALIGN arrB[i][j] WITH arrA[i][2*j] stretching along j*/ +void align222() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj]*/ + #define AN1 8 + #define AN2 8 + #define BN1 8 + #define BN2 4 + int k1i = 1, k2i = 0, li = 0; + int k1j = 0, k2j = 2, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + char tname[] = "align222 "; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN223*/ +/* ALIGN arrB[i][j] WITH arrA[i+4][j] shift along i*/ +void align223() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj]*/ + #define AN1 8 + #define AN2 8 + #define BN1 4 + #define BN2 8 + int k1i = 1, k2i = 0, li = 4; + int k1j = 0, k2j = 1, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + char tname[] = "align223 "; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN224*/ +/* ALIGN arrB[i][j] WITH arrA[-i+9][j] reverse on i*/ +void align224() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj]*/ + #define AN1 10 + #define AN2 8 + #define BN1 8 + #define BN2 8 + int k1i = -1, k2i = 0, li = 9; + int k1j = 0, k2j = 1, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + char tname[] = "align224 "; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN225*/ +/* ALIGN arrB[i][j] WITH arrA[i+4][j+4]shift along i and j*/ +void align225() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj]*/ + #define AN1 8 + #define AN2 8 + #define BN1 4 + #define BN2 4 + int k1i = 1, k2i = 0, li = 4; + int k1j = 0, k2j = 1, lj = 4; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + char tname[] = "align225 "; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN2251*/ +/* ALIGN arrB[i][j] WITH arrA[i+1][2*j] small arrays*/ +void align2251() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj]*/ + #define AN1 3 + #define AN2 5 + #define BN1 2 + #define BN2 3 + int k1i = 1, k2i = 0, li = 1; + int k1j = 0, k2j = 2, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + char tname[] = "align2251"; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN226*/ +/* ALIGN arrB[i][j] WITH arrA[j][i] rotation*/ +void align226() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k2i * j + li][k1j * i + lj]*/ + #define AN1 4 + #define AN2 4 + #define BN1 4 + #define BN2 4 + int k1i = 0, k2i = 1, li = 0; + int k1j = 1, k2j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k2i * j + li][k1j * i + lj]) + int B2[BN1][BN2]; + char tname[] = "align226 "; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k2i) * k2i)) && + ((j - lj) == (((j - lj) / k1j) * k1j)) && + (((i - li) / k2i) >= 0) && + (((j - lj) / k1j) >= 0) && + (((i - li) / k2i) < BN2) && + (((j - lj) / k1j) < BN1)) + { + jb = (i - li) / k2i; + ib = (j - lj) / k1j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k2i * j + li; + ja = k1j * i + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN227*/ +/* ALIGN arrB[i][j] WITH arrA[j+1][i] rotation and shift*/ +void align227() +{ +/* parameters for ALIGN arrB[i][j] WITH arrA[k2i*j+li][k1j*i+lj]*/ + #define AN1 8 + #define AN2 8 + #define BN1 4 + #define BN2 4 + int k1i = 0, k2i = 1, li = 1; + int k1j = 1, k2j = 0, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k2i * j + li][k1j * i + lj]) + int B2[BN1][BN2]; + char tname[] = "align227 "; + + erri = ER; + + #pragma dvm actual(erri) + #pragma dvm region local(A2, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k2i) * k2i)) && + ((j - lj) == (((j - lj) / k1j) * k1j)) && + (((i - li) / k2i) >= 0) && + (((j - lj) / k1j) >= 0) && + (((i - li) / k2i) < BN2) && + (((j - lj) / k1j) < BN1)) + { + jb = (i - li) / k2i; + ib = (j - lj) / k1j; + B2[ib][jb] = ib * NL + jb; + } + } + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + ia = k2i * j + li; + ja = k1j * i + lj; + if (A2[ia][ja] != (ia * NL + ja)) + if (erri > i * NL / 10 + j) erri = i * NL / 10 + j; + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} + +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align32.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align32.cdv new file mode 100644 index 0000000..861f4fd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align32.cdv @@ -0,0 +1,600 @@ +/* ALIGN32 +TESTING align CLAUSE*/ + +#include +#include +#include + +static void align321(); +static void align322(); +static void align323(); +static void align324(); +static void align325(); +static void align326(); +static void align327(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int s, cs, erri, i, j, n, m, k, l, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue; + +int main(int an, char **as) +{ + printf("=== START OF ALIGN32 ======================\n"); +/* ALIGN arrB[i][j] WITH arrA[i][j][1] matrix on section*/ + align321(); +/* ALIGN arrB[i][j] WITH arrA[j][i][5] matrix on section with rotation*/ + align322(); +/* ALIGN arrB[i][j] WITH arrA[j][1][2*i] matrix on section with + rotation and stretching*/ + align323(); +/* ALIGN arrB[i][j] WITH arrA[][i][j] matrix replication*/ + align324(); +/* ALIGN arrB[i][j] WITH arrA[i+4][][j] matrix replication with shift*/ + align325(); +/* ALIGN arrB[i][j] WITH arrA[-i+8][j][] matrix replication with reverse*/ +// align326(); +/* ALIGN arrB[][] WITH arrA[][][]*/ + align327(); + printf("=== END OF ALIGN32 ========================\n"); + return 0; +} +/* ---------------------------------------------ALIGN321*/ +/* ALIGN arrB[i][j] WITH arrA[i][j][1] matrix on section*/ +void align321() +{ +/* parameters for ALIGN arrB[i][j] + WITH arrA[k1i*i+li][k2j*j+lj][ln]*/ + #define AN1 5 + #define AN2 5 + #define AN3 5 + #define BN1 4 + #define BN2 4 + int k1i = 1, k2i = 0, k3i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 0, ln = 1; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j] with A3[k1i*i+li][k2j*j+lj][ln]) + int B2[BN1][BN2]; + char tname[] = "align321"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + if ((n == ln ) && + ((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL / 10 + jb * NL / 100; + } + } + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j * NL / 100; + s = s + B2[i][j]; + if (B2[i][j] != val) + if (erri > val) erri = val; + ia = k1i * i + li; + ja = k2j * j + lj; + na = ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL / 10 + j * NL / 100; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN322*/ +/* ALIGN arrB[i][j] WITH arrA[j][i][5] matrix on section with rotation*/ +void align322() +{ +/* parameters for ALIGN arrB[i][j] + WITH arrA[k2i*j+li][k1j*i+lj][ln]*/ + #define AN1 5 + #define AN2 5 + #define AN3 6 + #define BN1 4 + #define BN2 4 + int k1i = 0, k2i = 1, k3i = 0, li = 0; + int k1j = 1, k2j = 0, k3j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 0, ln = 5; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j] with A3[k2i*j+li][k1j*i+lj][ln]) + int B2[BN1][BN2]; + char tname[] = "align322"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + if ((n == ln ) && + ((i - li) == (((i - li) / k2i) * k2i)) && + ((j - lj) == (((j - lj) / k1j) * k1j)) && + (((i - li) / k2i) >= 0) && + (((j - lj) / k1j) >= 0) && + (((i - li) / k2i) < BN2) && + (((j - lj) / k1j) < BN1)) + { + ib = (j - lj) / k1j; + jb = (i - li) / k2i; + B2[ib][jb] = ib * NL / 10 + jb * NL / 100; + } + } + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j * NL / 100; + s = s + B2[i][j]; + if (B2[i][j] != val) + if (erri > val) erri = val; + ia = k2i * j + li; + ja = k1j * i + lj; + na = ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL / 10 + j * NL / 100; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN323*/ +/* ALIGN arrB[i][j] WITH arrA[j][1][2*i] matrix on section with + rotation and stretching*/ +void align323() +{ +/* parameters for ALIGN arrB[i][j] + WITH arrA[k2i*j+li][lj][k1n*i+ln]*/ + #define AN1 5 + #define AN2 2 + #define AN3 7 + #define BN1 4 + #define BN2 4 + int k1i = 0, k2i = 1, k3i = 0, li = 0; + int k1j = 0, k2j = 0, k3j = 0, lj = 1; + int k1n = 2, k2n = 0, k3n = 0, ln = 0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j] with A3[k2i*j+li][lj][k1n*i+ln]) + int B2[BN1][BN2]; + char tname[] = "align323"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + if ((j == lj) && + ((i - li) == (((i - li) / k2i) * k2i)) && + ((n - ln) == (((n - ln) / k1n) * k1n)) && + (((i - li) / k2i) >= 0) && + (((n - ln) / k1n) >= 0) && + (((i - li) / k2i) < BN2) && + (((n - ln) / k1n) < BN1)) + { + ib = (n - ln) / k1n; + jb = (i - li) / k2i; + B2[ib][jb] = ib * NL / 10 + jb * NL / 100; + } + } + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j * NL / 100; + s = s + B2[i][j]; + if (B2[i][j] != val) + if (erri > val) erri = val; + ia = k2i * j + li; + ja = lj; + na = k1n * i + ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL / 10 + j * NL / 100; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN324*/ +/* ALIGN arrB[i][j] WITH arrA[][i][j] matrix replication*/ +void align324() +{ +/* parameters for ALIGN arrB[i][j] + WITH arrA[][k1j*i+lj][k2n*j+ln]*/ + #define AN1 4 + #define AN2 6 + #define AN3 6 + #define BN1 4 + #define BN2 4 + int k1i = 0, k2i = 0, k3i = 0, li = 0; + int k1j = 1, k2j = 0, k3j = 0, lj = 0; + int k1n = 0, k2n = 1, k3n = 0, ln = 0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j] with A3[][k1j*i+lj][k2n*j+ln]) + int B2[BN1][BN2]; + char tname[] = "align324"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = i * NL / 10 + j * NL / 100; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) reduction(min(erri)), private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + if (((n - ln) == (((n - ln) / k2n) * k2n)) && + ((j - lj) == (((j - lj) / k1j) * k1j)) && + (((n - ln) / k2n) >= 0) && + (((j - lj) / k1j) >= 0) && + (((n - ln) / k2n) < BN2) && + (((j - lj) / k1j) < BN1)) + { + int val = i * NL / 10 + j * NL / 100; + ib = (j - lj) / k1j; + jb = (n - ln) / k2n; + if (B2[ib][jb] != ib * NL / 10 + jb * NL / 100) + if (erri > val) erri = val; + } + } + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j * NL / 100; + s = s + B2[i][j]; + if (B2[i][j] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL / 10 + j * NL / 100; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN325*/ +/* ALIGN arrB[i][j] WITH arrA[i+4][][j] matrix replication with shift*/ +void align325() +{ +/* parameters for ALIGN arrB[i][j] + WITH arrA[k1i*i+li][][k2n * j + ln]*/ + #define AN1 12 + #define AN2 6 + #define AN3 6 + #define BN1 4 + #define BN2 4 + int k1i = 1, k2i = 0, k3i = 0, li = 4; + int k1j = 1, k2j = 0, k3j = 0, lj = 0; + int k1n = 0, k2n = 1, k3n = 0, ln = 0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j] with A3[k1i*i+li][][k2n*j+ln]) + int B2[BN1][BN2]; + char tname[] = "align325"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = i * NL / 10 + j * NL / 100; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) reduction(min(erri)), private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i*NL/10 + j*NL/100 + n; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((n - ln) == (((n - ln) / k2n) * k2n)) && + (((i - li) / k1i) >= 0) && + (((n - ln) / k2n) >= 0) && + (((i - li) / k1i) < BN1) && + (((n - ln) / k2n) < BN2)) + { + int val = i * NL / 10 + j * NL / 100; + ib = (i - li) / k1i; + jb = (n - ln) / k2n; + if (B2[ib][jb] != ib * NL / 10 + jb * NL / 100) + if (erri > val) erri = val; + } + } + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j * NL / 100; + s = s + B2[i][j]; + if (B2[i][j] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL / 10 + j * NL / 100; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN326*/ +/* ALIGN arrB[i][j] WITH arrA[-i+8][j][] matrix replication with reverse*/ +void align326() +{ +/* parameters for ALIGN arrB[i][j] + WITH arrA[k1i*i+li][k2j*j+lj][]*/ + #define AN1 9 + #define AN2 5 + #define AN3 5 + #define BN1 7 + #define BN2 4 + int k1i = -1, k2i = 0, k3i = 0, li = 8; + int k1j = 0, k2j = 1, k3j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 0, ln = 0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j] with A3[k1i*i+li][k2j*j+lj][]) + int B2[BN1][BN2]; + char tname[] = "align326"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = i * NL / 10 + j * NL / 100; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) reduction(min(erri)), private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j -lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2n) < BN2)) + { + int val = i * NL / 10 + j * NL / 100; + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + if (B2[ib][jb] != ib * NL / 10 + jb * NL / 100) + if (erri > val) erri = val; + } + } + + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erri), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + int val = i * NL / 10 + j * NL / 100; + s = s + B2[i][j]; + if (B2[i][j] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + cs = cs + i * NL / 10 + j * NL / 100; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------ALIGN327*/ +/* ALIGN arrB[][] WITH arrA[][][]*/ +void align327() +{ +/* parameters for ALIGN arrB[][] + WITH arrA[][][]*/ + #define AN1 7 + #define AN2 5 + #define AN3 5 + #define BN1 7 + #define BN2 4 + int k1i = 0, k2i = 0, k3i = 0, li = 0; + int k1j = 0, k2j = 0, k3j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 0, ln = 1; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([][] with A3[][][]) + int B2[BN1][BN2]; + char tname[] = "align327"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = i * NL / 10 + j * NL / 100; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) reduction(min(erri)), private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + for (ib = 0; ib < BN1; ib++) + for (jb = 0; jb < BN2; jb++) + { + int val = i * NL / 10 + j * NL / 100; + if (B2[ib][jb] != ib * NL / 10 + jb * NL / 100) + if (erri > val) erri = val; + } + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align33.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align33.cdv new file mode 100644 index 0000000..82df028 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align33.cdv @@ -0,0 +1,197 @@ +/* ALIGN33 +TESTING align CLAUSE*/ + +#include +#include +#include + +static void align331(); +static void align332(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int s, cs, erri, i, j, n, m, k, l, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue; + +int main(int an, char **as) +{ + printf("=== START OF ALIGN33 ======================\n"); + /* ALIGN arrB[i][j][k] WITH arrA[i][j][k] normal*/ + align331(); + /* ALIGN arrB[][i][] WITH arrA[][lj][i]*/ + align332(); + printf("=== END OF ALIGN33 ========================\n"); + return 0; +} +/* ---------------------------------------------ALIGN331*/ +/* ALIGN arrB[i][j][n] WITH arrA[i][j][n] normal*/ +void align331() +{ +/* parameters for ALIGN arrB[i][j][n] + WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln]*/ + #define AN1 5 + #define AN2 5 + #define AN3 5 + #define BN1 2 + #define BN2 2 + #define BN3 2 + int k1i = 1, k2i = 0, k3i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 1, ln = 0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j][n] with A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) + int B3[BN1][BN2][BN3]; + char tname[] = "align331"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B3) + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = 0; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib, jb, nb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((n - ln) == (((n - ln) / k3n) * k3n)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((n - ln) / k3n) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) /k2j) < BN2) && + (((n - ln) / k3n) < BN3)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = (n - ln) / k3n; + B3[ib][jb][nb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000; + } + } + + #pragma dvm parallel([i][j][n] on B3[i][j][n]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000; + s = s + B3[i][j][n]; + if (B3[i][j][n] != val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} +/* ---------------------------------------------ALIGN332*/ +/* ALIGN arrB[][i][] WITH arrA[][lj][i]*/ +void align332() +{ +/* parameters for ALIGN arrB[][i][] + WITH arrA[][lj][k3n*n+ln]*/ + #define AN1 4 + #define AN2 4 + #define AN3 4 + #define BN1 2 + #define BN2 2 + #define BN3 2 + int k1i = 0, k2i = 0, k3i = 0, li = 0; + int k1j = 0, k2j = 0, k3j = 0, lj = 3; + int k1n = 1, k2n = 0, k3n = 0, ln = 0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([][i][] with A3[][lj][k1n*i+ln]) + int B3[BN1][BN2][BN3]; + char tname[] = "align332"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A3, B3) + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib, jb, nb, k, l), reduction(min(erri)) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + if (j == lj) + { + for (k = 0; k < BN1; k++) + for (l = 0; l < BN3; l++) + { + if (((n - ln) == (((n - ln) / k1n) * k1n)) && + (((n - ln) / k1n) >= 0) && + (((n - ln) / k1n) < BN2)) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000; + ib = k; + jb = (n - ln) / k1n; + nb = l; + if (B3[ib][jb][nb] != ib * NL / 10 + jb * NL / 100 + nb * NL / 1000) + if (erri > val) erri = val; + } + } + } + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align44.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align44.cdv new file mode 100644 index 0000000..c6a497e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/align44.cdv @@ -0,0 +1,855 @@ +/* ALIGN44 +TESTING align CLAUSE*/ + +#include +#include +#include + +static void align441(); +static void align442(); +static void align443(); +static void align444(); +static void align445(); +static void align446(); +static void align447(); +static void align448(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int s, cs, erri, i, j, n, m, k, l, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue; + +int main(int an, char **as) +{ + printf("=== START OF ALIGN44 ======================\n"); + /* ALIGN arrB[i][j][k][l] WITH arrA[i][j][k][l] normal*/ + align441(); + /* ALIGN arrB[i][j][k][l] WITH arrA[l][i][j][k] rotation*/ + align442(); + /* ALIGN arrB[i][j][k][l] WITH arrA[i][2* j][k][3*l] stretching*/ + align443(); + /* ALIGN arrB[i][j][k][l] WITH arrA[i+2][j][k][l+3] shift*/ + align444(); + /* ALIGN arrB[i][j][k][l] WITH arrA[i][j][-k+8][l+8] reverse*/ +// align445(); + /* ALIGN arrB[i][j][][l] WITH arrA[i][j][2][l] + compression and replication*/ + align446(); + /* ALIGN arrB[][j][k][i] WITH arrA[i][j][][k] + compression and replication*/ + align447(); + /* ALIGN arrB[][i][j][] WITH arrA[i][j][1][3] + compression and replication*/ + align448(); + printf("=== END OF ALIGN44 ========================\n"); + return 0; +} +/* ---------------------------------------------ALIGN441*/ +/* ALIGN arrB[i][j][n][m] WITH arrA[i][ j][n][m] normal*/ +void align441() +{ +/* parameters for ALIGN arrB[i][j][n][m] + WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]*/ + #define AN1 5 + #define AN2 5 + #define AN3 5 + #define AN4 5 + #define BN1 2 + #define BN2 2 + #define BN3 2 + #define BN4 2 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 1, k4n = 0, ln = 0; + int k1m = 0, k2m = 0, k3m = 0, k4m = 1, lm = 0; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align441"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((n - ln) == (((n - ln) / k3n) * k3n)) && + ((m - lm) == (((m - lm) / k4m) * k4m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((n - ln) / k3n) >= 0) && + (((m - lm) / k4m) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2) && + (((n - ln) / k3n) < BN3) && + (((m - lm) / k4m) < BN4)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = (n - ln) / k3n; + mb = (m - lm) / k4m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN442*/ +/* ALIGN arrB[i][j][k][l] WITH arrA[l][i][j][k] rotation*/ +void align442() +{ +/* parameters for ALIGN arrB[i][j][n][m] + WITH arrA4[k4i*n+li][k1j*i+lj][k2n*j+ln][k3m*n+lm]*/ + #define AN1 4 + #define AN2 4 + #define AN3 4 + #define AN4 4 + #define BN1 4 + #define BN2 4 + #define BN3 4 + #define BN4 4 + int k1i = 0, k2i = 0, k3i = 0, k4i = 1, li = 0; + int k1j = 1, k2j = 0, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 1, k3n = 0, k4n = 0, ln = 0; + int k1m = 0, k2m = 0, k3m = 1, k4m = 0, lm = 0; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k4i*m+li][k1j*i+lj][k2n*j+ln][k3m*n+lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align442"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if (((i - li) == (((i - li) / k4i) * k4i)) && + ((j - lj) == (((j - lj) / k1j) * k1j)) && + ((n - ln) == (((n - ln) / k2n) * k2n)) && + ((m - lm) == (((m - lm) / k3m) * k3m)) && + (((i - li) / k4i) >= 0) && + (((j - lj) / k1j) >= 0) && + (((n - ln) / k2n) >= 0) && + (((m - lm) / k3m) >= 0) && + (((i - li) / k4i) < BN4) && + (((j - lj) / k1j) < BN1) && + (((n - ln) / k2n) < BN2) && + (((m - lm) / k3m) < BN3)) + { + mb = (i - li) / k4i; + ib = (j - lj) / k1j; + jb = (n - ln) / k2n; + nb = (m - lm) / k3m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN443*/ +/* ALIGN arrB[i][j][k][l] WITH arrA[i][2* j][k][3*l] stretching*/ +void align443() +{ +/* parameters for ALIGN arrB[i][j][n][m] + WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]*/ + #define AN1 5 + #define AN2 4 + #define AN3 3 + #define AN4 7 + #define BN1 3 + #define BN2 2 + #define BN3 2 + #define BN4 3 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 2, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 1, k4n = 0, ln = 0; + int k1m = 0, k2m = 0, k3m = 0, k4m = 3, lm = 0; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align443"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((n - ln) == (((n - ln) / k3n) * k3n)) && + ((m - lm) == (((m - lm) / k4m) * k4m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((n - ln) / k3n) >= 0) && + (((m - lm) / k4m) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2) && + (((n - ln) / k3n) < BN3) && + (((m - lm) / k4m) < BN4)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = (n - ln) / k3n; + mb = (m - lm) / k4m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN444*/ +/* ALIGN arrB[i][j][k][l] WITH arrA[i+2][j][k][l+3] shift*/ +void align444() +{ +/* parameters for ALIGN arrB[i][j][n][m] + WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]*/ + #define AN1 4 + #define AN2 4 + #define AN3 3 + #define AN4 6 + #define BN1 2 + #define BN2 2 + #define BN3 2 + #define BN4 2 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 2; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 1, k4n = 0, ln = 0; + int k1m = 0, k2m = 0, k3m = 0, k4m = 1, lm = 3; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align444"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((n - ln) == (((n - ln) / k3n) * k3n)) && + ((m - lm) == (((m - lm) / k4m) * k4m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((n - ln) / k3n) >= 0) && + (((m - lm) / k4m) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2) && + (((n - ln) / k3n) < BN3) && + (((m - lm) / k4m) < BN4)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = (n - ln) / k3n; + mb = (m - lm) / k4m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN445*/ +/* ALIGN arrB[i][j][k][l] WITH arrA[i][j][-k+4][-l+3] reverse*/ +void align445() +{ +/* parameters for ALIGN arrB[i][j][n][m] + WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]*/ + #define AN1 4 + #define AN2 4 + #define AN3 8 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 5 + #define BN4 4 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = -1, k4n = 0, ln = 4; + int k1m = 0, k2m = 0, k3m = 0, k4m = -1, lm = 3; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align445"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((n - ln) == (((n - ln) / k3n) * k3n)) && + ((m - lm) == (((m - lm) / k4m) * k4m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((n - ln) / k3n) >= 0) && + (((m - lm) / k4m) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2) && + (((n - ln) / k3n) < BN3) && + (((m - lm) / k4m) < BN4)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = (n - ln) / k3n; + mb = (m - lm) / k4m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN446*/ +/* ALIGN arrB[i][j][][l] WITH arrA[i][j][2][l] + compression and replication*/ +void align446() +{ +/* parameters for ALIGN arrB[i][j][][m] WITH arrA4[k1i*i+li][k2j*j+lj][ln][k4m*m+lm]*/ + #define AN1 4 + #define AN2 4 + #define AN3 4 + #define AN4 4 + #define BN1 2 + #define BN2 2 + #define BN3 2 + #define BN4 2 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 0, k4n = 0, ln = 2; + int k1m = 0, k2m = 0, k3m = 0, k4m = 1, lm = 0; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][][m] with A4[k1i*i+li][k2j*j+lj][ln][k4m*m+lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align446"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb, k) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if (n == ln) + { + for (k = 0; k < BN3; k++) + { + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((m - lm) == (((m - lm) / k4m) * k4m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((m - lm) / k4m) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2) && + (((m - lm) / k4m) < BN4)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = k; + mb = (m - lm) / k4m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN447*/ +/* ALIGN arrB[][j][k][i] WITH arrA[i][j][][k] + compression and replication*/ +void align447() +{ +/* parameters for ALIGN arrB[][j][n][i] WITH arrA4[k1i*i+li][k2j*j+lj][][k3m*n+lm]*/ + #define AN1 4 + #define AN2 4 + #define AN3 4 + #define AN4 4 + #define BN1 4 + #define BN2 4 + #define BN3 4 + #define BN4 4 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 0, k4n = 0, ln = 0; + int k1m = 0, k2m = 0, k3m = 1, k4m = 0, lm = 0; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([][j][n][i] with A4[k1i*i+li][k2j*j+lj][][k3m*n+lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align447"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb, k) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + for (k = 0; k < BN1; k++) + { + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((m - lm) == (((m - lm) / k3m) * k3m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((m - lm) / k3m) >= 0) && + (((i - li) / k1i) < BN4) && + (((j - lj) / k2j) < BN2) && + (((m - lm) / k3m) < BN3)) + { + mb = (i - li) / k1i; + jb = (j - lj) / k2j; + ib = k; + nb = (m - lm) / k3m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* ---------------------------------------------ALIGN448*/ +/* ALIGN arrB[][i][j][] WITH arrA[i][j][1][3] + compression and replication*/ +void align448() +{ +/* parameters for ALIGN arrB[][i][j][] + WITH arrA[k1i*i+li][k2j*j+lj][ln][lm]*/ + #define AN1 4 + #define AN2 4 + #define AN3 4 + #define AN4 6 + #define BN1 4 + #define BN2 4 + #define BN3 4 + #define BN4 4 + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 0; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 0, k4n = 0, ln = 1; + int k1m = 0, k2m = 0, k3m = 0, k4m = 0, lm = 3; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([][i][j][] with A4[k1i*i+li][k2j*j+lj][ln][lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "align448"; + + erri = ER; + s = 0; + + #pragma dvm actual(erri, s) + #pragma dvm region local(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb, k, l) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((n == ln) && (m == lm)) + { + for (k = 0; k < BN1; k++) + for (l = 0; l < BN4; l++) + { + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN2) && + (((j - lj) / k2j) < BN3)) + { + ib = k; + jb = (i - li) / k1i; + nb = (j - lj) / k2j; + mb = l; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + } + + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erri), sum(s)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s = s + B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + if (erri > val) erri = val; + } + + } + #pragma dvm get_actual(erri, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ((erri == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/aligndyn11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/aligndyn11.cdv new file mode 100644 index 0000000..97eee25 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/ALIGN/aligndyn11.cdv @@ -0,0 +1,422 @@ +/* ALIGNDYN11 +TESTING align CLAUSE for dynamic arrays*/ + +#include +#include +#include + +static void align111(); +static void align1111(); +static void align1112(); +static void align112(); +static void align113(); +static void align114(); +static void align115(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF ALIGNDYN11 ===================\n"); + /* ALIGN arrB[i] WITH arrA[i] normal*/ + align111(); + /* ALIGN arrB[i] WITH arrA[i] small array*/ + align1111(); + /* ALIGN arrB[i] WITH arrA[2*i+3] small array*/ + align1112(); + /* ALIGN arrB[i] WITH arrA[i+4] shift along i*/ + align112(); + /* ALIGN arrB[i] WITH arrA[-i+8] reverse on i*/ +// align113(); + /* ALIGN arrB[i] WITH arrA[2*i+8] stretching along i*/ + align114(); + /* ALIGN arrB[] WITH arrA[]*/ + align115(); + printf("=== END OF ALIGNDYN11 =====================\n"); + return 0; +} +/* ---------------------------------------------ALIGN111*/ +/* ALIGN arrB[i] WITH arrA[i] normal*/ +void align111() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + int AN1 = 8; + int BN1 = 8; + int k1i = 1; + int k2i = 0; + int li = 0; + char tname[] = "align111 "; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + /* create arrays */ + A1 = malloc(AN1 * sizeof(int)); + B1 = malloc(BN1 * sizeof(int)); + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erri = ER; + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(B1); + free(A1); +} +/* ---------------------------------------------ALIGN1111*/ +/* ALIGN arrB[i] WITH arrA[i] small array*/ +void align1111() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + int AN1 = 5; + int BN1 = 2; + int k1i = 1; + int k2i = 0; + int li = 0; + char tname[] = "align1111"; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + /* create arrays */ + A1 = malloc(AN1 * sizeof(int)); + B1 = malloc(BN1 * sizeof(int)); + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erri = ER; + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(B1); + free(A1); +} +/* ---------------------------------------------ALIGN1112*/ +/* ALIGN arrB[i] WITH arrA[2*i+1] small array*/ +void align1112() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + int AN1 = 5; + int BN1 = 2; + int k1i = 2; + int k2i = 0; + int li = 1; + char tname[] = "align1112"; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + /* create arrays */ + A1 = malloc(AN1 * sizeof(int)); + B1 = malloc(BN1 * sizeof(int)); + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erri = ER; + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(B1); + free(A1); +} +/* ---------------------------------------------ALIGN112*/ +/* ALIGN arrB[i] WITH arrA[i+4] shift along i*/ +void align112() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + int AN1 = 8; + int BN1 = 4; + int k1i = 1; + int k2i = 0; + int li = 4; + char tname[] = "align112 "; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + /* create arrays */ + A1 = malloc(AN1 * sizeof(int)); + B1 = malloc(BN1 * sizeof(int)); + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erri = ER; + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(B1); + free(A1); +} +/* ---------------------------------------------ALIGN113*/ +/* ALIGN arrB[i] WITH arrA[-i+8] reverse on i*/ +void align113() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + int AN1 = 8; + int BN1 = 8; + int k1i = -1; + int k2i = 0; + int li = 8; + char tname[] = "align113 "; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + /* create arrays */ + A1 = malloc(AN1 * sizeof(int)); + B1 = malloc(BN1 * sizeof(int)); + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erri = ER; + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(B1); + free(A1); +} +/* ---------------------------------------------ALIGN114*/ +/* ALIGN arrB[i] WITH arrA[2*i+8] stretching along i*/ +void align114() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] */ + int AN1 = 24; + int BN1 = 8; + int k1i = 2; + int k2i = 0; + int li = 8; + char tname[] = "align114 "; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + /* create arrays */ + A1 = malloc(AN1 * sizeof(int)); + B1 = malloc(BN1 * sizeof(int)); + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erri = ER; + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] = ib; + } + } + #pragma dvm parallel([i] on B1[i]) reduction(min(erri)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i) + if (erri > i) erri = i; + ia = k1i * i + li; + if (A1[ia] != ia) + if (erri > i) erri = i; + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(B1); + free(A1); +} +/* ---------------------------------------------ALIGN115*/ +/* ALIGN arrB[] WITH arrA[]*/ +void align115() +{ +/* parameters for ALIGN arrB[i] WITH arrA[k1i * i + li]*/ + int AN1 = 24; + int BN1 = 8; + int k1i = 0; + int k2i = 0; + int li = 0; + char tname[] = "align115 "; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int (*B1); + + A1 = malloc(AN1 * sizeof(int)); + B1 = malloc(BN1 * sizeof(int)); + #pragma dvm realign(B1[] with A1[]) + + erri = ER; + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i; + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), private(j) + for (i = 0; i < AN1; i++) + for (j = 0; j < BN1; j++) + { + if (B1[j] != j) + if (erri > j) erri = j; + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(B1); + free(A1); +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr1.cdv new file mode 100644 index 0000000..b667ebd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr1.cdv @@ -0,0 +1,297 @@ +/* DISTR1 +TESTING distribute and redistribute CLAUSE*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distr11(); +static void distr12(); +static void distr13(); +static void distr14(); +static void distr21(); +static void distr22(); +static void distr23(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTR1 ===================\n"); + /* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*]*/ + distr11(); + /* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK]*/ + distr12(); + /* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*] small array*/ + distr13(); + /* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] small array*/ + distr14(); + /* DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][BLOCK]*/ + distr21(); + /* DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[*][*]*/ + distr22(); + /* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][BLOCK]*/ + distr23(); + printf("=== END OF DISTR1 =====================\n"); + return 0; +} +/* ---------------------------------------------DISTR11*/ + /* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*]*/ +void distr11() +{ + #define AN1 8 + + #pragma dvm array distribute[block] + int A1[AN1]; + char tname[] = "distr11"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[*]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 +} +/* ---------------------------------------------DISTR12*/ + /* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK]*/ +void distr12() +{ + #define AN1 8 + + #pragma dvm array distribute[*] + float A1[AN1]; + char tname[] = "distr12"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 +} +/* ---------------------------------------------DISTR13*/ + /* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*] small array*/ +void distr13() +{ + #define AN1 5 + + #pragma dvm array distribute[block] + double A1[AN1]; + char tname[] = "distr13"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[*]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 +} +/* ---------------------------------------------DISTR14*/ + /* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] small array*/ +void distr14() +{ + #define AN1 5 + + #pragma dvm array distribute[*] + long A1[AN1]; + char tname[] = "distr14"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 +} +/* ---------------------------------------------DISTR21*/ + /* DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][BLOCK]*/ +void distr21() +{ + #define AN1 8 + #define AN2 8 + + #pragma dvm array distribute[block][*] + int A2[AN1][AN2]; + char tname[] = "distr21"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[*][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 +} +/* ---------------------------------------------DISTR22*/ + /* DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[*][*]*/ +void distr22() +{ + #define AN1 8 + #define AN2 8 + + #pragma dvm array distribute[*][block] + float A2[AN1][AN2]; + char tname[] = "distr22"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 +} +/* ---------------------------------------------DISTR23*/ + /* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][BLOCK]*/ +void distr23() +{ + #define AN1 8 + #define AN2 8 + + #pragma dvm array distribute[*][*] + double A2[AN1][AN2]; + char tname[] = "distr23"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[*][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr2.cdv new file mode 100644 index 0000000..5c99679 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr2.cdv @@ -0,0 +1,257 @@ +/* DISTR2 +TESTING distribute and redistribute CLAUSE*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distr24(); +static void distr32(); +static void distr33(); +static void distr41(); +static void distr42(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, n, m, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTR2 ===================\n"); + /* DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[*][*]*/ + distr24(); + /* DISTRIBUTE arrA3[BLOCK][*][BLOCK] REDISTRIBUTE arrA3[*][BLOCK][BLOCK] */ + distr32(); + /* DISTRIBUTE arrA3[BLOCK][*][BLOCK] REDISTRIBUTE arrA3[*][BLOCK][*] */ + distr33(); + /* DISTRIBUTE arrA4[*][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*]*/ + distr41(); + /* DISTRIBUTE arrA4[BLOCK][*][BLOCK][*] REDISTRIBUTE arrA4[*][BLOCK][BLOCK][*]*/ + distr42(); + printf("=== END OF DISTR2 =====================\n"); + return 0; +} +/* ---------------------------------------------DISTR24*/ +/* DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[*][*]*/ +void distr24() +{ + #define AN1 8 + #define AN2 8 + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + char tname[] = "distr24"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 +} +/* ---------------------------------------------DISTR32*/ +/* DISTRIBUTE arrA3[BLOCK][*][BLOCK] REDISTRIBUTE arrA3[*][BLOCK][BLOCK]*/ +void distr32() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + + #pragma dvm array distribute[block][*][block] + float A3[AN1][AN2][AN3]; + char tname[] = "distr32"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + } + #pragma dvm redistribute(A3[*][block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + if (A3[i][j][n] != i * NL / 10 + j * NL / 100 + n) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 +} +/* ---------------------------------------------DISTR33*/ +/* DISTRIBUTE arrA3[BLOCK][*][ BLOCK] REDISTRIBUTE arrA3[*][BLOCK][*] */ +void distr33() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + + #pragma dvm array distribute[block][*][block] + double A3[AN1][AN2][AN3]; + char tname[] = "distr33"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + } + #pragma dvm redistribute(A3[*][block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + if (A3[i][j][n] != i * NL / 10 + j * NL / 100 + n) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 +} +/* ---------------------------------------------DISTR41*/ +/* DISTRIBUTE arrA4[*][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*]*/ +void distr41() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + #define AN4 5 + + #pragma dvm array distribute[*][*][block][block] + int A4[AN1][AN2][AN3][AN4]; + char tname[] = "distr41"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } + #pragma dvm redistribute(A4[*][*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + if (A4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} +/* ---------------------------------------------DISTR42*/ +/* DISTRIBUTE arrA4[BLOCK][*][BLOCK][*] REDISTRIBUTE arrA4[*][BLOCK][BLOCK][*]*/ +void distr42() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + #define AN4 5 + + #pragma dvm array distribute[block][*][block][*] + float A4[AN1][AN2][AN3][AN4]; + char tname[] = "distr42"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } + #pragma dvm redistribute(A4[*][block][block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + if (A4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr3.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr3.cdv new file mode 100644 index 0000000..60347b3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr3.cdv @@ -0,0 +1,125 @@ +/* DISTR3 +TESTING distribute and redistribute CLAUSE*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distr31(); +static void distr43(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, n, m, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTR3 ===================\n"); + /* DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA3[*][*][*]*/ + distr31(); + /* DISTRIBUTE arrA4[BLOCK][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][*]*/ + distr43(); + printf("=== END OF DISTR3 =====================\n"); + return 0; +} +/* ---------------------------------------------DISTR31*/ +/* DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA3[*][*][*]*/ +void distr31() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + char tname[] = "distr31"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n; + } + #pragma dvm redistribute(A3[*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + if (A3[i][j][n] != i * NL / 10 + j * NL / 100 + n) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 +} +/* ---------------------------------------------DISTR43*/ +/* DISTRIBUTE arrA4[BLOCK][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][*]*/ +void distr43() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + #define AN4 5 + + #pragma dvm array distribute[block][*][block][block] + double A4[AN1][AN2][AN3][AN4]; + char tname[] = "distr43"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } + #pragma dvm redistribute(A4[block][block][block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + if (A4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr4.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr4.cdv new file mode 100644 index 0000000..709ab73 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR/distr4.cdv @@ -0,0 +1,229 @@ +/* DISTR4 +TESTING distribute and redistribute CLAUSE*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distr44(); +static void distr45(); +static void distr46(); +static void distr47(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, n, m, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTR4 ===================\n"); + /* DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK]*/ + distr44(); + /* DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*]*/ + distr45(); + /* DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] + small array*/ + distr46(); + /* DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + small array*/ + distr47(); + printf("=== END OF DISTR4 =====================\n"); + return 0; +} +/* ---------------------------------------------DISTR44*/ +/* DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK]*/ +void distr44() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + #define AN4 8 + + #pragma dvm array distribute[*][*][*][*] + int A4[AN1][AN2][AN3][AN4]; + char tname[] = "distr44"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } + #pragma dvm redistribute(A4[block][block][block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + if (A4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} +/* ---------------------------------------------DISTR45*/ +/* DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*]*/ +void distr45() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + #define AN4 5 + + #pragma dvm array distribute[block][block][block][block] + float A4[AN1][AN2][AN3][AN4]; + char tname[] = "distr45"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } + #pragma dvm redistribute(A4[*][*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + if (A4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} +/* ---------------------------------------------DISTR46*/ +/* DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] + small array*/ +void distr46() +{ + #define AN1 5 + #define AN2 4 + #define AN3 3 + #define AN4 2 + + #pragma dvm array distribute[*][*][*][*] + double A4[AN1][AN2][AN3][AN4]; + char tname[] = "distr46"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } + #pragma dvm redistribute(A4[block][block][block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + if (A4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} +/* ---------------------------------------------DISTR47*/ +/* DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + small array*/ +void distr47() +{ + #define AN1 1 + #define AN2 2 + #define AN3 3 + #define AN4 4 + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + char tname[] = "distr47"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } + #pragma dvm redistribute(A4[*][*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + if (A4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen1.cdv new file mode 100644 index 0000000..76d5b92 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen1.cdv @@ -0,0 +1,386 @@ +/* DISTRGEN1 +TESTING distribute and redistribute CLAUSE +for arrays distributed with GEN-block*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distrg10(); +static void distrg11(); +static void distrg12(); +static void distrg13(); +static void distrg14(); +static void distrg15(); +static void distrg161(); +static void distrg162(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRGEN1 ===================\n"); + /* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[GENBLOCK]*/ + distrg10(); + + /* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[BLOCK]*/ + distrg11(); + + /* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[*]*/ + distrg12(); + + /* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*]*/ + distrg13(); + + /* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK]*/ + distrg14(); + + /* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[GENBLOCK]*/ + distrg15(); + + /* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[GENBLOCK] + with 0 in BS.1*/ + distrg161(); + + /* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[GENBLOCK] + with 0 in BS.2*/ + distrg162(); + + printf("=== END OF DISTRGEN1 =====================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount != 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +/* ---------------------------------------------DISTR10*/ +/* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[GENBLOCK]*/ +void distrg10() +{ + #define AN1 8 + int* BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array distribute[block] + int A1[AN1]; + char tname[] = "distrg10"; + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[genblock(BS)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 +} + +/* ---------------------------------------------DISTR11*/ +/* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[BLOCK]*/ +void distrg11() +{ + #define AN1 8 + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array distribute[genblock(BS)] + int A1[AN1]; + char tname[] = "distrg11"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 +} + +/* ---------------------------------------------DISTR12*/ +/* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[*]*/ +void distrg12() +{ + #define AN1 8 + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array distribute[genblock(BS)] + int A1[AN1]; + char tname[] = "distrg12"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[*]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 +} + +/* ---------------------------------------------DISTR13*/ +/* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*]*/ +void distrg13() +{ + #define AN1 8 + + #pragma dvm array distribute[block] + int A1[AN1]; + char tname[] = "distrg13"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[*]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 +} + +/* ---------------------------------------------DISTR14*/ +/* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK]*/ +void distrg14() +{ + #define AN1 8 + + #pragma dvm array distribute[*] + int A1[AN1]; + char tname[] = "distrg14"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + #undef AN1 +} + +/* ---------------------------------------------DISTR15*/ +/* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[GENBLOCK]*/ +void distrg15() +{ + #define AN1 8 + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array distribute[*] + int A1[AN1]; + char tname[] = "distrg15"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[genblock(BS)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 +} + +/* ---------------------------------------------DISTR161*/ +/* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[GENBLOCK] + wtih 0 in BS.1*/ +/*{0, 8} - works, {8, 0} - cycle*/ +void distrg161() +{ + #define AN1 8 + int *BS1, *BS2; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 0, &BS1); + #pragma dvm array distribute[genblock(BS1)] + int A1[AN1]; + char tname[] = "distrg161"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[genblock(BS2)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(BS2); + #undef AN1 +} + +/* ---------------------------------------------DISTR162*/ +/* DISTRIBUTE arrA1[GENBLOCK] REDISTRIBUTE arrA1[GENBLOCK] + wtih 0 in BS.2*/ +void distrg162() +{ + #define AN1 8 + int *BS1, *BS2; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 0, &BS2); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array distribute[genblock(BS1)] + int A1[AN1]; + char tname[] = "distrg162"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[genblock(BS2)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(BS2); + #undef AN1 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen2.cdv new file mode 100644 index 0000000..cafcf03 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen2.cdv @@ -0,0 +1,648 @@ +/* DISTRGEN2 +TESTING distribute and redistribute CLAUSE +for arrays distributed with GEN-block*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distrg21(); +static void distrg22(); +static void distrg23(); +static void distrg24(); +static void distrg25(); +static void distrg26(); +static void distrg261(); +static void distrg27(); +static void distrg28(); +static void distrg29(); +static void distrg210(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRGEN2 ===================\n"); + /* DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][GENBLOCK]*/ + distrg21(); + + /* DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[GENBLOCK][*]*/ + distrg22(); + + /* DISTRIBUTE arrA2[*][GENBLOCK] REDISTRIBUTE arrA2[*][*]*/ + distrg23(); + + /* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[GENBLOCK][*]*/ + distrg24(); + + /* DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] other blocks*/ + distrg25(); + + /* DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[BLOCK][BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK]*/ + distrg26(); + + /* DISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + REDISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK]*/ + distrg27(); + + /* DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[BLOCK][BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK]*/ + distrg28(); + + /* DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[*][*] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK]*/ + distrg29(); + + /* DISTRIBUTE arrA2[GEN_BLOCK][*] + REDISTRIBUTE arrA2[*][*] + REDISTRIBUTE arrA2[*][GEN_BLOCK]*/ + distrg210(); + + printf("=== END OF DISTRGEN2 =====================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount != 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} +/* ---------------------------------------------DISTR21*/ +/* DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][GENBLOCK]*/ +void distrg21() +{ + #define AN1 8 + #define AN2 8 + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS); + #pragma dvm array distribute[block][*] + int A1[AN1][AN2]; + char tname[] = "distrg21"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A1[i][j] = i*NL + j; + } + #pragma dvm redistribute(A1[*][genblock(BS)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A1[i][j] != i*NL + j) + erri = Min(erri, i*NL/10 + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR22*/ +/* DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[GENBLOCK][*]*/ +void distrg22() +{ + #define AN1 8 + #define AN2 8 + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array distribute[*][block] + int A1[AN1][AN2]; + char tname[] = "distrg22"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A1[i][j] = i*NL + j; + } + #pragma dvm redistribute(A1[genblock(BS)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A1[i][j] != i*NL + j) + erri = Min(erri, i*NL/10 + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR23*/ +/* DISTRIBUTE arrA2[*][GENBLOCK] REDISTRIBUTE arrA2[*][*]*/ +void distrg23() +{ + #define AN1 8 + #define AN2 8 + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS); + #pragma dvm array distribute[*][genblock(BS)] + int A1[AN1][AN2]; + char tname[] = "distrg23"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A1[i][j] = i*NL + j; + } + #pragma dvm redistribute(A1[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A1[i][j] != i*NL + j) + erri = Min(erri, i*NL/10 + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR24*/ +/* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[GENBLOCK][*]*/ +void distrg24() +{ + #define AN1 8 + #define AN2 8 + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array distribute[*][*] + int A1[AN1][AN2]; + char tname[] = "distrg24"; + + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A1[i][j] = i*NL + j; + } + #pragma dvm redistribute(A1[genblock(BS)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A1[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A1[i][j] != i*NL + j) + erri = Min(erri, i*NL/10 + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR25*/ +/* DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] other blocks*/ +void distrg25() +{ + #define AN1 10 + #define AN2 12 + int *BS1i, *BS1j, *BS2i, *BS2j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + //int BS1i[2] = {5, 5}, BS1j[2] = {7, 5}; + //int BS2i[2] = {6, 4}, BS2j[2] = {5, 7}; + #pragma dvm array distribute[genblock(BS1i)][genblock(BS1j)] + int A2[AN1][AN2]; + char tname[] = "distrg25"; + + erri = ER; + + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = 1; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += i*NL+j; + } + + #pragma dvm redistribute(A2[genblock(BS2i)][genblock(BS2j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i*NL+j + 1) + erri = Min(erri, i*NL/10+j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS2i); + free(BS2j); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR26*/ +/* DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[BLOCK][BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK]*/ +void distrg26() +{ + #define AN1 10 + #define AN2 12 + int *BS1i, *BS1j, *BS2i, *BS2j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + #pragma dvm array distribute[genblock(BS1i)][genblock(BS1j)] + int A2[AN1][AN2]; + char tname[] = "distrg26"; + erri = ER; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = 1; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += i*NL+j; + } + #pragma dvm redistribute(A2[block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS2i)][genblock(BS2j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i*NL+j + 3) + erri = Min(erri, i*NL/10 + j + 3); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS2i); + free(BS2j); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR27*/ + /* DISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + REDISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK]*/ + +void distrg27() +{ + #define AN1 10 + #define AN2 12 + int *BS1i, *BS2j, *BS3i; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS3i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + #pragma dvm array distribute[genblock(BS1i)][block] + int A2[AN1][AN2]; + char tname[] = "distrg27"; + + erri = ER; + + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = 1; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += i*NL+j; + } + #pragma dvm redistribute(A2[block][genblock(BS2j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS3i)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i*NL+j + 3) + erri = Min(erri, i*NL/10+j + 3); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS3i); + free(BS2j); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR28*/ +/* DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[BLOCK][BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK]*/ +void distrg28() +{ + #define AN1 10 + #define AN2 12 + int *BS1j, *BS2i; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + #pragma dvm array distribute[block][genblock(BS1j)] + int A2[AN1][AN2]; + char tname[] = "distrg28"; + + erri = ER; + + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = 1; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += i*NL+j; + } + #pragma dvm redistribute(A2[block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + + #pragma dvm redistribute(A2[genblock(BS2i)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i*NL+j + 3) + erri = Min(erri, i*NL/10+j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS2i); + free(BS1j); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR29*/ +/* DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[*][*] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK]*/ +void distrg29() +{ + #define AN1 10 + #define AN2 12 + int *BS1i, *BS1j, *BS2i, *BS2j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + #pragma dvm array distribute[genblock(BS1i)][genblock(BS1j)] + int A2[AN1][AN2]; + char tname[] = "distrg29"; + + erri = ER; + + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = 1; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += i*NL+j; + } + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS2i)][genblock(BS2j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i*NL+j + 3) + erri = Min(erri, i*NL/10+j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS2i); + free(BS2j); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR210*/ +/* DISTRIBUTE arrA2[GEN_BLOCK][*] + REDISTRIBUTE arrA2[*][*] + REDISTRIBUTE arrA2[*][GEN_BLOCK]*/ +void distrg210() +{ + #define AN1 10 + #define AN2 12 + int *BS1i, *BS2i; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS2i); + #pragma dvm array distribute[genblock(BS1i)][*] + int A2[AN1][AN2]; + char tname[] = "distrg210"; + + erri = ER; + + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = 1; + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += i*NL+j; + } + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[*][genblock(BS2i)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i*NL+j + 3) + erri = Min(erri, i*NL/10+j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS2i); + #undef AN1 + #undef AN2 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen3.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen3.cdv new file mode 100644 index 0000000..6a4ccf5 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_GEN/distrgen3.cdv @@ -0,0 +1,1006 @@ +/* DISTRGEN3 +TESTING distribute and redistribute CLAUSE +for arrays distributed with GEN-block*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distrg31(); +static void distrg32(); +static void distrg33(); +static void distrg34(); +static void distrg35(); +static void distrg36(); +static void distrg37(); +static void distrg38(); +static void distrg39(); +static void distrg310(); +static void distrg311(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erria, errib, i, j, k, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRGEN3 ===================\n"); + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks*/ + distrg31(); + + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ + distrg32(); + + /* DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] allocatable + DISTRIBUTE arrB3[BLOCK][GEN_BLOCK][GEN_BLOCK] static + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK]*/ + distrg33(); + + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] !static + REDISTRIBUTE [GEN_BLOCK][*][BLOCK] + DISTRIBUTE arrB3[GEN_BLOCK][*][BLOCK] !static + REDISTRIBUTE [BLOCK][GEN_BLOCK][*]*/ + distrg34(); + + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[*][*][*] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ + distrg35(); + + /* 36 DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK]*/ + distrg36(); + + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK]*/ + distrg37(); + + /* DISTRIBUTE arrA3 [GEN_BLOCK][*][GEN_BLOCK] + REDISTRIBUTE [*][GEN_BLOCK][*] + REDISTRIBUTE[GEN_BLOCK][GEN_BLOCK][*] + REDISTRIBUTE[*][GEN_BLOCK][GEN_BLOCK]*/ + distrg38(); + + /* 39 DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][*][*] + REDISTRIBUTE[GEN_BLOCK][*][GEN_BLOCK]*/ + distrg39(); + + /* 310 DISTRIBUTE arrA3 [GEN_BLOCK][GEN_BLOCK][*] + REDISTRIBUTE [*][*][GEN_BLOCK] + REDISTRIBUTE[*][GEN_BLOCK][BLOCK]*/ + distrg310(); + + /* 311 DISTRIBUTE arrA3 [GEN_BLOCK][*][*] + REDISTRIBUTE [*][*][*] + REDISTRIBUTE[*][*][GEN_BLOCK]*/ + distrg311(); + + printf("=== END OF DISTRGEN3 =====================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount != 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +/* ---------------------------------------------DISTR31*/ +/* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks*/ +void distrg31() +{ + #define AN1 12 + #define AN2 17 + #define AN3 16 + int *BS1i, *BS1j, *BS1k, *BS2i, *BS2j, *BS2k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS2k); + #pragma dvm array distribute[genblock(BS1i)][genblock(BS1j)][genblock(BS1k)] + int A3[AN1][AN2][AN3]; + char tname[] = "distrg31"; + + erria = ER; + + #pragma dvm region out(A3) + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + #pragma dvm redistribute(A3[genblock(BS2i)][genblock(BS2j)][genblock(BS2k)]) + + #pragma dvm region in(A3) + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erria = Min(erria, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(BS2i); + free(BS2j); + free(BS2k); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR32*/ +/* DISTRIBUTE arrA32[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ +void distrg32() +{ + #define AN1 8 + #define AN2 14 + #define AN3 6 + int *BS1i, *BS1j, *BS1k, *BS2i, *BS2j, *BS2k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS2k); + #pragma dvm array distribute[genblock(BS1i)][genblock(BS1j)][genblock(BS1k)] + int A3[AN1][AN2][AN3]; + char tname[] = "distrg32"; + + erria = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k + 1; + } + + #pragma dvm redistribute(A3[block][block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k]++; + } + + #pragma dvm redistribute(A3[genblock(BS2i)][genblock(BS2j)][genblock(BS2k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 2) + erria = Min(erria, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(BS2i); + free(BS2j); + free(BS2k); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------distrg33*/ +/* DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] allocatable + DISTRIBUTE arrB3[BLOCK][GEN_BLOCK][GEN_BLOCK] static + REDISTRIBUTE [GEN_BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK]*/ +void distrg33() +{ + #define AN1 12 + #define AN2 17 + #define AN3 16 + #define BN1 10 + #define BN2 10 + #define BN3 10 + int *BS1aj, *BS1ak, *BS1bi, *BS1bj, *BS1bk, *BS2ai, *BS2aj, *BS2ak, *BS2bi, *BS2bj, *BS2bk; + genBlocksAxis(dvmh_get_num_procs(1), BN1, 1, &BS1bi); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1aj); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1ak); + genBlocksAxis(dvmh_get_num_procs(2), BN2, 1, &BS1bj); + genBlocksAxis(dvmh_get_num_procs(3), BN3, 1, &BS1bk); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2ai); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2aj); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS2ak); + genBlocksAxis(dvmh_get_num_procs(1), BN1, 1, &BS2bi); + genBlocksAxis(dvmh_get_num_procs(2), BN2, 1, &BS2bj); + genBlocksAxis(dvmh_get_num_procs(3), BN3, 1, &BS2bk); + #pragma dvm array distribute[block][genblock(BS1bj)][genblock(BS1bk)] + int B3[BN1][BN2][BN3]; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg33"; + + erria = ER; + errib = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][genblock(BS1aj)][genblock(BS1ak)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + + #pragma dvm parallel([i][j][k] on B3[i][j][k]) cuda_block(256) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (k = 0; k < BN3; k++) + B3[i][j][k] = (i*NL/10 + j*NL/100 + k) * 2; + } + + #pragma dvm redistribute(A3[genblock(BS2ai)][genblock(BS2aj)][block]) + #pragma dvm redistribute(B3[genblock(BS2bi)][genblock(BS2bj)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erria = Min(erria, i*NL/10 + j*NL/100 + k); + + #pragma dvm parallel([i][j][k] on B3[i][j][k]) reduction(min(errib)), cuda_block(256) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + for(k = 0; k < BN3; k++) + if (B3[i][j][k] != (i*NL/10 + j*NL/100 + k) * 2) + errib = Min(errib, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erria, errib) + if (erria == ER && errib == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1aj); + free(BS1ak); + free(BS1bi); + free(BS1bj); + free(BS1bk); + free(BS2ai); + free(BS2aj); + free(BS2ak); + free(BS2bi); + free(BS2bj); + free(BS2bk); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +/* ---------------------------------------------distrg34*/ +/*DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][*][BLOCK] + DISTRIBUTE arrB3[GEN_BLOCK][*][BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][*] */ +void distrg34() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + #define BN1 12 + #define BN2 17 + #define BN3 11 + int *BS1ai, *BS1aj, *BS1ak, *BS1bi, *BS2ai, *BS2bj; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1aj); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1ak); + genBlocksAxis(dvmh_get_num_procs(1), BN1, 1, &BS1bi); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2ai); + genBlocksAxis(dvmh_get_num_procs(2), BN2, 1, &BS2bj); + #pragma dvm array distribute[genblock(BS1bi)][*][block] + int B3[BN1][BN2][BN3]; + #pragma dvm array distribute[genblock(BS1ai)][genblock(BS1aj)][genblock(BS1ak)] + int A3[AN1][AN2][AN3]; + char tname[] = "distrg34"; + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + + #pragma dvm parallel([i][j][k] on B3[i][j][k]) cuda_block(256) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (k = 0; k < BN3; k++) + B3[i][j][k] = (i*NL/10 + j*NL/100 + k) * 2; + } + + #pragma dvm redistribute(A3[genblock(BS2ai)][*][block]) + #pragma dvm redistribute(B3[block][genblock(BS2bj)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erria = Min(erria, i*NL/10 + j*NL/100 + k); + + #pragma dvm parallel([i][j][k] on B3[i][j][k]) reduction(min(errib)), cuda_block(256) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + for(k = 0; k < BN3; k++) + if (B3[i][j][k] != (i*NL/10 + j*NL/100 + k) * 2) + errib = Min(errib, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erria, errib) + if (erria == ER && errib == ER) + ansyes(tname); + else + ansno(tname); + free(BS1ai); + free(BS1aj); + free(BS1ak); + free(BS1bi); + free(BS2ai); + free(BS2bj); + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +/* ----------------------------------------------------distrg35 + DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[*][*][*] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ +void distrg35() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + int *BS1ai, *BS1aj, *BS1ak, *BS2ai, *BS2aj, *BS2ak; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1aj); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1ak); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2ai); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2aj); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS2ak); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg35"; + + erria = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1ai)][genblock(BS1aj)][genblock(BS1ak)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 3; + } + + #pragma dvm redistribute(A3[genblock(BS2ai)][genblock(BS2aj)][genblock(BS2ak)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 3; + + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 6) + erria = Min(erria, i*NL/10 + j*NL/100 + k + 6); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1ai); + free(BS1aj); + free(BS1ak); + free(BS2ai); + free(BS2aj); + free(BS2ak); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ----------------------------------------------------distrg36 + 36 DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK]*/ +void distrg36() +{ + #define AN1 12 + #define AN2 12 + #define AN3 5 + int *BS1ai, *BS1ak, *BS2aj, *BS3aj, *BS3ak, *BS4ai, *BS4aj; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1ak); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2aj); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS4ai); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS4aj); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS3aj); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS3ak); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg36"; + + erria = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1ai)][block][genblock(BS1ak)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][genblock(BS2aj)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[block][genblock(BS3aj)][genblock(BS3ak)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[genblock(BS4ai)][genblock(BS3aj)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 3) + erria = Min(erria, i*NL/10 + j*NL/100 + k + 3); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1ai); + free(BS1ak); + free(BS2aj); + free(BS3ak); + free(BS4ai); + free(BS4aj); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ----------------------------------------------------distrg37 + 37 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK]*/ +void distrg37() +{ + #define AN1 10 + #define AN2 15 + #define AN3 15 + int *BS1ai, *BS1aj, *BS2aj, *BS3aj, *BS3ak, *BS4ai, *BS4ak; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1aj); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2aj); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS4ai); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS4ak); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS3aj); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS3ak); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg37"; + + erria = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1ai)][genblock(BS1aj)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][genblock(BS2aj)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[block][genblock(BS3aj)][genblock(BS3ak)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[genblock(BS4ai)][block][genblock(BS4ak)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 3) + erria = Min(erria, i*NL/10 + j*NL/100 + k + 3); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1ai); + free(BS1aj); + free(BS2aj); + free(BS3aj); + free(BS3ak); + free(BS4ai); + free(BS4ak); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ----------------------------------------------------distrg38 + 38 DISTRIBUTE arrA3 [GEN_BLOCK][*][GEN_BLOCK] + REDISTRIBUTE [*][GEN_BLOCK][*] + REDISTRIBUTE[GEN_BLOCK][GEN_BLOCK][*] + REDISTRIBUTE[*][GEN_BLOCK][GEN_BLOCK]*/ +void distrg38() +{ + #define AN1 5 + #define AN2 6 + #define AN3 12 + int *BS1ai, *BS1aj, *BS2ai, *BS3aj, *BS3ai, *BS4ai, *BS4aj; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(2), AN3, 1, &BS1aj); + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS2ai); + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS4ai); + genBlocksAxis(dvmh_get_num_procs(2), AN3, 1, &BS4aj); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS3aj); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS3ai); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg38"; + + erria = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1ai)][*][genblock(BS1aj)]) + + #pragma dvm region out(A3) + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][genblock(BS2ai)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[genblock(BS3ai)][genblock(BS3aj)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[*][genblock(BS4ai)][genblock(BS4aj)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 3) + erria = Min(erria, i*NL/10 + j*NL/100 + k + 3); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1ai); + free(BS1aj); + free(BS2ai); + free(BS3aj); + free(BS3ai); + free(BS4ai); + free(BS4aj); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ----------------------------------------------------distrg39 + 39 DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][*][*] + REDISTRIBUTE[GEN_BLOCK][*][GEN_BLOCK]*/ +void distrg39() +{ + #define AN1 10 + #define AN2 16 + #define AN3 10 + int *BS1ai, *BS1aj, *BS2ai, *BS3aj, *BS3ai; + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(2), AN3, 1, &BS1aj); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2ai); + genBlocksAxis(dvmh_get_num_procs(2), AN3, 1, &BS3aj); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS3ai); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg39"; + + erria = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][genblock(BS1ai)][genblock(BS1aj)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + + #pragma dvm redistribute(A3[genblock(BS2ai)][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[genblock(BS3ai)][*][genblock(BS3aj)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 2) + erria = Min(erria, i*NL/10 + j*NL/100 + k + 2); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1ai); + free(BS1aj); + free(BS2ai); + free(BS3aj); + free(BS3ai); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ----------------------------------------------------distrg310 + 310 DISTRIBUTE arrA3 [GEN_BLOCK][GEN_BLOCK][*] + REDISTRIBUTE [*][*][GEN_BLOCK] + REDISTRIBUTE[*][GEN_BLOCK][BLOCK]*/ +void distrg310() +{ + #define AN1 20 + #define AN2 15 + #define AN3 10 + int *BS1aj, *BS1ai, *BS2ai, *BS3ai; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1aj); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(1), AN3, 1, &BS2ai); + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS3ai); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg310"; + + erria = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1ai)][genblock(BS1aj)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + + #pragma dvm redistribute(A3[*][*][genblock(BS2ai)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[*][genblock(BS3ai)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 2) + erria = Min(erria, i*NL/10 + j*NL/100 + k + 2); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1aj); + free(BS1ai); + free(BS2ai); + free(BS3ai); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ----------------------------------------------------distrg311 + 311 DISTRIBUTE arrA3 [GEN_BLOCK][*][*] + REDISTRIBUTE [*][*][*] + REDISTRIBUTE[*][*][GEN_BLOCK]*/ +void distrg311() +{ + #define AN1 8 + #define AN2 16 + #define AN3 24 + int *BS1ai, *BS3ai; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1ai); + genBlocksAxis(dvmh_get_num_procs(1), AN3, 1, &BS3ai); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrg311"; + + erria = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1ai)][*][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[*][*][genblock(BS3ai)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erria)), cuda_block(256) + for (i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 2) + erria = Min(erria, i*NL/10 + j*NL/100 + k + 2); + } + + #pragma dvm get_actual(erria) + if (erria == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + free(BS1ai); + free(BS3ai); + #undef AN1 + #undef AN2 + #undef AN3 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr1.cdv new file mode 100644 index 0000000..fd02e18 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr1.cdv @@ -0,0 +1,217 @@ +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distr11(); +static void distr12(); +static void distr13(); +static void distr14(); +static void distr15(); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static int ER = 10000; +static int erri, i, j, k; + +int main(int an, char **as) { + printf("=== START OF DELDISTR1 ===================\n"); + distr11(); + distr12(); + distr13(); + distr14(); + distr15(); + printf("=== END OF DELDISTR1 ===================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount != 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +void distr11() +{ + #define AN1 8 + #pragma dvm array + int (*A1); + char tname[] = "distr11"; + erri = ER; + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[*]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} +void distr12() +{ + #define AN1 8 + #pragma dvm array + int (*A1); + char tname[] = "distr12"; + erri = ER; + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) { + if (A1[i] != i) + erri = Min(erri, i); + } + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} +void distr13() +{ + #define AN1 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array + int (*A1); + char tname[] = "distr13"; + erri = ER; + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A1); + #undef AN1 +} +void distr14() +{ + #define AN1 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A1); + char tname[] = "distr14"; + erri = ER; + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} +void distr15() +{ + #define AN1 8 + int m1 = 4; + #pragma dvm array + int (*A1); + char tname[] = "distr15"; + erri = ER; + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} +void ansyes(const char name[]) { + printf("%s - complete\n", name); +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr2.cdv new file mode 100644 index 0000000..b9a4cdb --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr2.cdv @@ -0,0 +1,1001 @@ +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distr21(); +static void distr22(); +static void distr23(); +static void distr24(); +static void distr25(); +static void distr26(); +static void distr27(); +static void distr28(); +static void distr29(); +static void distr210(); +static void distr211(); +static void distr212(); +static void distr213(); +static void distr214(); +static void distr215(); +static void distr216(); +static void distr217(); +static void distr218(); +static void distr219(); +static void distr220(); +static void distr221(); +static void distr222(); +static void distr223(); +static void distr224(); +static void distr225(); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static int ER = 10000; +static int erri, i, j, k; + +int main(int an, char **as) { + printf("=== START OF DELDISTR2 ===================\n"); + distr21(); + distr22(); + distr23(); + distr24(); + distr25(); + distr26(); + distr27(); + distr28(); + distr29(); + distr210(); + distr211(); + distr212(); + distr213(); + distr214(); + distr215(); + distr216(); + distr217(); + distr218(); + distr219(); + distr220(); + distr221(); + distr222(); + distr223(); + distr224(); + distr225(); + printf("=== END OF DELDISTR2 ===================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount != 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +void distr21() +{ + #define AN1 8 + #define AN2 8 + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr21"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr22() +{ + #define AN1 8 + #define AN2 8 + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr22"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr23() +{ + #define AN1 8 + #define AN2 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int* BS2; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr23"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[genblock(BS1)][genblock(BS2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(BS2); + free(A2); + #undef AN1 + #undef AN2 +} +void distr24() +{ + #define AN1 8 + #define AN2 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + double wb2[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr24"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 8)][wgtblock(wb2, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr25() +{ + #define AN1 8 + #define AN2 8 + int m1 = 4; + int m2 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr25"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr26() +{ + #define AN1 8 + #define AN2 8 + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr26"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[*][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr27() +{ + #define AN1 8 + #define AN2 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr27"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[*][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr28() +{ + #define AN1 8 + #define AN2 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr28"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[*][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr29() +{ + #define AN1 8 + #define AN2 8 + int m1 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr29"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[*][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr210() +{ + #define AN1 8 + #define AN2 8 + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr210"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr211() +{ + #define AN1 8 + #define AN2 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr211"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr212() +{ + #define AN1 8 + #define AN2 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr212"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr213() +{ + #define AN1 8 + #define AN2 8 + int m1 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr213"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr214() +{ + #define AN1 8 + #define AN2 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr214"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[genblock(BS1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr215() +{ + #define AN1 8 + #define AN2 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr215"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[genblock(BS1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr216() +{ + #define AN1 8 + #define AN2 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr216"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[genblock(BS1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr217() +{ + #define AN1 8 + #define AN2 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr217"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[genblock(BS1)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr218() +{ + #define AN1 8 + #define AN2 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr218"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 8)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr219() +{ + #define AN1 8 + #define AN2 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr219"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 8)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr220() +{ + #define AN1 8 + #define AN2 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr220"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 8)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr221() +{ + #define AN1 8 + #define AN2 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr221"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 8)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr222() +{ + #define AN1 8 + #define AN2 8 + int m1 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr222"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr223() +{ + #define AN1 8 + #define AN2 8 + int m1 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr223"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void distr224() +{ + #define AN1 8 + #define AN2 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr224"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A2); + #undef AN1 + #undef AN2 +} +void distr225() +{ + #define AN1 8 + #define AN2 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distr225"; + erri = ER; + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * 10 + j; + } + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * 10 + j) + erri = Min(erri, i * 10 + j); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} +void ansyes(const char name[]) { + printf("%s - complete\n", name); +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr3.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr3.cdv new file mode 100644 index 0000000..79b67e5 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/deldistr3.cdv @@ -0,0 +1,2846 @@ +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distr31(); +static void distr32(); +static void distr33(); +static void distr34(); +static void distr35(); +static void distr36(); +static void distr37(); +static void distr38(); +static void distr39(); +static void distr310(); +static void distr311(); +static void distr312(); +static void distr313(); +static void distr314(); +static void distr315(); +static void distr316(); +static void distr317(); +static void distr318(); +static void distr319(); +static void distr320(); +static void distr321(); +static void distr322(); +static void distr323(); +static void distr324(); +static void distr325(); +static void distr326(); +static void distr327(); +static void distr328(); +static void distr329(); +static void distr330(); +static void distr331(); +static void distr332(); +static void distr333(); +static void distr334(); +static void distr335(); +static void distr336(); +static void distr337(); +static void distr338(); +static void distr339(); +static void distr340(); +static void distr341(); +static void distr342(); +static void distr343(); +static void distr344(); +static void distr345(); +static void distr346(); +static void distr347(); +static void distr348(); +static void distr349(); +static void distr350(); +static void distr351(); +static void distr352(); +static void distr353(); +static void distr354(); +static void distr355(); +static void distr356(); +static void distr357(); +static void distr358(); +static void distr359(); +static void distr360(); +static void distr361(); +static void distr362(); +static void distr363(); +static void distr364(); +static void distr365(); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static int ER = 10000; +static int erri, i, j, k; + +int main(int an, char **as) { + printf("=== START OF DELDISTR3 ===================\n"); + distr31(); + distr32(); + distr33(); + distr34(); + distr35(); + distr36(); + distr37(); + distr38(); + distr39(); + distr310(); + distr311(); + distr312(); + distr313(); + distr314(); + distr315(); + distr316(); + distr317(); + distr318(); + distr319(); + distr320(); + distr321(); + distr322(); + distr323(); + distr324(); + distr325(); + distr326(); + distr327(); + distr328(); + distr329(); + distr330(); + distr331(); + distr332(); + distr333(); + distr334(); + distr335(); + distr336(); + distr337(); + distr338(); + distr339(); + distr340(); + distr341(); + distr342(); + distr343(); + distr344(); + distr345(); + distr346(); + distr347(); + distr348(); + distr349(); + distr350(); + distr351(); + distr352(); + distr353(); + distr354(); + distr355(); + distr356(); + distr357(); + distr358(); + distr359(); + distr360(); + distr361(); + distr362(); + distr363(); + distr364(); + distr365(); + printf("=== END OF DELDISTR3 ===================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount != 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +void distr31() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr31"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr32() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr32"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr33() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int* BS2; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2); + int* BS3; + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS3); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr33"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][genblock(BS2)][genblock(BS3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(BS2); + free(BS3); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr34() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + double wb2[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + double wb3[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr34"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][wgtblock(wb2, 8)][wgtblock(wb3, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr35() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int m2 = 4; + int m3 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr35"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr36() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr36"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][block][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr37() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr37"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][block][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr38() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr38"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][block][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr39() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr39"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][genblock(BS1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr310() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr310"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][genblock(BS1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr311() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr311"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][genblock(BS1)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr312() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr312"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][wgtblock(wb1, 8)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr313() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr313"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][wgtblock(wb1, 8)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr314() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr314"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][wgtblock(wb1, 8)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr315() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr315"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][multblock(m1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr316() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr316"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][multblock(m1)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr317() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr317"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][multblock(m1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr318() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr318"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][*][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr319() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr319"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][*][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr320() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr320"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][*][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr321() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr321"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][genblock(BS1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr322() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr322"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][genblock(BS1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr323() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr323"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][genblock(BS1)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr324() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr324"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][wgtblock(wb1, 8)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr325() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr325"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][wgtblock(wb1, 8)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr326() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr326"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][wgtblock(wb1, 8)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr327() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr327"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][multblock(m1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr328() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr328"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][multblock(m1)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr329() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr329"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][multblock(m1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr330() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr330"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][*][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr331() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr331"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][*][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr332() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr332"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][*][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr333() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr333"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr334() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr334"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][block][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr335() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr335"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][block][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr336() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr336"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][wgtblock(wb1, 8)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr337() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr337"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][wgtblock(wb1, 8)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr338() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr338"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][wgtblock(wb1, 8)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr339() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr339"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][multblock(m1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr340() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr340"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][multblock(m1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr341() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int* BS1; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr341"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1)][multblock(m1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr342() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr342"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][*][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr343() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr343"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][*][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr344() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr344"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][*][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr345() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr345"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr346() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr346"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][block][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr347() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr347"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][block][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr348() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr348"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][genblock(BS1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr349() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr349"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][genblock(BS1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr350() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr350"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][genblock(BS1)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr351() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr351"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][multblock(m1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr352() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr352"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][multblock(m1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr353() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr353"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][multblock(m1)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr354() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr354"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][*][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr355() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr355"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][*][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr356() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr356"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][*][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr357() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr357"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr358() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr358"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][block][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr359() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr359"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][block][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr360() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr360"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][genblock(BS1)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr361() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr361"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][genblock(BS1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr362() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1); + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr362"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][genblock(BS1)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr363() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr363"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb1, 8)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr364() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr364"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb1, 8)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void distr365() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 4; + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1., 1.5, 2.}; + int* BS1; + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distr365"; + erri = ER; + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb1, 8)][genblock(BS1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i * 100 + j * 10 + k; + } + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i * 100 + j * 10 + k) + erri = Min(erri, i * 100 + j * 10 + k); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} +void ansyes(const char name[]) { + printf("%s - complete\n", name); +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix1.cdv new file mode 100644 index 0000000..a439923 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix1.cdv @@ -0,0 +1,398 @@ +/* DISTRMIX1 +Testing DISTRIBUTE and REDISTRIBUTE directive + GEN_BLOCK, WGT_BLOCK, MULT_BLOCK distributions +*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distrmix11(); +static void distrmix12(); +static void distrmix13(); +static void distrmix14(); +static void distrmix15(); +static void distrmix16(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, errib, i, j, k, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRMIX1 ===================\n"); + /* 11 DISTRIBUTE arrA1[MULT_BLOCK] + REDISTRIBUTE arrA1[WGT_BLOCK] + REDISTRIBUTE arrA1[MULT_BLOCK]*/ + distrmix11(); + + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks*/ + distrmix12(); + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks*/ + distrmix13(); + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks*/ + distrmix14(); + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks*/ + distrmix15(); + /* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks*/ + distrmix16(); + + printf("=== END OF DISTRMIX1 =====================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount > 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +/* ---------------------------------------------DISTR11*/ +/* 11 DISTRIBUTE arrA1[MULT_BLOCK] + REDISTRIBUTE arrA1[WGT_BLOCK] + REDISTRIBUTE arrA1[MULT_BLOCK]*/ +void distrmix11() +{ + #define AN1 64 + int m1 = 4, m2 = 2; + double wb[7] = {2.1, 4.6, 3., 2.0, 1.5, 2., 3.1}; + #pragma dvm array + int (*A1); + char tname[] = "distrmix11"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[multblock(m1)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[wgtblock(wb, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] += 1; + } + #pragma dvm redistribute(A1[multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i + 1) + erri = Min(erri, i + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR12*/ +/* DISTRIBUTE arrA1[WGT_BLOCK] + REDISTRIBUTE arrA1[MULT_BLOCK] + REDISTRIBUTE arrA1[WGT_BLOCK] */ +void distrmix12() +{ + #define AN1 75 + int m1 = 15; + double wb1[6] = {3.1, 1.6, 2., 3.0, 0.5, 2.}; + double wb2[8] = {1.5, 2.1, 2.6, 4.2, 2.5, 3.5, 1., 2.1}; + #pragma dvm array + int (*A1); + char tname[] = "distrmix12"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[wgtblock(wb1, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] += 1; + } + #pragma dvm redistribute(A1[wgtblock(wb2, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i + 1) + erri = Min(erri, i + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR13*/ +/* DISTRIBUTE arrA1[MULT_BLOCK] + REDISTRIBUTE arrA1[GEN_BLOCK] + REDISTRIBUTE arrA1[MULT_BLOCK] */ +void distrmix13() +{ + #define AN1 30 + int m1 = 5, m2 = 3; + int* BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array + int (*A1); + char tname[] = "distrmix13"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[multblock(m1)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[genblock(BS)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] += 1; + } + #pragma dvm redistribute(A1[multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i + 1) + erri = Min(erri, i + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR14*/ +/* DISTRIBUTE arrA1[GEN_BLOCK] + REDISTRIBUTE arrA1[MULT_BLOCK] + REDISTRIBUTE arrA1[GEN_BLOCK] */ +void distrmix14() +{ + #define AN1 35 + int m1 = 7; + int* BS1, * BS2; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2); + #pragma dvm array + int (*A1); + char tname[] = "distrmix14"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[genblock(BS1)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] += 1; + } + #pragma dvm redistribute(A1[genblock(BS2)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i + 1) + erri = Min(erri, i + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(BS2); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR15*/ +/* DISTRIBUTE arrA1[WGT_BLOCK] + REDISTRIBUTE arrA1[GEN_BLOCK] + REDISTRIBUTE arrA1[WGT_BLOCK] */ +void distrmix15() +{ + #define AN1 10 + double wb1[6] = {1.0, 2., 2., 3.0, 1., 1.}; + double wb2[5] = {2.0, 1., 2., 2.0, 2.}; + int* BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + #pragma dvm array + int (*A1); + char tname[] = "distrmix15"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[wgtblock(wb1, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[genblock(BS)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] += 1; + } + #pragma dvm redistribute(A1[wgtblock(wb2, 5)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i + 1) + erri = Min(erri, i + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR16*/ +/* DISTRIBUTE arrA1[GEN_BLOCK] + REDISTRIBUTE arrA1[WGT_BLOCK] + REDISTRIBUTE arrA1[GEN_BLOCK]*/ +void distrmix16() +{ + #define AN1 12 + double wb[7] = {1.0, 2., 2., 3.0, 1., 1., 0.5}; + int* BS1, * BS2; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2); + #pragma dvm array + int (*A1); + char tname[] = "distrmix16"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[genblock(BS1)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + #pragma dvm redistribute(A1[wgtblock(wb, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] += 1; + } + #pragma dvm redistribute(A1[genblock(BS2)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i + 1) + erri = Min(erri, i + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1); + free(BS2); + free(A1); + #undef AN1 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix2.cdv new file mode 100644 index 0000000..afa6e73 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix2.cdv @@ -0,0 +1,901 @@ +/* DISTRMIX2 +Testing DISTRIBUTE and REDISTRIBUTE directive + GEN_BLOCK, WGT_BLOCK, MULT_BLOCK distributions +*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distrmix21(); +static void distrmix22(); +static void distrmix23(); +static void distrmix24(); +static void distrmix25(); +static void distrmix26(); +static void distrmix27(); +static void distrmix28(); +static void distrmix29(); +static void distrmix210(); +static void distrmix211(); +static void distrmix212(); +static void distrmix213(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, errib, i, j, k, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRMIX2 ===================\n"); + + /* 21 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK]*/ + distrmix21(); + /* 22 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK]*/ + distrmix22(); + /* 23 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK]*/ + distrmix23(); + /* 24 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK]*/ + distrmix24(); + /* 25 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK]*/ + distrmix25(); + /* 26 DISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK]*/ + distrmix26(); + /* 27 DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK]*/ + distrmix27(); + /* 28 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK]*/ + distrmix28(); + /* 29 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][MULT_BLOCK]*/ + distrmix29(); + /* 210 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK]*/ + distrmix210(); + /* 211 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK]*/ + distrmix211(); + /* 212 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK]*/ + distrmix212(); + /* 213 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK]*/ + distrmix213(); + + printf("=== END OF DISTRMIX2 =====================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount > 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +/* ---------------------------------------------DISTR21*/ +/*DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK]*/ +void distrmix21() +{ + #define AN1 10 + #define AN2 56 + int m11 = 2, m12 = 7; + int m21 = 5, m22 = 8; + double wb1[8] = {1.0, 2., 1., 3.2, 1.0, 1.5, 2.3, 2.}; + double wb2[7] = {1.3, 1.5, 2.2, 1.6, 2.6, 0.5, 1.7}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix21"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m11)][multblock(m12)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb1, 8)][wgtblock(wb2, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[multblock(m21)][multblock(m22)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR22*/ +/*DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK]*/ +void distrmix22() +{ + #define AN1 16 + #define AN2 32 + int m1 = 2, m2 = 4; + double wb1[7] = {2.4, 1.2, 3.0, 0.2, 1.5, 2.8, 2.1}; + double wb2[6] = {2.0, 1.2, 2.6, 1.6, 3.5, 0.7}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix22"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 7)][wgtblock(wb2, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[wgtblock(wb2, 6)][wgtblock(wb1, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR23*/ +/*DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK]*/ +void distrmix23() +{ + #define AN1 18 + #define AN2 12 + int m11 = 2, m12 = 2; + int m21 = 3, m22 = 3; + double wb1[10] = {2., 1.2, 2., 2.5, 0.2, 1.5, 1., 2.8, 2.1, 3.}; + double wb2[8] = {3.0, 3.5, 2.0, 1.2, 2.6, 1.6, 3.5, 0.7}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix23"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m11)][multblock(m12)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[wgtblock(wb1, 10)][multblock(m22)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[multblock(m21)][wgtblock(wb2, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR24*/ +/*DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK]*/ +void distrmix24() +{ + #define AN1 30 + #define AN2 30 + int m1 = 3, m2 = 5; + int *BS1i, *BS1j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix24"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[genblock(BS1i)][genblock(BS1j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[multblock(m2)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR25*/ +/*DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK]*/ +void distrmix25() +{ + #define AN1 16 + #define AN2 12 + int m1 = 2, m2 = 3; + int *BS1i, *BS1j, *BS2i, *BS2j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix25"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[genblock(BS1i)][genblock(BS1j)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS2i)][genblock(BS2j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS2i); + free(BS2j); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR26*/ +/*DISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK]*/ +void distrmix26() +{ + #define AN1 52 + #define AN2 50 + int m1 = 13, m2 = 5; + int *BS1i, *BS1j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + double wb1[6] = {2.4, 2.2, 0.2, 3.5, 1.2, 1.}; + double wb2[8] = {1.0, 2.5, 3.0, 2.8, 1.6, 1., 0.5, 1.7}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix26"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 6)][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + #pragma dvm redistribute(A2[multblock(m1)][wgtblock(wb2, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS1i)][genblock(BS1j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR27*/ +/*DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK]*/ +void distrmix27() +{ + #define AN1 8 + #define AN2 64 + int m1 = 2, m2 = 8; + int *BS; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS); + double wb[7] = {2., 3.2, 2., 3.5, 1.2, 1., 4.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix27"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[multblock(m1)][wgtblock(wb, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR28*/ +/*DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK]*/ +void distrmix28() +{ + #define AN1 42 + #define AN2 16 + int m1 = 3, m2 = 2; + int *BS; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS); + double wb1[6] = {2., 3., 1.2, 1.5, 1., 1.5}; + double wb2[7] = {2.2, 1.5, 3.0, 2.8, 2.6, 1.4, 0.5}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix28"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][genblock(BS)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb1, 6)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[block][wgtblock(wb2, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR29*/ +/*DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][MULT_BLOCK]*/ +void distrmix29() +{ + #define AN1 21 + #define AN2 48 + int m1 = 3, m2 = 2; + int *BS1i, *BS1j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + double wb[9] = {2.2, 1.5, 3.0, 2.8, 2.6, 1.4, 0.5, 1., 2.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix29"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb, 9)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[genblock(BS1i)][genblock(BS1j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[block][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR210*/ +/*DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK]*/ +void distrmix210() +{ + #define AN1 9 + #define AN2 11 + + int *BS1i, *BS1j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + double wb1[6] = {1.0, 1.2, 2.5, 1.4, 2.5, 1.3}; + double wb2[4] = {1.0, 2., 1.5, 1.7}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix210"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 6)][wgtblock(wb2, 4)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[genblock(BS1i)][genblock(BS1j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[wgtblock(wb2, 4)][wgtblock(wb1, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR211*/ +/*DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK]*/ +void distrmix211() +{ + #define AN1 16 + #define AN2 16 + + int *BS1i, *BS1j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + double wb[7] = {1.0, 1.2, 2.5, 1.4, 2.5, 1.3, 2}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix211"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb, 7)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[genblock(BS1i)][genblock(BS1j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[block][wgtblock(wb, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR212*/ +/*DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK]*/ +void distrmix212() +{ + #define AN1 6 + #define AN2 28 + + int *BS1i, *BS1j, *BS2i, *BS2j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + double wb1[8] = {1.0, 1.2, 2.5, 1.4, 2.5, 1.3, 1., 2.}; + double wb2[5] = {2., 1.3, 2., 1.0, 1.7}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix212"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[genblock(BS1i)][genblock(BS1j)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb1, 6)][wgtblock(wb2, 4)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS2i)][genblock(BS2j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS2i); + free(BS2j); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR213*/ +/*DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK]*/ +void distrmix213() +{ + #define AN1 27 + #define AN2 14 + int m1 = 3, m2 = 2; + int *BS1i, *BS1j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + double wb[4] = {1.2, 1.6, 2.0, 1.8}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrmix213"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][genblock(BS1j)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb, 4)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] += 1; + } + #pragma dvm redistribute(A2[genblock(BS1i)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j + 1) + erri = Min(erri, i * NL + j + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(A2); + #undef AN1 + #undef AN2 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix3.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix3.cdv new file mode 100644 index 0000000..b4c2214 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MIX/distrmix3.cdv @@ -0,0 +1,1795 @@ +/* DISTRMIX3 +Testing DISTRIBUTE and REDISTRIBUTE directive + GEN_BLOCK, WGT_BLOCK, MULT_BLOCK distributions +*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +#ifndef _DVMH +#define dvmh_get_num_procs(X) 1 +#endif + +static void distrmix31(); +static void distrmix32(); +static void distrmix33(); +static void distrmix34(); +static void distrmix35(); +static void distrmix36(); +static void distrmix37(); +static void distrmix38(); +static void distrmix39(); +static void distrmix310(); +static void distrmix311(); +static void distrmix312(); +static void distrmix313(); +static void distrmix314(); +static void distrmix315(); +static void distrmix316(); +static void distrmix317(); +static void distrmix318(); +static void distrmix319(); +static void distrmix320(); +static void distrmix321(); +static void distrmix322(); +static void distrmix323(); +static void distrmix324(); +static void distrmix325(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, errib, i, j, k, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRMIX3 ===================\n"); + + /* 31 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ + distrmix31(); + /* 32 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ + distrmix32(); + /* 33 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ + distrmix33(); + /* 34 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ + distrmix34(); + /* 35 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][BLOCK] + REDISTRIBUTE [WGT_BLOCK][BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][MULT_BLOCK][WGT_BLOCK]*/ + distrmix35(); + /* 36 DISTRIBUTE arrA3[WGT_BLOCK][MULT_BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK]*/ + distrmix36(); + /* 37 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK]*/ + distrmix37(); + /* 38 DISTRIBUTE arrA3[MULT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE [*][*][*] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][*]*/ + distrmix38(); + /* 39 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] + REDISTRIBUTE [WGT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE [*][MULT_BLOCK][*]*/ + distrmix39(); + /* 310 DISTRIBUTE arrA3[WGT_BLOCK][*][*] + REDISTRIBUTE [MULT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE [*][WGT_BLOCK][MULT_BLOCK]*/ + distrmix310(); + + /* 311 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ + distrmix311(); + /* 312 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK]*/ + distrmix312(); + /* 313 DISTRIBUTE arrA3[BLOCK][BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][WGT_BLOCK]*/ + distrmix313(); + /* 314 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK]*/ + distrmix314(); + /* 315 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK]*/ + distrmix315(); + /* 316 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK]*/ + distrmix316(); + /* 317 DISTRIBUTE arrA3[GEN_BLOCK][*][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][*] + REDISTRIBUTE [*][GEN_BLOCK][BLOCK]*/ + distrmix317(); + /* 318 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ + distrmix318(); + + /* 319 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ + distrmix319(); + /* 320 DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrB3[WGT_BLOCK][BLOCK][WGT_BLOCK]*/ + distrmix320(); + /* 321 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK]*/ + distrmix321(); + /* 322 DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK][BLOCK]*/ + distrmix322(); + /* 323 DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][*]*/ + distrmix323(); + /* 324 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][*] + REDISTRIBUTE [*][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][*][GEN_BLOCK]*/ + distrmix324(); + /* 325 DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [*][WGT_BLOCK][*] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ + distrmix325(); + + printf("=== END OF DISTRMIX3 =====================\n"); + return 0; +} + +static int myRand() { + const unsigned a = 1103515245U; + const unsigned c = 12345U; + const unsigned m = ((unsigned)RAND_MAX) + 1U; + static unsigned prev = 5; + prev = (a * prev + c) % m; + return prev; +} + +static void genBlocksAxis(const int procCount, const int weight, const int withoutZero, int **blocks) { + *blocks = (int *)malloc(procCount * sizeof(int)); + int restWeight = weight, i, zeroind = -1; + if (!withoutZero && procCount > 1) + zeroind = myRand() % (procCount - 1); + for (i = 0; i < (procCount - 1); i++) { + if (i == zeroind) + (*blocks)[i] = 0; + else + (*blocks)[i] = 1 * withoutZero + myRand() % (restWeight - (procCount - (i + 1))); + restWeight -= (*blocks)[i]; + } + (*blocks)[i] = restWeight; +} + +/* ---------------------------------------------DISTR31*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ +void distrmix31() +{ + #define AN1 32 + #define AN2 32 + #define AN3 32 + int m11 = 4, m21 = 8, m31 = 2; + int m12 = 2, m22 = 4, m32 = 4; + double wb1[7] = {2.0, 1.5, 4., 3.0, 2., 3., 2.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[7] = {2.0, 2., 2.6, 3.0, 1., 1.5, 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix31"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m11)][multblock(m21)][multblock(m31)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 7)][wgtblock(wb2, 8)][wgtblock(wb3, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m12)][multblock(m22)][multblock(m32)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR32*/ +/*DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] */ +void distrmix32() +{ + #define AN1 16 + #define AN2 16 + #define AN3 12 + int m1 = 2, m2 = 4, m3 = 4; + double wb1[6] = {2.0,5.,0.,3.0, 2., 3.}; + double wb2[8] = {1.2,2.,4.,2.5,3.,1.,3.,2.}; + double wb3[7] = {2.3,1.2,4.6,3.0, 1.5, 2.5, 1.2}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix32"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][wgtblock(wb2, 8)][wgtblock(wb3, 7)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[wgtblock(wb2, 8)][wgtblock(wb3, 7)][wgtblock(wb1, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR33*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ +void distrmix33() +{ + #define AN1 12 + #define AN2 18 + #define AN3 20 + int m11 = 2, m21 = 3, m31 = 2; + int m12 = 6, m22 = 9, m32 = 5; + double wb1[7] = {2.2, 2.4, 4., 2.5, 3.5, 1.,3}; + double wb2[6] = {1.2, 2., 2.5, 3., 1.5, 3.}; + double wb3[5] = {4.3, 2.2, 2.6, 2.0, 2.5}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix33"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m11)][wgtblock(wb2, 6)][multblock(m31)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 7)][multblock(m21)][wgtblock(wb3, 5)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m12)][multblock(m22)][multblock(m32)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR34*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ +void distrmix34() +{ + #define AN1 35 + #define AN2 28 + #define AN3 16 + int m1 = 7, m2 = 7, m3 = 4; + double wb1[8] = {2., 2., 4., 2.7, 3.5, 2., 1., 3.}; + double wb2[6] = {12., 2.5, 3., 1.5, 3., 2.}; + double wb3[7] = {4.,3., 2.2, 2.6, 2.0, 2.5, 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix34"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][wgtblock(wb2, 6)][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb2, 6)][multblock(m2)][wgtblock(wb3, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb3, 7)][wgtblock(wb1, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR35*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][BLOCK] + REDISTRIBUTE [WGT_BLOCK][BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][MULT_BLOCK][WGT_BLOCK]*/ +void distrmix35() +{ + #define AN1 10 + #define AN2 21 + #define AN3 32 + int m1 = 2, m2 = 3, m3 = 4; + double wb1[7] = {2., 4., 3., 2.5, 5., 1., 2.}; + double wb2[10] = {1., 2., 5., 3., 1., 3., 2., 3., 2., 1.}; + double wb3[8] = {2.3, 2.2, 1.6, 1., 2.0, 2.5, 3., 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix35"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb2, 10)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 7)][block][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[block][multblock(m2)][wgtblock(wb3, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR36*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][MULT_BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK]*/ +void distrmix36() +{ + #define AN1 16 + #define AN2 28 + #define AN3 16 + int m1 = 2, m2 = 7, m3 = 4; + double wb1[8] = {1.2, 2., 4., 2.5, 3., 1., 3., 2.}; + double wb2[7] = {2., 2., 4., 2.5, 3., 1., 3.}; + double wb3[7] = {2.5, 2.2, 4.2, 2.0, 1.5, 3.5, 1.2}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix36"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 8)][multblock(m2)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][block][wgtblock(wb3, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[block][wgtblock(wb2, 7)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR37*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK]*/ +void distrmix37() +{ + #define AN1 10 + #define AN2 10 + #define AN3 30 + int m1 = 2, m2 = 5, m3 = 3; + double wb2[6] = {4., 2.5, 3., 1., 3., 2.}; + double wb3[8] = {1., 2., 3., 3.5, 4., 1., 3., 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix37"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][block][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][block][wgtblock(wb3, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[block][wgtblock(wb2, 6)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR38*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE [*][*][*] + REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][*]*/ +void distrmix38() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + int m1 = 2, m2 = 1, m3 = 4; + double wb[11] = {2.2, 3.,3., 2.5, 2., 1., 4., 2., 1., 5., 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix38"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][*][wgtblock(wb, 11)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[wgtblock(wb, 8)][multblock(m2)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR39*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] + REDISTRIBUTE [WGT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE [*][MULT_BLOCK][*]*/ +void distrmix39() +{ + #define AN1 18 + #define AN2 6 + #define AN3 30 + int m1 = 3, m2 = 2, m3 = 5; + double wb[11] = {3.2, 2., 2., 1.5, 4., 2., 3., 2.5, 1.6, 3., 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix39"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][block][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb, 11)][*][wgtblock(wb, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[*][multblock(m2)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR310*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][*][*] + REDISTRIBUTE [MULT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE [*][WGT_BLOCK][MULT_BLOCK]*/ +void distrmix310() +{ + #define AN1 25 + #define AN2 35 + #define AN3 10 + int m1 = 5, m2 = 7, m3 = 2; + double wb[12] = {3., 1., 2., 1.5, 3., 4., 3., 2.5, 1.6, 3., 1.2, 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix310"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb, 12)][*][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][*][wgtblock(wb, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[*][wgtblock(wb, 8)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR311*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ +void distrmix311() +{ + #define AN1 15 + #define AN2 15 + #define AN3 28 + int m11 = 3, m21 = 5, m31 = 4; + int m12 = 5, m22 = 3, m32 = 7; + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix311"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m11)][multblock(m21)][multblock(m31)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[genblock(BS1i)][genblock(BS1j)][genblock(BS1k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m12)][multblock(m22)][multblock(m32)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR312*/ +/* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK]*/ +void distrmix312() +{ + #define AN1 24 + #define AN2 10 + #define AN3 24 + int m1 = 3, m2 = 2, m3 = 4; + int *BS1i, *BS1j, *BS1k, *BS2i, *BS2j, *BS2k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS2k); + double wb[10] = {2., 2.5, 3., 4., 3.5, 2.5, 2.6, 3., 2.2, 3.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix312"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1i)][genblock(BS1j)][genblock(BS1k)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb, 10)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[genblock(BS2i)][genblock(BS2j)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(BS2i); + free(BS2j); + free(BS2k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR313*/ +/* DISTRIBUTE arrA3[BLOCK][BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][WGT_BLOCK]*/ +void distrmix313() +{ + #define AN1 12 + #define AN2 24 + #define AN3 36 + int m1 = 2, m2 = 3, m3 = 4; + int *BS1j; + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + double wb[9] = {1., 2.5, 3., 4., 2.5, 2.6, 3.5, 4.2, 3.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix313"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][block][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][genblock(BS1j)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][wgtblock(wb, 9)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1j); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR314*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK]*/ +void distrmix314() +{ + #define AN1 24 + #define AN2 15 + #define AN3 12 + int m1 = 4, m2 = 3, m3 = 2; + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb[10] = {3., 2., 2., 4., 2., 3., 2.5, 2.6, 1.2, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix314"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb, 10)][block][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[genblock(BS1i)][block][genblock(BS1k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m1)][block][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR315*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK]*/ +void distrmix315() +{ + #define AN1 21 + #define AN2 14 + #define AN3 16 + int m1 = 3, m2 = 2, m3 = 4; + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb1[8] = {2., 4., 3., 1., 2.5, 2.6, 2.2, 2.}; + double wb2[10] = {4., 2., 2.5, 4., 2., 3., 3.5, 1.6, 3.2, 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix315"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb1, 8)][wgtblock(wb2, 10)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][genblock(BS1j)][genblock(BS1k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb1, 6)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR316*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK]*/ +void distrmix316() +{ + #define AN1 33 + #define AN2 44 + #define AN3 55 + int m1 = 3, m2 = 11, m3 = 5; + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb1[7] = {3., 2.5, 2., 4., 2.5, 2.0, 3.5}; + double wb2[8] = {4., 3., 2.5, 2., 2., 3., 3.5, 2.6}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix316"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 7)][wgtblock(wb2, 8)][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[genblock(BS1i)][genblock(BS1j)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb1, 7)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR317*/ +/* DISTRIBUTE arrA3[GEN_BLOCK][*][GEN_BLOCK] + REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][*] + REDISTRIBUTE [*][GEN_BLOCK][BLOCK]*/ +void distrmix317() +{ + #define AN1 12 + #define AN2 16 + #define AN3 12 + int m1 = 2, m2 = 4, m3 = 3; + int *BS1i, *BS1j, *BS2i; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN3, 1, &BS1j); + double wb[8] = {2., 1., 2.5, 3., 4., 3., 3.5, 4.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix317"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1i)][*][genblock(BS1j)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][wgtblock(wb, 8)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[*][genblock(BS2i)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS2i); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR318*/ +/* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ +void distrmix318() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int *BS1i, *BS1j, *BS1k, *BS2i, *BS2j, *BS2k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS2k); + double wb1[7] = {2.0, 1.2, 2.5, 1.4, 2.5, 1.3, 1.}; + double wb2[5] = {2., 1.3, 2., 1.0, 1.7}; + double wb3[6] = {2., 3., 1.3, 2., 1.0, 1.7}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix318"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1i)][genblock(BS1j)][genblock(BS1k)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 7)][wgtblock(wb2, 5)][wgtblock(wb3, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[genblock(BS2i)][genblock(BS2j)][genblock(BS2k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(BS2i); + free(BS2j); + free(BS2k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR319*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ +void distrmix319() +{ + #define AN1 12 + #define AN2 6 + #define AN3 10 + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb1[6] = {2.0, 1.2, 2., 2.4, 2.3, 1.6}; + double wb2[5] = {2.4, 1.8, 2., 1.0, 1.7}; + double wb3[8] = {2., 3., 1.3, 2., 1.0, 1.7, 3., 4}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix319"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][wgtblock(wb2, 5)][wgtblock(wb3, 8)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[genblock(BS1i)][genblock(BS1j)][genblock(BS1k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + #pragma dvm redistribute(A3[wgtblock(wb2, 5)][wgtblock(wb3, 6)][wgtblock(wb1, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR320*/ +/* DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK]*/ +void distrmix320() +{ + #define AN1 5 + #define AN2 7 + #define AN3 6 + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb1[7] = {2.0, 2.2, 3., 2.4, 2.3, 1.6, 0.5}; + double wb2[6] = {2.4, 1.8, 3., 2.0, 1.7, 1.}; + double wb3[8] = {1., 3.5, 2.3, 2., 1.5, 1.7, 3., 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix320"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][genblock(BS1j)][genblock(BS1k)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 7)][block][wgtblock(wb3, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR321*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK]*/ +void distrmix321() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb1[6] = {2.5, 3.6, 2.4, 2.3, 1.2, 0.5}; + double wb2[5] = {1.4, 2.8, 3., 3.0, 1.1}; + double wb3[7] = {1., 2.3, 2.2, 3.5, 1.7, 3., 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix321"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][block][wgtblock(wb3, 7)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[genblock(BS1i)][block][genblock(BS1k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR322*/ +/* DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] + REDISTRIBUTE [BLOCK][WGT_BLOCK][BLOCK]*/ +void distrmix322() +{ + #define AN1 24 + #define AN2 16 + #define AN3 8 + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb1[5] = {3.2, 2.4, 2.0, 1.0, 2.5}; + double wb2[4] = {2.1, 2.5, 3., 1.1}; + double wb3[6] = {2.3, 2.0, 3.5, 1.5, 3., 2.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix322"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1i)][block][genblock(BS1k)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][wgtblock(wb2, 4)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR323*/ +/* DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][*]*/ +void distrmix323() +{ + #define AN1 8 + #define AN2 11 + #define AN3 11 + int *BS1i, *BS1j, *BS1k; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + double wb1[7] = {3.2, 2.4, 1., 2., 2.0, 1.0, 2.5}; + double wb2[6] = {3.1, 2.5, 4., 2.1, 2, 2}; + double wb3[6] = {1.2, 3.0, 2.4, 1.0, 3., 2.5}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix323"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][wgtblock(wb2, 6)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[genblock(BS1i)][genblock(BS1j)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR324*/ +/* DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][*] + REDISTRIBUTE [*][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [GEN_BLOCK][*][GEN_BLOCK]*/ +void distrmix324() +{ + #define AN1 12 + #define AN2 12 + #define AN3 21 + int *BS1i, *BS1j, *BS1k, *BS2i, *BS2j; + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS1k); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN3, 1, &BS2j); + double wb1[7] = {2.0, 1.2, 2.5, 1.4, 2.5, 1.3, 1.}; + double wb2[5] = {2., 1.3, 2., 1.0, 1.7}; + double wb3[6] = {2., 3., 1.3, 2., 1.0, 1.7}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix324"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[genblock(BS1i)][genblock(BS1j)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][wgtblock(wb2, 5)][wgtblock(wb3, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[genblock(BS2i)][*][genblock(BS2j)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS1k); + free(BS2i); + free(BS2j); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR325*/ +/* DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] + REDISTRIBUTE [*][WGT_BLOCK][*] + REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK]*/ +void distrmix325() +{ + #define AN1 7 + #define AN2 6 + #define AN3 7 + int *BS1i, *BS1j, *BS2i, *BS2j, *BS2k; + genBlocksAxis(dvmh_get_num_procs(1), AN2, 1, &BS1i); + genBlocksAxis(dvmh_get_num_procs(2), AN3, 1, &BS1j); + genBlocksAxis(dvmh_get_num_procs(1), AN1, 1, &BS2i); + genBlocksAxis(dvmh_get_num_procs(2), AN2, 1, &BS2j); + genBlocksAxis(dvmh_get_num_procs(3), AN3, 1, &BS2k); + double wb1[6] = {2., 1.3, 2., 1.0, 1.7, 1}; + double wb2[10] = {2.0, 1.2, 2.5, 1.0, 2.5, 1.3, 1., 3., 2., 1.}; + double wb3[6] = {2., 2., 4., 1.3, 2., 1.7}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrmix325"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[*][genblock(BS1i)][genblock(BS1j)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][wgtblock(wb2, 10)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] += 1; + } + + #pragma dvm redistribute(A3[genblock(BS2i)][genblock(BS2j)][genblock(BS2k)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k + 1) + erri = Min(erri, i*NL/10 + j*NL/100 + k + 1); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(BS1i); + free(BS1j); + free(BS2i); + free(BS2j); + free(BS2k); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult1.cdv new file mode 100644 index 0000000..9b1e5f3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult1.cdv @@ -0,0 +1,474 @@ +/* DISTRMULT1 + TESTING distribute and redistribute directive + MULT_BLOCK distribution*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distrm11(); +static void distrm12(); +static void distrm13(); +static void distrm14(); +static void distrm15(); +static void distrm16(); +static void distrm17(); +static void distrm21(); +static void distrm22(); +static void distrm23(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, k, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRMULT1 ===================\n"); + + /* 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[MULT_BLOCK] */ + distrm11(); + /* 12 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] */ + distrm12(); + /* 13 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[MULT_BLOCK] small array*/ + distrm13(); + /* 14 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array*/ + distrm14(); + /* 15 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[MULT_BLOCK] other m*/ + distrm15(); + /* 16 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[*]*/ + distrm16(); + /* 17 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[MULT_BLOCK]*/ + distrm17(); + /* 21 DISTRIBUTE arrA2[MULT_BLOCK][*] REDISTRIBUTE arrA2[*][MULT_BLOCK]*/ + distrm21(); + /* 22 DISTRIBUTE arrA2[*][MULT_BLOCK] REDISTRIBUTE arrA2[*][*]*/ + distrm22(); + /* 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][MULT_BLOCK]*/ + distrm23(); + + printf("=== END OF DISTRMULT1 =====================\n"); + return 0; +} + +/* ---------------------------------------------DISTR11*/ +/* DISTR arrA1[BLOCK] REDISTR arrA1[MULT_BLOCK]*/ +void distrm11() +{ + #define AN1 25 + int m = 5; + #pragma dvm array distribute[block] + int (*A1); + char tname[] = "distrm11"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[multblock(m)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR12*/ +/* DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] */ +void distrm12() +{ + #define AN1 48 + int m = 6; + #pragma dvm array + int (*A1); + char tname[] = "distrm12"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[multblock(m)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR13*/ +/* DISTR arrA1[BLOCK] REDISTR arrA1[MULT_BLOCK] small array */ +void distrm13() +{ + #define AN1 4 + int m = 4; + #pragma dvm array distribute[block] + int (*A1); + char tname[] = "distrm13"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[multblock(m)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR14*/ +/* DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array*/ +void distrm14() +{ + #define AN1 3 + int m = 3; + #pragma dvm array + int (*A1); + char tname[] = "distrm14"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[multblock(m)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR15*/ +/* DISTR arrA1[MULT_BLOCK] REDISTR arrA1[MULT_BLOCK] other m */ +void distrm15() +{ + #define AN1 24 + int m1 = 4, m2 = 3; + #pragma dvm array + int (*A1); + char tname[] = "distrm15"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[multblock(m1)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR16*/ +/* DISTR arrA1[MULT_BLOCK] REDISTR arrA1[*]*/ +void distrm16() +{ + #define AN1 50 + int m = 2; + #pragma dvm array + int (*A1); + char tname[] = "distrm16"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[multblock(m)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[*]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR17*/ +/* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[MULT_BLOCK]*/ +void distrm17() +{ + #define AN1 120 + int m = 10; + #pragma dvm array distribute[*] + int (*A1); + char tname[] = "distrm17"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[multblock(m)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR21*/ +/* DISTRIBUTE arrA2[MULT_BLOCK][*] REDISTRIBUTE arrA2[*][MULT_BLOCK] */ +void distrm21() +{ + #define AN1 36 + #define AN2 25 + int m1 = 6,m2 = 5; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrm21"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR22*/ +/* DISTRIBUTE arrA2[*][MULT_BLOCK] REDISTRIBUTE arrA2[*][*] */ +void distrm22() +{ + #define AN1 8 + #define AN2 121 + int m2 = 11; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrm22"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[*][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR23*/ +/* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][MULT_BLOCK] */ +void distrm23() +{ + #define AN1 8 + #define AN2 63 + int m2 = 9; + #pragma dvm array distribute[*][*] + int (*A2)[AN2]; + char tname[] = "distrm23"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult2.cdv new file mode 100644 index 0000000..ec70f83 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult2.cdv @@ -0,0 +1,857 @@ +/* DISTRMULT2 + TESTING distribute and redistribute directive + MULT_BLOCK distribution*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distrm24(); +static void distrm25(); +static void distrm26(); +static void distrm27(); +static void distrm28(); +static void distrm29(); +static void distrm210(); +static void distrm32(); +static void distrm33(); +static void distrm34(); +static void distrm35(); +static void distrm36(); +static void distrm37(); +static void distrm38(); +static void distrm41(); +static void distrm42(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, k, ia, ib, n; + +int main(int an, char **as) +{ + printf("=== START OF DISTRMULT2 ===================\n"); + + /* 24 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] REDISTRIBUTE arrA2[*][*]*/ + distrm24(); + /* 25 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK]*/ + distrm25(); + /* 26 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[BLOCK][BLOCK]*/ + distrm26(); + /* 27 DISTRIBUTE arrA2[BLOCK][BLOCK] + REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK]*/ + distrm27(); + /* 28 DISTRIBUTE arrA2[MULT_BLOCK][BLOCK] + REDISTRIBUTE arrA2[BLOCK][MULT_BLOCK]*/ + distrm28(); + /* 29 DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[MULT_BLOCK][BLOCK]*/ + distrm29(); + /* 210 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] other m1,m2*/ + distrm210(); + /* 32 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK] [*] + REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK]*/ + distrm32(); + /* 33 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + REDISTRIBUTE arrA3[MULT_BLOCK][*][BLOCK]*/ + distrm33(); + /* 34 DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] + REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*]*/ + distrm34(); + /* 35 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + REDISTRIBUTE arrA3[*][*]MULT_BLOCK]*/ + distrm35(); + /* 36 DISTRIBUTE arrA3[MULT_BLOCK][*][BLOCK] + REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK]*/ + distrm36(); + /* 37 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] + REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK]*/ + distrm37(); + /* 38 DISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] + REDISTRIBUTE arrA3[*][MULT_BLOCK][BLOCK]*/ + distrm38(); + /* 41 DISTRIBUTE arrA4[*][*][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA4[*][*][*][*]*/ + distrm41(); + /* 42 DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] + REDISTRIBUTE arrA4[*][MULT_BLOCK][MULT_BLOCK][*]*/ + distrm42(); + + printf("=== END OF DISTRMULT2 =====================\n"); + return 0; +} + +/* ---------------------------------------------DISTR24*/ +/* DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] REDISTRIBUTE arrA2[*][*] */ +void distrm24() +{ + #define AN1 15 + #define AN2 12 + int m1 = 5,m2 = 3; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrm24"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR25*/ +/* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK]*/ +void distrm25() +{ + #define AN1 18 + #define AN2 8 + int m1 = 3,m2 = 2; + #pragma dvm array distribute[*][*] + int (*A2)[AN2]; + char tname[] = "distrm25"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + + +/* ---------------------------------------------DISTR26*/ +/* DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[BLOCK][BLOCK]*/ +void distrm26() +{ + #define AN1 49 + #define AN2 12 + int m1 = 7,m2 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrm26"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR27*/ +/* DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK]*/ +void distrm27() +{ + #define AN1 8 + #define AN2 64 + int m1 = 1,m2 = 8; + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + char tname[] = "distrm27"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR28*/ +/* DISTRIBUTE arrA2[MULT_BLOCK][BLOCK] REDISTRIBUTE arrA2[BLOCK][MULT_BLOCK]*/ +void distrm28() +{ + #define AN1 20 + #define AN2 20 + int m1 = 5, m2 = 4; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrm28"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[block][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR29*/ +/* DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[MULT_BLOCK][BLOCK]*/ +void distrm29() +{ + #define AN1 30 + #define AN2 60 + int m1 = 10,m2 = 10; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrm29"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[multblock(m1)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR210*/ +/* DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] other m1, m2*/ +void distrm210() +{ + #define AN1 24 + #define AN2 24 + int m1 = 3,m2 = 2; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrm210"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[multblock(m1)][multblock(m2)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[multblock(m2)][multblock(m1)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR32*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK] [*] + REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK]*/ +void distrm32() +{ + #define AN1 16 + #define AN2 12 + #define AN3 8 + int m1 = 2, m2 = 3, m3 = 4; + #pragma dvm array + + int (*A3)[AN2][AN3]; + char tname[] = "distrm32"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][multblock(m2)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR33*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + REDISTRIBUTE arrA3[MULT_BLOCK][*][MULTBLOCK]*/ +void distrm33() +{ + #define AN1 16 + #define AN2 16 + #define AN3 8 + int m1 = 4, m2 = 2, m3 = 2; + #pragma dvm array + + int (*A3)[AN2][AN3]; + char tname[] = "distrm33"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][*][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR34*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] + REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*]*/ +void distrm34() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + int m1 = 2, m2 = 1, m3 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm34"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][*][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR35*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + REDISTRIBUTE arrA3[*][*][MULT_BLOCK]*/ +void distrm35() +{ + #define AN1 18 + #define AN2 28 + #define AN3 38 + int m1 = 3, m2 = 7, m3 = 19; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm35"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][*][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR36*/ +/* DISTRIBUTE arrA3[MULT_BLOCK][*][BLOCK] + REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK]*/ +void distrm36() +{ + #define AN1 121 + #define AN2 12 + #define AN3 35 + int m1 = 11, m2 = 2, m3 = 7; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm36"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][*][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][*][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR37*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] + REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK]*/ +void distrm37() +{ + #define AN1 8 + #define AN2 28 + #define AN3 8 + int m1 = 2, m2 = 4, m3 = 2; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm37"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][block][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][*][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR38*/ +/*DISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK]*/ +void distrm38() +{ + #define AN1 8 + #define AN2 28 + #define AN3 8 + int m1 = 2, m2 = 4, m3 = 2; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm38"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][*][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][multblock(m2)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR41*/ +/*DISTRIBUTE arrA4[*][*][MULT_BLOCK][MULT_BLOCK] REDISTRIBUTE arrA4[*][*][*][*]*/ +void distrm41() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + #define AN4 16 + int m1 = 2, m2 = 4, m3 = 2, m4 = 4; + #pragma dvm array + int (*A4)[AN2][AN3][AN4]; + char tname[] = "distrm41"; + + erri = ER; + + A4 = malloc(AN1 * AN2 * AN3 * AN4 * sizeof(int)); + #pragma dvm redistribute(A4[*][*][multblock(m3)][multblock(m4)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + A4[i][j][k][n] = i*NL/10+j*NL/100+k*NL/1000+n; + } + + #pragma dvm redistribute(A4[*][*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + if (A4[i][j][k][n] != i*NL/10+j*NL/100+k*NL/1000+n) + erri = Min(erri, i*NL/10+j*NL/100+k*NL/1000+n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A4); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +/* ---------------------------------------------DISTR42*/ +/*DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] + REDISTRIBUTE arrA4[*][MULT_BLOCK][MULT_BLOCK][*]*/ +void distrm42() +{ + #define AN1 28 + #define AN2 25 + #define AN3 27 + #define AN4 21 + int m1 = 7, m2 = 5, m3 = 9, m4 = 3; + #pragma dvm array + int (*A4)[AN2][AN3][AN4]; + char tname[] = "distrm42"; + + erri = ER; + + A4 = malloc(AN1 * AN2 * AN3 * AN4 * sizeof(int)); + #pragma dvm redistribute(A4[multblock(m1)][*][multblock(m3)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + A4[i][j][k][n] = i*NL/10+j*NL/100+k*NL/1000+n; + } + + #pragma dvm redistribute(A4[*][multblock(m2)][multblock(m3)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + if (A4[i][j][k][n] != i*NL/10+j*NL/100+k*NL/1000+n) + erri = Min(erri, i*NL/10+j*NL/100+k*NL/1000+n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A4); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult3.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult3.cdv new file mode 100644 index 0000000..6b5d849 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_MULT/distrmult3.cdv @@ -0,0 +1,569 @@ +/* DISTRMULT3 + TESTING distribute and redistribute directive + MULT_BLOCK distribution*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distrm311(); +static void distrm312(); +static void distrm313(); +static void distrm314(); +static void distrm315(); +static void distrm316(); +static void distrm317(); +static void distrm318(); +static void distrm319(); +static void distrm43(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, k, ia, ib, n; + +int main(int an, char **as) +{ + printf("=== START OF DISTRMULT3 ===================\n"); + + /* 311 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][BLOCK]*/ + distrm311(); + /* 312 DISTRIBUTE arrA3DISTRIBUTE [BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ + distrm312(); + /* 313 DISTRIBUTE arrA2[_BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK]*/ + distrm313(); + /* 314 DISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK] + REDISTRIBUTE arrA3[MULT_BLOCK][BLOCK][MULT_BLOCK]*/ + distrm314(); + /* 315 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] other m1,m2,m3*/ + distrm315(); + /* 316 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[*][*][*]*/ + distrm316(); + /* 317 DISTRIBUTE arrA3[*][*][*] + REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ + distrm317(); + /* 318 DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] + REDISTRIBUTE arrA3[*][MULT_BLOCK][*]*/ + distrm318(); + /* 319 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK]*/ + distrm319(); + /* 43 DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] + REDISTRIBUTE arrA4[[*][MULT_BLOCK][*][MULT_BLOCK]*/ + distrm43(); + + printf("=== END OF DISTRMULT3 =====================\n"); + return 0; +} + +/* ---------------------------------------------DISTR311*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][BLOCK]*/ +void distrm311() +{ + #define AN1 14 + #define AN2 12 + #define AN3 10 + int m1 = 7, m2 = 3, m3 = 5; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm311"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR312*/ +/*DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ +void distrm312() +{ + #define AN1 15 + #define AN2 15 + #define AN3 25 + int m1 = 5, m2 = 5, m3 = 5; + #pragma dvm array distribute[block][block][block] + int (*A3)[AN2][AN3]; + char tname[] = "distrm312"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR313*/ +/*DISTRIBUTE arrA2[MULT_BLOCK][BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK]*/ +void distrm313() +{ + #define AN1 24 + #define AN2 24 + #define AN3 24 + int m1 = 2, m2 = 3, m3 = 4; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm313"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][block][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][multblock(m2)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR314*/ +/*DISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK] + REDISTRIBUTE arrA3[MULT_BLOCK][BLOCK][MULT_BLOCK]*/ +void distrm314() +{ + #define AN1 20 + #define AN2 30 + #define AN3 30 + int m1 = 5, m2 = 3, m3 = 3; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm314"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][multblock(m2)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][block][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR315*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] other m1,m2,m3*/ +void distrm315() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + int m1 = 2, m2 = 4, m3 = 8; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm315"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m3)][multblock(m1)][multblock(m2)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR316*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + REDISTRIBUTE arrA2[*][*][*]*/ +void distrm316() +{ + #define AN1 12 + #define AN2 12 + #define AN3 48 + int m1 = 3, m2 = 2, m3 = 6; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm316"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR317*/ +/*DISTRIBUTE arrA3[*][*][*] + REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK]*/ +void distrm317() +{ + #define AN1 10 + #define AN2 35 + #define AN3 10 + int m1 = 2, m2 = 5, m3 = 2; + #pragma dvm array distribute[*][*][*] + int (*A3)[AN2][AN3]; + char tname[] = "distrm317"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[multblock(m1)][multblock(m2)][multblock(m3)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR318*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] + REDISTRIBUTE arrA3[*][MULT_BLOCK][*]*/ +void distrm318() +{ + #define AN1 11 + #define AN2 14 + #define AN3 24 + int m1 = 1, m2 = 2, m3 = 6; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm318"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m1)][*][multblock(m3)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][multblock(m2)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR319*/ +/*DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK]*/ +void distrm319() +{ + #define AN1 30 + #define AN2 12 + #define AN3 30 + int m11 = 2, m12 = 2, m13 = 2; + int m21 = 5, m22 = 4, m23 = 10; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrm319"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[multblock(m11)][multblock(m12)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][multblock(m22)][multblock(m23)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR43*/ +/*DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] + REDISTRIBUTE arrA4[*][MULT_BLOCK][*][MULT_BLOCK]*/ +void distrm43() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + #define AN4 16 + int m1 = 2, m2 = 4, m3 = 2, m4 = 4; + #pragma dvm array + int (*A4)[AN2][AN3][AN4]; + char tname[] = "distrm43"; + + erri = ER; + + A4 = malloc(AN1 * AN2 * AN3 * AN4 * sizeof(int)); + #pragma dvm redistribute(A4[multblock(m1)][*][multblock(m3)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + A4[i][j][k][n] = i*NL/10+j*NL/100+k*NL/1000+n; + } + + #pragma dvm redistribute(A4[*][multblock(m2)][*][multblock(m4)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + if (A4[i][j][k][n] != i*NL/10+j*NL/100+k*NL/1000+n) + erri = Min(erri, i*NL/10+j*NL/100+k*NL/1000+n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A4); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt1.cdv new file mode 100644 index 0000000..2d6ecb2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt1.cdv @@ -0,0 +1,483 @@ +/* DISTRWGT1 + Testing DISTRIBUTE and REDISTRIBUTE directives + WGT_BLOCK distribution*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distrwgt11(); +static void distrwgt12(); +static void distrwgt13(); +static void distrwgt14(); +static void distrwgt15(); +static void distrwgt16(); +static void distrwgt17(); +static void distrwgt21(); +static void distrwgt22(); +static void distrwgt23(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, k, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRWGT1 ===================\n"); + /* 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK]*/ + distrwgt11(); + + /* DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] */ + distrwgt12(); + + /* DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] small array*/ + distrwgt13(); + + /* DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array*/ + distrwgt14(); + + /* DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] other weights*/ + distrwgt15(); + + /* DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[*]*/ + distrwgt16(); + + /* DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[WGT_BLOCK]*/ + distrwgt17(); + + /* DISTRIBUTE arrA2[WGT_BLOCK][*] REDISTRIBUTE arrA2[*][WGT_BLOCK]*/ + distrwgt21(); + + /*DISTRIBUTE arrA2[*][WGT_BLOCK] REDISTRIBUTE arrA2[*][*]*/ + distrwgt22(); + + /* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][WGT_BLOCK]*/ + distrwgt23(); + + printf("=== END OF DISTRWGT1 =====================\n"); + return 0; +} + +/* ---------------------------------------------DISTR11*/ +/* 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK]*/ +void distrwgt11() +{ + #define AN1 16 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array distribute[block] + int (*A1); + char tname[] = "distrwgt11"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR12*/ +/* 11 12 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK]*/ +void distrwgt12() +{ + #define AN1 8 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A1); + char tname[] = "distrwgt12"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[wgtblock(wb, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR13*/ +/* 13 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] small array*/ +void distrwgt13() +{ + #define AN1 5 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array distribute[block] + int (*A1); + char tname[] = "distrwgt13"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR14*/ +/* 14 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array*/ +void distrwgt14() +{ + #define AN1 5 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A1); + char tname[] = "distrwgt14"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[wgtblock(wb, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[block]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR15*/ +/* 15 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] other weights*/ +void distrwgt15() +{ + #define AN1 16 + double wb1[6] = {1.0, 2., 2., 3.0, 1., 1.}; + double wb2[6] = {2.0, 1., 2., 2.0, 2., 1.}; + #pragma dvm array + int (*A1); + char tname[] = "distrwgt15"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[wgtblock(wb1, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[wgtblock(wb2, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR16*/ +/* 16 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[*]*/ +void distrwgt16() +{ + #define AN1 8 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A1); + char tname[] = "distrwgt16"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + #pragma dvm redistribute(A1[wgtblock(wb, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[*]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR17*/ +/* 17 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[WGT_BLOCK]*/ +void distrwgt17() +{ + #define AN1 28 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array distribute[*] + int (*A1); + char tname[] = "distrwgt17"; + + erri = ER; + + A1 = malloc(AN1 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) cuda_block(256) + for (i = 0; i < AN1; i++) + A1[i] = i; + } + + #pragma dvm redistribute(A1[wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + if (A1[i] != i) + erri = Min(erri, i); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A1); + #undef AN1 +} + +/* ---------------------------------------------DISTR17*/ +/* 21 DISTRIBUTE arrA2[WGT_BLOCK][*] REDISTRIBUTE arrA2[*][WGT_BLOCK]*/ +void distrwgt21() +{ + #define AN1 8 + #define AN2 8 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrwgt21"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb, 6)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR22*/ +/* 22 DISTRIBUTE arrA2[*][WGT_BLOCK] REDISTRIBUTE arrA2[*][*]*/ +void distrwgt22() +{ + #define AN1 8 + #define AN2 8 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrwgt22"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[*][wgtblock(wb, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR23*/ +/* 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][WGT_BLOCK]*/ +void distrwgt23() +{ + #define AN1 8 + #define AN2 8 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array distribute[*][*] + int (*A2)[AN2]; + char tname[] = "distrwgt23"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt2.cdv new file mode 100644 index 0000000..fa143fe --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt2.cdv @@ -0,0 +1,859 @@ +/* DISTRWGT2 + Testing DISTRIBUTE and REDISTRIBUTE directives + WGT_BLOCK distribution*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distrwgt24(); +static void distrwgt25(); +static void distrwgt26(); +static void distrwgt27(); +static void distrwgt28(); +static void distrwgt29(); +static void distrwgt210(); +static void distrwgt32(); +static void distrwgt33(); +static void distrwgt34(); +static void distrwgt35(); +static void distrwgt36(); +static void distrwgt37(); +static void distrwgt38(); +static void distrwgt41(); +static void distrwgt42(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, k, n, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF DISTRWGT2 ===================\n"); + /* 24 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[*][*]*/ + distrwgt24(); + /* 25 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK]*/ + distrwgt25(); + /* 26 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA2[BLOCK][BLOCK]*/ + distrwgt26(); + /* 27 DISTRIBUTE arrA2[BLOCK][BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK]*/ + distrwgt27(); + /* 28 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] + REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK]*/ + distrwgt28(); + /* 29 DISTRIBUTE arrA2[BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA2[WGT_BLOCK][BLOCK]*/ + distrwgt29(); + /* 210 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] other weigths + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK]*/ + distrwgt210(); + /* 32 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK] [*] + REDISTRIBUTE arrA3[*][WGT_BLOCK][WGT_BLOCK]*/ + distrwgt32(); + /* 33 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] + REDISTRIBUTE arrA3[WGT_BLOCK][*][BLOCK]*/ + distrwgt33(); + /* 34 DISTRIBUTE arrA3[WGT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*]*/ + distrwgt34(); + /* 35 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] + REDISTRIBUTE arrA3[*][*][WGT_BLOCK]*/ + distrwgt35(); + /* 36 DISTRIBUTE arrA3[WGT_BLOCK][*][BLOCK] + REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK]*/ + distrwgt36(); + /* 37 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][*] + REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK]*/ + distrwgt37(); + /* 38 DISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] + REDISTRIBUTE arrA3[*][WGT_BLOCK][BLOCK]*/ + distrwgt38(); + /* 41 DISTRIBUTE arrA4[*][*][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA4[*][*][*][*]*/ + distrwgt41(); + /* 42 DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][*] + REDISTRIBUTE arrA4[*][WGT_BLOCK][WGT_BLOCK][*]*/ + distrwgt42(); + + printf("=== END OF DISTRWGT2 =====================\n"); + return 0; +} + +/* ---------------------------------------------DISTR24*/ +/* 24 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[*][*]*/ +void distrwgt24() +{ + #define AN1 8 + #define AN2 8 + double wb1[4] = {2., 2., 3.0, 1.}; + double wb2[6] = {3.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrwgt24"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 4)][wgtblock(wb2, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR25*/ +/* DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK]*/ +void distrwgt25() +{ + #define AN1 8 + #define AN2 8 + double wb1[5] = {1.0,2.,2.,3.0, 0.}; + double wb2[7] = {1.0,1.,2.,1.0, 1.,1.,1.}; + #pragma dvm array distribute[*][*] + int (*A2)[AN2]; + char tname[] = "distrwgt25"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb1, 5)][wgtblock(wb2, 7)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR26*/ +/* DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[BLOCK][BLOCK]*/ +void distrwgt26() +{ + #define AN1 12 + #define AN2 12 + double wb[6] = {1.0, 4., 1., 1.0, 2., 1.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrwgt26"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb, 6)][wgtblock(wb, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR27*/ +/* DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK]*/ +void distrwgt27() +{ + #define AN1 8 + #define AN2 8 + double wb[6] = {2.0, 1., 3., 2.0, 1., 1.}; + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + char tname[] = "distrwgt27"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb, 6)][wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR28*/ +/* DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK]*/ +void distrwgt28() +{ + #define AN1 12 + #define AN2 12 + double wb1[8] = {1.0, 2., 2., 3.0, 1., 1, 2, 4.}; + double wb2[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrwgt28"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 8)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[block][wgtblock(wb2, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR29*/ +/* DISTRIBUTE arrA2[BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[WGT_BLOCK][BLOCK]*/ +void distrwgt29() +{ + #define AN1 12 + #define AN2 12 + double wb1[6] = {1.0, 2., 2., 3.0, 3, 1}; + double wb2[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrwgt29"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[block][wgtblock(wb1, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb2, 6)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR210*/ +/* DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] with other weigths*/ +void distrwgt210() +{ + #define AN1 12 + #define AN2 12 + double wb1[4] = {1.0, 2., 1., 1.0}; + double wb2[6] = {1.0, 1., 2., 1.0, 2., 1.}; + #pragma dvm array + int (*A2)[AN2]; + char tname[] = "distrwgt210"; + + erri = ER; + + A2 = malloc(AN1 * AN2 * sizeof(int)); + #pragma dvm redistribute(A2[wgtblock(wb1, 4)][wgtblock(wb2, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } + + #pragma dvm redistribute(A2[wgtblock(wb2, 6)][wgtblock(wb1, 4)]) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + if (A2[i][j] != i * NL + j) + erri = Min(erri, i * NL + j); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------DISTR32*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] + REDISTRIBUTE arrA3[*][WGT_BLOCK][WGT_BLOCK]*/ +void distrwgt32() +{ + #define AN1 16 + #define AN2 12 + #define AN3 8 + double wb1[7] = {1., 1., 2., 1.0, 2., 2., 3.0}; + double wb2[8] = {1.0, 2., 2., 3.0, 2, 1, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt32"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 7)][wgtblock(wb2, 6)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][wgtblock(wb2, 6)][wgtblock(wb1, 4)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR33*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] + REDISTRIBUTE arrA3[WGT_BLOCK][*][WGT_BLOCK]*/ +void distrwgt33() +{ + #define AN1 16 + #define AN2 16 + #define AN3 8 + double wb[10] = {1.0, 2., 2., 3.0, 2., 4, 2., 1., 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt33"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb, 6)][wgtblock(wb, 8)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb, 10)][*][wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR34*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][*][WGT_BLOCK] + REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*]*/ +void distrwgt34() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb[8] = {1.0, 2., 2., 3.0, 1., 2, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt34"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb, 6)][*][wgtblock(wb, 8)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb, 8)][wgtblock(wb, 6)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR35*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][*] + REDISTRIBUTE arrA3[*][*][WGT_BLOCK]*/ +void distrwgt35() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[6] = {1.0, 2., 2., 3.0, 1.5, 2.5}; + double wb2[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt35"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][block][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][*][wgtblock(wb2, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR36*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][*][BLOCK] + REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK]*/ +void distrwgt36() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb[6] = {.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt36"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb, 6)][*][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][*][wgtblock(wb, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR37*/ +/*DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][*] + REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK]*/ +void distrwgt37() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[6] = {0.5, 1, 1.0, 2., 2., 3.0}; + double wb2[8] = {1.0, 2., 2., 3.0, 0.5, 2, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt37"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][block][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][*][wgtblock(wb2, 8)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR38*/ +/*DISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] REDISTRIBUTE arrA3[*][WGT_BLOCK][WGT_BLOCK]*/ +void distrwgt38() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[6] = {1.0, 2., 2., 3.0, 4, 5}; + double wb2[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt38"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][*][wgtblock(wb1, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][wgtblock(wb1, 6)][wgtblock(wb2, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR41*/ +/*DISTRIBUTE arrA4[*][*][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA4[*][*][*][*]*/ +void distrwgt41() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + #define AN4 8 + double wb[8] = {1.0, 2., 2., 3.0, 1., 1., 2, 1}; + #pragma dvm array + int (*A4)[AN2][AN3][AN4]; + char tname[] = "distrwgt41"; + + erri = ER; + + A4 = malloc(AN1 * AN2 * AN3 * AN4 * sizeof(int)); + #pragma dvm redistribute(A4[*][*][wgtblock(wb, 6)][wgtblock(wb, 8)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + A4[i][j][k][n] = i*NL/10+j*NL/100+k*NL/1000+n; + } + #pragma dvm redistribute(A4[*][*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + if (A4[i][j][k][n] != i*NL/10+j*NL/100+k*NL/1000+n) + erri = Min(erri, i*NL/10+j*NL/100+k*NL/1000+n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A4); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +/* ---------------------------------------------DISTR42*/ +/*DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][*] REDISTRIBUTE arrA4[*][WGT_BLOCK][WGT_BLOCK][*]*/ +void distrwgt42() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + #define AN4 8 + double wb[6] = {1.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A4)[AN2][AN3][AN4]; + char tname[] = "distrwgt42"; + + erri = ER; + + A4 = malloc(AN1 * AN2 * AN3 * AN4 * sizeof(int)); + #pragma dvm redistribute(A4[wgtblock(wb, 6)][*][wgtblock(wb, 6)][*]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + A4[i][j][k][n] = i*NL/10+j*NL/100+k*NL/1000+n; + } + + #pragma dvm redistribute(A4[*][wgtblock(wb, 6)][wgtblock(wb, 6)][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + if (A4[i][j][k][n] != i*NL/10+j*NL/100+k*NL/1000+n) + erri = Min(erri, i*NL/10+j*NL/100+k*NL/1000+n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A4); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt3.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt3.cdv new file mode 100644 index 0000000..1c9c9aa --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/DISTR_WGT/distrwgt3.cdv @@ -0,0 +1,478 @@ +/* DISTRWGT3 + Testing DISTRIBUTE and REDISTRIBUTE directives + WGT_BLOCK distribution*/ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void distrwgt39(); +static void distrwgt310(); +static void distrwgt311(); +static void distrwgt312(); +static void distrwgt313(); +static void distrwgt314(); +static void distrwgt315(); +static void distrwgt41(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, k, ia, ib, n; + +int main(int an, char **as) +{ + printf("=== START OF DISTRWGT3 ===================\n"); + /* 39 DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ + distrwgt39(); + /* 310 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][BLOCK]*/ + distrwgt310(); + /* 311 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] other weigths*/ + distrwgt311(); + /* 312 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK]*/ + distrwgt312(); + /* 313 DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] + REDISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK]*/ + distrwgt313(); + /* 314 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA2[*][*][*]*/ + distrwgt314(); + /* 315 DISTRIBUTE arrA3[*][*][*] + REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ + distrwgt315(); + /* 41 DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA4[BLOCK][WGT_BLOCK][BLOCK][*]*/ + distrwgt41(); + + printf("=== END OF DISTRWGT3 =====================\n"); + return 0; +} + +/* ---------------------------------------------DISTR39*/ +/* DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ +void distrwgt39() +{ + #define AN1 16 + #define AN2 16 + #define AN3 16 + double wb1[6] = {3.0, 1., 2., 2.0, 2.5, 1.2}; + double wb2[7] = {1., 3., 4.0, 1., 2., 2., 4.}; + double wb3[6] = {5.0, 1., 3., 6.0, 2., 4.}; + #pragma dvm array distribute[block][block][block] + + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt39"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][wgtblock(wb2, 7)][wgtblock(wb3, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR310*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [BLOCK][BLOCK][BLOCK]*/ +void distrwgt310() +{ + #define AN1 12 + #define AN2 12 + #define AN3 24 + double wb1[6] = {2.0, 1., 1., 3.0, 2., 1.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[6] = {2.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt310"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][wgtblock(wb2, 8)][wgtblock(wb3, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][block][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR311*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] other weigths*/ +void distrwgt311() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[6] = {2.0, 1., 1., 3.0, 2., 1.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[6] = {2.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt311"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][wgtblock(wb2, 6)][wgtblock(wb3, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb3, 6)][wgtblock(wb1, 6)][wgtblock(wb2, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR312*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK]*/ +void distrwgt312() +{ + #define AN1 10 + #define AN2 10 + #define AN3 30 + double wb1[6] = {2.0, 1., 1., 3.0, 2., 1.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[6] = {2.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt312"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][block][wgtblock(wb3, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[block][wgtblock(wb2, 8)][block]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR313*/ +/* DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] + REDISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK]*/ +void distrwgt313() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[6] = {2.0, 1., 1., 3.0, 2., 1.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[6] = {2.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt313"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[block][wgtblock(wb2, 8)][block]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][block][wgtblock(wb3, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR314*/ +/* DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA3[*][*][*]*/ +void distrwgt314() +{ + #define AN1 8 + #define AN2 12 + #define AN3 24 + double wb1[6] = {2.0, 1., 1., 3.0, 2., 1.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[6] = {2.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt314"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][wgtblock(wb2, 8)][wgtblock(wb3, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[*][*][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR315*/ +/* DISTRIBUTE arrA3[*][*][*] + REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK]*/ +void distrwgt315() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + double wb1[6] = {2.0, 1., 1., 3.0, 2., 1.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[6] = {2.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array distribute[*][*][*] + int (*A3)[AN2][AN3]; + char tname[] = "distrwgt315"; + + erri = ER; + + A3 = malloc(AN1 * AN2 * AN3 * sizeof(int)); + + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + A3[i][j][k] = i*NL/10 + j*NL/100 + k; + } + + #pragma dvm redistribute(A3[wgtblock(wb1, 6)][wgtblock(wb2, 8)][wgtblock(wb3, 6)]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on A3[i][j][k]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + if (A3[i][j][k] != i*NL/10 + j*NL/100 + k) + erri = Min(erri, i*NL/10 + j*NL/100 + k); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A3); + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------DISTR41*/ +/*DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][WGT_BLOCK] + REDISTRIBUTE arrA4[BLOCK][WGT_BLOCK][BLOCK][*]*/ +void distrwgt41() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + #define AN4 8 + double wb1[6] = {2.0, 1., 1., 3.0, 2., 1.}; + double wb2[8] = {1.0, 1., 2., 2.0, 1., 1., 2., 2.}; + double wb3[6] = {2.0, 2., 2., 3.0, 1., 1.}; + #pragma dvm array + int (*A4)[AN2][AN3][AN4]; + char tname[] = "distrwgt41"; + + erri = ER; + + A4 = malloc(AN1 * AN2 * AN3 * AN4 * sizeof(int)); + #pragma dvm redistribute(A4[wgtblock(wb1, 6)][*][wgtblock(wb2, 8)][wgtblock(wb3, 6)]) + + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + A4[i][j][k][n] = i*NL/10+j*NL/100+k*NL/1000+n; + } + + #pragma dvm redistribute(A4[block][wgtblock(wb3, 6)][block][*]) + #pragma dvm region + { + #pragma dvm parallel([i][j][k][n] on A4[i][j][k][n]) reduction(min(erri)), cuda_block(256) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (k = 0; k < AN3; k++) + for (n = 0; n < AN4; n++) + if (A4[i][j][k][n] != i*NL/10+j*NL/100+k*NL/1000+n) + erri = Min(erri, i*NL/10+j*NL/100+k*NL/1000+n); + } + + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + free(A4); + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fopen11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fopen11.cdv new file mode 100644 index 0000000..7a23b26 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fopen11.cdv @@ -0,0 +1,181 @@ + +/* TESTING OF THE function fopen + FOR DISTRIBUTED ARRAY A[N]. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 + +static void fop1101(); +static void fop1102(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START TFOPEN11========================\n"); + fop1101(); + fop1102(); + + printf("=== END OF TFOPEN11 ========================= \n"); + return 0; +} +/* -------------------------------------------------fop1101 */ + void fop1101() +{ + + + char tname[]="FOPEN_1101"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARFOP01_%04d.txt", "wl"))==NULL) { + printf("ERROR OPENING FILE ARFOP01_%%4d.txt \n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + + if ((fp=fopen("ARFOP01_%04d.txt", "rl"))==NULL) { + printf("ERROR OPENING FILE ARFOP_%%4d.txt \n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + { + ni=fscanf(fp, "%d ",&nb); + B[i]=nb; + } + fclose(fp); + dvmh_remove_local("ARFOP01_%04d.txt"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* -------------------------------------------------fop1102 */ + void fop1102() +{ + + + char tname[]="FOPEN_1102"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARFOP02.txt", "wp"))==NULL) { + printf("ERROR OPENING FILE ARFOP02.txt \n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + + if ((fp=fopen("ARFOP02.txt", "rp"))==NULL) { + printf("ERROR OPENING FILE ARFOP02.txt \n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + { + ni=fscanf(fp, "%d ",&nb); + B[i]=nb; + } + fclose(fp); + remove("ARFOP02.txt"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc11.cdv new file mode 100644 index 0000000..149ce7c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc11.cdv @@ -0,0 +1,105 @@ + +/* TESTING OF THE function fprintf and fscanf + FOR DISTRIBUTED ARRAY A[N]. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 +static void prsc1101(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fpsc11========================\n"); + prsc1101(); + + printf("=== END OF fpsc11 ========================= \n"); + return 0; +} +/* ---------------------------------------------prsc1101 */ + void prsc1101() +{ + + + char tname[]="FPRINT_FSCANF_1101"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARFPSC11", "wb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC11\n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + + if ((fp=fopen("ARFPSC11", "rb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC11\n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + { + ni=fscanf(fp, "%d ",&nb); + B[i]=nb; + } + fclose(fp); + remove("ARFPSC11"); + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc12.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc12.cdv new file mode 100644 index 0000000..91c8a63 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc12.cdv @@ -0,0 +1,105 @@ + +/* TESTING OF THE function fprintf and fscanf + FOR DISTRIBUTED ARRAY A[N]. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 +static void prsc1201(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fpsc12========================\n"); + prsc1201(); + + printf("=== END OF fpsc12 ========================= \n"); + return 0; +} +/* ---------------------------------------------prsc1201 */ + void prsc1201() +{ + + + char tname[]="FPRINT_FSCANF_1201"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[*] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARFPSC12", "wb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC12\n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + + if ((fp=fopen("ARFPSC12", "rb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC12\n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + { + ni=fscanf(fp, "%d ",&nb); + B[i]=nb; + } + fclose(fp); + remove("ARFPSC12"); + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc21.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc21.cdv new file mode 100644 index 0000000..7ab27a3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc21.cdv @@ -0,0 +1,112 @@ + +/* TESTING OF THE function fprintf and fscanf + FOR DISTRIBUTED ARRAY A[N][M]. +*/ +#include +#include +#include +#define N 8 +#define M 4 +#define NL 1000 +static void prsc2101(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fpsc21========================\n"); + prsc2101(); + + printf("=== END OF fpsc21 ========================= \n"); + return 0; +} +/* ---------------------------------------------prsc2101 */ + void prsc2101() +{ + + + char tname[]="FPRINT_FSCANF_2101"; + int i,j,nloopi,nloopj,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARFPSC21", "wb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC21 \n"); + exit(1); + } + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { + #pragma dvm remote_access(A[i][j]) + { + na=A[i][j]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + + if ((fp=fopen("ARFPSC21", "rb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC21 \n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { + ni=fscanf(fp, "%d ",&nb); + B[i][j]=nb; + } + fclose(fp); + remove("ARFPSC21"); + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc22.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc22.cdv new file mode 100644 index 0000000..bf85877 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fpsc22.cdv @@ -0,0 +1,112 @@ + +/* TESTING OF THE function fprintf and fscanf + FOR DISTRIBUTED ARRAY A[N][M]. +*/ +#include +#include +#include +#define N 8 +#define M 4 +#define NL 1000 +static void prsc2201(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fpsc22========================\n"); + prsc2201(); + + printf("=== END OF fpsc22 ========================= \n"); + return 0; +} +/* ---------------------------------------------prsc2201 */ + void prsc2201() +{ + + + char tname[]="FPRINT_FSCANF_2201"; + int i,j,nloopi,nloopj,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[*][block] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARFPSC22", "wb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC22 \n"); + exit(1); + } + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { + #pragma dvm remote_access(A[i][j]) + { + na=A[i][j]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + + if ((fp=fopen("ARFPSC22", "rb"))==NULL) { + printf("ERROR OPENING FILE ARFPSC22 \n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { + ni=fscanf(fp, "%d ",&nb); + B[i][j]=nb; + } + fclose(fp); + remove("ARFPSC22"); + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre11.cdv new file mode 100644 index 0000000..6cf7d5e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre11.cdv @@ -0,0 +1,236 @@ + +/* TESTING OF THE function fwrite and fread + FOR DISTRIBUTED ARRAY A[N]. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 +static void wrre1101(); +static void wrre1102(); +static void wrre1103(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fwrre11========================\n"); + wrre1101(); + wrre1102(); + wrre1103(); + + printf("=== END OF fwrre11 ========================= \n"); + return 0; +} +/* ---------------------------------------------wrre1101 */ + void wrre1101() +{ + + + char tname[]="FWRITE_FREAD_1101"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE01", "wb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N, fp)!=N) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE01", "rb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N, fp)!=N) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE01"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +/* ---------------------------------------------wrre1102 */ + void wrre1102() +{ + + + char tname[]="FWRITE_FREAD_1102"; + int i,nloopi,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE02_%04d", "wbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE02_%04d", "rbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + dvmh_remove_local("ARWRRE02_%04d"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* ---------------------------------------------wrre1103 */ + void wrre1103() +{ + + + char tname[]="FWRITE_FREAD_1103"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE03", "wbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N, fp)!=N) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE03", "rbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N, fp)!=N) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE03"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre12.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre12.cdv new file mode 100644 index 0000000..2233ba5 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre12.cdv @@ -0,0 +1,236 @@ + +/* TESTING OF THE function fwrite and fread + FOR LOCAL ARRAY A[N]. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 +static void wrre1201(); +static void wrre1202(); +static void wrre1203(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fwrre12========================\n"); + wrre1201(); + wrre1202(); + wrre1203(); + + printf("=== END OF fwrre12 ========================= \n"); + return 0; +} +/* ---------------------------------------------wrre1201 */ + void wrre1201() +{ + + + char tname[]="FWRITE_FREAD_1201"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[*] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE01", "wb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N, fp)!=N) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE01", "rb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N, fp)!=N) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE01"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +/* ---------------------------------------------wrre1202 */ + void wrre1202() +{ + + + char tname[]="FWRITE_FREAD_1202"; + int i,nloopi,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[*] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE02_%04d", "wbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE02_%04d", "rbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + dvmh_remove_local("ARWRRE02_%04d"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* ---------------------------------------------wrre1203 */ + void wrre1203() +{ + + + char tname[]="FWRITE_FREAD_1203"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[*] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE03", "wbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N, fp)!=N) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE03", "rbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N, fp)!=N) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE03"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre21.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre21.cdv new file mode 100644 index 0000000..784ac13 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre21.cdv @@ -0,0 +1,242 @@ + +/* TESTING OF THE function fwrite and fread + FOR DISTRIBUTED ARRAY A[N][M]. +*/ +#include +#include +#include +#define N 8 +#define M 16 +#define NL 1000 +static void wrre2101(); +static void wrre2102(); +static void wrre2103(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fwrre21========================\n"); + wrre2101(); + wrre2102(); + wrre2103(); + + printf("=== END OF fwrre21 ========================= \n"); + return 0; +} +/* ---------------------------------------------wrre2101 */ + void wrre2101() +{ + + + char tname[]="FWRITE_FREAD_2101"; + int i,j,nloopi,nloopj,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE01", "wb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N*M, fp)!=N*M) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE01", "rb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N*M, fp)!=N*M) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE01"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi),min(nloopj)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +/* ---------------------------------------------wrre2102 */ + void wrre2102() +{ + + + char tname[]="FWRITE_FREAD_2102"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE02_%04d", "wbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE02_%04d", "rbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + dvmh_remove_local("ARWRRE02_%04d"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* ---------------------------------------------wrre2103 */ + void wrre2103() +{ + + + char tname[]="FWRITE_FREAD_2103"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE03_%04d", "wbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE03_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE03_%04d", "rbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + remove("ARWRRE03_%04d"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre22.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre22.cdv new file mode 100644 index 0000000..fba4f43 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre22.cdv @@ -0,0 +1,242 @@ + +/* TESTING OF THE function fwrite and fread + FOR DISTRIBUTED ARRAY A[N][M]. +*/ +#include +#include +#include +#define N 8 +#define M 16 +#define NL 1000 +static void wrre2201(); +static void wrre2202(); +static void wrre2203(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fwrre22========================\n"); + wrre2201(); + wrre2202(); + wrre2203(); + + printf("=== END OF fwrre22 ========================= \n"); + return 0; +} +/* ---------------------------------------------wrre2201 */ + void wrre2201() +{ + + + char tname[]="FWRITE_FREAD_2201"; + int i,j,nloopi,nloopj,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block][*] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE01", "wb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N*M, fp)!=N*M) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE01", "rb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N*M, fp)!=N*M) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE01"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi),min(nloopj)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +/* ---------------------------------------------wrre2202 */ + void wrre2202() +{ + + + char tname[]="FWRITE_FREAD_2202"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[block][*] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE02_%04d", "wbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE02_%04d", "rbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + dvmh_remove_local("ARWRRE02_%04d"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* ---------------------------------------------wrre2203 */ + void wrre2203() +{ + + + char tname[]="FWRITE_FREAD_2203"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[block][*] + int A[N][M]; + #pragma dvm array align ([i][j] with A[i][j]) + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE03_%04d", "wbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE03_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE03_%04d", "rbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + remove("ARWRRE03_%04d"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre23.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre23.cdv new file mode 100644 index 0000000..429a047 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre23.cdv @@ -0,0 +1,242 @@ + +/* TESTING OF THE function fwrite and fread + FOR DISTRIBUTED ARRAY A[N][M] AND LOCAL B[N][M]. +*/ +#include +#include +#include +#define N 8 +#define M 16 +#define NL 1000 +static void wrre2301(); +static void wrre2302(); +static void wrre2303(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fwrre23========================\n"); + wrre2301(); + wrre2302(); + wrre2303(); + + printf("=== END OF fwrre23 ========================= \n"); + return 0; +} +/* ---------------------------------------------wrre2301 */ + void wrre2301() +{ + + + char tname[]="FWRITE_FREAD_2301"; + int i,j,nloopi,nloopj,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + #pragma dvm array distribute[*][*] + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE01", "wb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N*M, fp)!=N*M) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE01", "rb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N*M, fp)!=N*M) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE01"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi),min(nloopj)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +/* ---------------------------------------------wrre2302 */ + void wrre2302() +{ + + + char tname[]="FWRITE_FREAD_2302"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[*][*] + int A[N][M]; + #pragma dvm array distribute[*][*] + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE02_%04d", "wbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE02_%04d", "rbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + dvmh_remove_local("ARWRRE02_%04d"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* ---------------------------------------------wrre2303 */ + void wrre2303() +{ + + + char tname[]="FWRITE_FREAD_2303"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + #pragma dvm array distribute[*][*] + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE03_%04d", "wbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE03_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE03_%04d", "rbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + remove("ARWRRE03_%04d"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre24.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre24.cdv new file mode 100644 index 0000000..366dc21 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/fwrre24.cdv @@ -0,0 +1,297 @@ + +/* TESTING OF THE function fwrite and fread + FOR DISTRIBUTED ARRAY A[N][M] AND B[N][M]. +*/ +#include +#include +#include +#define N 8 +#define M 16 +#define NL 1000 +static void wrre2401(); +static void wrre2402(); +static void wrre2403(); +static void wrre2404(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START fwrre24========================\n"); + wrre2401(); + wrre2402(); + wrre2403(); + wrre2404(); + + printf("=== END OF fwrre24 ========================= \n"); + return 0; +} +/* ---------------------------------------------wrre2401 */ + void wrre2401() +{ + + + char tname[]="FWRITE_FREAD_2401"; + int i,j,nloopi,nloopj,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE01", "wb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01\n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N*M, fp)!=N*M) + printf("ERROR WRITING FILE ARWRRE01\n"); + fclose(fp); + + if ((fp=fopen("ARWRRE01", "rb"))==NULL) { + printf("ERROR OPENING FILE ARWRRE01 \n"); + exit(1); + } +// rewind(fp); + if (fread(B, sizeof(int), N*M, fp)!=N*M) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + remove("ARWRRE01"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi),min(nloopj)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +/* ---------------------------------------------wrre2402 */ + void wrre2402() +{ + + + char tname[]="FWRITE_FREAD_2402"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + int A[N][M]; + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + } + + if((fp=fopen("ARWRRE02_%04d", "wbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); + fclose(fp); + + if ((fp=fopen("ARWRRE02_%04d", "rbl"))==NULL) { + printf("ERROR OPENING FILE ARWRRE02_%%04d\n"); + exit(1); + } + K=fread(B, sizeof(int), N*M, fp); + fclose(fp); + dvmh_remove_local("ARWRRE02_%04d"); + + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* ---------------------------------------------wrre2403 */ + void wrre2403() +{ + + + char tname[]="FWRITE_FREAD_2403"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + #pragma dvm array distribute[block][block] + int A[N][M]; + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on A[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + { A[i][j] = NL+i+j; + B[i][j]=777; + + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE03", "wbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE03\n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE03", "rbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE03\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + remove("ARWRRE03"); + + #pragma dvm parallel ([i][j] on A[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (A[i][j] !=B[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* ---------------------------------------------wrre2404 */ + void wrre2404() +{ + + + char tname[]="FWRITE_FREAD_2404"; + int i,j,nloopi,nloopj,ni,nb,na,K; + FILE *fp; + + int A[N][M]; + #pragma dvm array distribute[block][block] + int B[N][M]; + + + + nloopi=NL; + nloopj=NL; + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i][j] on B[i][j]) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + B[i][j]=777; + + } /*end region*/ + for (i=0;i<=N-1;i++) + for(j=0;j<=M-1;j++) + A[i][j]=NL+i+j; + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARWRRE04", "wbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE04 \n"); + exit(1); + } + + K=fwrite(A, sizeof(int), N*M, fp); +// printf("NUMBER=%d\n",K); + fclose(fp); + + if ((fp=fopen("ARWRRE04", "rbp"))==NULL) { + printf("ERROR OPENING FILE ARWRRE04\n"); + exit(1); + } +// rewind(fp); + K=fread(B, sizeof(int), N*M, fp); +// printf("NUMBER1=%d\n",K); + fclose(fp); + remove("ARWRRE04"); + + #pragma dvm parallel ([i][j] on B[i][j]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + for (j=0;j<=M-1;j++) + if (B[i][j] !=A[i][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/remove11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/remove11.cdv new file mode 100644 index 0000000..63a7c58 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/remove11.cdv @@ -0,0 +1,85 @@ + +/* TESTING OF THE function remove + FOR FILEs. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 +static void remove1101(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START REMOVE11========================\n"); + remove1101(); + + printf("=== END OF TREMOVE11 ========================= \n"); + return 0; +} +/* -------------------------------------------------remove1101 */ + void remove1101() +{ + + + char tname[]="REMOVE_1101"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARREMOVE_1101", "wl"))==NULL) { + printf("ERROR OPENING FILE ARREMOVE_1101 \n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + if (remove("ARREMOVE_1101")) + ansno(tname); + else + ansyes(tname); + + return ; + + +} + + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/rename11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/rename11.cdv new file mode 100644 index 0000000..a2d8a04 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/rename11.cdv @@ -0,0 +1,182 @@ + +/* TESTING OF THE function rename + FOR DISTRIBUTED ARRAY A[N]. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 +static void rename1101(); +static void rename1102(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START TRENAME11============================ \n"); + rename1101(); + rename1102(); + printf("=== END OF TRENAME11 ========================= \n"); + return 0; +} +/* ---------------------------------------------rename1101 */ + void rename1101() +{ + + + char tname[]="RENAME_1101"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARRENAMEA", "wb"))==NULL) { + printf("ERROR OPENING FILE ARRENAMEA\n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + if(rename("ARRENAMEA", "ARRENAMEB") != 0) + printf("ERROR WHEN RENAMING =>,ARRENAMEA,ARRENAMEB\n"); + if ((fp=fopen("ARRENAMEB", "rb"))==NULL) { + printf("ERROR OPENING FILE ARRENAMEB \n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + { + ni=fscanf(fp, "%d ",&nb); + B[i]=nb; + } + fclose(fp); + remove("ARRENAMEB"); + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} +/* -------------------------------------------------rename1102 */ + void rename1102() +{ + + + char tname[]="RENAME_1102"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=fopen("ARRENAMEA2_%04d.txt", "wl"))==NULL) { + printf("ERROR OPENING FILE ARRENAMEA2.txt \n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + fclose(fp); + + if (dvmh_rename_local("ARRENAMEA2_%04d.txt", "ARRENAMEB2_%04d.txt") !=0) + printf("ERROR WHEN RENAMING =>,ARRENAMEA2,ARRENAMEB2\n"); + + if ((fp=fopen("ARRENAMEB2_%04d.txt", "rl"))==NULL) { + printf("ERROR OPENING FILE ARRENAMEB2.txt \n"); + exit(1); + } +// rewind(fp); + + for (i=0;i<=N-1;i++) + { + ni=fscanf(fp, "%d ",&nb); + B[i]=nb; + } + fclose(fp); + dvmh_remove_local("ARRENAMEB2_%04d.txt"); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/tmpfile11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/tmpfile11.cdv new file mode 100644 index 0000000..d4eb193 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/IO/tmpfile11.cdv @@ -0,0 +1,225 @@ + +/* TESTING OF THE function tmpfile + FOR DISTRIBUTED ARRAY A[N]. +*/ +#include +#include +#include +#define N 8 +#define NL 1000 + +static void tmpfile1101(); +static void tmpfile1102(); +static void tmpfile1103(); + +static void ansyes(char tname[]); +static void ansno(char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START TMPFILE11========================\n"); + tmpfile1101(); + tmpfile1102(); + tmpfile1103(); + + printf("=== END OF TMPFILE11 ========================= \n"); + return 0; +} +/* -------------------------------------------------tmpfile1101 */ + void tmpfile1101() +{ + + + char tname[]="TMPFILE_1101"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=tmpfile())==NULL) { + printf("ERROR OPENING TMPFILE01 \n"); + exit(1); + } + for (i=0;i<=N-1;i++) { + #pragma dvm remote_access(A[i]) + { + na=A[i]; + } + ni=fprintf(fp, "%d ", na); + } + rewind(fp); + for (i=0;i<=N-1;i++) + { + ni=fscanf(fp, "%d ",&nb); + B[i]=nb; + } + fclose(fp); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +/* ---------------------------------------------tmpfile1102 */ + void tmpfile1102() +{ + + + char tname[]="TMPFILE_1102"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + if((fp=tmpfile())==NULL) { + printf("ERROR OPENING TMPFILE02 \n"); + exit(1); + } + + if (fwrite(A, sizeof(int), N, fp)!=N) + printf("ERROR WRITING FILE TMPFILE02\n"); + rewind(fp); + + if (fread(B, sizeof(int), N, fp)!=N) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + +/* ---------------------------------------------tmpfile1103 */ + void tmpfile1103() +{ + + + char tname[]="TMPFILE_1103"; + int i,nloopi,ni,nb,na; + FILE *fp; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align ([i] with A[i]) + int B[N]; + + + + nloopi=NL; + + #pragma dvm region out(A,B) + { + #pragma dvm parallel ([i] on A[i]) + for (i=0;i<=N-1;i++) + { A[i] = NL+i; + B[i]=777; + } + } /*end region*/ + + #pragma dvm get_actual(A,B) + + fp=dvmh_tmpfile_local(); + + if (fwrite(A, sizeof(int), N, fp)!=N) + printf("ERROR WRITING FILE TMPFILE02\n"); + rewind(fp); + + if (fread(B, sizeof(int), N, fp)!=N) + { + if(feof(fp)) printf("PREMATURE END OF FILE ARWRRE01"); + else printf("ERROR READING FILE ARWRRE01\n"); + } + fclose(fp); + + #pragma dvm parallel ([i] on A[i]) reduction(min(nloopi)) + for (i=0;i<=N-1;i++) + { + if (A[i] !=B[i]) + if (nloopi > i) nloopi = i; + } +// printf ("nloopi=%d\n", nloopi); + if (nloopi == NL ) + ansyes(tname); + else + ansno(tname); + + return ; + + +} + + +void ansyes(char name[]) +{ + printf ("%s - complete\n",name); + return ; +} + void ansno(char name[]) +{ + printf("%s - ***error\n",name); + return ; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal11.cdv new file mode 100644 index 0000000..2423c50 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal11.cdv @@ -0,0 +1,285 @@ +/* TESTING OF THE OWN CALCULASHION + FOR DISTRIBUTED ARRAY A[N]. +*/ + +#include +#include +#include + +#define N 32 +#define NL 1000 + +static void owncal1101(); +static void owncal1102(); +static void owncal1103(); +static void owncal1104(); +static void owncal1105(); +static void owncal1106(); + +static void serial(int AR[], int NN, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START OF OWNCAL11========================\n"); + owncal1101(); + owncal1102(); + owncal1103(); + owncal1104(); + owncal1105(); + owncal1106(); + + printf("=== END OF OWNCAL11 ========================= \n"); + return 0; +} +/* ---------------------------------------------OWNCAL1101 */ +void owncal1101() +{ + int C[N]; + char tname[] = "OWN1101"; + int i, NN, NNL, nloopi; + + #pragma dvm array distribute[block] + int A[N]; + + NN = N; + NNL = NL; + + serial(C, NN, NNL); + + nloopi = NL; + + #pragma dvm region out(A) + { + for (i = 0; i < N; i++) + A[i] = NL + i; + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i] on A[i]) reduction(min(nloopi)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + if (nloopi > i) nloopi = i; + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL1102 */ +void owncal1102() +{ + int C[N]; + char tname[] = "OWN1102"; + int i, NN, NNL, nloopi; + + #pragma dvm array distribute[block] + int A[N]; + + NN = N; + NNL = NL; + + serial(C, NN, NNL); + C[0] = N + NL + 2; + + nloopi = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + A[0]=N+NL+2; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i] on A[i]) reduction(min(nloopi)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + if (nloopi > i) nloopi = i; + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL1103 */ +void owncal1103() +{ + int C[N]; + char tname[] = "OWN1103"; + int i, NN, NNL, nloopi, ni; + + #pragma dvm array distribute[block] + int A[N]; + + NN = N; + NNL = NL; + + serial(C, NN, NNL); + ni = N / 2; + C[ni] = N + NL + 3; + + nloopi = NL; + #pragma dvm actual(ni) + + #pragma dvm region out(A), in(ni) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + A[ni] = N + NL + 3; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i] on A[i]) reduction(min(nloopi)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + if (nloopi > i) nloopi = i; + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL1104 */ +void owncal1104() +{ + int C[N]; + char tname[] = "OWN1104"; + int i, NN, NNL, nloopi, ni; + + #pragma dvm array distribute[block] + int A[N]; + + NN = N; + NNL = NL; + + serial(C, NN, NNL); + ni = N / 2; + C[ni+1] = N + NL + 4; + + nloopi = NL; + + #pragma dvm region out(A), in(ni) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + A[ni + 1] = N + NL + 4; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i] on A[i]) reduction(min(nloopi)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + if (nloopi > i) nloopi = i; + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL1105 */ +void owncal1105() +{ + int C[N]; + char tname[] = "OWN1105"; + int i, NN, NNL, nloopi, ni; + + #pragma dvm array distribute[block] + int A[N]; + + NN = N; + NNL = NL; + + serial(C, NN, NNL); + ni = N / 2; + C[ni - 1] = -(N + NL + 5); + + nloopi = NL; + + #pragma dvm region out(A), in(ni) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + A[ni - 1] = -(N + NL + 5); + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i] on A[i]) reduction(min(nloopi)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + if (nloopi > i) nloopi = i; + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL1106 */ +void owncal1106() +{ + int C[N]; + char tname[] = "OWN1106"; + int i, NN, NNL, nloopi, ni; + + #pragma dvm array distribute[block] + int A[N]; + + NN = N; + NNL = NL; + + serial(C, NN, NNL); + C[N - 1] = N + NL + 6; + + nloopi = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + A[N - 1] = N + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i] on A[i]) reduction(min(nloopi)) + for (i = 1; i < N - 1; i++) + if (A[i] != C[i]) + if (nloopi > i) nloopi = i; + if (nloopi == NL) + ansyes(tname); + else + ansno(tname); +} + +void serial(int AR[], int NN, int NNL) +{ + int i; + for (i = 0; i < NN; i++) + AR[i] = NNL+i; +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal21.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal21.cdv new file mode 100644 index 0000000..81acf87 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal21.cdv @@ -0,0 +1,520 @@ +/* TESTING OF THE OWN CALCULASHION + FOR DISTRIBUTED ARRAY A[N][M]. +*/ + +#include +#include +#include + +#define N 32 +#define M 32 +#define NL 1000 + +static void owncal2101(); +static void owncal2102(); +static void owncal2103(); +static void owncal2104(); +static void owncal2105(); +static void owncal2106(); +static void owncal2107(); +static void owncal2108(); +static void owncal2109(); +static void owncal2110(); + +static void serial2(int AR[][M], int NN, int NM, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START OF OWNCAL21========================\n"); + owncal2101(); + owncal2102(); + owncal2103(); + owncal2104(); + owncal2105(); + owncal2106(); + owncal2107(); + owncal2108(); + owncal2109(); + owncal2110(); + + printf("=== END OF OWNCAL21 ========================= \n"); + return 0; +} +/* ---------------------------------------------OWNCAL2101 */ +void owncal2101() +{ + int C[N][M]; + char tname[] = "OWN2101"; + int i, j, NN, NM, NNL, nloopi, nloopj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2102 */ +void owncal2102() +{ + int C[N][M]; + char tname[] = "OWN2102"; + int i, j, NN, NM, NNL, nloopi, nloopj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + C[0][0] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[0][0] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2103 */ +void owncal2103() +{ + int C[N][M]; + char tname[] = "OWN2103"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + ni = N / 2; + nj = M / 2; + C[ni][nj] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + #pragma dvm actual(ni,nj) + + #pragma dvm region out(A), in(ni, nj) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[ni][nj] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2104 */ +void owncal2104() +{ + int C[N][M]; + char tname[] = "OWN2104"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + ni = N / 2; + nj = M / 2; + C[ni + 1][nj + 1] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A), in(ni, nj) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[ni + 1][nj + 1] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2105 */ +void owncal2105() +{ + int C[N][M]; + char tname[] = "OWN2105"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + ni = N / 2; + nj = M / 2 ; + C[ni - 1][nj - 1] = -(N + M + NL + 1); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A), in(ni, nj) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[ni - 1][nj - 1] = -(N + M + NL + 1); + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2106 */ +void owncal2106() +{ + int C[N][M]; + char tname[] = "OWN2106"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + ni = N / 2; + nj = M / 2 ; + C[ni + 1][nj - 1] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A), in(ni, nj) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[ni + 1][nj - 1] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2107 */ +void owncal2107() +{ + int C[N][M]; + char tname[] = "OWN2107"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + ni = N / 2; + nj = M / 2 ; + C[ni - 1][nj + 1] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A), in(ni, nj) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[ni - 1][nj + 1] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2108 */ +void owncal2108() +{ + int C[N][M]; + char tname[] = "OWN2108"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + + C[0][M - 1] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[0][M - 1] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2109 */ + void owncal2109() +{ + int C[N][M]; + char tname[] = "OWN2109"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + C[N - 1][0] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[N - 1][0] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL2110 */ +void owncal2110() +{ + int C[N][M]; + char tname[] = "OWN2110"; + int i, j, NN, NM, NNL, nloopi, nloopj, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + serial2(C, NN, NM, NNL); + nj = M / 2; + C[0][nj + 1] = N + M + NL + 1; + + nloopi = NL; + nloopj = NL; + + #pragma dvm region out(A), in(nj) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[0][nj + 1] = N + M + NL + 1; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (A[i][j] != C[i][j]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +void serial2(int AR[][M], int NN, int NM, int NNL) +{ + int i, j; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + AR[i][j] = NNL + i + j; +} + +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal31.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal31.cdv new file mode 100644 index 0000000..5adef10 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal31.cdv @@ -0,0 +1,611 @@ +/* TESTING OF THE OWN CALCULASHION + FOR DISTRIBUTED ARRAY A[N][M]. +*/ + +#include +#include +#include + +#define N 32 +#define M 32 +#define K 32 +#define NL 1000 + +static void owncal3101(); +static void owncal3102(); +static void owncal3103(); +static void owncal3104(); +static void owncal3105(); +static void owncal3106(); +static void owncal3107(); +static void owncal3108(); +static void owncal3109(); +static void owncal3110(); + +static void serial3(int AR[][M][K], int NN, int NM, int NK, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START OF OWNCAL31========================\n"); + owncal3101(); + owncal3102(); + owncal3103(); + owncal3104(); + owncal3105(); + owncal3106(); + owncal3107(); + owncal3108(); + owncal3109(); + owncal3110(); + + printf("=== END OF OWNCAL31 ========================= \n"); + return 0; +} +/* ---------------------------------------------OWNCAL3101 */ +void owncal3101() +{ + int C[N][M][K]; + char tname[] = "OWN3101"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region out(A) + { + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------OWNCAL3102 */ +void owncal3102() +{ + int C[N][M][K]; + char tname[] = "OWN3102"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + C[0][0][0] = N + M + K + NL + 2; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[0][0][0] = N + M + K + NL + 2; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL3103 */ +void owncal3103() +{ + int C[N][M][K]; + char tname[] = "OWN3103"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + int ni, nj, nii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + + C[ni][nj][nii] = N + M + K + NL + 3; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm actual(ni, nj, nii) + + #pragma dvm region out(A), in(ni, nj, nii) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[ni][nj][nii] = N + M + K + NL + 3; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------OWNCAL3104 */ +void owncal3104() +{ + int C[N][M][K]; + char tname[] = "OWN3104"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + int ni, nj, nii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + + C[ni + 1][nj + 1][nii + 1] = N + M + K + NL + 4; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm actual(ni, nj, nii) + + #pragma dvm region out(A), in(ni, nj, nii) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[ni + 1][nj + 1][nii + 1] = N + M + K + NL + 4; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + + +/* ---------------------------------------------OWNCAL3105 */ +void owncal3105() +{ + int C[N][M][K]; + char tname[] = "OWN3105"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + int ni, nj, nii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + + C[ni - 1][nj - 1][nii - 1] = -(N + M + K + NL + 5); + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm actual(ni, nj, nii) + + #pragma dvm region out(A), in(ni, nj, nii) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[ni - 1][nj - 1][nii - 1] = -(N + M + K + NL + 5); + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL3106 */ +void owncal3106() +{ + int C[N][M][K]; + char tname[] = "OWN3106"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + int ni, nj, nii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + + C[ni + 1][nj - 1][nii + 1] = N + M + K + NL + 6; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm actual(ni, nj, nii) + + #pragma dvm region out(A), in(ni, nj, nii) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[ni + 1][nj - 1][nii + 1] = N + M + K + NL + 6; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + + +/* ---------------------------------------------OWNCAL3107 */ +void owncal3107() +{ + int C[N][M][K]; + char tname[] = "OWN3107"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + int ni, nj, nii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + + C[ni - 1][nj + 1][nii - 1] = N + M + K + NL + 7; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm actual(ni, nj, nii) + + #pragma dvm region out(A), in(ni, nj, nii) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[ni - 1][nj + 1][nii - 1] = N + M + K + NL + 7; + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL3108 */ +void owncal3108() +{ + int C[N][M][K]; + char tname[] = "OWN3108"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + + C[0][M - 1][K - 1] = N + M + K + NL + 8; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[0][M - 1][K - 1] = N + M + K + NL + 8; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + + +/* ---------------------------------------------OWNCAL3109 */ +void owncal3109() +{ + int C[N][M][K]; + char tname[] = "OWN3109"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + + C[N - 1][M - 1][0] = N + M + K + NL + 9; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[N - 1][M - 1][0] = N + M + K + NL + 9; + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------OWNCAL3110 */ +void owncal3110() +{ + int C[N][M][K]; + char tname[] = "OWN3110"; + int i, j, ii, NN, NM, NK, NNL, nloopi, nloopj, nloopii; + int nj; + + #pragma dvm array distribute[block][block][block] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + + serial3(C, NN, NM, NK, NNL); + + nj = M / 2; + C[0][nj + 1][K - 1] = N + M + K + NL + 10; + + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm actual(nj) + #pragma dvm region out(A), in(nj) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + A[i][j][ii] = NL + i + j + ii; + + A[0][nj + 1][K - 1] = N + M + K + NL + 10; + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + if (A[i][j][ii] != C[i][j][ii]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + + +void serial3(int AR[][M][K], int NN, int NM, int NK, int NNL) +{ + int i,j,ii; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + AR[i][j][ii] = NNL + i + j + ii; +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal41.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal41.cdv new file mode 100644 index 0000000..d5232a6 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/owncal41.cdv @@ -0,0 +1,656 @@ +/* TESTING OF THE OWN CALCULASHION + FOR DISTRIBUTED ARRAY A[N][M][K][L]. +*/ + +#include +#include +#include + +#define N 32 +#define M 32 +#define K 32 +#define L 32 +#define NL 1000 + +static void owncal4101(); +static void owncal4102(); +static void owncal4103(); +static void owncal4104(); +static void owncal4105(); +static void owncal4106(); +static void owncal4107(); +static void owncal4108(); +static void owncal4109(); +static void owncal4110(); + +static void serial4(int AR[][M][K][L], int NN, int NM, int NK, int NLL, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START OF OWNCAL41========================\n"); + owncal4101(); + owncal4102(); + owncal4103(); + owncal4104(); + owncal4105(); + owncal4106(); + owncal4107(); + owncal4108(); + owncal4109(); + owncal4110(); + + printf("=== END OF OWNCAL41 ========================= \n"); + return 0; +} +/* ---------------------------------------------OWNCAL4101 */ +void owncal4101() +{ + int C[N][M][K][L]; + char tname[] = "OWN4101"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region out(A) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------OWNCAL4102 */ +void owncal4102() +{ + int C[N][M][K][L]; + char tname[] = "OWN4102"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + C[0][0][0][0] = N + M + K + L + NL + 2; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[0][0][0][0] = N + M + K + L + NL + 2; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------OWNCAL4103 */ +void owncal4103() +{ + int C[N][M][K][L]; + char tname[] = "OWN4103"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + int ni, nj, nii, njj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + njj = L / 2; + + C[ni][nj][nii][njj] = N + M + K + L + NL + 3; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm actual(ni, nj, nii, njj) + #pragma dvm region out(A), in(ni, nj, nii, njj) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[ni][nj][nii][njj] = N + M + K + L + NL + 3; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------OWNCAL4104 */ +void owncal4104() +{ + int C[N][M][K][L]; + char tname[] = "OWN4104"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + int ni, nj, nii, njj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + njj = L / 2; + + C[ni + 1][nj + 1][nii + 1][njj + 1] = N + M + K + L + NL + 4; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm actual(ni, nj, nii, njj) + #pragma dvm region out(A), in(ni, nj, nii, njj) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[ni + 1][nj + 1][nii + 1][njj + 1] = N + M + K + L + NL + 4; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} + + +/* ---------------------------------------------OWNCAL4105 */ +void owncal4105() +{ + int C[N][M][K][L]; + char tname[] = "OWN4105"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + int ni, nj, nii, njj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + njj = L / 2; + + C[ni - 1][nj - 1][nii - 1][njj - 1] = -(N + M + K + L + NL + 5); + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm actual(ni, nj, nii, njj) + #pragma dvm region out(A), in(ni, nj, nii, njj) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[ni - 1][nj - 1][nii - 1][njj - 1] = -(N + M + K + L + NL + 5); + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------OWNCAL4106 */ +void owncal4106() +{ + int C[N][M][K][L]; + char tname[] = "OWN4106"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + int ni, nj, nii, njj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + njj = L / 2; + + C[ni - 1][nj + 1][nii - 1][njj + 1] = N + M + K + L + NL + 6; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm actual(ni, nj, nii, njj) + #pragma dvm region out(A), in(ni, nj, nii, njj) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[ni - 1][nj + 1][nii - 1][njj + 1] = N + M + K + L + NL + 6; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL4107 */ +void owncal4107() +{ + int C[N][M][K][L]; + char tname[] = "OWN4107"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + int ni, nj, nii, njj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + ni = N / 2; + nj = M / 2; + nii = K / 2; + njj = L / 2; + + C[ni + 1][nj - 1][nii + 1][njj - 1] = N + M + K + L + NL + 7; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm actual(ni, nj, nii, njj) + #pragma dvm region out(A), in(ni, nj, nii, njj) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[ni + 1][nj - 1][nii + 1][njj - 1] = N + M + K + L + NL + 7; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL4108 */ +void owncal4108() +{ + int C[N][M][K][L]; + char tname[] = "OWN4108"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + + C[0][M - 1][0][L - 1] = N + M + K + L + NL + 8; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[0][M - 1][0][L - 1] = N + M + K + L + NL + 8; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL4109 */ +void owncal4109() +{ + int C[N][M][K][L]; + char tname[] = "OWN4109"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + + C[N - 1][0][K - 1][0] = N + M + K + L + NL + 9; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[N][0][K - 1][0] = N + M + K + L + NL + 9; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------OWNCAL4110 */ +void owncal4110() +{ + int C[N][M][K][L]; + char tname[] = "OWN4110"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + int nloopi, nloopj, nloopii, nloopjj; + + #pragma dvm array distribute[block][block][block][block] + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + + serial4(C, NN, NM, NK, NLL, NNL); + + C[0][0][K - 1][L - 1] = N + M + K + L + NL + 10; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region out(A) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + A[0][0][K - 1][L - 1] = N + M + K + L + NL + 10; + + } /*end region*/ + + #pragma dvm get_actual(A) + + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (A[i][j][ii][jj] != C[i][j][ii][jj]) { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); +} + +void serial4(int AR[][M][K][L], int NN, int NM, int NK, int NLL, int NNL) +{ + int i, j, ii, jj; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + for (jj = 0; jj < NLL; jj++) + AR[i][j][ii][jj] = NNL + i + j + ii + jj; +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/settings b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/settings new file mode 100644 index 0000000..3ef2d72 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/OWNCALC/settings @@ -0,0 +1 @@ +DVM_ONLY=1 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel1.cdv new file mode 100644 index 0000000..f23c9b1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel1.cdv @@ -0,0 +1,340 @@ +/* PARALLEL1 +Testing PARALLEL directive */ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void parallel11(); +static void parallel12(); +static void parallel13(); +static void parallel131(); +static void parallel14(); +static void parallel15(); + + +static void ansyes(const char tname[]); +static void ansno (const char tname[]); + +static int NL = 1000; +static int ER = 10000; + +static int erri, i, j, ia; + +int main(int an, char **as) +{ + printf("=== START OF PARALLEL1 ===================\n"); + + /* arrA1[BLOCK] PARALLEL ON arrA[i+4] normal */ + parallel11(); + /* arrA1[BLOCK] PARALLEL ON arrA[-i+8] reverse */ +// parallel12(); + /* arrA1[BLOCK] PARALLEL ON arrA[2*i+8] stretch */ + parallel13(); + /* arrA1[BLOCK] PARALLEL ON arrA[2*i+1] small array */ + parallel131(); + /* arrA1[BLOCK] PARALLEL ON arrA[] */ + parallel14(); + /* arrA1[BLOCK] PARALLEL ON arrA[2] */ + parallel15(); + + printf ("=== END OF PARALLEL1 ===================\n"); + return 0; +} +/* ---------------------------------------------parallel11 */ + /* arrA1[BLOCK] PARALLEL ON arrA[i+4] normal */ +void parallel11() +{ + #define AN1 8 + +/* parameters for PARALLEL arrA1[k1i * i + li] */ + int k1i = 1; + int li = 4; + + #pragma dvm array distribute[block] + int A1[AN1]; + char tname[] = "paral11 "; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A1) + { + #pragma dvm parallel([i] on A1[i]) + for (i = 0; i < AN1; i++) + A1[i] = i; + + #pragma dvm parallel([i] on A1[k1i * i + li]) private(ia), reduction(min(erri)) + for (i = 0; i < ((AN1-li)/k1i); i++) + { + ia = k1i * i + li; + if (A1[ia] != ia) + erri = Min(erri, i); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 +} + +/* ---------------------------------------------parallel12 */ + /* arrA1[BLOCK] PARALLEL ON arrA[-i+8] reverse */ +void parallel12() +{ + #define AN1 7 + +/* parameters for PARALLEL arrA1[k1i * i + li] */ + int k1i = -1; + int li = 8; + + #pragma dvm array distribute[block] + int *A1; + char tname[] = "paral12 "; + + A1 = (int*)malloc(AN1*sizeof(int)); + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) + for (i = 0; i < AN1; i++) + A1[i] = i * 2; + + #pragma dvm parallel([i] on A1[k1i * i + li]) private(ia), reduction(min(erri)) + for (i = 0; i < ((AN1-li)/k1i); i++) + { + ia = k1i * i + li; + if (A1[ia] != (ia*2)) + erri = Min(erri, i); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free (A1); + + #undef AN1 +} + +/* ---------------------------------------------parallel13 */ + /* arrA1[BLOCK] PARALLEL ON arrA[2*i+8] stretch */ +void parallel13() +{ + #define AN1 20 + +/* parameters for PARALLEL arrA1[k1i * i + li]*/ + int k1i = 2; + int li = 8; + + #pragma dvm array distribute[block] + int *A1; + char tname[] = "paral13 "; + + A1 = (int*)malloc(sizeof(int[AN1])); + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) + for (i = 0; i < AN1; i++) + A1[i] = i + 5; + + #pragma dvm parallel([i] on A1[k1i * i + li]) private(ia), reduction(min(erri)) + for (i = 0; i < ((AN1-li)/k1i); i++) + { + ia = k1i * i + li; + if (A1[ia] != (ia + 5)) + erri = Min(erri, i); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A1); + #undef AN1 +} + +/* ---------------------------------------------parallel131 */ + /* arrA1[BLOCK] PARALLEL ON arrA[2*i+1] small array */ +void parallel131() +{ + #define AN1 5 + +/* parameters for PARALLEL arrA1[k1i * i + li] */ + int k1i = 2; + int li = 1; + + #pragma dvm array distribute[block] + int *A1; + char tname[] = "paral131"; + + A1 = (int*)malloc(AN1*sizeof(int)); + + erri = ER; + + #pragma dvm region + { + #pragma dvm parallel([i] on A1[i]) + for (i = 0; i < AN1; i++) + A1[i] = i; + } /* end region */ + + #pragma dvm actual(erri) + + #pragma dvm region local(A1) + { + #pragma dvm parallel([i] on A1[k1i * i + li]) private(ia), reduction(min(erri)) + for (i = 0; i < ((AN1-li)/k1i); i++) + { + ia=k1i * i + li; + if (A1[ia] != ia) + erri = Min(erri, i); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free (A1); + + #undef AN1 +} + +/* ---------------------------------------------parallel14 */ + /* arrA1[BLOCK] PARALLEL ON arrA[] */ +void parallel14() +{ + #define AN1 20 + #define BN1 10 + +/* parameters for PARALLEL arrA1[*] */ + #define k1i 0 + #define li 0 + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array distribute[*] + int *B1; + + char tname[] = "paral14 "; + + A1 = (int*)malloc(AN1*sizeof(int)); + B1 = (int*)malloc(BN1*sizeof(int)); + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A1, B1) + { + #pragma dvm parallel([i] on A1[i]) + for (i = 0; i < AN1; i++) + A1[i] = i; + + for (i = 0; i < BN1; i++) + B1[i] = i; + + #pragma dvm parallel([i] on A1[]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + if (B1[i] != i) + erri = Min(erri, i); + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free (A1); + free (B1); + + #undef AN1 + #undef BN1 + #undef k1i + #undef li +} + +/* ---------------------------------------------parallel15 */ +/* arrA1[BLOCK] PARALLEL ON arrA[2] */ +void parallel15() +{ + #define AN1 15 + +/* parameters for PARALLEL arrA1[li] */ + #define k1i 0 + #define li 2 + + #pragma dvm array distribute[block] + int *A1; + + char tname[] = "paral15 "; + + A1 = (int(*))malloc(AN1*sizeof(int)); + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A1) + { + #pragma dvm parallel([i] on A1[i]) + for(i = 0; i < AN1; i++) + A1[i] = i; + + #pragma dvm parallel ([i] on A1[li]) reduction(min(erri)), private(ia) + for(i = 0; i < AN1; i++) { + ia = li; + if (A1[ia] != ia) + erri = Min(erri, i); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A1); + #undef AN1 + #undef k1i + #undef li +} + +/*-------------------------------------------------------*/ +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel2.cdv new file mode 100644 index 0000000..bf400ef --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel2.cdv @@ -0,0 +1,253 @@ +/* PARALLEL2 +Testing PARALLEL directive */ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void parallel21(); +static void parallel22(); +static void parallel23(); +static void parallel24(); + +static void ansyes(const char tname[]); +static void ansno (const char tname[]); + +static int NL = 10000; +static int ER = 100000; + +static int erri,i,j,ia,ja; + +int main(int an, char **as) +{ + printf("=== START OF PARALLEL2 ===================\n"); + + /* PARALLEL ON arrA[i][2*j] stretching along j */ + parallel21(); + /* PARALLEL ON arrA[i+4][j] shift along i */ + parallel22(); + /* PARALLEL ON arrA[-i+8][j] reverse on i */ +// parallel23(); + /* PARALLEL ON arrA[i+4][j+4] shift along i and j */ + parallel24(); + + printf ("=== END OF PARALLEL2 ===================\n"); + + return 0; +} + +/* ---------------------------------------------parallel21 */ + /* PARALLEL ON arrA[i][2*j] stretching along j */ +void parallel21() +{ + #define AN1 8 + #define AN2 8 + +/* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + int k1i = 1, li = 0; + int k2j = 2, lj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + + char tname[] = "paral21"; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A2) + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i*NL+j; + + #pragma dvm parallel([i][j] on A2[k1i*i+li][k2j*j+lj]) private(ia, ja), reduction(min(erri)) + for (i = 0; i < (AN1-li)/k1i; i++) + for (j = 0; j < (AN2-lj)/k2j ; j++) + { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + erri = Min(erri, ia * NL + ja); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------parallel22 */ + /* PARALLEL ON arrA[i+4][j] shift along i */ +void parallel22() +{ + #define AN1 16 + #define AN2 10 + +/* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + int k1i = 1, li = 4; + int k2j = 1, lj = 0; + + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + + char tname[] = "paral22"; + + A2 = (int(*)[AN2])malloc(AN1*sizeof(int[AN2])); + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j + 2; + + #pragma dvm parallel([i][j] on A2[k1i*i+li][k2j*j+lj]) private(ia, ja), reduction(min(erri)) + for (i = 0; i < (AN1-li) / k1i; i++) + for (j = 0; j < (AN2-lj) / k2j; j++) + { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja) + 2) + erri = Min(erri, ia * NL + ja); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free (A2); + + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------parallel23 */ + /* PARALLEL ON arrA[-i+8][j] reverse on i*/ +void parallel23() +{ + #define AN1 8 + #define AN2 14 + +/* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + int k1i = -1, li = 8; + int k2j = 1, lj = 0; + + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + + char tname[] = "paral23"; + + A2 = (int(*)[AN2])malloc(AN1*AN2*sizeof(int)); + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A2) + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j - 3; + + #pragma dvm parallel([i][j] on A2[k1i*i+li][k2j*j+lj]) private(ia, ja), reduction(min(erri)) + for (i = 0; i < (AN1 - li) / k1i; i++) + for (j = 0; j < (AN2 - lj) / k2j; j++) + { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja) - 3) + erri = Min(erri, ia * NL + ja); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + #undef AN1 + #undef AN2 +} + +/* ---------------------------------------------parallel24 */ + /* PARALLEL ON arrA[i+4][j+4] shift along i and j */ +void parallel24() +{ + #define AN1 16 + #define AN2 15 + +/* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + int k1i = 1, li = 4; + int k2j = 1, lj = 4; + + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + + char tname[] = "paral24"; + + A2 = malloc(sizeof(int[AN1][AN2])); + + erri= ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A2) + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + + #pragma dvm parallel([i][j] on A2[k1i*i+li][k2j*j+lj]) private(ia, ja), reduction(min(erri)) + for (i = 0; i < (AN1 - li) / k1i; i++) + for (j = 0; j < (AN2 - lj) / k2j ; j++) + { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != (ia * NL + ja)) + erri = Min(erri, ia * NL + ja); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free (A2); + + #undef AN1 + #undef AN2 +} + +/*-------------------------------------------------------*/ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel3.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel3.cdv new file mode 100644 index 0000000..830cbe4 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/parallel3.cdv @@ -0,0 +1,518 @@ +/* PARALLEL3 +Testing PARALLEL directive */ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void parallel31(); +static void parallel32(); +static void parallel33(); +static void parallel34(); +static void parallel341(); +static void parallel35(); +static void parallel36(); + +static void ansyes(const char tname[]); +static void ansno (const char tname[]); + +static int NL = 10000; +static int ER = 100000; + +static int erri,i,j,n,l,ia,ja,na,ib,jb,nb; + +int main(int an, char **as) +{ + printf("=== START OF PARALLEL3 ===================\n"); + /* PARALLEL ON arrA[i][2* j][n] stretching */ + parallel31(); + /* PARALLEL ON arrA[i+2][ j][n] shift */ + parallel32(); + /* PARALLEL ON arrA[i][ j][-n+8] reverse */ +// parallel33(); + /* PARALLEL ON arrA[i][ j][2] compression */ + parallel34(); + /* PARALLEL ON arrA[2*i][3*j][1] stretching and compression */ + parallel341 (); + /* PARALLEL ON arrA[][j][n] replication */ + parallel35(); + /* PARALLEL ON arrA[1][2*j+1][3] */ + parallel36(); + + printf ("=== END OF PARALLEL3 ===================\n"); + + return 0; +} + +/* ---------------------------------------------parallel31 */ + /* PARALLEL ON arrA[i][2*j][k] stretching */ +void parallel31() +{ + #define AN1 6 + #define AN2 6 + #define AN3 4 + +/* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i = 1, li = 0; + int k2j = 2, lj = 0; + int k3n = 1, ln = 0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + + char tname[] = "paral31 "; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A3) + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + + #pragma dvm parallel([i][j][n] on A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) private(ia,ja,na), reduction(min(erri)) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != (ia * NL / 10 + ja * NL / 100 + na * NL / 1000)) + erri = Min(erri, ia * NL / 10 + ja * NL / 100 + na * NL / 1000); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 +} + +/* ---------------------------------------------parallel32 */ + /* PARALLEL ON arrA[i+2][j][k] shift */ +void parallel32() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + +/* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i = 1, li = 2; + int k2j = 1, lj = 0; + int k3n = 1, ln = 0; + + #pragma dvm array distribute[block][block][block] + int (*A3)[AN2][AN3]; + + char tname[] = "paral32 "; + + A3 = (int(*)[AN2][AN3])malloc(AN1*sizeof(int[AN2][AN3])); + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + 2; + } + + #pragma dvm parallel([i][j][n] on A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) private(ia,ja,na), reduction(min(erri)) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != (ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + 2)) + erri = Min(erri, ia * NL / 10 + ja * NL / 100 + na * NL / 1000); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free (A3); + + #undef AN1 + #undef AN2 + #undef AN3 +} +/* ---------------------------------------------parallel33 */ + /* PARALLEL ON arrA[i][j][-k+8] reverse */ +void parallel33() +{ + #define AN1 5 + #define AN2 5 + #define AN3 9 + +/* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i = 1, li = 0; + int k2j = 1, lj = 0; + int k3n = -1, ln = 8; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + + char tname[] = "paral33 "; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region inout(A3) + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL /1000; + + #pragma dvm parallel([i][j][n] on A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) private(ia,ja,na), reduction(min(erri)) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj - 1) / k2j); j++) + for (n = 0; n < ((AN3 - ln - 1) / k3n); n++) + { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != (ia * NL / 10 + ja * NL / 100 + na * NL/1000)) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 +} +/* ---------------------------------------------parallel34 */ + /* PARALLEL ON arrA[i][ j][2] compression */ +void parallel34() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + +/* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln] */ + #define k1i 1 + #define li 0 + #define k2j 1 + #define lj 0 + #define k3n 0 + #define ln 2 + + #pragma dvm array distribute[block][block][block] + int (*A3)[AN2][AN3]; + #pragma dvm array /* deferred aligning */ + int (*B3)[BN2][BN3]; + + char tname[] = "paral34 "; + + A3 = (int(*)[AN2][AN3])malloc(AN1*sizeof(int[AN2][AN3])); + B3 = (int(*)[BN2][BN3])malloc(BN1*sizeof(int[BN2][BN3])); + + #pragma dvm realign(B3[i][j][] with A3[k1i*i+li][k2j*j+lj][ln]) + + erri = ER; + + #pragma dvm region inout(A3, B3) + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for(i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + for(n = 0; n < BN3; n++) { + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for(i = 0; i < AN1; i++) + for(j = 0; j < AN2; j++) + for(n = 0; n < AN3; n++) { + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } + } /*end region*/ + + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel ([i][j][n] on A3[k1i * i + li][k2j * j + lj][ln]) reduction(min(erri)) + for(i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + for(n = 0; n < BN3; n++) { + if (B3[i][j][n] != i * NL / 10 + j * NL / 100 + n * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + } /* end region */ + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free (B3); + free (A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 + #undef k1i + #undef li + #undef k2j + #undef lj + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel341 */ + /* PARALLEL ON arrA[2*i][3*j][1] stretching and compression */ +void parallel341() +{ + #define AN1 8 + #define AN2 10 + #define AN3 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + +/* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln] */ + int k1i = 2, li = 0; + int k2j = 3, lj = 0; + int k3n = 0, ln = 1; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + + #pragma dvm array align([i][j][] with A3[k1i*i+li][k2j*j+lj][ln]) + int B3[BN1][BN2][BN3]; + + char tname[] = "paral341"; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region local(A3, B3) + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + 4; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + + #pragma dvm parallel([i][j][n] on A3[k1i*i+li][k2j*j+lj][ln]) reduction(min(erri)) + for (i = 0; i +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void parallel41(); +static void parallel42(); +static void parallel43(); +static void parallel44(); +static void parallel45(); +static void parallel46(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int PN = 2; +static int erri, NNL, i, j, n, m, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue, s, cs; + +int main(int an, char **as) +{ + printf("===START OF parallel4========================\n"); +/* PARALLEL ON arrA[i][2* j][k][3*l] stretching */ + parallel41(); +/* PARALLEL ON arrA[i+2][ j][k][ l+3] */ + parallel42(); +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +// parallel43(); +/* PARALLEL ON arrA[i][ j][2][ l] + compression !! */ + parallel44(); +/* PARALLEL ON arrA[i][ j][ ][ k] + replication */ + parallel45(); +/* PARALLEL ON arrA[i][ j][ ][3] + compression and replication */ + parallel46(); + + printf("=== END OF parallel4 =========================\n"); + return 0; +} +/* ---------------------------------------------parallel41 */ +/* arrA4[BLOCK][BLOCK] [BLOCK] [BLOCK] + PARALLEL ON arrA[i][2* j][k][3*l] stretching */ +void parallel41() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 3 + #define lm 0 + + #pragma dvm array distribute[block][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral41 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel42 */ +/* PARALLEL ON arrA[i+2][ j][k][ l+3] shift */ +void parallel42() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 2 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 3 + + #pragma dvm array distribute[block][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral42 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel43 */ +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +void parallel43() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n -1 + #define k4n 0 + #define ln 8 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m -1 + #define lm 8 + + #pragma dvm array distribute[block][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral43 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + //#pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel44 */ +/* PARALLEL ON arrA[i][ j][2][ l] */ +void parallel44() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 2 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[block][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1*sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][ln][k4m*m+lm]) + + + char tname[] = "paral44 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][ln][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel45 */ +/* PARALLEL ON arrA[i][ j][ ][ k] */ +void parallel45() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[block][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1*sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][k4m*m+lm]) + + char tname[] = "paral45 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel46 */ +/* PARALLEL ON arrA[i][ j][ ][3] */ +void parallel46() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 0 + #define lm 3 + + #pragma dvm array distribute[block][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1*sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][lm]) + + char tname[] = "paral46 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/*-------------------------------------------------------*/ +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus124.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus124.cdv new file mode 100644 index 0000000..50bdabb --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus124.cdv @@ -0,0 +1,1141 @@ +/* PARALPLUS124 + +TESTING parallel CLAUSE . +arrA2[*][BLOCK] +or arrA2[BLOCK][*] +or arrA4[BLOCK][*][*][*] +or arrA4[*][*][*][BLOCK] etc. */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void parallel21(); +static void parallel22(); +static void parallel23(); +static void parallel24(); +static void parallel25(); +static void parallel26(); +static void parallel27(); +static void parallel28(); + +static void parallel41(); +static void parallel42(); +static void parallel43(); +static void parallel44(); +static void parallel45(); +static void parallel46(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int PN = 2; +static int erri, NNL, i, j, n, m, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue, s, cs; + +int main(int an, char **as) +{ + printf("===START OF paralplus124========================\n"); +/* PARALLEL ON arrA[i][2*j] stretching along j */ + parallel21(); +/* PARALLEL ON arrA[i+4][j] shift along i */ + parallel22(); +/* PARALLEL ON arrA[-i+8][j] reverse on i */ +// parallel23(); +/* ARALLEL ON arrA[i+4][j+4] shift along i and j */ + parallel24(); +/* PARALLEL ON arrA[i][2*j] stretching along j */ + parallel25(); +/* PARALLEL ON arrA[i+4][j] shift along i */ + parallel26(); +/* PARALLEL ON arrA[-i+8][j] reverse on i */ +// parallel27(); +/* ARALLEL ON arrA[i+4][j+4] shift along i and j */ + parallel28(); + +/* PARALLEL ON arrA[i][2* j][k][3*l] stretching */ + parallel41(); +/* PARALLEL ON arrA[i+2][ j][k][ l+3] */ + parallel42(); +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +// parallel43(); +/* PARALLEL ON arrA[i][ j][2][ l] + compression !! */ + parallel44(); +/* PARALLEL ON arrA[i][ j][ ][ k] + replication */ + parallel45(); +/* PARALLEL ON arrA[i][ j][ ][3] + compression and replication */ + parallel46(); + + printf("=== END OF paralplus124 =========================\n"); + return 0; +} +/* ---------------------------------------------parallel21 */ +/* PARALLEL ON arrA[i][2*j] stretching along j */ +void parallel21() +{ + #define AN1 8 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i 1 + #define k2i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define lj 0 + + #pragma dvm array distribute[*][block] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+21 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) + #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel22 */ +/* PARALLEL ON arrA[i+4][j] shift along i */ +void parallel22() +{ + #define AN1 8 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i 1 + #define k2i 0 + #define li 4 + #define k1j 0 + #define k2j 1 + #define lj 0 + + #pragma dvm array distribute[*][block] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+22 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) + #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel23 */ +/* PARALLEL ON arrA[-i+8][j] reverse on i */ +void parallel23() +{ + #define AN1 7 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i -1 + #define k2i 0 + #define li 8 + #define k1j 0 + #define k2j 1 + #define lj 0 + + #pragma dvm array distribute[*][block] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+23 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) +// #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel24 */ +/* PARALLEL ON arrA[i+4][j+4] shift along i and j */ +void parallel24() +{ + #define AN1 8 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i 1 + #define k2i 0 + #define li 4 + #define k1j 0 + #define k2j 1 + #define lj 4 + + #pragma dvm array distribute[*][block] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+24 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) + #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel25 */ +/* PARALLEL ON arrA[i][2*j] stretching along j */ +void parallel25() +{ + #define AN1 8 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i 1 + #define k2i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define lj 0 + + #pragma dvm array distribute[block][*] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+25 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) + #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel26 */ +/* PARALLEL ON arrA[i+4][j] shift along i */ +void parallel26() +{ + #define AN1 8 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i 1 + #define k2i 0 + #define li 4 + #define k1j 0 + #define k2j 1 + #define lj 0 + + #pragma dvm array distribute[block][*] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+26 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) + #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel27 */ +/* PARALLEL ON arrA[-i+8][j] reverse on i */ +void parallel27() +{ + #define AN1 7 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i -1 + #define k2i 0 + #define li 8 + #define k1j 0 + #define k2j 1 + #define lj 0 + + #pragma dvm array distribute[block][*] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+27 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) +// #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k2j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel28 */ +/* PARALLEL ON arrA[i+4][j+4] shift along i and j */ +void parallel28() +{ + #define AN1 8 + #define AN2 8 + /* parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] */ + #define k1i 1 + #define k2i 0 + #define li 4 + #define k1j 0 + #define k2j 1 + #define lj 4 + + #pragma dvm array distribute[block][*] + int (*A2)[AN2]; + A2 = (int (*)[AN2])malloc(AN1 * sizeof(int[AN2])); + + char tname[] = "paral+28 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + A2[i][j] = i * NL + j; + } /*end region*/ + #pragma dvm get_actual(A2) + #pragma dvm parallel([i][j] on A2[k1i * i + li][k2j * j + lj]) reduction(min(erri)), private(ia, ja) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) { + ia = k1i * i + li; + ja = k1j * j + lj; + if (A2[ia][ja] != ia * NL + ja) + erri = Min(erri, ia * NL + ja); + } + #pragma dvm get_actual(erri) + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(A2); + + #undef AN1 + #undef AN2 + #undef k1i + #undef k2i + #undef li + #undef k1j + #undef k2j + #undef lj +} +/* ---------------------------------------------parallel41 */ +/* arrA4[*][*] [BLOCK] [*] + PARALLEL ON arrA[i][2* j][k][3*l] stretching */ +void parallel41() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 3 + #define lm 0 + + #pragma dvm array distribute[*][block][*][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+41 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++){ + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel42 */ +/* PARALLEL ON arrA[i+2][ j][k][ l+3] shift */ +void parallel42() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 2 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 3 + + #pragma dvm array distribute[*][block][*][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+42 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++){ + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel43 */ +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +void parallel43() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n -1 + #define k4n 0 + #define ln 8 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m -1 + #define lm 8 + + #pragma dvm array distribute[*][block][*][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+43 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + //#pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++){ + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel44 */ +/* PARALLEL ON arrA[i][ j][2][ l] */ +void parallel44() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 2 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[*][*][*][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1*sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][ln][k4m*m+lm]) + + + char tname[] = "paral+44 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][ln][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel45 */ +/* PARALLEL ON arrA[i][ j][ ][ k] */ +void parallel45() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[*][*][block][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1*sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][k4m*m+lm]) + + char tname[] = "paral+45 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel46 */ +/* PARALLEL ON arrA[i][ j][ ][3] */ +void parallel46() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 0 + #define lm 3 + + #pragma dvm array distribute[*][*][block][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1*sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][lm]) + + char tname[] = "paral+46 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/*-------------------------------------------------------*/ +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus234.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus234.cdv new file mode 100644 index 0000000..b8e0fc7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus234.cdv @@ -0,0 +1,1689 @@ +/* PARALPLUS234 + +TESTING parallel CLAUSE +arrA3[*][BLOCK][BLOCK] +or arrA3[BLOCK][*][BLOCK] +or arrA4[BLOCK][*][*][BLOCK] +or arrA4[*][BLOCK][*][BLOCK] etc. */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void parallel31(); +static void parallel32(); +static void parallel33(); +static void parallel34(); +static void parallel35(); +static void parallel36(); +static void parallel37(); +static void parallel38(); +static void parallel39(); +static void parallel310(); +static void parallel311(); +static void parallel312(); + +static void parallel41(); +static void parallel42(); +static void parallel43(); +static void parallel44(); +static void parallel45(); +static void parallel46(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int PN = 2; +static int erri, NNL, i, j, n, m, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue, s, cs; + +int main(int an, char **as) +{ + printf("===START OF paralplus234========================\n"); +/* PARALLEL ON arrA[i][2* j][k] stretching */ + parallel31(); +/* PARALLEL ON arrA[i+2][ j][k] shift */ + parallel32(); +/* PARALLEL ON arrA[i][ j][-k+8] reverse */ +// parallel33(); +/* PARALLEL ON arrA[i][ j][2] + compression !! */ + parallel34(); +/* PARALLEL ON arrA[][ j][ k] + replication */ + parallel35(); +/* PARALLEL ON arrA[1][i][3] + compression and replication */ + parallel36(); +/* PARALLEL ON arrA[i][2* j][k] stretching */ + parallel37(); +/* PARALLEL ON arrA[i+2][ j][k] shift */ + parallel38(); +/* PARALLEL ON arrA[i][ j][-k+8] reverse */ +// parallel39(); +/* PARALLEL ON arrA[i][ j][2] + compression !! */ + parallel310(); +/* PARALLEL ON arrA[][ j][ k] + replication */ + parallel311(); +/* PARALLEL ON arrA[1][i][3] + compression and replication */ + parallel312(); + +/* PARALLEL ON arrA[i][2* j][k][3*l] stretching */ + parallel41(); +/* PARALLEL ON arrA[i+2][ j][k][ l+3] */ + parallel42(); +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +// parallel43(); +/* PARALLEL ON arrA[i][ j][2][ l] + compression !! */ + parallel44(); +/* PARALLEL ON arrA[i][ j][ ][ k] + replication */ + parallel45(); +/* PARALLEL ON arrA[i][ j][ ][3] + compression and replication */ + parallel46(); + + printf("=== END OF paralplus234 =========================\n"); + return 0; +} +/* ---------------------------------------------parallel31 */ +/* arrA[*][BLOCK] [BLOCK] + PARALLEL ON arrA[i][2* j][k] stretching */ +void parallel31() +{ + #define AN1 6 + #define AN2 6 + #define AN3 4 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define ln 0 + + #pragma dvm array distribute[*][block][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + + char tname[] = "paral+31 "; + erri = ER; + NNL = NL; + + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3) + #pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][k3n * n + ln]) reduction(min(erri)), private(ia, ja, na) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel32 */ +/* PARALLEL ON arrA[i+2][ j][k] shift */ +void parallel32() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 2 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define ln 0 + + #pragma dvm array distribute[*][block][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + + char tname[] = "paral+32 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3) + #pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][k3n * n + ln]) reduction(min(erri)), private(ia, ja, na) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel33 */ +/* PARALLEL ON arrA[i][ j][-k+8] reverse */ +void parallel33() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n -1 + #define ln 6 + + #pragma dvm array distribute[*][block][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + + char tname[] = "paral+33 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3) + //#pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][k3n * n + ln]) reduction(min(erri)), private(ia, ja, na) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel34 */ +/* PARALLEL ON arrA[i][ j][2] */ +void parallel34() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define ln 2 + + #pragma dvm array distribute[*][block][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + #pragma dvm array + int (*B3)[BN2][BN3]; + B3 = (int (*)[BN2][BN3])malloc(BN1 * sizeof(int[BN2][BN3])); + #pragma dvm realign(B3[i][j][n] with A3[k1i*i+li][k2j*j+lj][ln]) + + char tname[] = "paral+34 "; + erri = ER; + NNL = NL; + + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(B3) + #pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][ln]) reduction(min(erri)), private(n) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + if (B3[i][j][n] != i * NL / 10 + j * NL / 100 + n * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B3); + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel35 */ +/* PARALLEL ON arrA[][ j][ k] */ +void parallel35() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define BN1 6 + #define BN2 6 + #define BN3 6 + /* parameters for PARALLEL ON arrA[*][k2j*j+lj][k3n*n+ln] */ + #define k1i 0 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define ln 0 + + #pragma dvm array distribute[*][block][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + #pragma dvm array + int (*B3)[BN2][BN3]; + B3 = (int (*)[BN2][BN3])malloc(BN1 * sizeof(int[BN2][BN3])); + #pragma dvm realign(B3[][j][n] with A3[][k2j*j+lj][k3n*n+ln]) + + char tname[] = "paral+35 "; + erri = ER; + NNL = NL; + #pragma dvm region out(A3, B3) + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3, B3) + for (i = 0; i < BN1; i++) { + #pragma dvm parallel([j][n] on A3[][k2j * j + lj][k3n * n + ln]) reduction(min(erri)) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + if (B3[i][j][n] != i * NL / 10 + j * NL / 100 + n * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B3); + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel36 */ +/* PARALLEL ON arrA[1][i][3] */ +void parallel36() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + /* parameters for PARALLEL ON arrA[li][k2j*j+lj][ln] */ + #define k1i 0 + #define k2i 0 + #define k3i 0 + #define li 1 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define ln 3 + + #pragma dvm array distribute[*][block][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + #pragma dvm array + int (*B3)[BN2][BN3]; + B3 = (int (*)[BN2][BN3])malloc(BN1 * sizeof(int[BN2][BN3])); + #pragma dvm realign(B3[i][j][n] with A3[li][k2j*j+lj][ln]) + + char tname[] = "paral+36 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(B3) + #pragma dvm parallel([i][j][n] on A3[li][k2j * j + lj][ln]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + if (B3[i][j][n] != i * NL / 10 + j * NL / 100 + n * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + #pragma dvm get_actual(erri) + + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B3); + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel37 */ +/* arrA[BLOCK][*] [BLOCK] + PARALLEL ON arrA[i][2* j][k] stretching */ +void parallel37() +{ + #define AN1 6 + #define AN2 6 + #define AN3 4 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define ln 0 + + #pragma dvm array distribute[block][*][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + + char tname[] = "paral+37 "; + erri = ER; + NNL = NL; + + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3) + #pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][k3n * n + ln]) reduction(min(erri)), private(ia, ja, na) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel38 */ +/* PARALLEL ON arrA[i+2][ j][k] shift */ +void parallel38() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 2 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define ln 0 + + #pragma dvm array distribute[block][*][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + + char tname[] = "paral+38 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3) + #pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][k3n * n + ln]) reduction(min(erri)), private(ia, ja, na) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel39 */ +/* PARALLEL ON arrA[i][ j][-k+8] reverse */ +void parallel39() +{ + #define AN1 5 + #define AN2 5 + #define AN3 5 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n -1 + #define ln 6 + + #pragma dvm array distribute[block][*][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + + char tname[] = "paral+39 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3) + //#pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][k3n * n + ln]) reduction(min(erri)), private(ia, ja, na) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + if (A3[ia][ja][na] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel310 */ +/* PARALLEL ON arrA[i][ j][2] */ +void parallel310() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define ln 2 + + #pragma dvm array distribute[block][*][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + #pragma dvm array + int (*B3)[BN2][BN3]; + B3 = (int (*)[BN2][BN3])malloc(BN1 * sizeof(int[BN2][BN3])); + #pragma dvm realign(B3[i][j][n] with A3[k1i*i+li][k2j*j+lj][ln]) + + char tname[] = "paral+310 "; + erri = ER; + NNL = NL; + + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(B3) + #pragma dvm parallel([i][j][n] on A3[k1i * i + li][k2j * j + lj][ln]) reduction(min(erri)), private(n) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + if (B3[i][j][n] != i * NL / 10 + j * NL / 100 + n * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B3); + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel311 */ +/* PARALLEL ON arrA[][ j][ k] */ +void parallel311() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define BN1 6 + #define BN2 6 + #define BN3 6 + /* parameters for PARALLEL ON arrA[*][k2j*j+lj][k3n*n+ln] */ + #define k1i 0 + #define k2i 0 + #define k3i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define ln 0 + + #pragma dvm array distribute[block][*][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + #pragma dvm array + int (*B3)[BN2][BN3]; + B3 = (int (*)[BN2][BN3])malloc(BN1 * sizeof(int[BN2][BN3])); + #pragma dvm realign(B3[][j][n] with A3[][k2j*j+lj][k3n*n+ln]) + + char tname[] = "paral+311 "; + erri = ER; + NNL = NL; + #pragma dvm region out(A3, B3) + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(A3, B3) + for (i = 0; i < BN1; i++) { + #pragma dvm parallel([j][n] on A3[][k2j * j + lj][k3n * n + ln]) reduction(min(erri)) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + if (B3[i][j][n] != i * NL / 10 + j * NL / 100 + n * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + } + + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B3); + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel312 */ +/* PARALLEL ON arrA[1][i][3] */ +void parallel312() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + /* parameters for PARALLEL ON arrA[li][k2j*j+lj][ln] */ + #define k1i 0 + #define k2i 0 + #define k3i 0 + #define li 1 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define ln 3 + + #pragma dvm array distribute[block][*][block] + int (*A3)[AN2][AN3]; + A3 = (int (*)[AN2][AN3])malloc(AN1 * sizeof(int[AN2][AN3])); + #pragma dvm array + int (*B3)[BN2][BN3]; + B3 = (int (*)[BN2][BN3])malloc(BN1 * sizeof(int[BN2][BN3])); + #pragma dvm realign(B3[i][j][n] with A3[li][k2j*j+lj][ln]) + + char tname[] = "paral+312 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = i * NL / 10 + j * NL / 100 + n * NL / 1000; + } /*end region*/ + #pragma dvm get_actual(B3) + #pragma dvm parallel([i][j][n] on A3[li][k2j * j + lj][ln]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + if (B3[i][j][n] != i * NL / 10 + j * NL / 100 + n * NL / 1000) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000); + #pragma dvm get_actual(erri) + + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B3); + free(A3); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 + #undef k1i + #undef k2i + #undef k3i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef ln +} +/* ---------------------------------------------parallel41 */ +/* arrA4[*][*] [BLOCK] [BLOCK] + PARALLEL ON arrA[i][2* j][k][3*l] stretching */ +void parallel41() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 3 + #define lm 0 + + #pragma dvm array distribute[*][*][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+41 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel42 */ +/* PARALLEL ON arrA[i+2][ j][k][ l+3] shift */ +void parallel42() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 2 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 3 + + #pragma dvm array distribute[*][block][*][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+42 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel43 */ +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +void parallel43() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n -1 + #define k4n 0 + #define ln 8 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m -1 + #define lm 8 + + #pragma dvm array distribute[block][block][*][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+43 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + //#pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel44 */ +/* PARALLEL ON arrA[i][ j][2][ l] */ +void parallel44() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 2 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[block][*][*][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1 * sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][ln][k4m*m+lm]) + + + char tname[] = "paral+44 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][ln][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel45 */ +/* PARALLEL ON arrA[i][ j][ ][ k] */ +void parallel45() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[*][block][block][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1 * sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][k4m*m+lm]) + + char tname[] = "paral+45 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel46 */ +/* PARALLEL ON arrA[i][ j][ ][3] */ +void parallel46() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 0 + #define lm 3 + + #pragma dvm array distribute[*][*][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1 * sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][lm]) + + char tname[] = "paral+46 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/*-------------------------------------------------------*/ +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus34.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus34.cdv new file mode 100644 index 0000000..967449b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/PARALLEL/paralplus34.cdv @@ -0,0 +1,672 @@ +/* PARALLELPLUS34 + +TESTING parallel CLAUSE +arrA4[BLOCK][*][ BLOCK][BLOCK] or arrA4[*][BLOCK][ BLOCK][BLOCK] etc. */ + +#include +#include +#include + +#define Min(a, b) (((a) < (b)) ? (a) : (b)) + +static void parallel41(); +static void parallel42(); +static void parallel43(); +static void parallel44(); +static void parallel45(); +static void parallel46(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int PN = 2; +static int erri, NNL, i, j, n, m, ia, ja, na, ma, ib, jb, nb, mb, Avalue, Bvalue, s, cs; + +int main(int an, char **as) +{ + printf("===START OF paralplus34========================\n"); +/* PARALLEL ON arrA[i][2* j][k][3*l] stretching */ + parallel41(); +/* PARALLEL ON arrA[i+2][ j][k][ l+3] */ + parallel42(); +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +// parallel43(); +/* PARALLEL ON arrA[i][ j][2][ l] + compression !! */ + parallel44(); +/* PARALLEL ON arrA[i][ j][ ][ k] + replication */ + parallel45(); +/* PARALLEL ON arrA[i][ j][ ][3] + compression and replication */ + parallel46(); + + printf("=== END OF paralplus34 =========================\n"); + return 0; +} +/* ---------------------------------------------parallel41 */ +/* arrA4[BLOCK][*] [BLOCK] [BLOCK] + PARALLEL ON arrA[i][2* j][k][3*l] stretching */ +void parallel41() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 2 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 3 + #define lm 0 + + #pragma dvm array distribute[block][*][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+41 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel42 */ +/* PARALLEL ON arrA[i+2][ j][k][ l+3] shift */ +void parallel42() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 2 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 1 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 3 + + #pragma dvm array distribute[*][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+42 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel43 */ +/* PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse */ +void parallel43() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n -1 + #define k4n 0 + #define ln 8 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m -1 + #define lm 8 + + #pragma dvm array distribute[block][block][*][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + + char tname[] = "paral+43 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(A4) + //#pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][k3n * n + ln][k4m * m + lm]) reduction(min(erri)), private(ia, ja, na, ma) + for (i = 0; i < ((AN1 - li) / k1i); i++) + for (j = 0; j < ((AN2 - lj) / k2j); j++) + for (n = 0; n < ((AN3 - ln) / k3n); n++) + for (m = 0; m < ((AN4 - lm) / k4m); m++) { + ia = k1i * i + li; + ja = k2j * j + lj; + na = k3n * n + ln; + ma = k4m * m + lm; + if (A4[ia][ja][na][ma] != ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + } + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel44 */ +/* PARALLEL ON arrA[i][ j][2][ l] */ +void parallel44() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 2 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[block][block][*][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1 * sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][ln][k4m*m+lm]) + + + char tname[] = "paral+44 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][ln][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel45 */ +/* PARALLEL ON arrA[i][ j][ ][ k] */ +void parallel45() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 1 + #define lm 0 + + #pragma dvm array distribute[block][block][block][*] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1 * sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][k4m*m+lm]) + + char tname[] = "paral+45 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][k4m * m + lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/* ---------------------------------------------parallel46 */ +/* PARALLEL ON arrA[i][ j][ ][3] */ +void parallel46() +{ + #define AN1 6 + #define AN2 6 + #define AN3 6 + #define AN4 6 + #define BN1 3 + #define BN2 3 + #define BN3 3 + #define BN4 3 + /* parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + #define k1i 1 + #define k2i 0 + #define k3i 0 + #define k4i 0 + #define li 0 + #define k1j 0 + #define k2j 1 + #define k3j 0 + #define k4j 0 + #define lj 0 + #define k1n 0 + #define k2n 0 + #define k3n 0 + #define k4n 0 + #define ln 0 + #define k1m 0 + #define k2m 0 + #define k3m 0 + #define k4m 0 + #define lm 3 + + #pragma dvm array distribute[*][block][block][block] + int (*A4)[AN2][AN3][AN4]; + A4 = (int (*)[AN2][AN3][AN4])malloc(AN1 * sizeof(int[AN2][AN3][AN4])); + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + B4 = (int (*)[BN2][BN3][BN4])malloc(BN1 * sizeof(int[BN2][BN3][BN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k1i*i+li][k2j*j+lj][][lm]) + + char tname[] = "paral+46 "; + erri = ER; + NNL = NL; + #pragma dvm actual(erri) + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + } /*end region*/ + #pragma dvm get_actual(B4) + #pragma dvm parallel([i][j][n][m] on A4[k1i * i + li][k2j * j + lj][][lm]) reduction(min(erri)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + if (B4[i][j][n][m] != i * NL / 10 + j * NL / 100 + n * NL / 1000 + m) + erri = Min(erri, i * NL / 10 + j * NL / 100 + n * NL / 1000 + m); + #pragma dvm get_actual(erri) + s = 0; + cs = 0; + if (erri == ER && s == cs) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef k1i + #undef k2i + #undef k3i + #undef k4i + #undef li + #undef k1j + #undef k2j + #undef k3j + #undef k4j + #undef lj + #undef k1n + #undef k2n + #undef k3n + #undef k4n + #undef ln + #undef k1m + #undef k2m + #undef k3m + #undef k4m + #undef lm +} +/*-------------------------------------------------------*/ +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign11.cdv new file mode 100644 index 0000000..01bc6ca --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign11.cdv @@ -0,0 +1,774 @@ +/* REALIGN11 +Testing REALIGN directive */ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void realign111(); +static void realign112(); +static void realign1121(); +static void realign112r(); +static void realign113(); +static void realign113r(); +static void realign114(); +static void realign1141(); +static void realign115(); +static void realign116(); + +static void ansyes(const char tname[]); +static void ansno (const char tname[]); + +static int NL = 1000; +static int ER = 10000; + +static int erria, errib, i, j, ia, ib; + +int main(int an, char **as) +{ + printf("=== START OF REALIGN11 ======================\n"); + + /* ALIGN arrB[i] WITH arrA[i] REALIGN arrB[i] WITH arrA[2*i+8] */ + realign111(); + /* ALIGN arrB[i] WITH arrA[i+4] REALIGN arrB[i] WITH arrA[i+8] */ + realign112(); + /* ALIGN arrB[i] WITH arrA[i+2] REALIGN arrB[i] WITH arrA[2*i+5] */ + realign1121(); + /* ALIGN arrB[i] WITH arrA[i+4] REALIGN arrB[i] WITH arrA[-i+8] */ +// realign112r(); + /* ALIGN arrB[i] WITH arrA[3*i+2] REALIGN arrB[i] WITH arrA[2*i+1] */ + realign113(); + /* ALIGN arrB[i] WITH arrA[-i+8] REALIGN arrB[i] WITH arrA[3*i+2] */ +// realign113r(); + /* ALIGN arrB[i] WITH arrA[2*i+8] REALIGN arrB[i] WITH arrA[i] */ + realign114(); + /* ALIGN arrB[i] WITH arrA[2*i] REALIGN arrB[i] WITH arrA[i+2] */ + realign1141(); + /* ALIGN arrB[ ] WITH arrA[ ] REALIGN arrB[i] WITH arrA[i+4] */ + realign115(); + /* ALIGN arrB[i] WITH arrA[4*i+3] REALIGN arrB[] WITH arrA[] */ + realign116(); + + printf ("=== END OF REALIGN11 ======================\n"); + return 0; +} + +/* ---------------------------------------------REALIGN111 */ + /* ALIGN arrB[i] WITH arrA[i] REALIGN arrB[i] WITH arrA[2*i+8] */ +void realign111() +{ + #define AN1 30 + #define BN1 8 + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 1,li = 0; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 2, lri = 8; /* lri = -1 RTS err */ + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + + char tname[] = "realign111 "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i-li) == (((i-li)/k1i) * k1i)) && + (((i-li)/k1i) >= 0) && + (((i-li)/k1i) < BN1)) { + ib = (i-li)/k1i; + B1[ib] = ib; + } + } + + } /* end region */ + + #pragma dvm realign (B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region inlocal(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) private(ia), reduction(min(erria), min(errib)) + for (i = 0; i < BN1; i++) + { + if (B1[i] != (i)) + errib = Min(errib, i); + ia=kr1i * i + lri; + if (A1[ia] != (ia)) + erria = Min(erria, i); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------REALIGN112 */ + /* ALIGN arrB[i] WITH arrA[i+4] REALIGN arrB[i] WITH arrA[i+8] */ +void realign112() +{ + #define AN1 16 + #define BN1 4 + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 1,li = 4; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 1,lri = 8; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + + char tname[] = "realign112 "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 1; + + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i * 2; + if (((i-li) == (((i-li)/k1i) * k1i)) && + (((i-li)/k1i) >= 0) && + (((i-li)/k1i) < BN1)){ + ib = (i-li)/k1i; + B1[ib] += ib; + } + } + + } /* end region */ + + #pragma dvm realign(B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region inout(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) private(ia), reduction(min(erria), min(errib)) + for (i = 0; i < BN1; i++) + { + if (B1[i] != (i+1)) + errib = Min(errib, i); + ia=kr1i * i + lri; + if (A1[ia] != ia*2) + erria = Min(erria, i); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------REALIGN1121*/ + /* ALIGN arrB[i] WITH arrA[i+2] REALIGN arrB[i] WITH arrA[2*i+5] */ +void realign1121() +{ + int AN1 = 25; + int BN1 = 7; + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 1; + int li = 4; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 2; + int lri = 5; + + char tname[] = "realign1121"; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + A1 = malloc(sizeof(int[AN1])); + B1 = malloc(sizeof(int[BN1])); + + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 2; + } + + #pragma dvm region inout(B1), out(A1) + { + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] += ib; + } + } + } + + #pragma dvm realign(B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual(erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i] on B1[i]) reduction(min(erria), min(errib)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i+2) + errib = Min(errib, i); + ia = kr1i * i + lri; + if (A1[ia] != ia) + erria = Min(erria, i); + } + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + free(B1); + free(A1); +} + +/* ---------------------------------------------REALIGN112r */ + /* ALIGN arrB[i] WITH arrA[i+4] REALIGN arrB[i] WITH arrA[-i+8] */ +void realign112r() +{ + #define AN1 12 + #define BN1 5 + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 1,li = 4; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = -1,lri = 8; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + + char tname[] = "realign112r "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i-li) == (((i-li)/k1i) * k1i)) && + (((i-li)/k1i) >= 0) && + (((i-li)/k1i) < BN1)){ + ib = (i-li)/k1i; + B1[ib] = ib; + } + } + + } /* end region */ + + #pragma dvm realign(B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) private(ia), reduction(min(erria), min(errib)) + for (i = 0; i < BN1; i++) + { + if (B1[i] != (i)) + errib = Min(errib, i); + ia=kr1i * i + lri; + if (A1[ia] != (ia)) + erria = Min(erria, i); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} + +/* ---------------------------------------------REALIGN113 */ + /* ALIGN arrB[i] WITH arrA[3*i+2] REALIGN arrB[i] WITH arrA[2*i+1] */ +void realign113() +{ + #define AN1 30 + #define BN1 6 + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 3,li = -2; /* 3*i + (-2) - RTS err */ +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 2,lri = -1; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i - li]) + int B1[BN1]; + + char tname[] = "realign113 "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 5; + + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i+3; +// if (((i-li) == (((i-li)/k1i) * k1i)) && +// (((i-li)/k1i) >= 0) && +// (((i-li)/k1i) < BN1)) { +// ib = (i-li)/k1i; +// B1[ib] = B1[ib] + ib; +// } +// } + if (((i+li) == (((i+li)/k1i) * k1i)) && + (((i+li)/k1i) >= 0) && + (((i+li)/k1i) < BN1)) { + ib = (i+li)/k1i; + B1[ib] = B1[ib] + ib; + } + } + + } /* end region */ + + #pragma dvm realign(B1[i] with A1[kr1i * i - lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) reduction(min(erria), min(errib)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i+5) + errib = Min(errib, i); + ia=kr1i * i - lri; + if (A1[ia] != (ia+3)) + erria = Min(erria, i); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------REALIGN113r */ + /* ALIGN arrB[i] WITH arrA[-i+8] REALIGN arrB[i] WITH arrA[3*i+2] */ +void realign113r() +{ + #define AN1 18 + #define BN1 5 + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = -1,li = 8; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 3,lri = 2; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + + char tname[] = "realign113r "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i-li) == (((i-li)/k1i) * k1i)) && + (((i-li)/k1i) >= 0) && + (((i-li)/k1i) < BN1)) { + ib = (i-li)/k1i; + B1[ib] = ib; + } + } + + } /* end region */ + + #pragma dvm realign(B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i] on B1[i]) reduction(min(erria),min(errib)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != (i)) + errib = Min(errib, i); + ia=kr1i * i + lri; + if (A1[ia] != (ia)) + erria = Min(erria, i); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} + +/* ---------------------------------------------REALIGN114 */ + /* ALIGN arrB[i] WITH arrA[2*i+8] REALIGN arrB[i] WITH arrA[i] */ +void realign114() +{ + #define AN1 24 + #define BN1 8 + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 2, li = 8; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 1, lri = 0; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + + char tname[] = "realign114 "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 0; + + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i; + if (((i-li) == (((i-li)/k1i) * k1i)) && + (((i-li)/k1i) >= 0) && + (((i-li)/k1i) < BN1)) { + ib = (i-li)/k1i; + B1[ib] = ib; + } + } + + } /* end region */ + + #pragma dvm realign(B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) reduction(min(erria), min(errib)), private (ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != (i)) + errib = Min(errib, i); + ia=kr1i * i + lri; + if (A1[ia] != (ia)) + erria = Min(erria, i); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} +/* ------ ---------------------------------------REALIGN1141*/ + /* ALIGN arrB[i] WITH arrA[4*i] REALIGN arrB[i] WITH arrA[i+2] */ +void realign1141() +{ + int AN1 = 24; + int BN1 = 6; + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 4; + int li = 0; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 1; + int lri = 2; + + char tname[] = "realign1141"; + + #pragma dvm array distribute[block] + int *A1; + #pragma dvm array + int *B1; + + A1 = malloc(sizeof(int[AN1])); + B1 = malloc(sizeof(int[BN1])); + + #pragma dvm realign(B1[i] with A1[k1i * i + li]) + + erria = ER; + errib = ER; + + #pragma dvm region out(B1, A1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = 4; + + #pragma dvm parallel([i] on A1[i]) private(ib) + for (i = 0; i < AN1; i++) + { + A1[i] = i+2; + if (((i - li) == (((i - li) / k1i) * k1i)) && + (((i - li) / k1i) >= 0) && + (((i - li) / k1i) < BN1)) + { + ib = (i - li) / k1i; + B1[ib] += ib; + } + } + } + + #pragma dvm realign(B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual(erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i] on B1[i]) reduction(min(erria), min(errib)), private(ia) + for (i = 0; i < BN1; i++) + { + if (B1[i] != i+4) + errib = Min(errib, i); + ia = kr1i * i + lri; + if (A1[ia] != ia+2) + erria = Min(erria, i); + } + } + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + free(B1); + free(A1); +} +/* ---------------------------------------------REALIGN115 */ + /* ALIGN arrB[ ] WITH arrA[ ] REALIGN arrB[i] WITH arrA[i+4] */ +void realign115() +{ + #define AN1 16 + #define BN1 8 + +/* parameters for ALIGN arrB[] WITH arrA[] */ + int k1i = 0,li = 0; +/* parameters for REALIGN arrB[i] WITH arrA[kr1i*i+lri] */ + int kr1i = 1,lri = 4; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([] with A1[]) + int B1[BN1]; + + char tname[] = "realign115 "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i; + + #pragma dvm parallel([i] on A1[i]) + for (i = 0; i < AN1; i++) + A1[i] = i; + + } /* end region */ + + #pragma dvm realign(B1[i] with A1[kr1i * i + lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) private (ia), reduction(min(erria), min(errib)) + for (i = 0; i < BN1; i++) + { + if (B1[i] != (i)) + errib = Min(errib, i); + ia=kr1i * i + lri; + if (A1[ia] != (ia)) + erria = Min(erria, i); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} +/* ---------------------------------------------REALIGN116 */ + /* ALIGN arrB[i] WITH arrA[4*i+3] REALIGN arrB[] WITH arrA[] */ +void realign116() +{ + #define AN1 35 + #define BN1 8 + +/* parameters for ALIGN arrB[i] WITH arrA[k1i*i+li] */ + int k1i = 4,li = 3; /* 4*i-3 RTS err */ +/* parameters for REALIGN arrB[] WITH arrA[] */ + int kr1i = 0,lri = 0; + + #pragma dvm array distribute[block] + int A1[AN1]; + #pragma dvm array align([i] with A1[k1i*i+li]) + int B1[BN1]; + + char tname[] = "realign116 "; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A1, B1) + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i+6; + + #pragma dvm parallel([i] on A1[i]) + for (i = 0; i < AN1; i++) + A1[i] = (i+1)*3; + + } /* end region */ + + #pragma dvm realign(B1[] with A1[]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region inout(A1,B1) + { + #pragma dvm parallel([i] on B1[i]) reduction(min(errib)) + for (i = 0; i < BN1; i++) + if (B1[i] != i+6) + errib = Min(errib, i); + #pragma dvm parallel([i] on A1[i]) reduction(min(erria)) + for (i = 0; i < AN1; i++) + if (A1[i] != (i+1)*3) + erria = Min(erria, i); + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 +} +/*-------------------------------------------------------*/ +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign22.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign22.cdv new file mode 100644 index 0000000..afd396f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign22.cdv @@ -0,0 +1,855 @@ +/* REALIGN22 +Testing REALIGN directive */ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void realign221(); +static void realign222(); +static void realign223(); +static void realign224(); +static void realign225(); +static void realign226(); +static void realign227(); +static void realign228(); +static void realign229(); + +static void ansyes(const char tname[]); +static void ansno (const char tname[]); + +static int NL = 10000; +static int ER = 100000; + +static int s, cs, erri, erria, errib, i, j, k, n, ia, ja, ib, jb; + +int main(int an, char **as) +{ + printf("=== START OF REALIGN22 ======================\n"); + + /* ALIGN arrB[i][j] WITH arrA[i][j] + REALIGN arrB[i][j] WITH arrA[3*i+2][2*j+1] */ + realign221(); + /* ALIGN arrB[i][j] WITH arrA[j+1][i] + REALIGN arrB[i][j] WITH arrA[i+4][j] */ + realign222(); + /* ALIGN arrB[i][*] WITH arrA[*][i] + REALIGN arrB[i][j] WITH arrA[i+4][j+4] */ + realign223(); + /* ALIGN arrB[*][*] WITH arrA[*][1] + REALIGN arrB[i][j] WITH arrA[i+4][j+4] */ + realign224(); + /* ALIGN arrB[i][j] WITH arrA[i][j] + REALIGN arrB[*][*] WITH arrA[*][2] */ + realign225(); + /* ALIGN arrB[i][j] WITH arrA[i][j] + REALIGN arrB[i][j] WITH arrA[2*j+1][3*i+2] */ + realign226(); + /* ALIGN arrB[*][*] WITH arrA[4][*] + REALIGN arrB[i][j] WITH arrA[i+2][2*j] */ + realign227(); + /* ALIGN arrB[i][j] WITH arrA[j][i] + REALIGN arrB[*][*] WITH arrA[3][*] */ + realign228(); + /* ALIGN arrB[i][j] WITH arrA[2*i][3*j+1] + REALIGN arrB[i][j] WITH arrA[j+6][i+2] */ + realign229(); + + printf ("=== END OF REALIGN22 ======================\n"); + return 0; +} + +/* ---------------------------------------------REALIGN221 */ + /* ALIGN arrB[i][j] WITH arrA[i][j] + REALIGN arrB[i][j] WITH arrA[3*i+2][2*j+1] */ +void realign221() +{ + #define AN1 16 + #define AN2 16 + #define BN1 4 + #define BN2 4 + +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i*i+li][k2j*j+lj] */ + int k1i = 1, li = 0; + int k2j = 1, lj = 0; +/* parameters for REALIGN arrB[i][j] WITH arrA[kr1i*i+lri][kr2j*j+lrj] */ + int kr1i = 3, lri = 2; + int kr2j = 2, lrj = 1; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + + char tname[] = "realign221"; + + erria = ER; + errib = ER; + + #pragma dvm region in(A2,B2), out(A2,B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + + #pragma dvm parallel([i][j] on A2[i][j]) private(ib,jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = (i*NL+j)*2; + if ( + ((i-li) ==(((i-li)/k1i) * k1i)) && + ((j-lj) ==(((j-lj)/k2j) * k2j)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) + ) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + B2[ib][jb]= B2[ib][jb] + ib*NL+jb; + } + } + + } /* end region */ + + #pragma dvm realign(B2[i][j] with A2[kr1i * i + lri][kr2j * j + lrj]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region in(A2,B2), local(A2,B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erria),min(errib)), private(ia,ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i*NL+j)) + errib = Min(errib, i*NL/10+j); + + ia=kr1i * i + lri; + ja=kr2j * j + lrj; + if (A2[ia][ja] != (ia*NL+ja)*2) + erria = Min(erria, i*NL/10+j); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------REALIGN222 */ + /* ALIGN arrB[i][j] WITH arrA[j+1][i] + REALIGN arrB[i][j] WITH arrA[i+4][j] */ +void realign222() +{ + #define AN1 8 + #define AN2 8 + #define BN1 4 + #define BN2 4 + +/* parameters for ALIGN arrB[i][j] WITH arrA[k2j*j+lj][k1i*i+li] */ + int k1i = 1,li = 0; + int k2j = 1,lj = 1; +/* parameters for REALIGN arrB[i][j] WITH arrA[kr1i*i+lri][kr2j*j+lrj] */ + int kr1i = 1,lri = 4; + int kr2j = 1,lrj = 0; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k2j * j + lj][k1i * i + li]) + int B2[BN1][BN2]; + + char tname[] = "realign222"; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A2,B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 1; + + #pragma dvm parallel([i][j] on A2[i][j]) private(ib), private(jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i*NL+j; + if ( + ((i-lj) ==(((i-lj)/k2j) * k2j)) && + ((j-li) ==(((j-li)/k1i) *k1i)) && + (((i-lj)/k2j) >= 0) && + (((j-li)/k1i) >= 0) && + (((i-lj)/k2j) < BN2) && + (((j-li)/k1i) < BN1) + ) + { + ib = (j-li)/k1i; + jb = (i-lj)/k2j; + B2[ib][jb]=B2[ib][jb]+ib*NL+jb; + } + } + + } /* end region */ + + #pragma dvm realign(B2[i][j] with A2[kr1i * i + lri][kr2j * j + lrj]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) private(ia,ja), reduction(min(erria),min(errib)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i*NL+j)+1) + errib = Min(errib, i*NL/10+j); + ia=kr1i * i + lri; + ja=kr2j * j + lrj; + if (A2[ia][ja] != (ia*NL+ja)) + erria = Min(erria, i*NL/10+j); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------REALIGN223 */ + /* ALIGN arrB[i][*] WITH arrA[*][i] + REALIGN arrB[i][j] WITH arrA[i+4][j+4] */ +void realign223() +{ + #define AN1 10 + #define AN2 10 + #define BN1 4 + #define BN2 4 + +/* parameters for ALIGN arrB[i][] WITH arrA[][k1i*i+li] */ + int k1i = 1, li = 0; + int k2j = 0, lj = 0; +/* parameters for REALIGN arrB[i][j] WITH arrA[kr1i*i+lri][kr2j*j+lrj] */ + int kr1i = 1, lri = 4; + int kr2j = 1, lrj = 4; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][] with A2[][k1i * i + li]) + int B2[BN1][BN2]; + + char tname[] = "realign223"; + + erria = ER; + errib = ER; + + #pragma dvm actual (errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = i*NL+j+5; + + #pragma dvm parallel([i][j] on A2[i][j]) private(ib,jb,k), reduction (min(errib)) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i*NL+j; + for (k = 0; k < BN2; k++) + { + if ( + ((j-li) ==(((j-li)/k1i) *k1i)) && + (((j-li)/k1i) >= 0) && + (((j-li)/k1i) < BN1) + ) + { + ib = ((j-li)/k1i); + jb = k; + if (B2[ib][jb] !=(ib*NL+jb+5)) + errib = Min(errib, i*NL/10+j); + } + } + } + + } /* end region */ + + #pragma dvm realign(B2[i][j] with A2[kr1i * i + lri][kr2j * j + lrj]) + + #pragma dvm get_actual (errib) + #pragma dvm actual (erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erria), min(errib)), private(ia,ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i*NL+j+5)) + errib = Min(errib, i*NL/10+j); + ia=kr1i * i + lri; + ja=kr2j * j + lrj; + if (A2[ia][ja] != (ia*NL+ja)) + erria = Min(erria, i*NL/10+j); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------REALIGN224 */ + /* ALIGN arrB[*][*] WITH arrA[*][1] + ALIGN arrB[i][j] WITH arrA[i+4][j+4] shift along i and j */ +void realign224() +{ + #define AN1 12 + #define AN2 14 + #define BN1 5 + #define BN2 6 + +/* parameters for ALIGN arrB[][] WITH arrA[][lj] */ + int k1i = 0, li = 0; + int k2j = 0, lj = 1; +/* parameters for REALIGN arrB[i][j] WITH arrA[kr1i*i+lri][kr2j*j+lrj] */ + int kr1i = 1, lri = 4; + int kr2j = 1, lrj = 4; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([][] with A2[][k2j * j + lj]) + int B2[BN1][BN2]; + + char tname[] = "realign224"; + + erria = ER; + errib = ER; + + #pragma dvm actual (errib) + + #pragma dvm region inout(A2,B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = (i*NL+j)*2; + + #pragma dvm parallel([i][j] on A2[i][j]) private(ib,jb,k,n), reduction(min(errib)) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i*NL+j+5; + if (j == (lj)) + for (k = 0; k < BN1; k++) + for (n = 0; n < BN2; n++) + { + ib = k; + jb = n; + if (B2[ib][jb] !=(ib*NL+jb)*2) + errib = Min(errib, i*NL/10+j); + } + } + + } /* end region */ + + #pragma dvm realign(B2[i][j] with A2[kr1i * i + lri][kr2j * j + lrj]) + + #pragma dvm get_actual (errib) + #pragma dvm actual (erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erria), min(errib)), private(ia,ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i*NL+j)*2) + errib = Min(errib, i*NL/10+j); + ia=kr1i * i + lri; + ja=kr2j * j + lrj; + if (A2[ia][ja] != (ia*NL+ja+5)) + erria = Min(erria, i*NL/10+j); + } + + } /* end region */ + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------REALIGN225 */ + /* ALIGN arrB[i][j] WITH arrA[i][j] + REALIGN arrB[*][*] WITH arrA[*][2] */ +void realign225() +{ + #define AN1 10 + #define AN2 10 + #define BN1 4 + #define BN2 4 + +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i*i+li][k2j*j+lj] */ + int k1i = 1, li = 0; + int k2j = 1, lj = 0; +/* parameters for REALIGN arrB[][] WITH arrA[][lrj] */ + int kr1i = 0, lri = 0; + int kr2j = 0, lrj = 2; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + + char tname[] = "realign225"; + + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + + #pragma dvm parallel([i][j] on A2[i][j]) private(ib,jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i*NL+j; + if ( + ((i-li) ==(((i-li)/k1i) * k1i)) && + ((j-lj) ==(((j-lj)/k2j) *k2j)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) + ) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + B2[ib][jb]=ib*NL+jb; + } + } + + } /* end region */ + + #pragma dvm realign(B2[][] with A2[][kr2j * j + lrj]) + + #pragma dvm actual (errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction (min(errib)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + if (B2[i][j] != (i*NL+j)) + errib = Min(errib, i*NL/10+j); + + } /* end region */ + + #pragma dvm get_actual(errib) + + if (errib == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------REALIGN226 */ + /* ALIGN arrB[i][j] WITH arrA[i][j] + REALIGN arrB[i][j] WITH arrA[2*j+1][3*i+2] */ +void realign226() +{ + #define AN1 16 + #define AN2 18 + #define BN1 6 + #define BN2 4 + +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i*i+li][k2j*j+lj] */ + int k1i = 1, li = 0; + int k2j = 1, lj = 0; +/* parameters for REALIGN arrB[i][j] WITH arrA[kr2j*j+lrj][kr1i*i+lri] */ + int kr1i = 3, lri = 2; + int kr2j = 2, lrj = 1; + + #pragma dvm array distribute[block][block] + int A2[AN1][AN2]; + #pragma dvm array align([i][j] with A2[k1i * i + li][k2j * j + lj]) + int B2[BN1][BN2]; + + char tname[] = "realign226"; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A2), in(B2), out(B2) + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + + } /* end region */ + + #pragma dvm region + { + #pragma dvm parallel([i][j] on A2[i][j]) private(ib,jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = (i*NL+j)*3; + if ( + ((i-li) ==(((i-li)/k1i) * k1i)) && + ((j-lj) ==(((j-lj)/k2j) * k2j)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) + ) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + B2[ib][jb]=ib*NL+jb; + } + } + + } /* end region */ + + #pragma dvm realign(B2[i][j] with A2[kr2j*j+lrj][kr1i*i+lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erria),min(errib)),private(ia,ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i*NL+j)) + errib = Min(errib, i*NL/10+j); + ia=kr2j * j + lrj; + ja=kr1i * i + lri; + if (A2[ia][ja] != (ia*NL+ja)*3) + erria = Min(erria,i*NL/10+j); + } + + } /* end region */ + + #pragma dvm get_actual(errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef BN1 + #undef BN2 +} +/* ---------------------------------------------REALIGN227 */ + /* ALIGN B2[*][*] WITH arrA[4][*] + REALIGN B2[i][j] WITH arrA[i+2][2*j] */ +void realign227() +{ + int AN1 = 10; + int AN2 = 12; + int BN1 = 4; + int BN2 = 6; + +/* parameters for ALIGN arrB[][] WITH arrA[li][] */ + int k1i = 0, li = 4; + int k2j = 0, lj = 0; +/* parameters for REALIGN arrB[i][j] WITH arrA[kr1i*i+li][kr2j*j+lj] */ + int kr1i = 1, lri = 2; + int kr2j = 2, lrj = 0; + + char tname[] = "realign227"; + + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + #pragma dvm array + int (*B2)[BN2]; + + A2 = malloc(sizeof(int[AN1][AN2])); + B2 = malloc(sizeof(int[BN1][BN2])); + + #pragma dvm realign(B2[][] with A2[li][]) + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([j][i] on A2[i][j]) private(ib, jb, k, n) + for (j = 0; j < AN2; j++) + for (i = 0; i < AN1; i++) + { + A2[i][j] = i * NL + j + 4; + if (i == li) + for (k = 0; k < BN1; k++) + for (n = 0; n < BN2; n++) + { + ib = k; + jb = n; + B2[ib][jb] = ib * NL + jb + 7; + } + } + } + + #pragma dvm realign(B2[i][j] with A2[kr1i * i + lri][kr2j * j + lrj]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erria), min(errib)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j + 7)) + errib = Min(errib, i*NL/10+j); + ia = kr1i * i + lri; + ja = kr2j * j + lrj; + if (A2[ia][ja] != (ia * NL + ja + 4)) + erria = Min(erria, i*NL/10+j); + } + } + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + free(B2); + free(A2); +} +/* ---------------------------------------------REALIGN228 */ + /* ALIGN arrB[i][j] WITH arrA[j][i] + REALIGN arrB[*][*] WITH arrA[3][*] */ +void realign228() +{ + int AN1 = 14; + int AN2 = 8; + int BN1 = 4; + int BN2 = 3; + +/* parameters for ALIGN arrB[i][j] WITH arrA[k2j*j+lj][k1i*i+li] */ + int k1i = 1, li = 0; + int k2j = 1, lj = 0; +/* parameters for REALIGN arrB[][] WITH arrA[lri][] */ + int kr1i = 0, lri = 3; + int kr2j = 0, lrj = 0; + + char tname[] = "realign228"; + + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + #pragma dvm array + int (*B2)[BN2]; + + A2 = malloc(sizeof(int[AN1][AN2])); + B2 = malloc(sizeof(int[BN1][BN2])); + + #pragma dvm realign(B2[i][j] with A2[k2j * j + lj][k1i * i + li]) + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 1; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if ( + ((i-lj) ==(((i-lj)/k2j) * k2j)) && + ((j-li) ==(((j-li)/k1i) * k1i)) && + (((i-lj)/k2j) >= 0) && + (((j-li)/k1i) >= 0) && + (((i-lj)/k2j) < BN2) && + (((j-li)/k1i) < BN1) + ) + { + ib = (j-li)/k1i; + jb = (i-lj)/k2j; + B2[ib][jb] += ib*NL+jb; + } + } + } + + #pragma dvm realign(B2[][] with A2[lri][]) + + #pragma dvm actual(errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(errib)) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + if (B2[i][j] != i * NL + j + 1) + errib = Min(errib, i*NL/10+j); + } + + #pragma dvm get_actual(errib) + + if (errib == ER) + ansyes(tname); + else + ansno(tname); + + free(B2); + free(A2); +} +/* ---------------------------------------------REALIGN229 */ + /* ALIGN B2[i][j] WITH arrA[2*i][3*j+1] + REALIGN B2[i][j] WITH arrA[j+6][i+2] */ +void realign229() +{ + int AN1 = 12; + int AN2 = 18; + int BN1 = 4; + int BN2 = 6; + +/* parameters for ALIGN arrB[i][j] WITH arrA[k1i*i+li][k2j*j+lj] */ + int k1i = 2, li = 0; + int k2j = 3, lj = 1; +/* parameters for REALIGN arrB[i][j] WITH arrA[kr2j*j+lrj][kr1i*i+lri] */ + int kr1i = 1, lri = 2; + int kr2j = 1, lrj = 6; + + char tname[] = "realign229"; + + #pragma dvm array distribute[block][block] + int (*A2)[AN2]; + #pragma dvm array + int (*B2)[BN2]; + + A2 = malloc(sizeof(int[AN1][AN2])); + B2 = malloc(sizeof(int[BN1][BN2])); + + #pragma dvm realign(B2[i][j] with A2[k1i * i + li][k2j * j + lj]) + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + B2[i][j] = 0; + #pragma dvm parallel([i][j] on A2[i][j]) private(ib, jb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + { + A2[i][j] = i * NL + j; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + B2[ib][jb] = ib * NL + jb; + } + } + } + + #pragma dvm realign(B2[i][j] with A2[kr2j * j + lrj][kr1i * i + lri]) + + #pragma dvm actual (erria, errib) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) reduction(min(erria), min(errib)), private(ia, ja) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + { + if (B2[i][j] != (i * NL + j)) + errib = Min(errib, i*NL/10+j); + ia=kr2j * j + lrj; + ja=kr1i * i + lri; + if (A2[ia][ja] != (ia * NL + ja)) + erria = Min(erria, i*NL/10+j); + } + } + + #pragma dvm get_actual(erria, errib) + + if ((erria == ER) && (errib == ER)) + ansyes(tname); + else + ansno(tname); + + free(B2); + free(A2); +} + +/*-------------------------------------------------------*/ + +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign33.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign33.cdv new file mode 100644 index 0000000..2be207c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign33.cdv @@ -0,0 +1,775 @@ +/* REALIGN33 +Testing ALIGN and REALIGN directives */ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void realign331(); +static void realign332(); +static void realign333(); +static void realign334(); +static void realign335(); +static void realign336(); + +static void ansyes(const char tname[]); +static void ansno (const char tname[]); + +static int NL = 10000; +static int ER = 100000; + +static int s,cs,erria,errib,i,j,n,l,ia,ja,na,ib,jb,nb; + +int main(int an, char **as) +{ + printf("=== START OF REALIGN33 ===================\n"); + + /* ALIGN arrB3[i][j][n] WITH arrA3[i][j][n] + REALIGN arrB3[i][j][n] WITH arrA3[i+1][j+2][n+3] */ + realign331(); + /* ALIGN arrB3[i][j][n] WITH arrA3[i][j][n] + REALIGN arrB3[i][j][n] WITH arrA3[2*i][3*j][5*n] */ + realign332(); + /* ALIGN arrB3[i][j][n] WITH arrA3[i+2][j+4][n+3] + REALIGN arrB3[i][j][n] WITH arrA3[2*i+1][2*n][j+1] */ + realign333(); + /* ALIGN arrB3[i][j][n] WITH arrA3[n+1][3*i+1][j+2] + REALIGN arrB3[i][j][n] WITH arrA3[2*j][i+1][2*n+1] */ + realign334(); + /* ALIGN arrB[*][*][*] WITH arrA[*][*][*] + REALIGN arrB[i][j][n] WITH arrA[i][j][n] */ + realign335(); + /* ALIGN arrB[i][j][n] WITH arrA[i][j+1][2*n+1] + REALIGN arrB[*][j][n] WITH arrA[j+1][n][1] */ + realign336(); + + printf("=== END OF REALIGN33 ===================\n"); + return 0; +} + +/* ----------------------------------------------------realign331 */ + /* ALIGN arrB3[i][j][n] WITH arrA3[i][j][n] + REALIGN arrB3[i][j][n] WITH arrA3[i+1][j+2][n+3] */ + +void realign331() +{ + #define AN1 10 + #define AN2 10 + #define AN3 10 + #define BN1 9 + #define BN2 8 + #define BN3 6 + +/* parameters for ALIGN arrB[i][j][n] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i=1, li=0; + int k2j=1, lj=0; + int k3n=1, ln=0; +/* parameters for REALIGN arrB[i][j][n] WITH arrA[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn] */ + int kr1i=1, lri=1; + int kr2j=1, lrj=2; + int kr3n=1, lrn=3; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j][n] with A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) + int B3[BN1][BN2][BN3]; + + char tname[] = "realign331"; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A3,B3) + { + +// A3 = 0; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = 0; + +// B3 = 0; + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = 0; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib,jb,nb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i*NL/10+j*NL/100+n*NL/1000; + if (((i-li) == (((i-li)/k1i) * k1i)) && + ((j-lj) == (((j-lj)/k2j) * k2j)) && + ((n-ln) == (((n-ln)/k3n) * k3n)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((n-ln)/k3n) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) && + (((n-ln)/k3n) < BN3)) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + nb = (n-ln)/k3n; + B3[ib][jb][nb]=ib*NL/10+jb*NL/100+nb*NL/1000; + } + } /* end of loop */ + + } /* end region */ + + #pragma dvm realign(B3[i][j][n] with A3[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn]) + + s=0; + + #pragma dvm actual (erria, errib, s) + + #pragma dvm region inlocal(A3,B3) + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) reduction(min(erria),min(errib),sum(s)),private(ia,ja,na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + { + s = s + B3[i][j][n]; + if (B3[i][j][n] != (i*NL/10+j*NL/100+n*NL/1000)) + errib = Min(errib,i*NL/10 + j*NL/100 + n*NL/1000); + ia=kr1i * i + lri; + ja=kr2j * j + lrj; + na=kr3n * n + lrn; + if (A3[ia][ja][na] != (ia*NL/10+ja*NL/100+na*NL/1000)) + erria = Min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000); + } /* end of loop */ + + } /* end region */ + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000; + + #pragma dvm get_actual(erria, errib, s) + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +/* ----------------------------------------------------realign332 */ + /* ALIGN arrB3[i][j][n] WITH arrA3[i][j][n] + REALIGN arrB3[i][j][n] WITH arrA3[2*i][3*j][5*n] */ + +void realign332() +{ + #define AN1 12 + #define AN2 16 + #define AN3 25 + #define BN1 4 + #define BN2 3 + #define BN3 5 + +/* parameters for ALIGN arrB[i][j][n] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i=1, li=0; + int k2j=1, lj=0; + int k3n=1, ln=0; +/* parameters for REALIGN arrB[i][j][n] WITH arrA[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn] */ + int kr1i=2, lri=0; + int kr2j=3, lrj=0; + int kr3n=5, lrn=0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j][n] with A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) + int B3[BN1][BN2][BN3]; + + char tname[] = "realign332"; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A3,B3) + { + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = 0; + + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = 0; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib,jb,nb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n]=i*NL/10+j*NL/100+n*NL/1000 + 10; + if ( + ((i-li) == (((i-li)/k1i) * k1i)) && + ((j-lj) == (((j-lj)/k2j) *k2j)) && + ((n-ln) == (((n-ln)/k3n) * k3n)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((n-ln)/k3n) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) && + (((n-ln)/k3n) < BN3) + ) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + nb = (n-ln)/k3n; + B3[i][j][n]=ib*NL/10+jb*NL/100+nb*NL/1000 + 5; + } + } /* end of loop */ + + } /* end region */ + + #pragma dvm realign(B3[i][j][n] with A3[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn]) + + s=0; + + #pragma dvm actual (erria, errib, s) + + #pragma dvm region inlocal(A3),inlocal(B3) + { + + #pragma dvm parallel([i][j][n] on B3[i][j][n]) reduction(min(erria), min(errib), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) { + s = s + B3[i][j][n]; + if (B3[i][j][n] != (i*NL/10+j*NL/100+n*NL/1000) + 5) + errib = Min(errib,i*NL/10 + j*NL/100 + n*NL/1000); + ia=kr1i * i + lri; + ja=kr2j * j + lrj; + na=kr3n * n + lrn; + if (A3[ia][ja][na] != (ia*NL/10+ja*NL/100+na*NL/1000)+10) + erria = Min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000); + } /* end of loop */ + + } /* end region */ + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + 5; + + #pragma dvm get_actual(erria, errib, s) + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} +/* --------------------------------------------------realign333 */ + /* ALIGN arrB3[i][j][n] WITH arrA3[i+2][j+4][n+3] + REALIGN arrB3[i][j][n] WITH arrA3[2*i+1][2*n][j+1] */ + +void realign333() +{ + #define AN1 12 + #define AN2 16 + #define AN3 25 + #define BN1 4 + #define BN2 3 + #define BN3 5 + +/* parameters for ALIGN arrB[i][j][n] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i=1, li=2; + int k2j=1, lj=4; + int k3n=1, ln=3; +/* parameters for REALIGN arrB[i][j][n] WITH arrA[kr1i*i+lri][kr3n*n+lrn][kr2j*j+lrj] */ + int kr1i=2, lri=1; + int kr2j=1, lrj=1; + int kr3n=2, lrn=0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j][n] with A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) + int B3[BN1][BN2][BN3]; + + char tname[] = "realign333"; + + erria = ER; + errib = ER; + + #pragma dvm region inout(A3),inout(B3) + { + +// A3 = 1; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = 1; + +// B3 = 2; + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = 2; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib,jb,nb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = A3[i][j][n] + i*NL/10+j*NL/100+n*NL/1000; + if ( + ((i-li) == (((i-li)/k1i) * k1i)) && + ((j-lj) == (((j-lj)/k2j) *k2j)) && + ((n-ln) == (((n-ln)/k3n) * k3n)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((n-ln)/k3n) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) && + (((n-ln)/k3n) < BN3) + ) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + nb = (n-ln)/k3n; + B3[ib][jb][nb] += ib*NL/10+jb*NL/100+nb*NL/1000; + } + } /* end of loop */ + + } /* end region */ + + #pragma dvm realign(B3[i][j][n] with A3[kr1i*i+lri][kr3n*n+lrn][kr2j*j+lrj]) + + s=0; + + #pragma dvm actual (erria, errib, s) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) reduction(min(erria),min(errib),sum(s)),private(ia,ja,na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + { + s = s + B3[i][j][n]; + if (B3[i][j][n] != (i*NL/10+j*NL/100+n*NL/1000) + 2) + errib = Min(errib,i*NL/10 + j*NL/100 + n*NL/1000); + ia=kr1i * i + lri; + ja=kr3n * n + lrn; + na=kr2j * j + lrj; + if (A3[ia][ja][na] != (ia*NL/10+ja*NL/100+na*NL/1000)+1) + erria = Min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000); + } /* end of loop */ + + } /* end region */ + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + 2; + + #pragma dvm get_actual(erria, errib, s) + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +/* ----------------------------------------------------realign334 */ + /* ALIGN arrB3[i][j][n] WITH arrA3[n+1][3*i+1][j+2] + REALIGN arrB3[i][j][n] WITH arrA3[2*j][i+1][2*n+1] */ + +void realign334() +{ + #define AN1 15 + #define AN2 28 + #define AN3 20 + #define BN1 4 + #define BN2 6 + #define BN3 6 + +/* parameters for ALIGN arrB[i][j][n] WITH arrA[k3n*n+ln][k1i*i+li][k2j*j+lj] */ + int k1i=3, li=1; + int k2j=1, lj=2; + int k3n=1, ln=1; +/* parameters for REALIGN arrB[i][j][n] WITH arrA[kr2j*j+lrj][kr1i*i+lri][kr3n*n+lrn] */ + int kr1i=1, lri=1; + int kr2j=2, lrj=0; + int kr3n=2, lrn=1; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j][n] with A3[k3n*n+ln][k1i*i+li][k2j*j+lj]) + int B3[BN1][BN2][BN3]; + + char tname[] = "realign334"; + + erria = ER; + errib = ER; + + #pragma dvm region in(A3),in(B3),out(A3),out(B3) + { + +// A3 = 0; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = 0; + +// B3 = 0; + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = 0; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib,jb,nb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] += i*NL/10+j*NL/100+n*NL/1000; + if ( + ((i-ln) == (((i-ln)/k3n) * k3n)) && + ((j-li) == (((j-li)/k1i) * k1i)) && + ((n-lj) == (((n-lj)/k2j) * k2j)) && + (((i-ln)/k3n) >= 0) && + (((j-li)/k1i) >= 0) && + (((n-lj)/k2j) >= 0) && + (((i-ln)/k3n) < BN3) && + (((j-li)/k1i) < BN1) && + (((n-lj)/k2j) < BN2) + ) + { + ib = (j-li)/k1i; + jb = (n-lj)/k2j; + nb = (i-ln)/k3n; + B3[ib][jb][nb] += ib*NL/10+jb*NL/100+nb*NL/1000; + } + } /* end of loop */ + + } /* end region */ + + #pragma dvm realign(B3[i][j][n] with A3[kr2j*j+lrj][kr1i*i+lri][kr3n*n+lrn]) + + s=0; + + #pragma dvm actual (erria, errib, s) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) reduction(min(erria),min(errib),sum(s)),private(ia,ja,na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + { + s += B3[i][j][n]; + if (B3[i][j][n] != (i*NL/10+j*NL/100+n*NL/1000)) + errib = Min(errib,i*NL/10 + j*NL/100 + n*NL/1000); + ia=kr2j * j + lrj; + ja=kr1i * i + lri; + na=kr3n * n + lrn; + if (A3[ia][ja][na] != (ia*NL/10+ja*NL/100+na*NL/1000)) + erria = Min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000); + } /* end of loop */ + + } /* end region */ + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000; + + #pragma dvm get_actual(erria, errib, s) + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +/* ----------------------------------------------------realign335 */ + /* ALIGN arrB[*][*][*] WITH arrA[*][*][*] + REALIGN arrB[i][j][n] WITH arrA[i][j][n] */ + +void realign335() +{ + #define AN1 10 + #define AN2 10 + #define AN3 10 + #define BN1 4 + #define BN2 8 + #define BN3 4 + +/* parameters for ALIGN arrB[*][*][*] WITH arrA[*][*][*] */ + int k1i=0, li=0; + int k2j=0, lj=0; + int k3n=0, ln=0; +/* parameters for REALIGN arrB[i][j][n] WITH arrA[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn] */ + int kr1i=1, lri=0; + int kr2j=1, lrj=0; + int kr3n=1, lrn=0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([][][] with A3[][][]) + int B3[BN1][BN2][BN3]; + + char tname[] = "realign335"; + + erria = ER; + errib = ER; + + #pragma dvm actual (A3, B3) + + #pragma dvm region inout(B3) + { + +// A3 = 0; + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + A3[i][j][n] = 0; + +// B3 = 6; + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = 6; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] += i*NL/10+j*NL/100+n*NL/1000; + } + + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + { + B3[i][j][n] = B3[i][j][n] + i*NL/10+j*NL/100+n*NL/1000; + } + + } /* end region */ + + #pragma dvm realign(B3[i][j][n] with A3[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn]) + + s=0; + + #pragma dvm actual (erria, errib, s) + + #pragma dvm region inlocal(A3,B3) + { + + #pragma dvm parallel([i][j][n] on B3[i][j][n]) reduction(min(erria),min(errib),sum(s)),private(ia,ja,na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + { + s += B3[i][j][n]; + if (B3[i][j][n] != (i*NL/10+j*NL/100+n*NL/1000)+ 6) + errib = Min(errib,i*NL/10 + j*NL/100 + n*NL/1000); + ia=kr1i * i + lri; + ja=kr2j * j + lrj; + na=kr3n * n + lrn; + if (A3[ia][ja][na] != (ia*NL/10+ja*NL/100+na*NL/1000)) + erria = Min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000); + } /* end of loop */ + + } /* end region */ + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + 6; + + #pragma dvm get_actual(erria, errib, s) + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +/* ----------------------------------------------------realign336 */ + /* ALIGN arrB3[i][j][n] WITH arrA3[i][j+1][2*n+1] + REALIGN arrB3[*][j][n] WITH arrA[j+1][n][1] */ + +void realign336() +{ + #define AN1 8 + #define AN2 8 + #define AN3 8 + #define BN1 3 + #define BN2 4 + #define BN3 3 + +/* parameters for ALIGN arrB[i][j][n] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i=1,li=0; + int k2j=1,lj=1; + int k3n=2,ln=1; +/* parameters for REALIGN arrB[*][i][j] WITH arrA[kr2j*j+lrj][kr3n*n+lrn][lri] */ + int kr1i=0,lri=1; + int kr2j=1,lrj=1; + int kr3n=1,lrn=0; + + #pragma dvm array distribute[block][block][block] + int A3[AN1][AN2][AN3]; + #pragma dvm array align([i][j][n] with A3[k1i*i+li][k2j*j+lj][k3n*n+ln]) + int B3[BN1][BN2][BN3]; + + char tname[] = "realign336"; + + erria = ER; + errib = ER; + + #pragma dvm actual (B3) + + #pragma dvm region inout(B3), inout(A3) + { + +// B3 = 0; + #pragma dvm parallel([i][j][n] on B3[i][j][n]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + B3[i][j][n] = 0; + + #pragma dvm parallel([i][j][n] on A3[i][j][n]) private(ib,jb,nb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + { + A3[i][j][n] = i*NL/10+j*NL/100+n*NL/1000; + if ( + ((i-li) == (((i-li)/k1i) * k1i)) && + ((j-lj) == (((j-lj)/k2j) *k2j)) && + ((n-ln) == (((n-ln)/k3n) * k3n)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((n-ln)/k3n) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) && + (((n-ln)/k3n) < BN3) + ) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + nb = (n-ln)/k3n; + B3[ib][jb][nb]=ib*NL/10+jb*NL/100+nb*NL/1000; + } + } /* end of loop */ + + } /* end region */ + + #pragma dvm realign(B3[][j][n] with A3[kr2j*j+lrj][kr3n*n+lrn][lri]) + + s=0; + + #pragma dvm actual (erria, errib, s) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n] on B3[i][j][n]) reduction(min(erria), min(errib), sum(s)), private(ia, ja, na) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + { + s = s + B3[i][j][n]; + if (B3[i][j][n] != (i*NL/10+j*NL/100+n*NL/1000)) + errib = Min(errib,i*NL/10 + j*NL/100+ n*NL/1000); + ia=kr2j*j+lrj; + ja=kr3n*n+lrn; + na=lri; + if (A3[ia][ja][na] != (ia*NL/10+ja*NL/100+na*NL/1000)) + erria = Min(erria,i*NL/10 + j*NL/100+ n*NL/1000); + } /* end of loop */ + + } /* end region */ + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000; + + #pragma dvm get_actual(erria, errib, s) + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef BN1 + #undef BN2 + #undef BN3 +} + +/* ---------------------------------------------------- */ +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} +void ansno(const char name[]) +{ + printf ("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign44.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign44.cdv new file mode 100644 index 0000000..99f8b76 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REALIGN/realign44.cdv @@ -0,0 +1,553 @@ +/* REALIGN44 +Testing REALIGN directive */ + +#include +#include +#include + +#define Min(a, b) ((a) < (b) ? (a) : (b)) + +static void realign441(); +static void realign442(); +static void realign443(); +static void realign444(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 10000; +static int ER = 100000; +static int erria, errib, i, j, k, n, m, na, ma, ia, ib, nb, mb, ja, jb, s, cs; + +int main(int an, char **as) +{ + printf("=== START OF REALIGN44 ======================\n"); + + /* ALIGN arrB[i][j][n][m] WITH arrA[i][j][n][m] + REALIGN arrB[][j][n][] WITH arrA[j][n][1][3] */ + realign441(); + /* ALIGN arrB[][j][n][i] WITH arrA[i][j][][n] + REALIGN arrB[i][j][][m] WITH arrA[i][j][2][m] */ + realign442(); + /* ALIGN arrB[i][j][n][m] WITH arrA[i][2*j][3*n][4*m] + REALIGN arrB[i][j][n][m] WITH arrA[i+1][j+2]+[n+3][m+4] */ + realign443(); + /* ALIGN arrB[i][j][n][m] WITH arrA[m][i][j][n] + REALIGN arrB[i][j][n][m] WITH arrA[i+2][3*j+4][2*n+2][m+1] */ + realign444(); + + printf("=== END OF REALIGN44 ========================\n"); + return 0; +} + +/* ---------------------------------------------REALIGN441*/ + /* ALIGN arrB[i][j][n][m] WITH arrA[i][j][n][m] + REALIGN arrB[][j][n][] WITH arrA[j][n][1][3] */ +void realign441() +{ + #define AN1 6 + #define AN2 8 + #define AN3 5 + #define AN4 7 + #define BN1 2 + #define BN2 5 + #define BN3 4 + #define BN4 3 +/* parameters for ALIGN arrB[i][j][n][m] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + int k1i = 1, li = 0; + int k2j = 1, lj = 0; + int k3n = 1, ln = 0; + int k4m = 1, lm = 0; +/* parameters for REALIGN arrB[*][j][n][*] WITH arrA[kr2j*j+lrj][kr3n*n+lrn][lri][lrm] */ + int kr1i = 0, lri = 1; + int kr2j = 1, lrj = 0; + int kr3n = 1, lrn = 0; + int kr4m = 0, lrm = 3; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k1i*i + li][k2j*j + lj][k3n*n + ln][k4m*m + lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "realign441"; + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((n - ln) == (((n - ln) / k3n) * k3n)) && + ((m - lm) == (((m - lm) / k4m) * k4m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((n - ln) / k3n) >= 0) && + (((m - lm) / k4m) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2) && + (((n - ln) / k3n) < BN3) && + (((m - lm) / k4m) < BN4)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = (n - ln) / k3n; + mb = (m - lm) / k4m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + + #pragma dvm realign(B4[][j][n][] with A4[kr2j*j+lrj][kr3n*n+lrn][lri][lrm]) + + s = 0; + + #pragma dvm actual(erria, errib, s) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erria), min(errib), sum(s)), private(ia, ja, na, ma) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s += B4[i][j][n][m]; + if (B4[i][j][n][m] !=val) + errib = Min(errib, val); + + ia=kr2j*j+lrj; + ja=kr3n*n+lrn; + na=lri; + ma=lrm; + val = ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma; + if (A4[ia][ja][na][ma] != val) + erria = Min(erria, val); + } + + } + + #pragma dvm get_actual(erria, errib, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else { + ansno(tname); + printf ("%d, %d, %d\n", erria, errib, s); + } + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} + +/* ---------------------------------------------REALIGN442*/ + /* ALIGN arrB[][j][n][i] WITH arrA[i][j][][n] + REALIGN arrB[i][j][][m] WITH arrA[i][j][2][m] */ +void realign442() +{ + int AN1 = 5, AN2 = 5, AN3 = 5, AN4 = 5; + int BN1 = 2, BN2 = 2, BN3 = 2, BN4 = 2; + +/* parameters for ALIGN arrB[*][j][n][i] WITH arrA4(k1i*i+li,k2j*j+lj,*,k3m*n+lm) */ + int k1i = 1, li = 0; + int k2j = 1, lj = 0; + int k3n = 0, ln = 0; + int k3m = 1, lm = 0; +/* parameters for REALIGN arrB[i][j][*][m] WITH arrA(kr1i*i+lri,kr2j*j+lrj,lrn,kr4m*m+lrm) */ + int kr1i = 1, lri = 0; + int kr2j = 1, lrj = 0; + int kr3n = 0, lrn = 2; + int kr4m = 1, lrm = 0; + + char tname[] = "realign442"; + + #pragma dvm array distribute[block][block][block][block] + int (*A4)[AN2][AN3][AN4]; + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + + A4 = malloc(sizeof(int[AN1][AN2][AN3][AN4])); + B4 = malloc(sizeof(int[BN1][BN2][BN3][BN4])); + + #pragma dvm realign(B4[][j][n][i] with A4[k1i*i + li][k2j*j + lj][][k3m*n + lm]) + + erria = ER; + errib = ER; + + #pragma dvm region inout(A4, B4) + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 0; + + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb, k) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + for (k = 0; k < BN1; k++) + { + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((m - lm) == (((m - lm) / k3m) * k3m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((m - lm) / k3m) >= 0) && + (((i - li) / k1i) < BN4) && + (((j - lj) / k2j) < BN2) && + (((m - lm) / k3m) < BN3)) + { + mb = (i - li) / k1i; + jb = (j - lj) / k2j; + ib = k; + nb = (m - lm) / k3m; + B4[ib][jb][nb][mb] = ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + } + + #pragma dvm realign(B4[i][j][][m] with A4[kr1i*i+lri][kr2j*j+lrj][lrn][kr4m*m+lrm]) + s = 0; + #pragma dvm actual(erria, errib, s) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erria), min(errib), sum(s)), private(ia, ja, na, ma) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s += B4[i][j][n][m]; + if (B4[i][j][n][m] != val) + errib = Min(errib,val); + + ia = kr1i*i + lri; + ja = kr2j*j + lrj; + na = lrn; + ma = kr4m*m + lrm; + val = ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma; + if (A4[ia][ja][na][ma] != val) + erria = Min(erria, val); + } + + } + #pragma dvm get_actual(erria, errib, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + + // printf("erri = %u, ER = %u, s = %u, cs = %u\n", erri, ER, s, cs); + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(A4); +} + +/* ---------------------------------------------REALIGN443*/ + /* ALIGN arrB[i][j][n][m] WITH arrA[i][2*j][3*n][4*m] + REALIGN arrB[i][j][n][m] WITH arrA[i+1][j+2]+[n+3][m+4] */ + +void realign443() +{ + #define AN1 10 + #define AN2 8 + #define AN3 14 + #define AN4 12 + #define BN1 4 + #define BN2 3 + #define BN3 5 + #define BN4 3 +/* parameters for ALIGN arrB[i][j][n][m] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] */ + int k1i = 1, li = 0; + int k2j = 2, lj = 0; + int k3n = 3, ln = 0; + int k4m = 4, lm = 0; +/* parameters for REALIGN arrB[i][j][n][m] WITH arrA[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn][kr4m*m+lrm] */ + int kr1i = 1, lri = 1; + int kr2j = 1, lrj = 2; + int kr3n = 1, lrn = 3; + int kr4m = 1, lrm = 4; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k1i*i + li][k2j*j + lj][k3n*n + ln][k4m*m + lm]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "realign443"; + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 5; + + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m + 1; + if (((i - li) == (((i - li) / k1i) * k1i)) && + ((j - lj) == (((j - lj) / k2j) * k2j)) && + ((n - ln) == (((n - ln) / k3n) * k3n)) && + ((m - lm) == (((m - lm) / k4m) * k4m)) && + (((i - li) / k1i) >= 0) && + (((j - lj) / k2j) >= 0) && + (((n - ln) / k3n) >= 0) && + (((m - lm) / k4m) >= 0) && + (((i - li) / k1i) < BN1) && + (((j - lj) / k2j) < BN2) && + (((n - ln) / k3n) < BN3) && + (((m - lm) / k4m) < BN4)) + { + ib = (i - li) / k1i; + jb = (j - lj) / k2j; + nb = (n - ln) / k3n; + mb = (m - lm) / k4m; + B4[ib][jb][nb][mb] += ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + } + + #pragma dvm realign(B4[i][j][n][m] with A4[kr1i*i + lri][kr2j*j + lrj][kr3n*n + lrn][kr4m*m + lrm]) + + s = 0; + + #pragma dvm actual(erria, errib, s) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erria), min(errib), sum(s)), private(ia, ja, na, ma) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s += B4[i][j][n][m]; + if (B4[i][j][n][m] != val + 5) + errib = Min(errib, val); + + ia=kr1i*i+lri; + ja=kr2j*j+lrj; + na=kr3n*n+lrn; + ma=kr4m*m+lrm; + val = ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma; + if (A4[ia][ja][na][ma] != val + 1) + erria = Min(erria, val); + } + + } + + #pragma dvm get_actual(erria, errib, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m + 5; + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + { + ansno(tname); +// printf ("%d, %d, %d\n", erria, errib, s); + } + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} + +/* ---------------------------------------------REAGLIGN444*/ + /* ALIGN arrB[i][j][n][m] WITH arrA[m][i+1][j][2*n] + REALIGN arrB[i][j][n][m] WITH arrA[i+2][3*j+4][2*n+2][m+1] */ + +void realign444() +{ + #define AN1 12 + #define AN2 15 + #define AN3 16 + #define AN4 10 + #define BN1 4 + #define BN2 4 + #define BN3 5 + #define BN4 3 +/* parameters for ALIGN arrB[i][j][n][m] WITH arrA4[k4m*m+lm][k1i*i+li][k2j*j+lj][k3n*n+ln] */ + int k1i = 1, li = 1; + int k2j = 1, lj = 0; + int k3n = 2, ln = 0; + int k4m = 1, lm = 0; +/* parameters for REALIGN arrB[i][j][n][m] WITH arrA[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn][kr4m*m+lrm] */ + int kr1i = 1, lri = 2; + int kr2j = 3, lrj = 4; + int kr3n = 2, lrn = 2; + int kr4m = 1, lrm = 1; + + #pragma dvm array distribute[block][block][block][block] + int A4[AN1][AN2][AN3][AN4]; + #pragma dvm array align([i][j][n][m] with A4[k4m*m+lm][k1i*i+li][k2j*j+lj][k3n*n+ln]) + int B4[BN1][BN2][BN3][BN4]; + char tname[] = "realign444"; + + erria = ER; + errib = ER; + + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + B4[i][j][n][m] = 4; + + #pragma dvm parallel([i][j][n][m] on A4[i][j][n][m]) private(ib, jb, nb, mb) + for (i = 0; i < AN1; i++) + for (j = 0; j < AN2; j++) + for (n = 0; n < AN3; n++) + for (m = 0; m < AN4; m++) + { + A4[i][j][n][m] = 10 + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + if ( + ((i-lm) == (((i-lm)/k4m) * k4m)) && + ((j-li) == (((j-li)/k1i) * k1i)) && + ((n-lj) == (((n-lj)/k2j) * k2j)) && + ((m-ln) == (((m-ln)/k3n) * k3n)) && + (((i-lm)/k4m) >= 0) && + (((j-li)/k1i) >= 0) && + (((n-lj)/k2j) >= 0) && + (((m-ln)/k3n) >= 0) && + (((i-lm)/k4m) < BN4)&& + (((j-li)/k1i) < BN1) && + (((n-lj)/k2j) < BN2) && + (((m-ln)/k3n) < BN3) + ) + { + ib = (j-li)/k1i; + jb = (n-lj)/k2j; + nb = (m-ln)/k3n; + mb = (i-lm)/k4m; + B4[ib][jb][nb][mb] += ib * NL / 10 + jb * NL / 100 + nb * NL / 1000 + mb; + } + } + + } /* end region */ + + #pragma dvm realign(B4[i][j][n][m] with A4[kr1i*i + lri][kr2j*j + lrj][kr3n*n + lrn][kr4m*m + lrm]) + + s = 0; + + #pragma dvm actual(erria, errib, s) + + #pragma dvm region + { + #pragma dvm parallel([i][j][n][m] on B4[i][j][n][m]) reduction(min(erria), min(errib), sum(s)), private(ia, ja, na, ma) + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + { + int val = i * NL / 10 + j * NL / 100 + n * NL / 1000 + m; + s += B4[i][j][n][m]; + if (B4[i][j][n][m] != val+4) + errib = Min(errib, val); + + ia=kr1i*i+lri; + ja=kr2j*j+lrj; + na=kr3n*n+lrn; + ma=kr4m*m+lrm; + val = ia * NL / 10 + ja * NL / 100 + na * NL / 1000 + ma; + if (A4[ia][ja][na][ma] != val+10) + erria = Min(erria, val); + } + } + + #pragma dvm get_actual(erria, errib, s) + + cs = 0; + for (i = 0; i < BN1; i++) + for (j = 0; j < BN2; j++) + for (n = 0; n < BN3; n++) + for (m = 0; m < BN4; m++) + cs = cs + i * NL / 10 + j * NL / 100 + n * NL / 1000 + m + 4; + + if ((erria == ER) && (errib == ER) && (s == cs)) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 +} +/* --------------------------------------------- */ + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REDUCTION/red11n.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REDUCTION/red11n.cdv new file mode 100644 index 0000000..0cc5548 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REDUCTION/red11n.cdv @@ -0,0 +1,995 @@ +/* Testing REDUCTION clause + REDUCTION operations: SUM,PRODUCT,MAX,MIN,AND,OR,MAXLOC,MINLOC and + their combinations are executed + for distributed array A(N) +*/ + +#include +#include +#include + +static void red1101(); +static void red1102(); +static void red1103(); +static void red1104(); +static void red1105(); +static void red1106(); +static void red1107(); +static void red1108(); +static void red1111(); /* tests 109-110 are absent */ +static void red1112(); +static void red1113(); +static void red1114(); +static void red1115(); +static void red1116(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int sersum1(int *AR, int N, int NL); +static int sersum1m(int *AR, int N, int NL); +static float sers1mr(float *RAR, int N, float RNL); +static int serprod1(int *AR, int N, int NL); +static float serprodr1(float *AR, int N, float RNL); +static int serand1(int *AR, int N); +static int seror1(int *AR, int N); + +int main(int an, char **as) +{ + printf("===START OF red11n ========================\n"); + + red1101(); + red1102(); + red1103(); + red1104(); + red1105(); + red1106(); + red1107(); + red1108(); + red1111(); + red1112(); + red1113(); + red1114(); + red1115(); + red1116(); + + printf("=== END OF red11n ========================= \n"); + return 0; +} + +/* ---------------------------------------------RED1101 */ +void red1101() +{ + #define N 32 + #define NL 1000 + + int C[N]; + int i, isum1, isumt1; + + char tname[] = "RED1101"; + + #pragma dvm array distribute[block] + int A[N]; + + isum1 = sersum1(C, N, NL); + isumt1=0; + + #pragma dvm actual(isumt1) + + #pragma dvm region inout(A) + { + + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL+i; + + #pragma dvm parallel([i] on A[i]) reduction(sum(isumt1)) + for (i = 0; i < N; i++) + isumt1 = isumt1 + A[i]; + + } /* end region */ + + #pragma dvm get_actual(isumt1) + + if (isum1 == isumt1) + ansyes(tname); + else + { + ansno(tname); +// printf("isum1=%d isumt1=%d\n",isum1,isumt1); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1102 */ +void red1102() + { + #define N 15 + #define NL 2 + + int C[N]; + int i; + int iprod1, iprodt1; + char tname[] = "RED1102"; + + #pragma dvm array distribute[block] + int A[N]; + + iprod1 = serprod1(C, N, NL); + + iprodt1 = 1; + + #pragma dvm actual(iprodt1) + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + #pragma dvm parallel([i] on A[i]) reduction(product(iprodt1)) + for (i = 0; i < N; i++) + iprodt1 = iprodt1 * A[i]; + + } /* end region */ + + #pragma dvm get_actual(iprodt1) + + if (iprod1 == iprodt1) + ansyes(tname); + else + { + ansno(tname); +// printf ("iprod1 = %d, iprodt1 = %d\n", iprod1, iprodt1); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1103 */ +void red1103() +{ + #define N 30 + #define NL 1003 + + int C[N]; + int i, imax1, imaxt1, ni; + char tname[] = "RED1103"; + + #pragma dvm array distribute[block] + int A[N]; + + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + ni = N / 2 - 1; + A[ni] = N + 1 + NL; + + #pragma dvm host_section + { + #pragma dvm remote_access(A[1]) + { + imaxt1 = A[1]; + } + #pragma dvm actual(imaxt1) + } /* end host_section */ + + #pragma dvm parallel([i] on A[i]) reduction(max(imaxt1)) + for (i = 0; i < N; i++) + if (A[i] > imaxt1) imaxt1 = A[i]; + + } /* end region */ + + #pragma dvm get_actual(imaxt1) + + imax1 = N + 1 + NL; + + if (imax1 == imaxt1) + ansyes(tname); + else + { + ansno(tname); +// printf("imax1=%d imaxt1=%d\n",imax1,imaxt1); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1104 */ +void red1104() +{ + #define N 16 + #define NL 1004 + int C[N]; + int i, imin1, imint1, ni; + char tname[] = "RED1104"; + + #pragma dvm array distribute[block] + int A[N]; + + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + } /* end region */ + + #pragma dvm remote_access(A[1]) + { + imint1 = A[1]; + } + + ni = N / 2 + 1; + A[ni] = -(N + 1 + NL); + imin1 = -(N + 1 + NL); + + #pragma dvm actual(imint1, A[ni]) + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) reduction(min(imint1)) + for (i = 0; i < N; i++) + if (A[i] < imint1) imint1 = A[i]; + } /* end region */ + + #pragma dvm get_actual(imint1) + + if (imin1 == imint1) + ansyes(tname); + else + { + ansno(tname); +// printf("imin1=%d imint1=%d\n",imin1,imint1); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1105 */ +void red1105() +{ + #define N 32 + #define RNL 1005. + + float C[N]; + int i, ni; + float imax1, imaxt1; + char tname[] = "RED1105"; + + #pragma dvm array distribute[block] + float A[N]; + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = RNL + i; + + ni = N / 2 - 1; + A[ni] = N + 1. + RNL; + imax1 = N + 1. + RNL; + + } /* end region */ + + #pragma dvm get_actual(imax1) + + #pragma dvm remote_access(A[1]) + { + imaxt1 = A[1]; + } + + #pragma dvm actual(imaxt1) + + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) reduction(max(imaxt1)) + for (i = 0; i < N; i++) + if (A[i] > imaxt1) imaxt1=A[i]; + + } /* end region */ + + #pragma dvm get_actual(imaxt1) + + if (imax1 == imaxt1) + ansyes(tname); + else + { + ansno(tname); +// printf("imax1=%f imaxt1=%f\n",imax1,imaxt1); + } + + #undef N + #undef RNL +} + +/* ---------------------------------------------RED1106 */ +void red1106() +{ + #define N 11 + float RNL = 1.; + + float C[N]; + int i; + float iprod1, iprodt1; + char tname[] = "RED1106"; + + #pragma dvm array distribute[block] + float A[N]; + + iprod1 = serprodr1(C, N, RNL); + iprodt1 = 1.; + + #pragma dvm actual(iprodt1) + + #pragma dvm region out(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = RNL + i; + + #pragma dvm parallel([i] on A[i]) reduction(product(iprodt1)) + for (i = 0; i < N; i++) + iprodt1 = iprodt1 * A[i]; + + } /* end region */ + + #pragma dvm get_actual(iprodt1) + + if (iprod1 == iprodt1) + ansyes(tname); + else + { + ansno(tname); +// printf ("iprod1 = %f, iprodt1 = %f\n", iprod1, iprodt1); + } + + #undef N +} + +/* ---------------------------------------------RED1107 */ +void red1107() +{ + #define N 31 + + int CL[N]; + int i; + int land1, landt1; + char tname[] = "RED1107"; + + #pragma dvm array distribute[block] + int A[N]; + + land1 = serand1(CL, N); + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i+=2) + A[i] = 1; + + #pragma dvm parallel([i] on A[i]) + for (i = 1; i < N; i+=2) + A[i] = 0; + + } /* end region */ + +// # pragma dvm get_actual(A) + + #pragma dvm remote_access(A[1]) + { + landt1 = A[1]; + } + + #pragma dvm actual(landt1) + + #pragma dvm region inlocal(A) + { + #pragma dvm parallel([i] on A[i]) reduction(and(landt1)) + for (i = 0; i < N; i++) + landt1 = landt1 && A[i]; + + } /* end region */ + + #pragma dvm get_actual(landt1) + + if (land1 == landt1) + ansyes(tname); + else + ansno(tname); + + #undef N +} + +/* ---------------------------------------------RED1108 */ +void red1108() +{ + #define N 17 + + int CL[N]; + int i; + int lor1,lort1; + char tname[] = "RED1108"; + + #pragma dvm array distribute[block] + int A[N]; + + lor1 = seror1(CL, N); + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = i % 2; + #pragma dvm host_section + { + #pragma dvm remote_access(A[1]) + { + lort1 = A[1]; + } + #pragma dvm actual(lort1) + } + + #pragma dvm parallel([i] on A[i]) reduction(or(lort1)) + for (i = 0; i < N; i++) + lort1 = lort1 || A[i]; + + } /* end region */ + + #pragma dvm get_actual(lort1) + + if (lor1 == lort1) + ansyes(tname); + else + ansno(tname); + + #undef N +} + +/* ---------------------------------------------RED1111 */ +void red1111() +{ + #define N 32 + #define NL 1000 + + int C[N]; + int i, imaxloc1, imaxloct1, it1, ni; + char tname[] = "RED1111"; + + #pragma dvm array distribute[block] + int A[N]; + + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + + ni = N / 2 + 1; + A[ni] = N + 1 + NL; + imaxloc1 = N + 1 + NL; + + #pragma dvm remote_access(A[0]) + { + imaxloct1 = A[0]; + } + + #pragma dvm actual(imaxloct1) + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) reduction(maxloc(imaxloct1, it1)) + for (i = 0; i < N; i++) + if (A[i] > imaxloct1) { + imaxloct1 = A[i]; + it1 = i; + } + } /* end region */ + + #pragma dvm get_actual(imaxloct1,it1) + + if ((imaxloct1 == imaxloc1) && (it1 == ni)) + ansyes(tname); + else + { + ansno(tname); +// printf("imax1=%d imaxt1=%d imaxloct1=%d it1=%d ni=%d\n", +// imax1,imaxt1,imaxloct1,it1,ni); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1112 */ +void red1112() +{ + #define N 27 + int NL = 1012; + int C[N]; + int i, ni, iminloc1, iminloct1,it2; + char tname[] = "RED1112"; + + #pragma dvm array distribute[block] + int A[N]; + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + } /* end region */ + + #pragma dvm get_actual(A) + + ni = N / 2 + 2; + A[ni] = - (N + 1 + NL); + #pragma dvm actual(A[ni]) + iminloc1 = -(N + 1 + NL); + + #pragma dvm remote_access(A[3]) + { + iminloct1=A[3]; + } + + #pragma dvm actual(iminloct1) + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) reduction(minloc(iminloct1, it2)) + for (i = 0; i < N; i++) + if (A[i] < iminloct1) { + iminloct1 = A[i]; + it2 = i; + } + } /* end region */ + + #pragma dvm get_actual(iminloct1, it2) + + if ((iminloct1 == iminloc1) && (it2 == ni)) + ansyes(tname); + else + { + ansno(tname); +// printf("imin1=%d imint1=%d iminloct1=%d it2=%d ni=%d\n", +// imin1,imint1,iminloct1,it2,ni); + } + + #undef N +} + +/* ---------------------------------------------RED1113 */ +void red1113() +{ + #define N 24 + #define NL 1003 + + int C[N]; + int i, isum1, isumt1, imax1, imaxt1, imin1, imint1, ni; + char tname[] = "RED1113"; + + #pragma dvm array distribute[block] + int A[N]; + + isum1 = sersum1m(C, N, NL); + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL+i; + } /* end region */ + + ni = N / 2 - 2; + A[ni] = N + 1 + NL; + #pragma dvm actual(A[ni]) + + imax1 = N + 1 + NL; + + #pragma dvm remote_access(A[1]) + { + imaxt1 = A[1]; + } + + ni = N / 2; + A[ni] = -(N + 1 + NL); + #pragma dvm actual(A[ni]) + + imin1 = -(N + 1 + NL); + imint1 = imaxt1; + + isumt1 = 0; + + #pragma dvm actual(isumt1, imaxt1, imint1) + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) reduction(sum(isumt1), max(imaxt1), min(imint1)) + for (i = 0; i < N; i++) + { + isumt1 = isumt1 + A[i]; + if (A[i] > imaxt1) imaxt1 = A[i]; + if (A[i] < imint1) imint1 = A[i]; + } + } /* end region */ + + #pragma dvm get_actual(isumt1, imaxt1, imint1) + + if ((isum1 == isumt1) && (imax1 == imaxt1) && (imin1 == imint1)) + ansyes(tname); + else + { + ansno(tname); +// printf("isum1=%d isumt1=%d\n",isum1,isumt1); +// printf("imax1=%d imaxt1=%d\n",imax1,imaxt1); +// printf("imin1=%d imint1=%d\n",imin1,imint1); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1114 */ +void red1114() +{ + #define N 13 + #define NL 2 + + int C[N],CL[N]; + char tname[] = "RED1114"; + int i; + int iprod1, iprodt1; + int land1, landt1; + + #pragma dvm array distribute[block] + int A[N]; + #pragma dvm array align([i] with A[i]) + int B[N]; + + iprod1 = serprod1(C, N, NL); + land1 = serand1(CL, N); + + #pragma dvm region inout(A) + { + + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL + i; + #pragma dvm parallel([i] on B[i]) + for (i = 0; i < N; i++) + B[i] = i%2; + } /* end region */ + +// #pragma dvm get_actual (B[1]) + + #pragma dvm remote_access(B[1]) + { + landt1 = B[1]; + } + + iprodt1 = 1; + + #pragma dvm actual (landt1, iprodt1) + + #pragma dvm region + { + #pragma dvm parallel([i] on A[i]) reduction(product(iprodt1), and(landt1)) + for (i = 0; i < N; i++) + { + iprodt1 = iprodt1 * A[i]; + landt1 = landt1 && B[i]; + } + + } /* end region */ + + #pragma dvm get_actual(iprodt1, landt1) + + if ((iprod1 == iprodt1) && (land1 == landt1)) + ansyes(tname); + else + { + ansno(tname); +// printf ("iprod1 = %f, iprodt1 = %f\n", iprod1, iprodt1); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1115 */ +void red1115() +{ + #define N 22 + #define NL 1015 + + int C[N]; + int i, imax1, imaxt1, imin1, ni1, ni2; + int imaxloct1, iminloct1, it1, it2; + char tname[] = "RED1115"; + + #pragma dvm array distribute[block] + int A[N]; + + #pragma dvm region inout(A) + { + + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = NL+i; + + } /* end region */ + + ni1 = N / 2 - 3; + A[ni1] = N + 1 + NL; + imax1 = N + 1 + NL; + + ni2 = N / 2 + 2; + A[ni2] = -(N + 1 + NL); + imin1 = -(N + 1 + NL); + + #pragma dvm remote_access(A[1]) + { + imaxt1=A[1]; + } + + imaxloct1 = imaxt1; + iminloct1 = imaxloct1; + + #pragma dvm actual(A[ni1], A[ni2], imaxt1, imaxloct1, iminloct1) + + #pragma dvm region inout(A) + { + #pragma dvm parallel([i] on A[i]) reduction(max(imaxt1),maxloc(imaxloct1,it1), minloc(iminloct1,it2)) + for (i = 0; i < N; i++) + { + if (A[i] > imaxt1) imaxt1 = A[i]; + if (A[i] > imaxloct1) + { + imaxloct1 = A[i]; + it1 = i; + } + if (A[i] < iminloct1) + { + iminloct1 = A[i]; + it2 = i; + } + } + + } /* end region */ + + #pragma dvm get_actual(imaxt1, imaxloct1, it1, iminloct1, it2) + + if ((imaxloct1 == imax1) && (iminloct1 == imin1) && + (imaxt1 == imaxloct1) && (it1 == ni1) && (it2 == ni2)) + ansyes(tname); + else + { + ansno(tname); +// printf("imax1=%d imaxt1=%d imaxloct1=%d it1=%d ni1=%d\n", +// imax1,imaxt1,imaxloct1,it1,ni1); +// printf("imin1=%d iminloct1=%d it2=%d ni2=%d\n", +// imin1,iminloct1,it2,ni2); + } + + #undef N + #undef NL +} + +/* ---------------------------------------------RED1116 */ +void red1116() +{ + #define N 28 + #define RNL 1016. + + float C[N]; + int i, ni1, ni2, it1, it2; + float isum1, isumt1, imax1, imin1; + float imaxloct1, iminloct1; + char tname[] = "RED1116"; + + #pragma dvm array distribute[block] + float A[N]; + + isum1 = sers1mr(C, N, RNL); + +/* printf("c=%d isum1=%d\n",C[1],isum1); */ + + imax1 = N + 1. + RNL; + imin1 = -(N + 1 + RNL); + + #pragma dvm region inout(A, ni1, ni2) + { + #pragma dvm parallel([i] on A[i]) + for (i = 0; i < N; i++) + A[i] = RNL + i; + + ni1 = N / 2 - 1; + A[ni1] = N + 1. + RNL; + + ni2 = N / 2 + 1; + A[ni2] = -(N + 1 + RNL); + + #pragma dvm host_section + { + #pragma dvm remote_access(A[1]) + { + imaxloct1 = A[1]; + } + #pragma dvm actual(imaxloct1) + } + + iminloct1 = imaxloct1; + + isumt1 = 0.; + + #pragma dvm parallel([i] on A[i]) reduction(sum(isumt1), maxloc(imaxloct1, it1), minloc(iminloct1, it2)) + for (i = 0; i < N; i++) + { + isumt1 = isumt1 + A[i]; + if (A[i] > imaxloct1) + { + imaxloct1 = A[i]; + it1 = i; + } + if (A[i] < iminloct1) + { + iminloct1 = A[i]; + it2 = i; + } + } + + } /* end region */ + + #pragma dvm get_actual(isumt1, imaxloct1, iminloct1) + + if ((isum1 == isumt1) && (imaxloct1 == imax1) && (iminloct1 == imin1) && + (it1 == ni1) && (it2 == ni2)) + ansyes(tname); + else + { + ansno(tname); +// printf("isum1=%f isumt1=%f\n",isum1,isumt1); +// printf("imax1=%f imaxloct1=%f it1=%d ni1=%d\n", +// imax1,imaxloct1,it1,ni1); +// printf("imin1=%f iminloct1=%f it2=%d ni2=%d\n", +// imin1,iminloct1,it2,ni2); + } + + #undef N + #undef RNL +} + +/* --------------------------------------------- */ + +int sersum1(int *AR, int NN, int NL) +{ + int i, s; + + for (i = 0; i < NN; i++) + AR[i] = NL+i; + + s=0; + + for (i = 0; i < NN; i++) + s = s + AR[i]; + +// printf("s=%d\n",s); + + return s; +} + +int sersum1m(int *AR, int NN, int NL) +{ + int i, ni, s; + + for (i = 0; i < NN; i++) + AR[i] = NL + i; + ni = NN / 2 - 2; + AR[ni] = NN + 1 + NL; + ni= NN / 2; + AR[ni] = -(NN + 1 + NL); + + s = 0; + for (i = 0; i < NN; i++) + s = s + AR[i]; + +// printf("s=%d\n",s); + + return s; +} + +float sers1mr(float *RAR, int NN, float RNL) +{ + int i, ni; + float s; + + for (i = 0; i < NN; i++) + RAR[i] = RNL + i; + ni = NN / 2 - 1; + RAR[ni]=NN + 1.+ RNL; + ni = NN / 2 + 1; + RAR[ni] = -(NN + 1.+ RNL); + + s = 0; + for (i = 0; i < NN; i++) + s = s + RAR[i]; +// printf("s=%d\n",s); + + return s; +} + +int serprod1(int *AR, int NN, int NL) +{ + int i, p; + + for (i = 0; i < NN; i++) + AR[i] = NL + i; + + p = 1; + for (i = 0; i < NN; i++) + p = p * AR[i]; + + return p; +} + +float serprodr1(float *AR, int NN, float RNL) +{ + int i; + float p; + + for (i = 0; i < NN; i++) + AR[i] = RNL + i; + + p = 1.; + for (i = 0; i < NN; i++) + p = p * AR[i]; + + return p; +} + +int serand1(int *AR, int NN) +{ + int i, ni, LAND; + + for (i = 0; i < NN; i++) + AR[i] = i % 2; + + LAND = AR[1]; + + for (i = 0; i < NN; i++) + LAND = LAND && AR[i]; + + return LAND; +} + +int seror1(int *AR, int NN) +{ + int i, LOR; + + for (i = 0; i < NN; i++) + AR[i] = i % 2; + + LOR = AR[1]; + + for (i = 0; i < NN; i++) + LOR = LOR || AR[i]; + + return LOR; +} + +/* --------------------------------------------- */ +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REDUCTION/red21m.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REDUCTION/red21m.cdv new file mode 100644 index 0000000..aac1b4e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REDUCTION/red21m.cdv @@ -0,0 +1,915 @@ +/* TESTING OF THE REDUCTION CLAUSE . + REDUCTION OPERATION : SUM.PRODUCT,MAX,MIN,AND,OR,MAXLOC,MINLOC AND + THEIR COMBINATION ARE EXECUTED + FOR DISTRIBUTED ARRAY A[N][M]. +*/ +#include +#include +#include + +#define N 8 +#define M 8 +#define NL 1000 +#define RNL 1000. +#define PNL 1 +#define RPNL 1. + +static void red2101(); +static void red2102(); +static void red2103(); +static void red2104(); +static void red2105(); +static void red2106(); +static void red2107(); +static void red2108(); +static void red2109(); +static void red2111(); +static void red2112(); +static void red2113(); +static void red2114(); + +static int sersum2(int AR[N][M], int NN, int NM, int NNL); +static int sersum2m(int AR[N][M], int NN, int NM, int NNL); +static float sers2mr(float RAR[N][M], int NN, int NM, float RNNL); +static long serprod2(int AR[N][M], int NN, int NM, int NNL); +static float serprodr2(float AR[N][M], int NN, int NM, float NNL); +static int serand2(int AR[N][M], int NN, int NM, int NNL); +static int seror2(int AR[N][M], int NN, int NM, int NNL); +static int serxor2(int AR[N][M], int NN, int NM, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START OF red21m ========================\n"); + red2101(); + red2102(); + red2103(); + red2104(); + red2105(); + red2106(); + red2107(); + red2108(); + red2109(); + red2111(); + red2112(); + red2113(); + red2114(); + + printf("=== END OF red21m ========================= \n"); + return 0; +} +/* ---------------------------------------------RED2101 */ +void red2101() +{ + int C[N][M]; + char tname[] = "RED2101"; + int i, j, NN, NM, NNL, ISUM1, isum1, isumt1; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + isum1 = sersum2(C, NN, NM, NNL); +/* printf("isum1=%d\n",isum1);*/ + + isumt1 = 0; + #pragma dvm actual(isumt1) + #pragma dvm region local(A) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on A[i][j]) reduction(sum(isumt1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + isumt1 = isumt1 + A[i][j]; + } /*end region*/ + + #pragma dvm get_actual(isumt1) + + if (isum1 == isumt1) + ansyes(tname); + else + ansno(tname); +// printf("isum1=%d isumt1=%d\n",isum1,isumt1); +} +/* ---------------------------------------------RED2102 */ +void red2102() +{ + int C[N][M], CL[N][M]; + char tname[] = "RED2102"; + int i, j, NN, NM, NNL; + long iprod1, iprodt1; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = PNL; + + iprod1 = serprod2(C, NN, NM, NNL); + + iprodt1 = 1; + #pragma dvm actual(iprodt1) + #pragma dvm region local(A) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NNL + i + j; + #pragma dvm parallel([i][j] on A[i][j]) reduction(product(iprodt1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + iprodt1 = iprodt1 * A[i][j]; +/* printf("iprodt1=%ld\n",iprodt1);*/ + } /*end region*/ + + #pragma dvm get_actual(iprodt1) +/* printf("iprod1=%ld iprodt1=%ld \n", + iprod1,iprodt1);*/ + + if (iprod1 == iprodt1) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------RED2103*/ +void red2103() +{ + int C[N][M]; + char tname[] = "RED2103"; + int i, j, NN, NM, NNL, imax1, imaxt1, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + ni = N / 2 - 1; + nj = M / 2 - 1; + imax1 = N + M + 1 + NL; + + #pragma dvm actual(imax1, ni, nj) +// #pragma dvm region local(A) +// { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NNL + i + j; + A[ni][nj] = N + M + 1 + NNL; + + #pragma dvm actual(A) + #pragma dvm region in(A) + { + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + imaxt1=A[0][0]; +// printf("imaxt1=%d\n",imaxt1); + } + #pragma dvm actual(imaxt1) + } + #pragma dvm parallel([i][j] on A[i][j]) reduction(max(imaxt1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + if (A[i][j] > imaxt1) imaxt1=A[i][j]; + + } /*end region*/ + + #pragma dvm get_actual(imaxt1) + + if (imax1 == imaxt1) + ansyes(tname); + else + ansno(tname); +// printf("imax1=%d imaxt1=%d\n",imax1,imaxt1); +} + + /*---------------------------------------------RED2104 */ +void red2104() +{ + int C[N][M]; + char tname[] = "RED2104"; + int i, j, NN, NM, NNL, imin1, imint1, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + ni = N / 2 +1; + nj = M / 2 + 1; + imin1 = -(N + M + 1 + NL); + + #pragma dvm actual(imin1, ni, nj) +// #pragma dvm region local(A) +// { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[ni][nj] = -(N + M + 1 + NL); + + #pragma dvm actual(A) + #pragma dvm region in(A) + { + + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + imint1=A[0][0]; +// printf("imint1=%d\n",imint1); + } + #pragma dvm actual(imint1) + } + #pragma dvm parallel([i][j] on A[i][j]) reduction(min(imint1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + if (A[i][j] < imint1) imint1=A[i][j]; + + } /*end region*/ + + #pragma dvm get_actual(imint1) + + if (imin1 == imint1) + ansyes(tname); + else + ansno(tname); +// printf("imin1=%d imint1=%d\n",imin1,imint1); +} +/* ---------------------------------------------RED2105*/ +void red2105() +{ + float C[N][M]; + char tname[] = "RED2105"; + int i, j, NN, NM, NNL, ni, nj; + float imax1, imaxt1; + + #pragma dvm array distribute[block][block] + float A[N][M]; + + NN = N; + ni = N / 2 - 1; + nj = M / 2 - 1; + imax1= N + M + 1. + RNL; + + #pragma dvm actual(imax1, ni, nj) +// #pragma dvm region local(A) +// { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + A[ni][nj] = N + M + 1. + RNL; + + #pragma dvm actual(A) + #pragma dvm region in(A) + { + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + imaxt1=A[0][0]; + } + #pragma dvm actual(imaxt1) + } + #pragma dvm parallel([i][j] on A[i][j]) reduction(max(imaxt1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + if (A[i][j] > imaxt1) imaxt1 = A[i][j]; + + } /*end region*/ + + #pragma dvm get_actual(imaxt1) + if (imax1 == imaxt1) + ansyes(tname); + else + ansno(tname); +/* printf("imax1=%f imaxt1=%f\n",imax1,imaxt1); */ +} +/* ---------------------------------------------RED2106 */ +void red2106() +{ + float C[N][M], CL[N][M]; + char tname[] = "RED2106"; + int i, j, NN, NM, NNL; + float iprod1, iprodt1, RNNL; + + #pragma dvm array distribute[block][block] + float A[N][M]; + + NN = N; + NM = M; + RNNL = RPNL; + + iprod1 = serprodr2(C, NN, NM, RNNL); + iprodt1 = 1; + + #pragma dvm actual(iprodt1) + #pragma dvm region local(A) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + #pragma dvm parallel([i][j] on A[i][j]) reduction(product(iprodt1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + iprodt1 = iprodt1 * A[i][j]; +/* printf("iprodt1=%ld\n",iprodt1);*/ + } /*end region*/ + + #pragma dvm get_actual(iprodt1) +/* printf("iprod1=%ld iprodt1=%ld \n", + iprod1,iprodt1); +*/ + if (iprod1 == iprodt1) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------RED2107*/ +void red2107() +{ + int C[N][M], CL[N][M]; + char tname[] = "RED2107"; + int i, j, NN, NM, NNL; + int land1, landt1; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + + NN = N; + NM = M; + NNL = NL; + + land1 = serand2(CL, NN, NM, NNL); + + #pragma dvm actual(land1) + #pragma dvm region local(A) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j += 2) + A[i][j] = 1; + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 1; j < M; j += 2) + A[i][j] = 0; + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + landt1=A[0][0]; + } + #pragma dvm actual(landt1) + } + #pragma dvm parallel([i][j] on A[i][j]) reduction(and(landt1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + landt1 = landt1 && A[i][j]; + } /*end region*/ + + #pragma dvm get_actual(landt1) +/* printf(" land1=%d landt1=%d\n", + land1,landt1);*/ + + if (land1 == landt1) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------RED2108*/ +void red2108() +{ + int C[N][M], CL[N][M]; + char tname[] = "RED2108"; + int i, j, NN, NM, NNL; + int lor1, lort1; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + + NN = N; + NM = M; + NNL = NL; + + lor1 = seror2(CL, NN, NM, NNL); + + #pragma dvm actual(lor1) + #pragma dvm region local(A) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j += 2) + A[i][j] = 1; + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 1; j < M; j += 2) + A[i][j] = 0; + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + lort1=A[0][0]; + } + #pragma dvm actual(lort1) + } + #pragma dvm parallel([i][j] on A[i][j]) reduction(or(lort1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + lort1 = lort1 || A[i][j]; + } /*end region*/ + + #pragma dvm get_actual(lort1) + + if (lor1 == lort1) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------RED2109*/ +void red2109() +{ + int C[N][M], CL[N][M]; + char tname[] = "RED2109"; + int i, j, NN, NM, NNL; + int lxor1, lxort1; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + + NN = N; + NM = M; + NNL = NL; + + lxor1 = serxor2(CL, NN, NM, NNL); + + #pragma dvm actual(lxor1) + #pragma dvm region local(A) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j += 2) + A[i][j] = 1; + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 1; j < M; j += 2) + A[i][j] = 0; + #pragma dvm host_section + { + lxort1 = 0; + #pragma dvm actual(lxort1) + } + #pragma dvm parallel([i][j] on A[i][j]) reduction(xor(lxort1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + lxort1 = lxort1 ^ A[i][j]; + } /*end region*/ + + #pragma dvm get_actual(lxort1) + + if (lxor1 == lxort1) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------RED2111*/ +void red2111() +{ + int C[N][M]; + char tname[] = "RED2111"; + int i, j, NN, NM, NNL, imax1, imaxt1, ni, ni1, nj, nj1; + int imaxloct1; + int coor[2]; + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + + ni = N / 2 - 1; + nj = M / 2 - 1; + imax1 = N + M + 1 + NL; + + #pragma dvm actual(imax1,ni,nj) +// #pragma dvm region local(A) +// { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + A[ni][nj] = N + M + 1 + NL; + + #pragma dvm actual(A) + #pragma dvm region in(A) + { + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + imaxt1=A[0][0]; + } + #pragma dvm actual(imaxt1) + } + imaxloct1 = imaxt1; + coor[0] = 0; + coor[1] = 0; + #pragma dvm parallel([i][j] on A[i][j]) reduction(maxloc(imaxloct1, coor)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + if (A[i][j] > imaxloct1) + { + imaxloct1 = A[i][j]; + coor[0] = i; + coor[1] = j; + } + + } /*end region*/ + + #pragma dvm get_actual(imaxloct1, coor) + if ((imaxloct1 == imax1) && (coor[0] == ni) && (coor[1] == nj)) + ansyes(tname); + else + ansno(tname); +/* printf("imax1=%d imaxt1=%d imaxloct1=%d coor=%d %d ni=%d\n", + imax1,imaxt1,imaxloct1,coor[0],coor[1],ni); */ +} + /*---------------------------------------------RED2112*/ +void red2112() +{ + int C[N][M]; + char tname[] = "RED2112"; + int i, j, NN, NM, NNL, imin1, imint1, ni, ni1, nj1; + int iminloct1; + int coor[2]; + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + ni1 = N /2 + 1; + nj1 = M / 2 +1; + imin1 = -(N + 1 + M + NL); + + #pragma dvm actual(imin1, ni1, nj1) +// #pragma dvm region local(A) +// { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + A[ni1][nj1] = -(N + 1 + M + NL); + + #pragma dvm actual(A) + #pragma dvm region in(A) + { + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + imint1 = A[0][0]; + } + #pragma dvm actual(imint1) + } + iminloct1 = imint1; + coor[0] = 0; + coor[1] = 0; + #pragma dvm parallel([i][j] on A[i][j]) reduction(minloc(iminloct1,coor)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + if (A[i][j] < iminloct1) + { + iminloct1 = A[i][j]; + coor[0] = i; + coor[1] = j; + } + } /*end region*/ + + #pragma dvm get_actual(iminloct1, coor) + + if ((iminloct1 == imin1) && (coor[0] == ni1) && (coor[1] == nj1)) + ansyes(tname); + else + ansno(tname); +/* printf("imin1=%d imint1=%d iminloct1=%d coor=%d %d ni1=%d\n", + imin1,imint1,iminloct1,coor[0],coor[1],ni1);*/ +} + +/* ---------------------------------------------RED2113*/ +void red2113() +{ + int C[N][M]; + char tname[] = "RED2113"; + int i, j, NN, NM, NNL, ISUM1, isum1, isumt1, imax1, imaxt1, imin1, imint1, ni, nj; + + #pragma dvm array distribute[block][block] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + isum1 = sersum2m(C, NN, NM, NNL); + imax1 = N + M + 1 + NL; + + ni = N / 2 - 1; + nj = M / 2 - 1; + imin1 = -(N + M + 1 + NL); + isumt1 = 0; + + #pragma dvm actual(imin1, imax1, isumt1, ni, nj) +// #pragma dvm region local(A) +// { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + A[ni][nj] = -(N + M + 1 + NL); + A[ni+1][nj+1] = N + M + 1 + NL; + + #pragma dvm actual(A) + #pragma dvm region in(A) + { + + #pragma dvm host_section + { + #pragma dvm remote_access(A[0][0]) + { + imaxt1 = A[0][0]; + } + #pragma dvm actual(imaxt1) + } + imint1 = imaxt1; + + #pragma dvm parallel([i][j] on A[i][j]) reduction(sum(isumt1), max(imaxt1), min(imint1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + { + isumt1 = isumt1 + A[i][j]; + if (A[i][j] > imaxt1) imaxt1 = A[i][j]; + if (A[i][j] < imint1) imint1 = A[i][j]; + } + } /*end region*/ + + #pragma dvm get_actual(isumt1, imaxt1, imint1) + + if ((isum1 == isumt1) && (imax1 == imaxt1) && (imin1 == imint1)) + ansyes(tname); + else + ansno(tname); +/* printf("isum1=%d isumt1=%d\n",isum1,isumt1); + printf("imax1=%d imaxt1=%d\n",imax1,imaxt1); + printf("imin1=%d imint1=%d\n",imin1,imint1); */ +} +/* ---------------------------------------------RED2114*/ +void red2114() +{ + int C[N][M], CL[N][M]; + char tname[] = "RED2114"; + int i, j, NN, NM, NNL; + int iprod1, iprodt1; + int land1, landt1; + + #pragma dvm array distribute[block][block] + int A[N][M]; + #pragma dvm array align([i][j]with A[i][j]) + int B[N][M]; + + + NN = N; + NM = M; + NNL = NL; + + iprod1 = serprod2(C, NN, NM, NNL); + land1 = serand2(CL, NN, NM, NNL); + + #pragma dvm actual(iprod1, land1) + #pragma dvm region local(A), local(B) + { + + #pragma dvm parallel([i][j] on B[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + #pragma dvm parallel([i][j] on B[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j += 2) + B[i][j] = 1; + + #pragma dvm parallel([i][j] on B[i][j]) + for (i = 0; i < N; i++) + for (j = 1; j < M; j += 2) + B[i][j] = 0; + + #pragma dvm host_section + { + #pragma dvm remote_access(B[0][0]) + { + landt1 = B[0][0]; + } + #pragma dvm actual(landt1) + } + + iprodt1 = 1; + #pragma dvm parallel([i][j] on A[i][j]) reduction(product(iprodt1), and(landt1)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + { + iprodt1 = iprodt1*A[i][j]; + landt1 = landt1 && B[i][j]; + } + + } /*end region*/ + #pragma dvm get_actual(iprodt1,landt1) + +/* printf("iprod1=%d iprodt1=%d land1=%d landt1=%d\n", + iprod1,iprodt1,land1,landt1); */ + + if ((iprod1 == iprodt1) && (land1 == landt1)) + ansyes(tname); + else + ansno(tname); +} + +int sersum2(int AR[N][M], int NN, int NM, int NNL) +{ + int i, j, S; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + AR[i][j] = NNL + i + j; + + S = 0; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + S = S + AR[i][j]; + +/* printf("s=%d\n",S);*/ + return S; +} +int sersum2m(int AR[N][M], int NN, int NM, int NNL) +{ + int i, j, ni, nj, S; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + AR[i][j] = NNL + i + j; + ni = NN / 2 - 1; + nj = NM / 2 - 1; + AR[ni][nj] = NN + NM + 1 + NNL; + ni = NN / 2; + nj = NM / 2; + AR[ni][nj] = -(NN + NM + 1 + NNL); + S = 0; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + S = S + AR[i][j]; +/* printf("s=%d\n",S);*/ + return S; +} +float sers2mr(float RAR[N][M], int NN, int NM, float NNL) +{ + int i, j, ni, nj; + float S; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + RAR[i][j] = NNL+i+j; + + ni = NN / 2 - 1; + nj = NM / 2 - 1; + RAR[ni][nj] = NN + NM + 1. + NNL; + ni = NN / 2 + 1; + nj = NM / 2 + 1; + RAR[ni][nj] = -(NN + NM + 1. + NNL); + S = 0; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + S = S + RAR[i][j]; + +/* printf("s=%d\n",S);*/ + return S; +} +long serprod2(int AR[N][M], int NN, int NM, int NNL) +{ + int i, j, ni, nj; + long P; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + AR[i][j] = NNL+i+j; +/* printf("I=%d J=%d AR=%d\n",I,J,AR[I][J]);*/ + + P = 1; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + P = P * AR[i][j]; + return P; +} +float serprodr2(float AR[N][M], int NN, int NM, float NNL) +{ + int i, j; + float P; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + AR[i][j] = NNL+i+j; + P = 1; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + P = P * AR[i][j]; + return P; +} +int serand2(int AR[N][M], int NN, int NM, int NNL) +{ + int i, j, LAND; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j += 2) + AR[i][j] = 1; + for (i = 0; i < NN; i++) + for (j = 1; j < NM; j += 2) + AR[i][j] = 0; + + LAND = AR[0][0]; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + LAND = LAND && AR[i][j]; + + return LAND; +} + +int seror2(int AR[N][M], int NN, int NM, int NNL) +{ + int i, j, LOR; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j += 2) + AR[i][j] = 1; + for (i = 0; i < NN; i++) + for (j = 1; j < NM; j += 2) + AR[i][j] = 0; + + LOR = AR[0][0]; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + LOR = LOR || AR[i][j]; + + return LOR; +} + +int serxor2(int AR[N][M], int NN, int NM, int NNL) +{ + int i, j, LXOR; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j += 2) + AR[i][j] = 1; + for (i = 0; i < NN; i++) + for (j = 1; j < NM; j += 2) + AR[i][j] = 0; + + LXOR = 0; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + LXOR = LXOR ^ AR[i][j]; + + return LXOR; +} + +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem11.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem11.cdv new file mode 100644 index 0000000..1e44bc1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem11.cdv @@ -0,0 +1,537 @@ +// TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +// DISTRIBUTED ARRAY A(N) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +// ON ALL PROCESSORS. + +#include +#include +#include + +void rem1101(); +void rem1102(); +void rem1103(); +void rem1104(); +void rem1105(); +void rem1106(); +void rem1107(); +void rem1108(); +void rem1109(); +void rem1110(); +void rem1111(); +void rem1112(); + +void serial1(int *ar, int n, int nl); +void ansyes(const char *name); +void ansno(const char *name); + +#define n 16 +#define nl 1000 +#define Min(x, y) (x < y) ? (x) : (y) + +int main(int argc, char *argv[]) { + printf("===START OF REM11========================\n"); + + // -------------------------------------------------- + rem1101(); + + // -------------------------------------------------- + rem1102(); + + // -------------------------------------------------- + rem1103(); + + // ------------------------------------------------- + rem1104(); + + // ------------------------------------------------- + rem1105(); + + // ------------------------------------------------- + rem1106(); + + // -------------------------------------------------- + rem1107(); + + // -------------------------------------------------- + rem1108(); + + // -------------------------------------------------- + rem1109(); + + // ------------------------------------------------- + rem1110(); + + // ------------------------------------------------- + rem1111(); + + // ------------------------------------------------- + rem1112(); + + // ------------------------------------------------- + // + // + printf("=== END OF REM11 ========================= \n"); + return 0; +} + +// ---------------------------------------------REM1101 +void rem1101() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl, ib; + + const char *tname = "REM1101"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a[0]) +#pragma dvm remote_access(a[0]) + { ib = a[0]; } + + if (ib == c[0]) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1102() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl, ib; + + const char *tname = "REM1102"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a[n - 1]) +#pragma dvm remote_access(a[n - 1]) + { ib = a[n - 1]; } + + if (ib == c[n - 1]) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1103() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl, ib; + + const char *tname = "REM1103"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a[n / 2 - 1]) +#pragma dvm remote_access(a[n / 2 - 1]) + { ib = a[n / 2 - 1]; } + + if (ib == c[n / 2 - 1]) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1104() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n], d[n]; + int nloop, i, nnl, isumc, isuma; + + const char *tname = "REM1104"; + isumc = 0; + isuma = 0; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } + for (i = 1; i <= n; i++) { +#pragma dvm get_actual(a[i - 1]) +#pragma dvm remote_access(a[i - 1]) + { d[i - 1] = a[i - 1]; } + isumc = isumc + c[i - 1]; + isuma = isuma + d[i - 1]; + } + + if (isumc == isuma) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1105() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n], d[n]; + int nloop, i, nnl, isumc, isuma; + + const char *tname = "REM1105"; + isumc = 0; + isuma = 0; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a) + for (i = 1; i <= n; i++) { +#pragma dvm remote_access(a[]) + { d[i - 1] = a[i - 1]; } + isumc = isumc + c[i - 1]; + isuma = isuma + d[i - 1]; + } + + if (isumc == isuma) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1106() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n], d[n]; + int nloop, i, nnl, isumc, isuma; + + const char *tname = "REM1106"; + isumc = 0; + isuma = 0; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } + int kk = 2; + int kk1 = 3; + for (i = 1; i <= n / kk - kk1; i++) { +#pragma dvm get_actual(a[kk * (i - 1) + kk1]) +#pragma dvm remote_access(a[kk * (i - 1) + kk1]) + { d[i - 1] = a[kk * (i - 1) + kk1]; } + isumc = isumc + c[kk * (i - 1) + kk1]; + isuma = isuma + d[i - 1]; + } + + if (isumc == isuma) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1107() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1107"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[0]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[0]; + } + +#pragma dvm parallel([i] on a[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[0]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1108() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1108"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[n - 1]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[n - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[n - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1109() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1109"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[n / 2 - 1]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[n / 2 - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[n / 2 - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1110() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1110"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[i - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[i - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1111() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1111"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[i - 1]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[i - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[i - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1112() { +#pragma dvm array distribute[block] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1112"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + int kk = 2; + int kk1 = 3; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[kk * i + (kk1 - kk)]) + for (i = 1; i <= n / kk - kk1; i++) { + b[i - 1] = a[kk * i + (kk1 - kk)]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n / kk - kk1; i++) { + if (b[i - 1] != c[kk * (i - 1) + kk1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +#undef n +#undef nl + +void serial1(int *ar, int n, int nl) { + int i; + for (i = 1; i <= n; i++) { + ar[i - 1] = nl + i; + } +} + +void ansyes(const char *name) { printf("%s - complete\n", name); } + +void ansno(const char *name) { printf("%s - ***error\n", name); } diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem12.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem12.cdv new file mode 100644 index 0000000..a468fd3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem12.cdv @@ -0,0 +1,537 @@ +// TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +// DISTRIBUTED ARRAY A(N) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +// ON ALL PROCESSORS. + +#include +#include +#include + +void rem1101(); +void rem1102(); +void rem1103(); +void rem1104(); +void rem1105(); +void rem1106(); +void rem1107(); +void rem1108(); +void rem1109(); +void rem1110(); +void rem1111(); +void rem1112(); + +void serial1(int *ar, int n, int nl); +void ansyes(const char *name); +void ansno(const char *name); + +#define n 16 +#define nl 1000 +#define Min(x, y) (x < y) ? (x) : (y) + +int main(int argc, char *argv[]) { + printf("===START OF REM11========================\n"); + + // -------------------------------------------------- + rem1101(); + + // -------------------------------------------------- + rem1102(); + + // -------------------------------------------------- + rem1103(); + + // ------------------------------------------------- + rem1104(); + + // ------------------------------------------------- + rem1105(); + + // ------------------------------------------------- + rem1106(); + + // -------------------------------------------------- + rem1107(); + + // -------------------------------------------------- + rem1108(); + + // -------------------------------------------------- + rem1109(); + + // ------------------------------------------------- + rem1110(); + + // ------------------------------------------------- + rem1111(); + + // ------------------------------------------------- + rem1112(); + + // ------------------------------------------------- + // + // + printf("=== END OF REM11 ========================= \n"); + return 0; +} + +// ---------------------------------------------REM1101 +void rem1101() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl, ib; + + const char *tname = "REM1101"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a[0]) +#pragma dvm remote_access(a[0]) + { ib = a[0]; } + + if (ib == c[0]) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1102() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl, ib; + + const char *tname = "REM1102"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a[n - 1]) +#pragma dvm remote_access(a[n - 1]) + { ib = a[n - 1]; } + + if (ib == c[n - 1]) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1103() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl, ib; + + const char *tname = "REM1103"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a[n / 2 - 1]) +#pragma dvm remote_access(a[n / 2 - 1]) + { ib = a[n / 2 - 1]; } + + if (ib == c[n / 2 - 1]) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1104() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n], d[n]; + int nloop, i, nnl, isumc, isuma; + + const char *tname = "REM1104"; + isumc = 0; + isuma = 0; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } + for (i = 1; i <= n; i++) { +#pragma dvm get_actual(a[i - 1]) +#pragma dvm remote_access(a[i - 1]) + { d[i - 1] = a[i - 1]; } + isumc = isumc + c[i - 1]; + isuma = isuma + d[i - 1]; + } + + if (isumc == isuma) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1105() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n], d[n]; + int nloop, i, nnl, isumc, isuma; + + const char *tname = "REM1105"; + isumc = 0; + isuma = 0; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } +#pragma dvm get_actual(a) + for (i = 1; i <= n; i++) { +#pragma dvm remote_access(a[]) + { d[i - 1] = a[i - 1]; } + isumc = isumc + c[i - 1]; + isuma = isuma + d[i - 1]; + } + + if (isumc == isuma) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1106() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n], d[n]; + int nloop, i, nnl, isumc, isuma; + + const char *tname = "REM1106"; + isumc = 0; + isuma = 0; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region out(a) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + } + int kk = 2; + int kk1 = 3; + for (i = 1; i <= n / kk - kk1; i++) { +#pragma dvm get_actual(a[kk * (i - 1) + kk1]) +#pragma dvm remote_access(a[kk * (i - 1) + kk1]) + { d[i - 1] = a[kk * (i - 1) + kk1]; } + isumc = isumc + c[kk * (i - 1) + kk1]; + isuma = isuma + d[i - 1]; + } + + if (isumc == isuma) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1107() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1107"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[0]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[0]; + } + +#pragma dvm parallel([i] on a[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[0]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1108() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1108"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[n - 1]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[n - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[n - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1109() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1109"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[n / 2 - 1]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[n / 2 - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[n / 2 - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1110() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1110"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[i - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[i - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1111() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1111"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[i - 1]) + for (i = 1; i <= n; i++) { + b[i - 1] = a[i - 1]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n; i++) { + if (b[i - 1] != c[i - 1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +void rem1112() { +#pragma dvm array distribute[*] + int b[n]; +#pragma dvm array align([i] with b[i]) + int a[n]; + int c[n]; + int nloop, i, nnl; + + const char *tname = "REM1112"; + nnl = nl; + serial1(c, n, nnl); + nloop = nl; + int kk = 2; + int kk1 = 3; + +#pragma dvm region local(a, b) + { +#pragma dvm parallel([i] on a[i - 1]) + for (i = 1; i <= n; i++) { + a[i - 1] = nl + i; + } + +#pragma dvm parallel([i] on b[i - 1]) remote_access(a[kk * i + (kk1 - kk)]) + for (i = 1; i <= n / kk - kk1; i++) { + b[i - 1] = a[kk * i + (kk1 - kk)]; + } + +#pragma dvm parallel([i] on b[i - 1]) reduction(min(nloop)) + for (i = 1; i <= n / kk - kk1; i++) { + if (b[i - 1] != c[kk * (i - 1) + kk1]) { + nloop = Min(nloop, i); + } + } + } +#pragma dvm get_actual(nloop) + if (nloop == nl) { + ansyes(tname); + } else { + ansno(tname); + } +} + +#undef n +#undef nl + +void serial1(int *ar, int n, int nl) { + int i; + for (i = 1; i <= n; i++) { + ar[i - 1] = nl + i; + } +} + +void ansyes(const char *name) { printf("%s - complete\n", name); } + +void ansno(const char *name) { printf("%s - ***error\n", name); } diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem21.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem21.cdv new file mode 100644 index 0000000..31c2239 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem21.cdv @@ -0,0 +1,943 @@ +/* TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. + DISTRIBUTED ARRAY A(N,M) OR ELEMENTS OF THIS ARRAY ARE REPLICATED + ON ALL PROCESSORS. */ +#include +#include +#include +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define N 16 +#define M 8 +#define NL 1000 + +static void rem2101(); +static void rem2102(); +static void rem2103(); +static void rem2104(); +static void rem2105(); +static void rem2106(); +static void rem2107(); +static void rem2108(); +static void rem2109(); +static void rem2110(); +static void rem2111(); +static void rem2112(); +static void rem2113(); +static void rem2114(); +static void rem2115(); +static void rem2116(); +static void rem2117(); +static void rem2118(); +static void rem2119(); +static void rem2120(); +static void serial2(int AR[N][M], int NN, int NM, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int an, char **as) { + printf("===START OF REM21========================\n"); + rem2101(); + rem2102(); + rem2103(); + rem2104(); + rem2105(); + rem2106(); + rem2107(); + rem2108(); + rem2109(); + rem2110(); + rem2111(); + rem2112(); + rem2113(); + rem2114(); + rem2115(); + rem2116(); + rem2117(); + rem2118(); + rem2119(); + rem2120(); + + printf("=== END OF REM21 ========================= \n"); + return 0; +} +/* ---------------------------------------------REM2101 */ +void rem2101() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2101"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[0][0]) +#pragma dvm remote_access(A[0][0]) + { ib = A[0][0]; } + if (ib == C[0][0]) + ansyes(tname); + else + ansno(tname); + return; +} + +/* ---------------------------------------------REM2102 */ +void rem2102() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2102"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } + +#pragma dvm get_actual(A[N - 1][M - 1]) +#pragma dvm remote_access(A[N - 1][M - 1]) + { ib = A[N - 1][M - 1]; } + if (ib == C[N - 1][M - 1]) + ansyes(tname); + else + ansno(tname); + return; +} + +/* ---------------------------------------------REM2103 */ +void rem2103() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2103"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } + +#pragma dvm get_actual(A[0][M - 1]) +#pragma dvm remote_access(A[0][M - 1]) + { ib = A[0][M - 1]; } + if (ib == C[0][M - 1]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2104 */ +void rem2104() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2104"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[N - 1][0]) +#pragma dvm remote_access(A[N - 1][0]) + { ib = A[N - 1][0]; } + if (ib == C[N - 1][0]) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2105 */ +void rem2105() { + + int C[N][M], D[N][M]; + int ib, isuma, isumc; + char tname[] = "REM2105"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int A[N][M]; + +#pragma dvm array align([i][j] with A[i][j]) + int B[N][M]; + isuma = 0; + isumc = 0; + NNL = NL; + serial2(C, N, M, NNL); +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[][]) + { D[i][j] = A[i][j]; } + isumc = isumc + C[i][j]; + isuma = isuma + D[i][j]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2106 */ +void rem2106() { + + int C[N][M], D[N][M]; + int ib, isuma, isumc; + char tname[] = "REM2106"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int A[N][M]; + +#pragma dvm array align([i][j] with A[i][j]) + int B[N][M]; + isuma = 0; + isumc = 0; + NNL = NL; + serial2(C, N, M, NNL); +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][0]) + for (i = 0; i < N; i++) { +#pragma dvm remote_access(A[][0]) + { D[i][0] = A[i][0]; } + isumc = isumc + C[i][0]; + isuma = isuma + D[i][0]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2107 */ +void rem2107() { + + int C[N][M], D[N][M]; + int isuma, isumc; + char tname[] = "REM2107"; + + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int A[N][M]; + +#pragma dvm array align([i][j] with A[i][j]) + int B[N][M]; + isuma = 0; + isumc = 0; + NNL = NL; + serial2(C, N, M, NNL); + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[0][]) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[0][]) + { D[0][j] = A[0][j]; } + isumc = isumc + C[0][j]; + isuma = isuma + D[0][j]; + } + + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2108 */ +void rem2108() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc; + char tname[] = "REM2108"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][M - 1]) + + for (i = 0; i < N; i++) { +#pragma dvm remote_access(A[][M - 1]) + { D[i][M - 1] = A[i][M - 1]; } + isumc = isumc + C[i][M - 1]; + isuma = isuma + D[i][M - 1]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2109 */ +void rem2109() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc; + char tname[] = "REM2109"; + + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[N - 1][]) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[N - 1][]) + { D[N - 1][j] = A[N - 1][j]; } + isumc = isumc + C[N - 1][j]; + isuma = isuma + D[N - 1][j]; + } + + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2110 */ +void rem2110() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc; + char tname[] = "REM2110"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[i][j]) + { D[i][j] = A[i][j]; } + isumc = isumc + C[i][j]; + isuma = isuma + D[i][j]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2111 */ +void rem2111() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc, kk, kk1; + char tname[] = "REM2111"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][]) + + kk = 2; + kk1 = 3; + + for (i = 0; i < N / (kk - kk1); i++) + for (j = 0; j < M / (kk - kk1); j++) { +#pragma dvm remote_access(A[kk * i + kk1][kk * j + kk1]) + { D[i][j] = A[kk * i + kk1][kk * j + kk1]; } + isumc = isumc + C[kk * i + kk1][kk * j + kk1]; + isuma = isuma + D[i][j]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2112 */ +void rem2112() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2112"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[0][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[0][0]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[0][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2113 */ +void rem2113() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2113"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[N - 1][M - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[N - 1][M - 1]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[N - 1][M - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2114 */ +void rem2114() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2114"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[0][M - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[0][M - 1]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[0][M - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2115 */ +void rem2115() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2115"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[N - 1][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[N - 1][0]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[N - 1][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2116 */ +void rem2116() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2116"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[i][j]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[i][j]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2117 */ +void rem2117() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2117"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[i][0]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[i][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2118 */ +void rem2118() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2118"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[0][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[0][j]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[0][j]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2119 */ +void rem2119() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2119"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[][M - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[i][M - 1]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[i][M - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2120 */ +void rem2120() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2120"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[N - 1][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[N - 1][j]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[N - 1][j]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +void serial2(int AR[N][M], int NN, int NM, int NNL) { + int i, j; + + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) { + AR[i][j] = NNL + i + j; + } + return; +} + +void ansyes(const char name[]) { + printf("%s - complete\n", name); + return; +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); + return; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem22.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem22.cdv new file mode 100644 index 0000000..79f7ae1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem22.cdv @@ -0,0 +1,943 @@ +/* TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. + DISTRIBUTED ARRAY A(N,M) OR ELEMENTS OF THIS ARRAY ARE REPLICATED + ON ALL PROCESSORS. */ +#include +#include +#include +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define N 16 +#define M 8 +#define NL 1000 + +static void rem2101(); +static void rem2102(); +static void rem2103(); +static void rem2104(); +static void rem2105(); +static void rem2106(); +static void rem2107(); +static void rem2108(); +static void rem2109(); +static void rem2110(); +static void rem2111(); +static void rem2112(); +static void rem2113(); +static void rem2114(); +static void rem2115(); +static void rem2116(); +static void rem2117(); +static void rem2118(); +static void rem2119(); +static void rem2120(); +static void serial2(int AR[N][M], int NN, int NM, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int an, char **as) { + printf("===START OF REM21========================\n"); + rem2101(); + rem2102(); + rem2103(); + rem2104(); + rem2105(); + rem2106(); + rem2107(); + rem2108(); + rem2109(); + rem2110(); + rem2111(); + rem2112(); + rem2113(); + rem2114(); + rem2115(); + rem2116(); + rem2117(); + rem2118(); + rem2119(); + rem2120(); + + printf("=== END OF REM21 ========================= \n"); + return 0; +} +/* ---------------------------------------------REM2101 */ +void rem2101() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2101"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[0][0]) +#pragma dvm remote_access(A[0][0]) + { ib = A[0][0]; } + if (ib == C[0][0]) + ansyes(tname); + else + ansno(tname); + return; +} + +/* ---------------------------------------------REM2102 */ +void rem2102() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2102"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } + +#pragma dvm get_actual(A[N - 1][M - 1]) +#pragma dvm remote_access(A[N - 1][M - 1]) + { ib = A[N - 1][M - 1]; } + if (ib == C[N - 1][M - 1]) + ansyes(tname); + else + ansno(tname); + return; +} + +/* ---------------------------------------------REM2103 */ +void rem2103() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2103"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } + +#pragma dvm get_actual(A[0][M - 1]) +#pragma dvm remote_access(A[0][M - 1]) + { ib = A[0][M - 1]; } + if (ib == C[0][M - 1]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2104 */ +void rem2104() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2104"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[N - 1][0]) +#pragma dvm remote_access(A[N - 1][0]) + { ib = A[N - 1][0]; } + if (ib == C[N - 1][0]) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2105 */ +void rem2105() { + + int C[N][M], D[N][M]; + int ib, isuma, isumc; + char tname[] = "REM2105"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int A[N][M]; + +#pragma dvm array align([i][j] with A[i][j]) + int B[N][M]; + isuma = 0; + isumc = 0; + NNL = NL; + serial2(C, N, M, NNL); +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[][]) + { D[i][j] = A[i][j]; } + isumc = isumc + C[i][j]; + isuma = isuma + D[i][j]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2106 */ +void rem2106() { + + int C[N][M], D[N][M]; + int ib, isuma, isumc; + char tname[] = "REM2106"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int A[N][M]; + +#pragma dvm array align([i][j] with A[i][j]) + int B[N][M]; + isuma = 0; + isumc = 0; + NNL = NL; + serial2(C, N, M, NNL); +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][0]) + for (i = 0; i < N; i++) { +#pragma dvm remote_access(A[][0]) + { D[i][0] = A[i][0]; } + isumc = isumc + C[i][0]; + isuma = isuma + D[i][0]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2107 */ +void rem2107() { + + int C[N][M], D[N][M]; + int isuma, isumc; + char tname[] = "REM2107"; + + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int A[N][M]; + +#pragma dvm array align([i][j] with A[i][j]) + int B[N][M]; + isuma = 0; + isumc = 0; + NNL = NL; + serial2(C, N, M, NNL); + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[0][]) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[0][]) + { D[0][j] = A[0][j]; } + isumc = isumc + C[0][j]; + isuma = isuma + D[0][j]; + } + + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2108 */ +void rem2108() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc; + char tname[] = "REM2108"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][M - 1]) + + for (i = 0; i < N; i++) { +#pragma dvm remote_access(A[][M - 1]) + { D[i][M - 1] = A[i][M - 1]; } + isumc = isumc + C[i][M - 1]; + isuma = isuma + D[i][M - 1]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2109 */ +void rem2109() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc; + char tname[] = "REM2109"; + + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[N - 1][]) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[N - 1][]) + { D[N - 1][j] = A[N - 1][j]; } + isumc = isumc + C[N - 1][j]; + isuma = isuma + D[N - 1][j]; + } + + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2110 */ +void rem2110() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc; + char tname[] = "REM2110"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { +#pragma dvm remote_access(A[i][j]) + { D[i][j] = A[i][j]; } + isumc = isumc + C[i][j]; + isuma = isuma + D[i][j]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2111 */ +void rem2111() { + + int C[N][M], D[N][M]; + int nloop, ib, isuma, isumc, kk, kk1; + char tname[] = "REM2111"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + isuma = 0; + isumc = 0; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + } +#pragma dvm get_actual(A[][]) + + kk = 2; + kk1 = 3; + + for (i = 0; i < N / (kk - kk1); i++) + for (j = 0; j < M / (kk - kk1); j++) { +#pragma dvm remote_access(A[kk * i + kk1][kk * j + kk1]) + { D[i][j] = A[kk * i + kk1][kk * j + kk1]; } + isumc = isumc + C[kk * i + kk1][kk * j + kk1]; + isuma = isuma + D[i][j]; + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2112 */ +void rem2112() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2112"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[0][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[0][0]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[0][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2113 */ +void rem2113() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2113"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[N - 1][M - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[N - 1][M - 1]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[N - 1][M - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2114 */ +void rem2114() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2114"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[0][M - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[0][M - 1]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[0][M - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2115 */ +void rem2115() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2115"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[N - 1][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[N - 1][0]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[N - 1][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2116 */ +void rem2116() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2116"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[i][j]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[i][j]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM2117 */ +void rem2117() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2117"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[i][0]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[i][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2118 */ +void rem2118() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2118"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[0][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[0][j]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[0][j]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2119 */ +void rem2119() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2119"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[*][block] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[][M - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[i][M - 1]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[i][M - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM2120 */ +void rem2120() { + + int C[N][M]; + int nloop, ib; + char tname[] = "REM2120"; + int i, j, NN, NM, NNL; + +#pragma dvm array distribute[block][*] + int B[N][M]; + +#pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloop = NL; +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + A[i][j] = NL + i + j; + } + +#pragma dvm parallel([i][j] on B[i][j]) remote_access(A[N - 1][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + B[i][j] = A[N - 1][j]; + } +#pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + if (B[i][j] != C[N - 1][j]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +void serial2(int AR[N][M], int NN, int NM, int NNL) { + int i, j; + + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) { + AR[i][j] = NNL + i + j; + } + return; +} + +void ansyes(const char name[]) { + printf("%s - complete\n", name); + return; +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); + return; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem31.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem31.cdv new file mode 100644 index 0000000..7216f6f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem31.cdv @@ -0,0 +1,702 @@ +/* TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K) OR ELEMENTS OF THIS ARRAY ARE REPLICATED + ON ALL PROCESSORS. */ +#include +#include +#include +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define N 16 +#define M 8 +#define K 8 +#define NL 1000 + +static void rem3101(); +static void rem3102(); +static void rem3103(); +static void rem3104(); +static void rem3105(); +static void rem3106(); +static void rem3107(); +static void rem3108(); +static void rem3109(); +static void rem3110(); +static void rem3111(); +static void rem3112(); +static void rem3113(); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static void serial3(int AR[N][M][K], int NN, int NM, int NK, int NNL); + +int main(int an, char **as) { + printf("===START OF REM31========================\n"); + rem3101(); + rem3102(); + rem3103(); + rem3104(); + rem3105(); + rem3106(); + rem3107(); + rem3108(); + rem3109(); + rem3110(); + rem3111(); + rem3112(); + rem3113(); + + printf("=== END OF REM31 ========================= \n"); + return 0; +} +/* ---------------------------------------------REM3101 */ +void rem3101() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3101"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[0][0][0]) +#pragma dvm remote_access(A[0][0][0]) + { ib = A[0][0][0]; } + if (ib == C[0][0][0]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3102 */ +void rem3102() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3102"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[N - 1][M - 1][K - 1]) +#pragma dvm remote_access(A[N - 1][M - 1][K - 1]) + { ib = A[N - 1][M - 1][K - 1]; } + if (ib == C[N - 1][M - 1][K - 1]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3103 */ +void rem3103() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3103"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[][][]) +#pragma dvm remote_access(A[][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[i][j][ii]; + isuma = isuma + A[i][j][ii]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3104 */ +void rem3104() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3104"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[0][][]) +#pragma dvm remote_access(A[0][][]) + { + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[0][j][ii]; + isuma = isuma + A[0][j][ii]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM3105 */ +void rem3105() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3105"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[][M - 1][]) +#pragma dvm remote_access(A[][M - 1][]) + { + for (i = 0; i < N; i++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[i][M - 1][ii]; + isuma = isuma + A[i][M - 1][ii]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3106 */ +void rem3106() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3106"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[][][K - 1]) +#pragma dvm remote_access(A[][][K - 1]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + isumc = isumc + C[i][j][K - 1]; + isuma = isuma + A[i][j][K - 1]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM3107 */ +void rem3107() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + int ki, ki1, kj, kj1, kii, kii1; + char tname[] = "REM3107"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A) + ki = 2; + ki1 = 3; + kj = 2; + kj1 = 3; + kii = 2; + kii1 = 3; + for (i = 0; i < N / ki - ki1; i++) + for (j = 0; j < M / kj - kj1; j++) + for (ii = 0; ii < K / kii - kii1; ii++) { +#pragma dvm remote_access(A[ki * i + ki1][kj * j + kj1][kii * ii + kii1]) + { isuma = isuma + A[ki * i + ki1][kj * j + kj1][kii * ii + kii1]; } + isumc = isumc + C[ki * i + ki1][kj * j + kj1][kii * ii + kii1]; + } + + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); + return; +} + +/* ---------------------------------------------REM3108 */ +void rem3108() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3108"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[0][0][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[0][0][0]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[0][0][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3109 */ +void rem3109() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3109"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) \ + remote_access(A[N - 1][M - 1][K - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[N - 1][M - 1][K - 1]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[N - 1][M - 1][K - 1]) + nloop = i; + } + } + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM3110 */ +void rem3110() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3110"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + B[i][j][ii] = A[i][j][ii]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[i][j][ii]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3111 */ +void rem3111() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3111"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[0][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[0][j][ii]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[0][j][ii]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3112 */ +void rem3112() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3112"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[][M - 1][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + B[i][j][ii] = A[i][M - 1][ii]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[i][M - 1][ii]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3113 */ +void rem3113() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3113"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[][][K - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[i][j][K - 1]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[i][j][K - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +void serial3(int AR[N][M][K], int NN, int NM, int NK, int NNL) { + int i, j, ii; + + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + + { + AR[i][j][ii] = NNL + i + j + ii; + } +} + +void ansyes(const char name[]) { + printf("%s - complete\n", name); + return; +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); + return; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem32.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem32.cdv new file mode 100644 index 0000000..a2944b4 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem32.cdv @@ -0,0 +1,705 @@ +/* TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K) OR ELEMENTS OF THIS ARRAY ARE REPLICATED + ON ALL PROCESSORS. */ +#include +#include +#include +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define N 16 +#define M 8 +#define K 8 +#define NL 1000 + +static void rem3101(); +static void rem3102(); +static void rem3103(); +static void rem3104(); +static void rem3105(); +static void rem3106(); +static void rem3107(); +static void rem3108(); +static void rem3109(); +static void rem3110(); +static void rem3111(); +static void rem3112(); +static void rem3113(); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static void serial3(int AR[N][M][K], int NN, int NM, int NK, int NNL); + +int main(int an, char **as) { + printf("===START OF REM31========================\n"); + rem3101(); + rem3102(); + rem3103(); + rem3104(); + rem3105(); + rem3106(); + rem3107(); + rem3108(); + rem3109(); + rem3110(); + rem3111(); + rem3112(); + rem3113(); + + printf("=== END OF REM31 ========================= \n"); + return 0; +} +/* ---------------------------------------------REM3101 */ +void rem3101() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3101"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[*][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[1][1][1]) +#pragma dvm remote_access(A[1][1][1]) + { ib = A[1][1][1]; } + if (ib == C[1][1][1]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3102 */ +void rem3102() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3102"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][*][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[N - 1][M - 1][K - 1]) +#pragma dvm remote_access(A[N - 1][M - 1][K - 1]) + { ib = A[N - 1][M - 1][K - 1]; } + if (ib == C[N - 1][M - 1][K - 1]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3103 */ +void rem3103() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3103"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][*] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[][][]) +#pragma dvm remote_access(A[][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[i][j][ii]; + isuma = isuma + A[i][j][ii]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3104 */ +void rem3104() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3104"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[*][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[1][][]) +#pragma dvm remote_access(A[1][][]) + { + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[1][j][ii]; + isuma = isuma + A[1][j][ii]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM3105 */ +void rem3105() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3105"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][*][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[][M - 1][]) +#pragma dvm remote_access(A[][M - 1][]) + { + for (i = 0; i < N; i++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[i][M - 1][ii]; + isuma = isuma + A[i][M - 1][ii]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3106 */ +void rem3106() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + char tname[] = "REM3106"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][*] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A[][][K - 1]) +#pragma dvm remote_access(A[][][K - 1]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) { + isumc = isumc + C[i][j][K - 1]; + isuma = isuma + A[i][j][K - 1]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM3107 */ +void rem3107() { + + int C[N][M][K]; + int nloop, ib, isuma, isumc; + int ki, ki1, kj, kj1, kii, kii1; + char tname[] = "REM3107"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[*][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + isuma = 0; + isumc = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + } +#pragma dvm get_actual(A) + ki = 2; + ki1 = 3; + kj = 2; + kj1 = 3; + kii = 2; + kii1 = 3; + for (i = 0; i < N / ki - ki1; i++) + for (j = 0; j < M / kj - kj1; j++) + for (ii = 0; ii < K / kii - kii1; ii++) { +#pragma dvm remote_access(A[ki * i + ki1][kj * j + kj1][kii * ii + kii1]) + { isuma = isuma + A[ki * i + ki1][kj * j + kj1][kii * ii + kii1]; } + isumc = isumc + C[ki * i + ki1][kj * j + kj1][kii * ii + kii1]; + } + + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); + return; +} + +/* ---------------------------------------------REM3108 */ +void rem3108() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3108"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][*][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[1][1][1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[1][1][1]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[1][1][1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3109 */ +void rem3109() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3109"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][*] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) \ + remote_access(A[N - 1][M - 1][K - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[N - 1][M - 1][K - 1]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[N - 1][M - 1][K - 1]) + nloop = i; + } + } + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM3110 */ +void rem3110() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3110"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[*][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[i][j][ii]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[i][j][ii]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3111 */ +void rem3111() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3111"; + + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][*][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[1][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[1][j][ii]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[1][j][ii]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3112 */ +void rem3112() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3112"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[block][block][*] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[][M - 1][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[i][M - 1][ii]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[i][M - 1][ii]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM3113 */ +void rem3113() { + + int C[N][M][K]; + int nloop, ib; + char tname[] = "REM3113"; + int i, j, ii, NN, NM, NK, NNL; + +#pragma dvm array distribute[*][block][block] + int B[N][M][K]; + +#pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + } + +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) remote_access(A[][][K - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + + B[i][j][ii] = A[i][j][K - 1]; + } +#pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + if (B[i][j][ii] != C[i][j][K - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +void serial3(int AR[N][M][K], int NN, int NM, int NK, int NNL) { + int i, j, ii; + + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + + { + AR[i][j][ii] = NNL + i + j + ii; + } +} + +void ansyes(const char name[]) { + printf("%s - complete\n", name); + return; +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); + return; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem41.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem41.cdv new file mode 100644 index 0000000..95bc72f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem41.cdv @@ -0,0 +1,811 @@ +/* TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K,L) OR ELEMENTS OF THIS ARRAY ARE REPLICATED + ON ALL PROCESSORS. */ +#include +#include +#include +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define N 16 +#define M 16 +#define K 16 +#define L 16 +#define NL 1000 + +static void rem4101(); +static void rem4102(); +static void rem4103(); +static void rem4104(); +static void rem4105(); +static void rem4106(); +static void rem4107(); +static void rem4108(); +static void rem4109(); +static void rem4110(); +static void rem4111(); +static void rem4112(); +static void rem4113(); +static void rem4114(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static void serial4(int AR[N][M][K][L], int NN, int NM, int NK, int NLL, + int NNL); + +int main(int an, char **as) { + printf("===START OF REM41========================\n"); + rem4101(); + rem4102(); + rem4103(); + rem4104(); + rem4105(); + rem4106(); + rem4107(); + rem4108(); + rem4109(); + rem4110(); + rem4111(); + rem4112(); + rem4113(); + rem4114(); + + printf("=== END OF REM41 ========================= \n"); + return 0; +} +/* ---------------------------------------------REM4101 */ +void rem4101() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4101"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[1][1][1][1]) +#pragma dvm remote_access(A[1][1][1][1]) + { ib = A[1][1][1][1]; } + if (ib == C[1][1][1][1]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4102 */ +void rem4102() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4102"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[N - 1][M - 1][K - 1][L - 1]) +#pragma dvm remote_access(A[N - 1][M - 1][K - 1][L - 1]) + { ib = A[N - 1][M - 1][K - 1][L - 1]; } + + if (ib == C[N - 1][M - 1][K - 1][L - 1]) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM4103 */ +void rem4103() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4103"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][][]) +#pragma dvm remote_access(A[][][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[i][j][ii][jj]; + isuma = isuma + A[i][j][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4104 */ +void rem4104() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4104"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[1][][][]) +#pragma dvm remote_access(A[1][][][]) + { + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[1][j][ii][jj]; + isuma = isuma + A[1][j][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4105 */ +void rem4105() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4105"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][M - 1][][]) +#pragma dvm remote_access(A[][M - 1][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[i][M - 1][ii][jj]; + isuma = isuma + A[i][M - 1][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4106 */ +void rem4106() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4106"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][K - 1][]) + +#pragma dvm remote_access(A[][][K - 1][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (jj = 0; jj < L; jj++) { + isumc = isumc + C[i][j][K - 1][jj]; + isuma = isuma + A[i][j][K - 1][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4107 */ +void rem4107() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4107"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][][L - 1]) +#pragma dvm remote_access(A[][][][L - 1]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[i][j][ii][L - 1]; + isuma = isuma + A[i][j][ii][L - 1]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4108 */ +void rem4108() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4108"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[1][1][1][1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[1][1][1][1]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[1][1][1][1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4109 */ +void rem4109() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4109"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[N - 1][M - 1][K - 1][L - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[N - 1][M - 1][K - 1][L - 1]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[N - 1][M - 1][K - 1][L - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4110 */ +void rem4110() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4110"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) remote_access(A[][][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4111 */ +void rem4111() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4111"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[1][][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[1][j][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[1][j][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM4112 */ +void rem4112() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4112"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][M - 1][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][M - 1][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][M - 1][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4113 */ +void rem4113() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4113"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][][K - 1][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][K - 1][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][K - 1][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4114 */ +void rem4114() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4114"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][][][L - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][ii][L - 1]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][ii][L - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +void serial4(int AR[N][M][K][L], int NN, int NM, int NK, int NLL, int NNL) { + int i, j, ii, jj; + + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + for (jj = 0; jj < NLL; jj++) + + { + AR[i][j][ii][jj] = NNL + i + j + ii + jj; + } +} +void ansyes(const char name[]) { + printf("%s - complete\n", name); + return; +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); + return; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem42.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem42.cdv new file mode 100644 index 0000000..ad51022 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem42.cdv @@ -0,0 +1,811 @@ +/* TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K,L) OR ELEMENTS OF THIS ARRAY ARE REPLICATED + ON ALL PROCESSORS. */ +#include +#include +#include +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define N 16 +#define M 16 +#define K 16 +#define L 16 +#define NL 1000 + +static void rem4101(); +static void rem4102(); +static void rem4103(); +static void rem4104(); +static void rem4105(); +static void rem4106(); +static void rem4107(); +static void rem4108(); +static void rem4109(); +static void rem4110(); +static void rem4111(); +static void rem4112(); +static void rem4113(); +static void rem4114(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static void serial4(int AR[N][M][K][L], int NN, int NM, int NK, int NLL, + int NNL); + +int main(int an, char **as) { + printf("===START OF REM41========================\n"); + rem4101(); + rem4102(); + rem4103(); + rem4104(); + rem4105(); + rem4106(); + rem4107(); + rem4108(); + rem4109(); + rem4110(); + rem4111(); + rem4112(); + rem4113(); + rem4114(); + + printf("=== END OF REM41 ========================= \n"); + return 0; +} +/* ---------------------------------------------REM4101 */ +void rem4101() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4101"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[0][0][0][0]) +#pragma dvm remote_access(A[0][0][0][0]) + { ib = A[0][0][0][0]; } + if (ib == C[0][0][0][0]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4102 */ +void rem4102() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4102"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[N - 1][M - 1][K - 1][L - 1]) +#pragma dvm remote_access(A[N - 1][M - 1][K - 1][L - 1]) + { ib = A[N - 1][M - 1][K - 1][L - 1]; } + + if (ib == C[N - 1][M - 1][K - 1][L - 1]) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM4103 */ +void rem4103() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4103"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][][]) +#pragma dvm remote_access(A[][][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[i][j][ii][jj]; + isuma = isuma + A[i][j][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4104 */ +void rem4104() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4104"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[0][0][0][0]) +#pragma dvm remote_access(A[0][][][]) + { + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[0][j][ii][jj]; + isuma = isuma + A[0][j][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4105 */ +void rem4105() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4105"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][M - 1][][]) +#pragma dvm remote_access(A[][M - 1][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[i][M - 1][ii][jj]; + isuma = isuma + A[i][M - 1][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4106 */ +void rem4106() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4106"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][K - 1][]) + +#pragma dvm remote_access(A[][][K - 1][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (jj = 0; jj < L; jj++) { + isumc = isumc + C[i][j][K - 1][jj]; + isuma = isuma + A[i][j][K - 1][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4107 */ +void rem4107() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4107"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][][L - 1]) +#pragma dvm remote_access(A[][][][L - 1]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[i][j][ii][L - 1]; + isuma = isuma + A[i][j][ii][L - 1]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4108 */ +void rem4108() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4108"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[0][0][0][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[0][0][0][0]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[0][0][0][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4109 */ +void rem4109() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4109"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[N - 1][M - 1][K - 1][L - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[N - 1][M - 1][K - 1][L - 1]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[N - 1][M - 1][K - 1][L - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4110 */ +void rem4110() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4110"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) remote_access(A[][][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4111 */ +void rem4111() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4111"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[0][][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[0][j][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[0][j][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM4112 */ +void rem4112() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4112"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][M - 1][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][M - 1][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][M - 1][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4113 */ +void rem4113() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4113"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][][K - 1][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][K - 1][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][K - 1][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4114 */ +void rem4114() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4114"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][*][*][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][][][L - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][ii][L - 1]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][ii][L - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +void serial4(int AR[N][M][K][L], int NN, int NM, int NK, int NLL, int NNL) { + int i, j, ii, jj; + + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + for (jj = 0; jj < NLL; jj++) + + { + AR[i][j][ii][jj] = NNL + i + j + ii + jj; + } +} +void ansyes(const char name[]) { + printf("%s - complete\n", name); + return; +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); + return; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem43.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem43.cdv new file mode 100644 index 0000000..09f6d7a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/REMOTE/rem43.cdv @@ -0,0 +1,811 @@ +/* TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K,L) OR ELEMENTS OF THIS ARRAY ARE REPLICATED + ON ALL PROCESSORS. */ +#include +#include +#include +#define Min(a, b) ((a) < (b) ? (a) : (b)) +#define N 16 +#define M 16 +#define K 16 +#define L 16 +#define NL 1000 + +static void rem4101(); +static void rem4102(); +static void rem4103(); +static void rem4104(); +static void rem4105(); +static void rem4106(); +static void rem4107(); +static void rem4108(); +static void rem4109(); +static void rem4110(); +static void rem4111(); +static void rem4112(); +static void rem4113(); +static void rem4114(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); +static void serial4(int AR[N][M][K][L], int NN, int NM, int NK, int NLL, + int NNL); + +int main(int an, char **as) { + printf("===START OF REM41========================\n"); + rem4101(); + rem4102(); + rem4103(); + rem4104(); + rem4105(); + rem4106(); + rem4107(); + rem4108(); + rem4109(); + rem4110(); + rem4111(); + rem4112(); + rem4113(); + rem4114(); + + printf("=== END OF REM41 ========================= \n"); + return 0; +} +/* ---------------------------------------------REM4101 */ +void rem4101() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4101"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[0][0][0][0]) +#pragma dvm remote_access(A[0][0][0][0]) + { ib = A[0][0][0][0]; } + if (ib == C[0][0][0][0]) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4102 */ +void rem4102() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4102"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][*][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[N - 1][M - 1][K - 1][L - 1]) +#pragma dvm remote_access(A[N - 1][M - 1][K - 1][L - 1]) + { ib = A[N - 1][M - 1][K - 1][L - 1]; } + + if (ib == C[N - 1][M - 1][K - 1][L - 1]) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM4103 */ +void rem4103() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4103"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][*][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][][]) +#pragma dvm remote_access(A[][][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[i][j][ii][jj]; + isuma = isuma + A[i][j][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4104 */ +void rem4104() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4104"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[0][0][0][0]) +#pragma dvm remote_access(A[0][][][]) + { + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[0][j][ii][jj]; + isuma = isuma + A[0][j][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4105 */ +void rem4105() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4105"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][M - 1][][]) +#pragma dvm remote_access(A[][M - 1][][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < K; jj++) { + isumc = isumc + C[i][M - 1][ii][jj]; + isuma = isuma + A[i][M - 1][ii][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4106 */ +void rem4106() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4106"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][*][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][K - 1][]) + +#pragma dvm remote_access(A[][][K - 1][]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (jj = 0; jj < L; jj++) { + isumc = isumc + C[i][j][K - 1][jj]; + isuma = isuma + A[i][j][K - 1][jj]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4107 */ +void rem4107() { + + int C[N][M][K][L]; + int nloop, ib, isuma, isumc; + char tname[] = "REM4107"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][*][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + isumc = 0; + isuma = 0; + +#pragma dvm region out(A) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + } +#pragma dvm get_actual(A[][][][L - 1]) +#pragma dvm remote_access(A[][][][L - 1]) + { + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + isumc = isumc + C[i][j][ii][L - 1]; + isuma = isuma + A[i][j][ii][L - 1]; + } + } + if (isuma == isumc) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4108 */ +void rem4108() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4108"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[0][0][0][0]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[0][0][0][0]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[0][0][0][0]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4109 */ +void rem4109() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4109"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[N - 1][M - 1][K - 1][L - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[N - 1][M - 1][K - 1][L - 1]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[N - 1][M - 1][K - 1][L - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4110 */ +void rem4110() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4110"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][*][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) remote_access(A[][][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4111 */ +void rem4111() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4111"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][*][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[0][][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[0][j][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[0][j][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------REM4112 */ +void rem4112() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4112"; + + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[*][block][block][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][M - 1][][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][M - 1][ii][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][M - 1][ii][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4113 */ +void rem4113() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4113"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][block][*] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][][K - 1][]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][K - 1][jj]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][K - 1][jj]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------REM4114 */ +void rem4114() { + + int C[N][M][K][L]; + int nloop, ib; + char tname[] = "REM4114"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + +#pragma dvm array distribute[block][block][*][block] + int B[N][M][K][L]; + +#pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]) + int A[N][M][K][L]; + + NN = N; + NM = M; + NK = K; + NLL = L; + NNL = NL; + serial4(C, NN, NM, NK, NLL, NNL); + nloop = NL; + +#pragma dvm region local(A, B) + { + +#pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + A[i][j][ii][jj] = NL + i + j + ii + jj; + } + +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) \ + remote_access(A[][][][L - 1]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + + B[i][j][ii][jj] = A[i][j][ii][L - 1]; + } +#pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloop)) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) { + if (B[i][j][ii][jj] != C[i][j][ii][L - 1]) + nloop = i; + } + } +#pragma dvm get_actual(nloop) + if (nloop == NL) + ansyes(tname); + else + ansno(tname); +} +void serial4(int AR[N][M][K][L], int NN, int NM, int NK, int NLL, int NNL) { + int i, j, ii, jj; + + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + for (jj = 0; jj < NLL; jj++) + + { + AR[i][j][ii][jj] = NNL + i + j + ii + jj; + } +} +void ansyes(const char name[]) { + printf("%s - complete\n", name); + return; +} +void ansno(const char name[]) { + printf("%s - ***error\n", name); + return; +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh21.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh21.cdv new file mode 100644 index 0000000..977fb11 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh21.cdv @@ -0,0 +1,1169 @@ +/* TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. + DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT SHADOW WIDTH + ON BOTH SIDES */ + +#include +#include +#include + +#define N 60 +#define M 60 +#define NL 1000 + +static void sh2101(); +static void sh2102(); +static void sh2103(); +static void sh2104(); +static void sh2105(); +static void sh2106(); +static void sh2107(); +static void sh2108(); +static void sh2109(); +static void sh2110(); +static void sh2111(); +static void sh2112(); +static void sh2113(); +static void sh2114(); +static void sh2115(); +static void sh2116(); +static void sh2117(); +static void sh2118(); +static void sh2119(); +static void sh2120(); +static void sh2121(); +static void sh2122(); + +static void serial2(int AR[N][M], int NN, int NM, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START OF SH21========================\n"); + sh2101(); + sh2102(); + sh2103(); + sh2104(); + sh2105(); + sh2106(); + sh2107(); + sh2108(); + sh2109(); + sh2110(); + sh2111(); + sh2112(); + sh2113(); + sh2114(); + sh2115(); + sh2116(); + sh2117(); + sh2118(); + sh2119(); + sh2120(); + sh2121(); + sh2122(); + + printf("=== END OF SH21 ========================= \n"); + return 0; +} +/* ---------------------------------------------SH2101 */ +void sh2101() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2101"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A (corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + B[i][j] = A[i+1][j]+A[i][j+1]+A[i-1][j]+A[i][j-1]+ A[i-1][j-1]+ + A[i+1][j+1]+A[i-1][j+1]+A[i+1][j-1]; + } /*end region*/ + + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (B[i][j] !=C[i+1][j]+C[i][j+1]+C[i-1][j]+C[i][j-1]+C[i-1][j-1]+ + C[i+1][j+1]+C[i-1][j+1]+C[i+1][j-1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------SH2102 */ +void sh2102() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2102"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]) + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:1][0:1](corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + B[i][j] = A[i+1][j]+A[i][j+1]+ A[i+1][j+1]; + } /*end region*/ + + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (B[i][j] !=C[i+1][j]+C[i][j+1]+C[i+1][j+1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------SH2103 */ +void sh2103() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2103"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[1:0][0:1] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[1:0][0:1](corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + B[i][j] = A[i-1][j]+A[i][j+1]; + + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (B[i][j] !=C[i-1][j]+C[i][j+1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2104 */ +void sh2104() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2104"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[0:1][0:1] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:1][0:1](corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + B[i][j] = A[i+1][j]+A[i][j+1]+ A[i+1][j+1]; + + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (B[i][j] !=C[i+1][j]+C[i][j+1]+C[i+1][j+1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------SH2105 */ +void sh2105() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2105"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[0:1][1:0] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:1][1:0](corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + B[i][j] = A[i][j-1]+A[i+1][j]+A[i+1][j-1]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (B[i][j] !=C[i][j-1]+C[i+1][j]+C[i+1][j-1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2106 */ +void sh2106() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2106"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[0:1][0:0] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:1][0:0](corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + B[i][j] = A[i+1][j]; + + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (B[i][j] != C[i+1][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2107 */ +void sh2107() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2107"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[0:0][1:0] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:0][1:0](corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + B[i][j] = A[i][j-1]; + + } /*end region*/ + + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + if (B[i][j] !=C[i][j-1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------SH2108 */ +void sh2108() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2108"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[2:2][2:2] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[2:2][2:2](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + B[i][j] = A[i+2][j]+A[i][j+2]+A[i+2][j+2]+A[i-2][j+2]+ + A[i-2][j]+A[i][j-2]+A[i-2][j-2]+A[i+2][j]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (B[i][j] != C[i+2][j]+C[i][j+2]+C[i+2][j+2]+C[i-2][j+2]+ + C[i-2][j]+C[i][j-2]+C[i-2][j-2]+C[i+2][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2109 */ + void sh2109() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2109"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[0:2][2:2] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:2][2:2](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + B[i][j] = A[i+2][j+2]+A[i+1][j+1]+A[i][j+2]+A[i][j-2]+A[i+2][j-2]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (B[i][j] != C[i+2][j+2]+C[i+1][j+1]+C[i][j+2]+C[i][j-2]+C[i+2][j-2]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2110 */ +void sh2110() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2110"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[2:2][2:0] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[2:2][2:0](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + B[i][j] = A[i-2][j-2]+A[i-1][j-1]+A[i-2][j]+A[i+2][j]+A[i+2][j-2]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (B[i][j] != C[i-2][j-2]+C[i-1][j-1]+C[i-2][j]+C[i+2][j]+C[i+2][j-2]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2111 */ +void sh2111() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2111"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[2:2][0:2] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[2:2][0:2](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + B[i][j] = A[i+2][j+2]+A[i+1][j+1]+A[i-2][j+2]+A[i+2][j]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (B[i][j] != C[i+2][j+2]+C[i+1][j+1]+C[i-2][j+2]+C[i+2][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------SH2112 */ +void sh2112() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2112"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[2:0][2:2] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[1:0][0:1](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + B[i][j] = A[i-1][j+1]+A[i][j+1]+A[i-1][j]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (B[i][j] != C[i-1][j+1]+C[i][j+1]+C[i-1][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2113 */ +void sh2113() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2113"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[2:2][2:0] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:1][0:0](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + B[i][j] = A[i+1][j]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (B[i][j] !=C[i+1][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2114 */ +void sh2114() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2114"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[2:0][2:2] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:0][0:2](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + B[i][j] = A[i][j+2]+A[i][j+1]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + if (B[i][j] !=C[i][j+2]+C[i][j+1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2115 */ +void sh2115() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2115"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[3:3][3:3] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A(corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + B[i][j] = A[i+1][j+1]+A[i+2][j+2]+A[i+3][j+3]+A[i-3][j-3]+A[i-2][j-2]+ + A[i-1][j-1]+A[i-3][j+3]+A[i+3][j-3]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (B[i][j] !=C[i+1][j+1]+C[i+2][j+2]+C[i+3][j+3]+C[i-3][j-3]+C[i-2][j-2]+ + C[i-1][j-1]+C[i-3][j+3]+C[i+3][j-3]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2116 */ +void sh2116() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2116"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[3:3][0:3] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:0][0:1](corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + B[i][j] = A[i][j+1]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (B[i][j] !=C[i][j+1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +/* ---------------------------------------------SH2117 */ +void sh2117() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2117"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[0:3][3:3] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[0:1][0:0](corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + B[i][j] = A[i+1][j]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (B[i][j] !=C[i+1][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2118 */ +void sh2118() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2118"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[3:3][3:0] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A(corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + B[i][j] = A[i-3][j-3]+A[i+3][j]+A[i-3][j]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (B[i][j] !=C[i-3][j-3]+C[i+3][j]+C[i-3][j]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2119 */ +void sh2119() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2119"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[3:0][3:3] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A[3:0][3:3](corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + B[i][j] = A[i-3][j-3]+A[i][j+3]+A[i-3][j+3]; + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + if (B[i][j] !=C[i-3][j-3]+C[i][j+3]+C[i-3][j+3]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2120 */ +void sh2120() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2120"; + int i, j, NN, NM, NNL; + #pragma dvm array distribute[block][block] + int B[N][M]; + #pragma dvm array align([i][j] with B[i][j]), shadow[9:9][9:9] + int A[N][M]; + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + + nloopi = NL; + nloopj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A(corner)) + for (i = 9; i < N - 9;i++) + for (j = 9; j < M - 9; j++) + B[i][j] = A[i+7][j+7]+A[i+8][j+8]+A[i+9][j+9]+A[i-9][j-9]+A[i-8][j-8]+ + A[i-7][j-7]+A[i-9][j+9]+A[i+9][j-9]; + + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + if (B[i][j] !=C[i+7][j+7]+C[i+8][j+8]+C[i+9][j+9]+C[i-9][j-9]+C[i-8][j-8]+ + C[i-7][j-7]+C[i-9][j+9]+C[i+9][j-9] ) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2121 */ +void sh2121() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2121"; + int i, j, NN, NM, NNL; + + #pragma dvm array distribute[block][block] + int B[N][M]; + + #pragma dvm array shadow[9:9][9:9] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloopi = NL; + nloopj = NL; + #pragma dvm realign(A[i][j] with B[i][j]) + #pragma dvm region local(A), out(B) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A(corner)) + for (i = 9; i < N - 9;i++) + for (j = 9; j < M - 9; j++) + B[i][j] = A[i+7][j+7]+A[i+8][j+8]+A[i+9][j+9]+A[i-9][j-9]+A[i-8][j-8]+ + A[i-7][j-7]+A[i-9][j+9]+A[i+9][j-9]; + + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + if (B[i][j] !=C[i+7][j+7]+C[i+8][j+8]+C[i+9][j+9]+C[i-9][j-9]+C[i-8][j-8]+ + C[i-7][j-7]+C[i-9][j+9]+C[i+9][j-9] ) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH2122 */ +void sh2122() +{ + int C[N][M]; + int nloopi, nloopj; + char tname[] = "SH2122"; + int i, j, NN, NM, NNL; + + #pragma dvm array + int B[N][M]; + + #pragma dvm array shadow[9:9][9:9] + int A[N][M]; + + NN = N; + NM = M; + NNL = NL; + serial2(C, NN, NM, NNL); + nloopi = NL; + nloopj = NL; + #pragma dvm redistribute(B[block][block]) + #pragma dvm realign(A[i][j] with B[i][j]) + #pragma dvm region local(A), out(B) + { + + #pragma dvm parallel([i][j] on A[i][j]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + A[i][j] = NL + i + j; + + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A(corner)) + for (i = 9; i < N - 9;i++) + for (j = 9; j < M - 9; j++) + B[i][j] = A[i+7][j+7]+A[i+8][j+8]+A[i+9][j+9]+A[i-9][j-9]+A[i-8][j-8]+ + A[i-7][j-7]+A[i-9][j+9]+A[i+9][j-9]; + + } /*end region*/ + + #pragma dvm get_actual(B) + + #pragma dvm parallel([i][j] on B[i][j]) reduction(min(nloopi), min(nloopj)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + if (B[i][j] !=C[i+7][j+7]+C[i+8][j+8]+C[i+9][j+9]+C[i-9][j-9]+C[i-8][j-8]+ + C[i-7][j-7]+C[i-9][j+9]+C[i+9][j-9] ) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + } + + if (nloopi == NL && nloopj == NL) + ansyes(tname); + else + ansno(tname); +} + +void serial2(int AR[N][M], int NN, int NM, int NNL) +{ + int i,j; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + AR[i][j] = NNL + i + j; +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh31.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh31.cdv new file mode 100644 index 0000000..a5854ea --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh31.cdv @@ -0,0 +1,706 @@ + /* TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT SHADOW WIDTH + ON BOTH SIDES */ + +#include +#include +#include + +#define N 60 +#define M 60 +#define K 60 +#define NL 1000 + +static void sh3101(); +static void sh3102(); +static void sh3103(); +static void sh3104(); +static void sh3105(); +static void sh3106(); +static void sh3107(); +static void sh3108(); +static void sh3109(); +static void sh3110(); +static void sh3111(); +static void serial3(int AR[N][M][K], int NN, int NM, int NK, int NNL); +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int argc, char *argv[]) +{ + printf("===START OF SH31========================\n"); + sh3101(); + sh3102(); + sh3103(); + sh3104(); + sh3105(); + sh3106(); + sh3107(); + sh3108(); + sh3109(); + sh3110(); + sh3111(); + + printf("=== END OF SH31 ========================= \n"); + return 0; +} +/* ---------------------------------------------SH3101 */ +void sh3101() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3101"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]) + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A (corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1;j++) + for (ii = 1; ii < K - 1; ii++) + B[i][j][ii] = A[i+1][j][ii]+A[i][j+1][ii]+A[i][j][ii+1]+A[i-1][j][ii]+ + A[i][j-1][ii]+A[i][j][ii-1]+A[i-1][j-1][ii-1]+ + A[i+1][j+1][ii+1]+A[i-1][j+1][ii]+A[i+1][j-1][ii]+ + A[i-1][j+1][ii-1]+A[i-1][j+1][ii+1]+A[i+1][j-1][ii-1]+ + A[i+1][j-1][ii+1]; + + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1;j++) + for (ii = 1; ii < K - 1; ii++) + if (B[i][j][ii]!=C[i+1][j][ii]+C[i][j+1][ii]+C[i][j][ii+1]+ + C[i-1][j][ii]+C[i][j-1][ii]+C[i][j][ii-1]+ + C[i-1][j-1][ii-1]+C[i+1][j+1][ii+1]+C[i-1][j+1][ii]+ + C[i+1][j-1][ii]+C[i-1][j+1][ii-1]+C[i-1][j+1][ii+1]+ + C[i+1][j-1][ii-1]+C[i+1][j-1][ii+1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3102 */ +void sh3102() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3102"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[2:2][2:2][2:2] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[1:2][2:2][1:2](corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + B[i][j][ii] = A[i-1][j-2][ii+2]+A[i-1][j+2][ii-1]+A[i-1][j+2][ii+2]+ + A[i+2][j+2][ii+2]+A[i+2][j+2][ii-1]+A[i+2][j-2][ii+2]+ + A[i+2][j-2][ii-1]+A[i-1][j-2][ii-1]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + if (B[i][j][ii]!= C[i-1][j-2][ii+2]+C[i-1][j+2][ii-1]+C[i-1][j+2][ii+2]+ + C[i+2][j+2][ii+2]+C[i+2][j+2][ii-1]+C[i+2][j-2][ii+2]+ + C[i+2][j-2][ii-1]+C[i-1][j-2][ii-1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3103 */ +void sh3103() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3103"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[2:2][2:2][2:2] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[0:2][2:2][0:2] (corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + B[i][j][ii] = A[i+2][j+2][ii+2]+A[i][j-2][ii]+ + A[i+2][j-2][ii]+A[i][j+2][ii]+ A[i][j+2][ii+2]+ + A[i+2][j-2][ii+2]+A[i+2][j+2][ii]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + if (B[i][j][ii]!= C[i+2][j+2][ii+2]+C[i][j-2][ii]+ + C[i+2][j-2][ii]+C[i][j+2][ii]+ C[i][j+2][ii+2]+ + C[i+2][j-2][ii+2]+C[i+2][j+2][ii] ) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3104 */ +void sh3104() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3104"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[2:2][2:2][2:2] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[2:2][2:0][2:0] (corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + B[i][j][ii] = A[i+2][j][ii]+A[i-2][j-2][ii-2] + + A[i+2][j-2][ii-2]+A[i-2][j][ii-2]+ A[i-2][j-2][ii]+ + A[i-2][j][ii]+A[i+2][j-2][ii]+A[i+2][j][ii-2]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + if (B[i][j][ii]!=C[i+2][j][ii]+C[i-2][j-2][ii-2] + + C[i+2][j-2][ii-2]+C[i-2][j][ii-2]+ C[i-2][j-2][ii]+ + C[i-2][j][ii]+C[i+2][j-2][ii]+C[i+2][j][ii-2]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } +/* printf ("%i,%i,%i\n",nloopi,nloopj,nloopii);*/ + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3105 */ +void sh3105() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3105"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[0:2][2:2][0:2] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[0:2][2:2][0:2] (corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + B[i][j][ii] = A[i+2][j+2][ii+2]+A[i][j-2][ii]+ + A[i+2][j-2][ii]+A[i][j+2][ii]+ A[i][j+2][ii+2]+ + A[i+2][j-2][ii+2]+A[i+2][j+2][ii]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + if (B[i][j][ii]!= C[i+2][j+2][ii+2]+C[i][j-2][ii]+ + C[i+2][j-2][ii]+C[i][j+2][ii]+ C[i][j+2][ii+2]+ + C[i+2][j-2][ii+2]+C[i+2][j+2][ii]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3106 */ +void sh3106() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3106"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[3:3][3:3][3:3] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A (corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + B[i][j][ii] = A[i-3][j-3][ii+3]+A[i+3][j+3][ii-3]+A[i+3][j-3][ii+3]+ + A[i-3][j+3][ii+3]+A[i-3][j+3][ii-3]+A[i+3][j-3][ii-3]+ + A[i+3][j+3][ii+3]+A[i-3][j-3][ii-3]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + if (B[i][j][ii]!= C[i-3][j-3][ii+3]+C[i+3][j+3][ii-3]+C[i+3][j-3][ii+3]+ + C[i-3][j+3][ii+3]+C[i-3][j+3][ii-3]+C[i+3][j-3][ii-3]+ + C[i+3][j+3][ii+3]+C[i-3][j-3][ii-3]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3107 */ +void sh3107() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3107"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[3:3][0:3][3:0] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A (corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + B[i][j][ii] = A[i+3][j+3][ii]+A[i-3][j][ii-3]+A[i+3][j][ii-3]+ + A[i-3][j+3][ii-3]+A[i-3][j][ii]+A[i-3][j+3][ii]+ + A[i+3][j][ii]+A[i+3][j+3][ii-3]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + if (B[i][j][ii]!= C[i-3][j-3][ii+3]+C[i+3][j+3][ii-3]+C[i+3][j-3][ii+3]+ + C[i-3][j+3][ii+3]+C[i-3][j+3][ii-3]+C[i+3][j-3][ii-3]+ + C[i+3][j+3][ii+3]+C[i-3][j-3][ii-3]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3108 */ +void sh3108() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3108"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[0:3][0:3][0:3] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[0:3][0:3][0:3] (corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + B[i][j][ii] = A[i+3][j+3][ii+3]+A[i+3][j][ii]+A[i][j+3][ii]+ + A[i][j][ii+3]+A[i][j+3][ii+3]+A[i+3][j][ii+3]+ + A[i+3][j+3][ii]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + if (B[i][j][ii]!=C[i+3][j+3][ii+3]+C[i+3][j][ii]+C[i][j+3][ii]+ + C[i][j][ii+3]+C[i][j+3][ii+3]+C[i+3][j][ii+3]+ + C[i+3][j+3][ii] ) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3109 */ +void sh3109() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3109"; + int i, j, ii, NN, NM, NK, NNL; + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + #pragma dvm array align([i][j][ii] with B[i][j][ii]), shadow[9:9][9:9][9:9] + int A[N][M][K]; + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[9:9][9:9][9:9] (corner)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 9; ii < K - 9; ii++) + B[i][j][ii]=A[i+9][j+9][ii+9]+A[i-9][j-9][ii-9]+A[i+9][j-9][ii-9]+ + A[i-9][j+9][ii-9]+A[i-9][j-9][ii+9]+A[i-9][j+9][ii+9]+ + A[i+9][j-9][ii+9]+A[i+9][j+9][ii-9]; + + + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 9; ii < K - 9; ii++) + if (B[i][j][ii]!=C[i+9][j+9][ii+9]+C[i-9][j-9][ii-9]+C[i+9][j-9][ii-9]+ + C[i-9][j+9][ii-9]+C[i-9][j-9][ii+9]+C[i-9][j+9][ii+9]+ + C[i+9][j-9][ii+9]+C[i+9][j+9][ii-9]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3110 */ +void sh3110() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3110"; + int i, j, ii, NN, NM, NK, NNL; + + #pragma dvm array distribute[block][block][block] + int B[N][M][K]; + + #pragma dvm array shadow[9:9][9:9][9:9] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + #pragma dvm realign(A[i][j][ii] with B[i][j][ii]) + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[9:9][9:9][9:9] (corner)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 9; ii < K - 9; ii++) + B[i][j][ii]=A[i+9][j+9][ii+9]+A[i-9][j-9][ii-9]+A[i+9][j-9][ii-9]+ + A[i-9][j+9][ii-9]+A[i-9][j-9][ii+9]+A[i-9][j+9][ii+9]+ + A[i+9][j-9][ii+9]+A[i+9][j+9][ii-9]; + + + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 9; ii < K - 9; ii++) + if (B[i][j][ii]!=C[i+9][j+9][ii+9]+C[i-9][j-9][ii-9]+C[i+9][j-9][ii-9]+ + C[i-9][j+9][ii-9]+C[i-9][j-9][ii+9]+C[i-9][j+9][ii+9]+ + C[i+9][j-9][ii+9]+C[i+9][j+9][ii-9]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} +/* ---------------------------------------------SH3111 */ +void sh3111() +{ + int C[N][M][K]; + int nloopi, nloopj, nloopii; + char tname[] = "SH3111"; + int i, j, ii, NN, NM, NK, NNL; + + #pragma dvm array + int B[N][M][K]; + + #pragma dvm array shadow[9:9][9:9][9:9] + int A[N][M][K]; + + NN = N; + NM = M; + NK = K; + NNL = NL; + serial3(C, NN, NM, NK, NNL); + nloopi = NL; + nloopj = NL; + nloopii = NL; + #pragma dvm redistribute(B[block][block][block]) + #pragma dvm realign(A[i][j][ii] with B[i][j][ii]) + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii] on A[i][j][ii]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) { + A[i][j][ii] = NL + i + j + ii; + B[i][j][ii] = 0; + } + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) shadow_renew(A[9:9][9:9][9:9] (corner)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 9; ii < K - 9; ii++) + B[i][j][ii]=A[i+9][j+9][ii+9]+A[i-9][j-9][ii-9]+A[i+9][j-9][ii-9]+ + A[i-9][j+9][ii-9]+A[i-9][j-9][ii+9]+A[i-9][j+9][ii+9]+ + A[i+9][j-9][ii+9]+A[i+9][j+9][ii-9]; + + + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii] on B[i][j][ii]) reduction(min(nloopi), min(nloopj), min(nloopii)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 9; ii < K - 9; ii++) + if (B[i][j][ii]!=C[i+9][j+9][ii+9]+C[i-9][j-9][ii-9]+C[i+9][j-9][ii-9]+ + C[i-9][j+9][ii-9]+C[i-9][j-9][ii+9]+C[i-9][j+9][ii+9]+ + C[i+9][j-9][ii+9]+C[i+9][j+9][ii-9]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL) + ansyes(tname); + else + ansno(tname); +} + +void serial3(int AR[N][M][K], int NN, int NM, int NK, int NNL) +{ + int i, j, ii; + for (i = 0; i < NN; i++) + for (j = 0; j < NM; j++) + for (ii = 0; ii < NK; ii++) + AR[i][j][ii] = NNL + i + j + ii; +} + +void ansyes(const char name[]) +{ + printf ("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh41.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh41.cdv new file mode 100644 index 0000000..d0ff678 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/SHADOW/sh41.cdv @@ -0,0 +1,923 @@ +/* TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. + DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT SHADOW WIDTH + ON BOTH SIDES */ + +#include +#include +#include + +#define NL 1000 + +static void sh4101(); +static void sh4102(); +static void sh4103(); +static void sh4104(); +static void sh4105(); +static void sh4106(); +static void sh4107(); +static void sh4108(); +static void sh4109(); +static void sh4110(); +static void sh4111(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +int main(int an, char **as) +{ + printf("===START OF SH41========================\n"); + sh4101(); + sh4102(); + sh4103(); + sh4104(); + sh4105(); + sh4106(); + sh4107(); + sh4108(); + sh4109(); + sh4110(); + sh4111(); + + printf("=== END OF SH41 ========================= \n"); + return 0; +} +/* ---------------------------------------------SH4101 */ +void sh4101() +{ + #define N 16 + #define M 8 + #define K 8 + #define L 8 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4101"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[1:1][1:1][1:1][1:1] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A(corner)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + B[i][j][ii][jj] = A[i+1][j+1][ii+1][jj+1]+A[i-1][j-1][ii-1][jj-1]+ + A[i+1][j-1][ii-1][jj-1]+A[i-1][j+1][ii-1][jj-1]+ + A[i-1][j-1][ii+1][jj-1]+A[i-1][j-1][ii-1][jj+1]+ + A[i+1][j+1][ii-1][jj-1]+A[i-1][j+1][ii+1][jj-1]+ + A[i-1][j-1][ii+1][jj+1]+A[i+1][j-1][ii-1][jj+1]+ + A[i+1][j-1][ii+1][jj-1]+A[i-1][j+1][ii-1][jj+1]+ + A[i+1][j+1][ii+1][jj-1]+A[i-1][j+1][ii+1][jj+1]+ + A[i+1][j-1][ii+1][jj+1]+A[i+1][j+1][ii-1][jj+1]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 1; i < N - 1; i++) + for (j = 1; j < M - 1; j++) + for (ii = 1; ii < K - 1; ii++) + for (jj = 1; jj < L - 1; jj++) + if (B[i][j][ii][jj]!= + C[i+1][j+1][ii+1][jj+1]+C[i-1][j-1][ii-1][jj-1]+ + C[i+1][j-1][ii-1][jj-1]+C[i-1][j+1][ii-1][jj-1]+ + C[i-1][j-1][ii+1][jj-1]+C[i-1][j-1][ii-1][jj+1]+ + C[i+1][j+1][ii-1][jj-1]+C[i-1][j+1][ii+1][jj-1]+ + C[i-1][j-1][ii+1][jj+1]+C[i+1][j-1][ii-1][jj+1]+ + C[i+1][j-1][ii+1][jj-1]+C[i-1][j+1][ii-1][jj+1]+ + C[i+1][j+1][ii+1][jj-1]+C[i-1][j+1][ii+1][jj+1]+ + C[i+1][j-1][ii+1][jj+1]+C[i+1][j+1][ii-1][jj+1]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/*-----------------------------------------------------------SH4102 */ +void sh4102() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4102"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel ([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A (corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + B[i][j][ii][jj] = + A[i+2][j+2][ii+2][jj+2]+A[i-2][j-2][ii-2][jj-2]+ + A[i+2][j-2][ii-2][jj-2]+A[i-2][j+2][ii-2][jj-2]+ + A[i-2][j-2][ii+2][jj-2]+A[i-2][j-2][ii-2][jj+2]+ + A[i+2][j+2][ii-2][jj-2]+A[i-2][j+2][ii+2][jj-2]+ + A[i-2][j-2][ii+2][jj+2]+A[i+2][j-2][ii-2][jj+2]+ + A[i+2][j-2][ii+2][jj-2]+A[i-2][j+2][ii-2][jj+2]+ + A[i+2][j+2][ii+2][jj-2]+A[i-2][j+2][ii+2][jj+2]+ + A[i+2][j-2][ii+2][jj+2]+A[i+2][j+2][ii-2][jj+2]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + if (B[i][j][ii][jj]!= + C[i+2][j+2][ii+2][jj+2]+C[i-2][j-2][ii-2][jj-2]+ + C[i+2][j-2][ii-2][jj-2]+C[i-2][j+2][ii-2][jj-2]+ + C[i-2][j-2][ii+2][jj-2]+C[i-2][j-2][ii-2][jj+2]+ + C[i+2][j+2][ii-2][jj-2]+C[i-2][j+2][ii+2][jj-2]+ + C[i-2][j-2][ii+2][jj+2]+C[i+2][j-2][ii-2][jj+2]+ + C[i+2][j-2][ii+2][jj-2]+C[i-2][j+2][ii-2][jj+2]+ + C[i+2][j+2][ii+2][jj-2]+C[i-2][j+2][ii+2][jj+2]+ + C[i+2][j-2][ii+2][jj+2]+C[i+2][j+2][ii-2][jj+2]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4103 */ +void sh4103() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4103"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[2:2][2:2][2:2][2:2] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A[2:0][2:2][2:0][2:0] (corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + B[i][j][ii][jj] = + A[i-2][j-2][ii-2][jj-2]+A[i][j-2][ii][jj]+ + A[i-2][j-2][ii][jj] +A[i][j-2][ii][jj]+ + A[i][j-2][ii-2][jj] +A[i-2][j-2][ii][jj]+ + A[i][j-2][ii-2][jj-2] +A[i][j-2][ii][jj-2]+ + A[i-2][j-2][ii-2][jj] +A[i][j-2][ii-2][jj-2]; + }/* end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + if (B[i][j][ii][jj]!= + C[i-2][j-2][ii-2][jj-2]+C[i][j-2][ii][jj]+ + C[i-2][j-2][ii][jj] +C[i][j-2][ii][jj]+ + C[i][j-2][ii-2][jj] +C[i-2][j-2][ii][jj]+ + C[i][j-2][ii-2][jj-2] +C[i][j-2][ii][jj-2]+ + C[i-2][j-2][ii-2][jj] +C[i][j-2][ii-2][jj-2]) + + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4104 */ +void sh4104() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4104"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[0:2][2:2][0:2][0:2] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A(corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + B[i][j][ii][jj] = A[i+2][j+2][ii+2][jj+2]+A[i][j-2][ii][jj]+ + A[i+2][j-2][ii][jj] +A[i][j-2][ii][jj]+ + A[i][j+2][ii][jj] +A[i][j-2][ii+2][jj]+ + A[i+2][j+2][ii][jj] +A[i][j-2][ii+2][jj+2]+ + A[i][j+2][ii][jj+2] +A[i+2][j+2][ii+2][jj]+ + A[i][j+2][ii+2][jj+2] +A[i+2][j-2][ii+2][jj+2]; + }/*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + if (B[i][j][ii][jj]!= + C[i+2][j+2][ii+2][jj+2]+C[i][j-2][ii][jj]+ + C[i+2][j-2][ii][jj] +C[i][j-2][ii][jj]+ + C[i][j+2][ii][jj] +C[i][j-2][ii+2][jj]+ + C[i+2][j+2][ii][jj] +C[i][j-2][ii+2][jj+2]+ + C[i][j+2][ii][jj+2] +C[i+2][j+2][ii+2][jj]+ + C[i][j+2][ii+2][jj+2] +C[i+2][j-2][ii+2][jj+2]) + + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4105 */ +void sh4105() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4105"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[2:2][2:0][0:2][2:2] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A[0:0][0:0][0:0][0:2] (corner)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + B[i][j][ii][jj] = A[i][j][ii][jj+2]; + }/*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 2; i < N - 2; i++) + for (j = 2; j < M - 2; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + if (B[i][j][ii][jj]!=C[i][j][ii][jj+2]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4106 */ +void sh4106() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4106"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[3:3][3:3][3:3][3:3] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A (corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + B[i][j][ii][jj] = A[i+3][j+3][ii+3][jj+3]+A[i-3][j-3][ii-3][jj-3]+ + A[i+3][j-3][ii-3][jj-3]+A[i-3][j+3][ii-3][jj-3]+ + A[i-3][j-3][ii+3][jj-3]+A[i-3][j-3][ii-3][jj+3]+ + A[i+3][j+3][ii-3][jj-3]+A[i-3][j+3][ii+3][jj-3]+ + A[i-3][j-3][ii+3][jj+3]+A[i+3][j-3][ii-3][jj+3]+ + A[i+3][j-3][ii+3][jj-3]+A[i-3][j+3][ii-3][jj+3]+ + A[i+3][j+3][ii+3][jj-3]+A[i-3][j+3][ii+3][jj+3]+ + A[i+3][j-3][ii+3][jj+3]+A[i+3][j+3][ii-3][jj+3]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + if (B[i][j][ii][jj]!= + C[i+3][j+3][ii+3][jj+3]+C[i-3][j-3][ii-3][jj-3]+ + C[i+3][j-3][ii-3][jj-3]+C[i-3][j+3][ii-3][jj-3]+ + C[i-3][j-3][ii+3][jj-3]+C[i-3][j-3][ii-3][jj+3]+ + C[i+3][j+3][ii-3][jj-3]+C[i-3][j+3][ii+3][jj-3]+ + C[i-3][j-3][ii+3][jj+3]+C[i+3][j-3][ii-3][jj+3]+ + C[i+3][j-3][ii+3][jj-3]+C[i-3][j+3][ii-3][jj+3]+ + C[i+3][j+3][ii+3][jj-3]+C[i-3][j+3][ii+3][jj+3]+ + C[i+3][j-3][ii+3][jj+3]+C[i+3][j+3][ii-3][jj+3] ) + + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4107 */ +void sh4107() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4107"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[0:3][3:3][0:3][0:3] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A(corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + B[i][j][ii][jj] = + A[i+3][j+3][ii+3][jj+3]+A[i][j-3][ii][jj]+ + A[i+3][j-3][ii][jj]+A[i][j+3][ii][jj]+ + A[i][j-3][ii+3][jj]+A[i+3][j+3][ii][jj]+ + A[i][j-3][ii+3][jj+3]+A[i][j+3][ii][jj+3]+ + A[i+3][j+3][ii+3][jj]+A[i][j+3][ii+3][jj+3]+ + A[i+3][j-3][ii+3][jj+3]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + if (B[i][j][ii][jj]!= + C[i+3][j+3][ii+3][jj+3]+C[i][j-3][ii][jj]+ + C[i+3][j-3][ii][jj]+ C[i][j+3][ii][jj]+ + C[i][j-3][ii+3][jj]+ C[i+3][j+3][ii][jj]+ + C[i][j-3][ii+3][jj+3]+ C[i][j+3][ii][jj+3]+ + C[i+3][j+3][ii+3][jj]+ C[i][j+3][ii+3][jj+3]+ + C[i+3][j-3][ii+3][jj+3]) + + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4108 */ +void sh4108() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4108"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[0:3][3:3][0:3][0:3] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A[0:0][0:0][0:0][0:3] (corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + B[i][j][ii][jj] = A[i][j][ii][jj+3]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + if (B[i][j][ii][jj]!=C[i][j][ii][jj+3]) + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4109 */ +void sh4109() +{ + #define N 48 + #define M 48 + #define K 24 + #define L 24 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4109"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array align([i][j][ii][jj] with B[i][j][ii][jj]), shadow[9:9][9:9][2:2][2:2] + int A[N][M][K][L]; + + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A[9:9][9:9][2:2][2:2] (corner)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + B[i][j][ii][jj] = A[i+9][j+9][ii+2][jj+2]+A[i-9][j-9][ii-2][jj-2]+ + A[i+9][j-9][ii-2][jj-2]+A[i-9][j+9][ii-2][jj-2]+ + A[i-9][j-9][ii+2][jj-2]+A[i-9][j-9][ii-2][jj+2]+ + A[i+9][j+9][ii-2][jj-2]+A[i-9][j+9][ii+2][jj-2]+ + A[i-9][j-9][ii+2][jj+2]+A[i+9][j-9][ii-2][jj+2]+ + A[i+9][j-9][ii+2][jj-2]+A[i-9][j+9][ii-2][jj+2]+ + A[i+9][j+9][ii+2][jj-2]+A[i-9][j+9][ii+2][jj+2]+ + A[i+9][j-9][ii+2][jj+2]+A[i+9][j+9][ii-2][jj+2]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 9; i < N - 9; i++) + for (j = 9; j < M - 9; j++) + for (ii = 2; ii < K - 2; ii++) + for (jj = 2; jj < L - 2; jj++) + if (B[i][j][ii][jj]!= + C[i+9][j+9][ii+2][jj+2]+C[i-9][j-9][ii-2][jj-2]+ + C[i+9][j-9][ii-2][jj-2]+C[i-9][j+9][ii-2][jj-2]+ + C[i-9][j-9][ii+2][jj-2]+C[i-9][j-9][ii-2][jj+2]+ + C[i+9][j+9][ii-2][jj-2]+C[i-9][j+9][ii+2][jj-2]+ + C[i-9][j-9][ii+2][jj+2]+C[i+9][j-9][ii-2][jj+2]+ + C[i+9][j-9][ii+2][jj-2]+C[i-9][j+9][ii-2][jj+2]+ + C[i+9][j+9][ii+2][jj-2]+C[i-9][j+9][ii+2][jj+2]+ + C[i+9][j-9][ii+2][jj+2]+C[i+9][j+9][ii-2][jj+2] ) + + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4110 */ +void sh4110() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4110"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array distribute[block][block][block][block] + int B[N][M][K][L]; + #pragma dvm array shadow[3:3][3:3][3:3][3:3] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + #pragma dvm realign(A[i][j][ii][jj] with B[i][j][ii][jj]) + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A (corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + B[i][j][ii][jj] = A[i+3][j+3][ii+3][jj+3]+A[i-3][j-3][ii-3][jj-3]+ + A[i+3][j-3][ii-3][jj-3]+A[i-3][j+3][ii-3][jj-3]+ + A[i-3][j-3][ii+3][jj-3]+A[i-3][j-3][ii-3][jj+3]+ + A[i+3][j+3][ii-3][jj-3]+A[i-3][j+3][ii+3][jj-3]+ + A[i-3][j-3][ii+3][jj+3]+A[i+3][j-3][ii-3][jj+3]+ + A[i+3][j-3][ii+3][jj-3]+A[i-3][j+3][ii-3][jj+3]+ + A[i+3][j+3][ii+3][jj-3]+A[i-3][j+3][ii+3][jj+3]+ + A[i+3][j-3][ii+3][jj+3]+A[i+3][j+3][ii-3][jj+3]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + if (B[i][j][ii][jj]!= + C[i+3][j+3][ii+3][jj+3]+C[i-3][j-3][ii-3][jj-3]+ + C[i+3][j-3][ii-3][jj-3]+C[i-3][j+3][ii-3][jj-3]+ + C[i-3][j-3][ii+3][jj-3]+C[i-3][j-3][ii-3][jj+3]+ + C[i+3][j+3][ii-3][jj-3]+C[i-3][j+3][ii+3][jj-3]+ + C[i-3][j-3][ii+3][jj+3]+C[i+3][j-3][ii-3][jj+3]+ + C[i+3][j-3][ii+3][jj-3]+C[i-3][j+3][ii-3][jj+3]+ + C[i+3][j+3][ii+3][jj-3]+C[i-3][j+3][ii+3][jj+3]+ + C[i+3][j-3][ii+3][jj+3]+C[i+3][j+3][ii-3][jj+3] ) + + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} +/* ---------------------------------------------SH4111 */ +void sh4111() +{ + #define N 16 + #define M 16 + #define K 16 + #define L 16 + + int C[N][M][K][L]; + int nloopi, nloopj, nloopii, nloopjj; + char tname[] = "SH4111"; + int i, j, ii, jj, NN, NM, NK, NLL, NNL; + #pragma dvm array + int B[N][M][K][L]; + #pragma dvm array shadow[3:3][3:3][3:3][3:3] + int A[N][M][K][L]; + + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + C[i][j][ii][jj] = NL + i + j + ii + jj; + nloopi = NL; + nloopj = NL; + nloopii = NL; + nloopjj = NL; + + #pragma dvm redistribute(B[block][block][block][block]) + #pragma dvm realign(A[i][j][ii][jj] with B[i][j][ii][jj]) + + #pragma dvm region local(A), out(B) + { + #pragma dvm parallel([i][j][ii][jj] on A[i][j][ii][jj]) + for (i = 0; i < N; i++) + for (j = 0; j < M; j++) + for (ii = 0; ii < K; ii++) + for (jj = 0; jj < L; jj++) + A[i][j][ii][jj] = NL + i + j + ii + jj; + + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) shadow_renew(A (corner)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + B[i][j][ii][jj] = A[i+3][j+3][ii+3][jj+3]+A[i-3][j-3][ii-3][jj-3]+ + A[i+3][j-3][ii-3][jj-3]+A[i-3][j+3][ii-3][jj-3]+ + A[i-3][j-3][ii+3][jj-3]+A[i-3][j-3][ii-3][jj+3]+ + A[i+3][j+3][ii-3][jj-3]+A[i-3][j+3][ii+3][jj-3]+ + A[i-3][j-3][ii+3][jj+3]+A[i+3][j-3][ii-3][jj+3]+ + A[i+3][j-3][ii+3][jj-3]+A[i-3][j+3][ii-3][jj+3]+ + A[i+3][j+3][ii+3][jj-3]+A[i-3][j+3][ii+3][jj+3]+ + A[i+3][j-3][ii+3][jj+3]+A[i+3][j+3][ii-3][jj+3]; + } /*end region*/ + #pragma dvm get_actual(B) + #pragma dvm parallel([i][j][ii][jj] on B[i][j][ii][jj]) reduction(min(nloopi), min(nloopj), min(nloopii), min(nloopjj)) + for (i = 3; i < N - 3; i++) + for (j = 3; j < M - 3; j++) + for (ii = 3; ii < K - 3; ii++) + for (jj = 3; jj < L - 3; jj++) + if (B[i][j][ii][jj]!= + C[i+3][j+3][ii+3][jj+3]+C[i-3][j-3][ii-3][jj-3]+ + C[i+3][j-3][ii-3][jj-3]+C[i-3][j+3][ii-3][jj-3]+ + C[i-3][j-3][ii+3][jj-3]+C[i-3][j-3][ii-3][jj+3]+ + C[i+3][j+3][ii-3][jj-3]+C[i-3][j+3][ii+3][jj-3]+ + C[i-3][j-3][ii+3][jj+3]+C[i+3][j-3][ii-3][jj+3]+ + C[i+3][j-3][ii+3][jj-3]+C[i-3][j+3][ii-3][jj+3]+ + C[i+3][j+3][ii+3][jj-3]+C[i-3][j+3][ii+3][jj+3]+ + C[i+3][j-3][ii+3][jj+3]+C[i+3][j+3][ii-3][jj+3] ) + + { + if (nloopi > i) nloopi = i; + if (nloopj > j) nloopj = j; + if (nloopii > ii) nloopii = ii; + if (nloopjj > jj) nloopjj = jj; + } + + if (nloopi == NL && nloopj == NL && nloopii == NL && nloopjj == NL) + ansyes(tname); + else + ansno(tname); + + #undef N + #undef M + #undef K + #undef L +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ1.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ1.cdv new file mode 100644 index 0000000..c87edef --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ1.cdv @@ -0,0 +1,190 @@ +/* TEMPL1 +TESTING template CLAUSE */ + +#include +#include +#include + +static void templ111(); +static void templ121(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib, ic, ja, jb, jc, k; + +int main(int an, char **as) +{ + printf("=== START OF TEMPL1 ======================\n"); + /* TEMPLATE A1[BLOCK] ALIGN B1[i] WITH A1[i + 4] + ALIGN C1[i] WITH A1[2*i + 4] */ + templ111(); + /* TEMPLATE A1[BLOCK] ALIGN B1[][i] WITH A1[i] + ALIGN C1[i][] WITH A1[2*i + 1] */ + templ121(); + printf("=== END OF TEMPL1 ========================\n"); + return 0; +} + +/* ---------------------------------------------TEMPL111*/ +/* TEMPLATE A1[BLOCK] ALIGN B1[i] WITH A1[i + 4] + ALIGN C1[i] WITH A1[2*i + 4] */ +void templ111() +{ + #define AN1 14 + #define BN1 8 + #define CN1 4 + int k1i = 1, k2i = 0, li = 4; + int kc1i = 2, kc2i = 0, lci = 4; + char tname[] = "templ111 "; + + #pragma dvm template[AN1] distribute[block] + void *A1; + #pragma dvm array align([i] with A1[k1i * i + li]) + int B1[BN1]; + #pragma dvm array align([i] with A1[kc1i * i + lci]) + int C1[CN1]; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i; + + #pragma dvm parallel([i] on C1[i]) + for (i = 0; i < CN1; i++) + C1[i] = i; + + #pragma dvm parallel([i] on A1[i]) private(ib, erri, ic) + for (i = 0; i < AN1; i++) + { + if (((i-li) == (((i-li)/k1i) * k1i)) && + (((i-li)/k1i) >= 0) && + (((i-li)/k1i) < BN1)) + { + ib = (i-li)/k1i; + if (B1[ib] != (ib)) + erri = i; + } + if (((i-lci) == (((i-lci)/kc1i) * kc1i)) && + (((i-lci)/kc1i) >= 0) && + (((i-lci)/kc1i) < CN1)) + { + ic = (i-lci)/kc1i; + if (C1[ic] != (ic)) + erri = i; + } + } + + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef BN1 + #undef CN1 +} + +/* ---------------------------------------------TEMPL121*/ +/* TEMPLATE A1[BLOCK] ALIGN B1[][i] WITH A1[i] + ALIGN C1[i][] WITH A1[2*i + 1] */ +void templ121() +{ + int AN1 = 9; + int BN1 = 8; + int BN2 = 8; + int CN1 = 4; + int CN2 = 4; + + int k1i = 1, k2i = 0, li = 0; + int kc1i = 2, kc2i = 0, lci = 1; + + char tname[] = "templ121 "; + + #pragma dvm template[AN1] distribute[block] + void *A1; + #pragma dvm array + int (*B2)[BN2]; + #pragma dvm array + int (*C2)[CN2]; + + B2 = malloc(sizeof(int[BN1][BN2])); + C2 = malloc(sizeof(int[CN1][CN2])); + #pragma dvm realign(B2[][i] with A1[k1i * i + li]) + #pragma dvm realign(C2[i][] with A1[kc1i * i + lci]) + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([i][j] on B2[i][j]) + for (i = 0; i < BN1; i++) + for(j = 0; j < BN2; j++) + B2[i][j] = i*NL + j; + + #pragma dvm parallel([i][j] on C2[i][j]) + for (i = 0; i < CN1; i++) + for(j = 0; j < CN2; j++) + C2[i][j] = i*NL + j; + + + #pragma dvm parallel([i] on A1[i]) private(j, ib, jb, erri, jc, ic, k) + for (i = 0; i < AN1; i++) + { + for (j = 0; j < BN1; j++) + { + if (((i-li) == (((i-li)/k1i) * k1i)) && + (((i-li)/k1i) >= 0) && + (((i-li)/k1i) < BN2)) + { + ib = j; + jb = (i-li)/k1i; + if (B2[ib][jb] != ib*NL + jb) + erri = i*NL/10 + j; + } + } + for (k = 0; k < CN2; k++) + { + if (((i-lci) == (((i-lci)/kc1i) * kc1i)) && + (((i-lci)/kc1i) >= 0) && + (((i-lci)/kc1i) < CN1)) + { + jc = k; + ic = (i-lci)/kc1i; + if (C2[ic][jc] != (ic*NL + jc)) + erri = i*NL/10 + j; + } + } + } + } + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(B2); + free(C2); +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ2.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ2.cdv new file mode 100644 index 0000000..c2ca18b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ2.cdv @@ -0,0 +1,198 @@ +/* TEMPL2 +TESTING template CLAUSE */ + +#include +#include +#include + +static void templ211(); +static void templ221(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib, ic, ja, jb, jc, k; + +int main(int an, char **as) +{ + printf("=== START OF TEMPL2 ======================\n"); + /* TEMPLATE A2[BLOCK][BLOCK] ALIGN B1[i] WITH A2[1][i] + ALIGN C2[i][j] WITH A2[2*i+2][j] */ + templ211(); + /* TEMPLATE A2[BLOCK][BLOCK] ALIGN B1[i][j] WITH A2[i+4][j+4] + ALIGN C2[i][j] WITH A2[i+1][j+1] */ + templ221(); + printf("=== END OF TEMPL2 ========================\n"); + return 0; +} + +/* ---------------------------------------------TEMPL211*/ +/* TEMPLATE A2[BLOCK][BLOCK] ALIGN B1[i] WITH A2[1][i] + ALIGN C2[i][j] WITH A2[2*i+2][j] */ +void templ211() +{ + #define AN1 14 + #define AN2 14 + #define BN1 8 + #define CN1 4 + #define CN2 4 + + int k1i = 0, k2i = 0, li = 1, k1j = 1, k2j = 0, lj = 0; + int kc1i = 2, kc2i = 0, lci = 2, kc1j = 0, kc2j = 1, lcj = 0; + char tname[] = "templ211 "; + + #pragma dvm template[AN1][AN2] distribute[block][block] + void *A2; + #pragma dvm array align([i] with A2[1][i]) + int B1[BN1]; + #pragma dvm array align([i][j] with A2[kc1i * i + lci][kc2j * j + lcj]) + int C2[CN1][CN1]; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([i] on B1[i]) + for (i = 0; i < BN1; i++) + B1[i] = i; + + #pragma dvm parallel([j][i] on C2[i][j]) + for (j = 0; j < CN2; j++) + for (i = 0; i < CN1; i++) + C2[i][j] = (i*NL+j); + + #pragma dvm parallel([j][i] on A2[j][i]) private(ib, erri, ic, jc) + for (j = 0; j < AN2; j++) + for (i = 0; i < AN1; i++) + { + if (i == 0) + { + if (j < BN1) + { + ib = j; + if (B1[ib] != (ib)) + erri = i; + } + } + if (((i-lci) == (((i-lci)/kc1i) * kc1i)) && + ((j-lcj) == (((j-lcj)/kc2j) * kc2j)) && + (((i-lci)/kc1i) >= 0) && + (((j-lcj)/kc2j) >= 0) && + (((i-lci)/kc1i) < CN1) && + (((j-lcj)/kc2j) < CN2)) + { + ic = (i-lci)/kc1i; + jc = (j-lcj)/kc2j; + if (C2[ic][jc] != (ic*NL+jc)) + erri = i; + } + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef BN1 + #undef CN1 + #undef CN2 +} + +/* ---------------------------------------------TEMPL221*/ +/* TEMPLATE A2[BLOCK][BLOCK] ALIGN B1[i][j] WITH A2[i+4][j+4] + ALIGN C2[i][j] WITH A2[i+1][j+1] */ +void templ221() +{ + int AN1 = 14, AN2 = 14, CN1 = 4, CN2 = 4, BN1 = 8, BN2 = 8; + + int k1i = 1, k2i = 0, li = 4, k1j = 0, k2j = 1, lj = 4; + int kc1i = 1, kc2i = 0, lci = 1, kc1j = 0, kc2j = 1, lcj = 1; + + char tname[] = "templ221 "; + + #pragma dvm template[AN1][AN2] distribute[block][block] + void *A2; + #pragma dvm array + int (*B2)[BN2]; + #pragma dvm array + int (*C2)[CN2]; + + B2 = malloc(sizeof(int[BN1][BN2])); + C2 = malloc(sizeof(int[CN1][CN2])); + #pragma dvm realign(B2[i][j] with A2[k1i * i + li][k2j * j + lj]) + #pragma dvm realign(C2[i][j] with A2[kc1i * i + lci][kc2j * j + lcj]) + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([j][i] on B2[i][j]) + for (j = 0; j < BN2; j++) + for (i = 0; i < BN1; i++) + B2[i][j] = i*NL + j; + + #pragma dvm parallel([j][i] on C2[i][j]) + for (j = 0; j < CN2; j++) + for (i = 0; i < CN1; i++) + C2[i][j] = i*NL + j; + + + #pragma dvm parallel([j][i] on A2[i][j]) private(ib, ic, erri, jb, jc) + for (j = 0; j < AN2; j++) + for (i = 0; i < AN1; i++) + { + if (((i-li) == (((i-li)/k1i) * k1i)) && + ((j-lj) == (((j-lj)/k2j) * k2j)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2)) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + if (B2[ib][jb] != (ib*NL + jb)) + erri = i; + } + if (((i-lci) == (((i-lci)/kc1i) * kc1i)) && + ((j-lcj) == (((j-lcj)/kc2j) * kc2j)) && + (((i-lci)/kc1i) >= 0) && + (((j-lcj)/kc2j) >= 0) && + (((i-lci)/kc1i) < CN1) && + (((j-lcj)/kc2j) < CN2)) + { + ic = (i-lci)/kc1i; + jc = (j-lcj)/kc2j; + if (C2[ic][jc] != (ic*NL+jc)) + erri = i; + } + } + } + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(B2); + free(C2); +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ4.cdv b/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ4.cdv new file mode 100644 index 0000000..d8afac8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/C/TEMPLATE/templ4.cdv @@ -0,0 +1,265 @@ +/* TEMPL4 +TESTING template CLAUSE */ + +#include +#include +#include + +static void templ441(); +static void templ442(); + +static void ansyes(const char tname[]); +static void ansno(const char tname[]); + +static int NL = 1000; +static int ER = 10000; +static int erri, i, j, ia, ib, ic, ja, jb, jc, k, m, n, mb, nb, mc, nc; + +int main(int an, char **as) +{ + printf("=== START OF TEMPL4 ======================\n"); + /* TEMPLATE A4[BLOCK][BLOCK][BLOCK][BLOCK] + ALIGN B4[i][j][k][l] WITH A4[i+2][j][k][l+3] + ALIGN C2[i][j] WITH A4[i+2][2][3][l+3] */ + templ441(); + /* TEMPLATE A4[BLOCK][BLOCK][BLOCK][BLOCK] + ALIGN B4[i][j][k][l] WITH A4[l][i][j][k] + ALIGN C4[i][j][k][l] WITH A4[i+2][j][k][l+3] */ + templ442(); + printf("=== END OF TEMPL4 ========================\n"); + return 0; +} + +/* ---------------------------------------------TEMPL441*/ +/* TEMPLATE A4[BLOCK][BLOCK][BLOCK][BLOCK] + ALIGN B4[i][j][k][l] WITH A4[i+2][j][k][l+3] + ALIGN C2[i][j] WITH A4[i+2][2][3][l+3] */ +void templ441() +{ + #define AN1 7 + #define AN2 7 + #define AN3 7 + #define AN4 7 + #define BN1 2 + #define BN2 2 + #define BN3 2 + #define BN4 2 + #define CN1 4 + #define CN2 4 + + int k1i = 1, k2i = 0, k3i = 0, k4i = 0, li = 2; + int k1j = 0, k2j = 1, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 0, k3n = 1, k4n = 0, ln = 0; + int k1m = 0, k2m = 0, k3m = 0, k4m = 1, lm = 3; + int kc1i = 1, kc2i = 0, kc3i = 0, kc4i = 0, lci = 2; + int kc1j = 0, kc2j = 0, kc3j = 0, kc4j = 0, lcj = 2; + int kc1n = 0, kc2n = 0, kc3n = 0, kc4n = 0, lcn = 3; + int kc1m = 0, kc2m = 1, kc3m = 0, kc4m = 0, lcm = 3; + char tname[] = "templ441 "; + + #pragma dvm template[AN1][AN2][AN3][AN4] distribute[block][block][block][block] + void *A4; + #pragma dvm array align([i][j][n][m] with A4[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm]) + int B4[BN1][BN2][BN3][BN4]; + #pragma dvm array align([i][j] with A4[kc1i*i+lci][lcj][lcn][kc2m*j+lcm]) + int C2[CN1][CN2]; + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([m][n][j][i] on B4[i][j][n][m]) + for (m = 0; m < BN4; m++) + for (n = 0; n < BN3; n++) + for (j = 0; j < BN2; j++) + for (i = 0; i < BN1; i++) + B4[i][j][n][m] = (i*NL/10+j*NL/100+n*NL/1000+m); + + #pragma dvm parallel([j][i] on C2[i][j]) + for (j = 0; j < CN2; j++) + for (i = 0; i < CN1; i++) + C2[i][j] = (i*NL+j); + + #pragma dvm parallel([m][n][j][i] on A4[i][j][n][m]) private(ib, jb, nb, mb, ic, jc, erri) + for (m = 0; m < AN4; m++) + for (n = 0; n < AN3; n++) + for (j = 0; j < AN2; j++) + for (i = 0; i < AN1; i++) + { + if (((i-li) == (((i-li)/k1i) * k1i)) && + ((j-lj) == (((j-lj)/k2j) *k2j)) && + ((n-ln) == (((n-ln)/k3n) * k3n)) && + ((m-lm) == (((m-lm)/k4m) *k4m)) && + (((i-li)/k1i) >= 0) && + (((j-lj)/k2j) >= 0) && + (((n-ln)/k3n) >= 0) && + (((m-lm)/k4m) >= 0) && + (((i-li)/k1i) < BN1) && + (((j-lj)/k2j) < BN2) && + (((n-ln)/k3n) < BN3) && + (((m-lm)/k4m) < BN4)) + { + ib = (i-li)/k1i; + jb = (j-lj)/k2j; + nb = (n-ln)/k3n; + mb = (m-lm)/k4m; + if (B4[ib][jb][nb][mb] != (ib*NL/10+jb*NL/100+nb*NL/1000+mb)) + erri = i*NL/10 + j*NL/100+ n*NL/1000+ m; + } + if ((j == lcj) && (n == lcn) && + ((i-lci) == (((i-lci)/kc1i) * kc1i)) && + ((m-lcm) == (((m-lcm)/kc2m) *kc2m)) && + (((i-lci)/kc1i) >= 0) && + (((m-lcm)/kc2m) >= 0) && + (((i-lci)/kc1i) < CN1) && + (((m-lcm)/kc2m) < CN2)) + { + ic = (i-lci)/kc1i; + jc = (m-lcm)/kc2m; + if (C2[ic][jc] != (ic*NL+jc)) + erri = i; + } + } + } + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + #undef AN1 + #undef AN2 + #undef AN3 + #undef AN4 + #undef BN1 + #undef BN2 + #undef BN3 + #undef BN4 + #undef CN1 + #undef CN2 +} + +/* ---------------------------------------------TEMPL442*/ +/* TEMPLATE A4[BLOCK][BLOCK][BLOCK][BLOCK] + ALIGN B4[i][j][k][l] WITH A4[l][i][j][k] + ALIGN C4[i][j][k][l] WITH A4[i+2][j][k][l+3] */ +void templ442() +{ + int AN1 = 7, AN2 = 7, AN3 = 7, AN4 = 7; + int BN1 = 2, BN2 = 2, BN3 = 2, BN4 = 2; + int CN1 = 4, CN2 = 4, CN3 = 4, CN4 = 4; + + int k1i = 0, k2i = 0, k3i = 0, k4i = 1, li = 0; + int k1j = 1, k2j = 0, k3j = 0, k4j = 0, lj = 0; + int k1n = 0, k2n = 1, k3n = 0, k4n = 0, ln = 0; + int k1m = 0, k2m = 0, k3m = 1, k4m = 0, lm = 0; + int kc1i = 1, kc2i = 0, kc3i = 0, kc4i = 0, lci = 2; + int kc1j = 0, kc2j = 1, kc3j = 0, kc4j = 0, lcj = 0; + int kc1n = 0, kc2n = 0, kc3n = 1, kc4n = 0, lcn = 0; + int kc1m = 0, kc2m = 0, kc3m = 0, kc4m = 1, lcm = 3; + + char tname[] = "templ442 "; + + #pragma dvm template[AN1][AN2][AN3][AN4] distribute[block][block][block][block] + void *A4; + #pragma dvm array + int (*B4)[BN2][BN3][BN4]; + #pragma dvm array + int (*C4)[CN2][CN3][CN4]; + + B4 = malloc(sizeof(int[BN1][BN2][BN3][BN4])); + C4 = malloc(sizeof(int[CN1][CN2][CN3][CN4])); + #pragma dvm realign(B4[i][j][n][m] with A4[k4i*m+li][k1j*i+lj][k2n*j+ln][k3m*n+lm]) + #pragma dvm realign(C4[i][j][n][m] with A4[kc1i*i+lci][kc2j*j+lcj][ kc3n*n+lcn][kc4m*m+lcm]) + + erri = ER; + #pragma dvm actual(erri) + + #pragma dvm region + { + #pragma dvm parallel([m][n][j][i] on B4[i][j][n][m]) + for (m = 0; m < BN4; m++) + for (n = 0; n < BN3; n++) + for (j = 0; j < BN2; j++) + for (i = 0; i < BN1; i++) + B4[i][j][n][m] = (i*NL/10+j*NL/100+n*NL/1000+m); + + #pragma dvm parallel([m][n][j][i] on C4[i][j][n][m]) + for (m = 0; m < CN4; m++) + for (n = 0; n < CN3; n++) + for (j = 0; j < CN2; j++) + for (i = 0; i < CN1; i++) + C4[i][j][n][m] = (i*NL/10+j*NL/100+n*NL/1000+m); + + #pragma dvm parallel([m][n][j][i] on A4[i][j][n][m]) private(ib, jb, nb, mb, ic, jc, nc, mc, erri) + for (m = 0; m < AN4; m++) + for (n = 0; n < AN3; n++) + for (j = 0; j < AN2; j++) + for (i = 0; i < AN1; i++) + { + if (((i-li) == (((i-li)/k4i) * k4i)) && + ((j-lj) == (((j-lj)/k1j) *k1j)) && + ((n-ln) == (((n-ln)/k2n) * k2n)) && + ((m-lm) == (((m-lm)/k3m) *k3m)) && + (((i-li)/k4i) >= 0) && + (((j-lj)/k1j) >= 0) && + (((n-ln)/k2n) >= 0) && + (((m-lm)/k3m) >= 0) && + (((i-li)/k4i) < BN4) && + (((j-lj)/k1j) < BN1) && + (((n-ln)/k2n) < BN2) && + (((m-lm)/k3m) < BN3)) + { + mb = (i-li)/k4i; + ib = (j-lj)/k1j; + jb = (n-ln)/k2n; + nb = (m-lm)/k3m; + if (B4[ib][jb][nb][mb] != (ib*NL/10+jb*NL/100+nb*NL/1000+mb)) + erri = i*NL/10 + j*NL/100+ n*NL/1000+ m; + } + if ( + ((i-lci) == (((i-lci)/kc1i) * kc1i)) && + ((j-lcj) == (((j-lcj)/kc2j) * kc2j)) && + ((n-lcn) == (((n-lcn)/kc3n) * kc3n)) && + ((m-lcm) == (((m-lcm)/kc4m) *kc4m)) && + (((i-lci)/kc1i) >= 0) && + (((j-lcj)/kc2j) >= 0) && + (((n-lcn)/kc3n) >= 0) && + (((m-lcm)/kc2m) >= 0) && + (((i-lci)/kc1i) < CN1) && + (((j-lcj)/kc2j) < CN2) && + (((n-lcn)/kc3n) < CN3) && + (((m-lcm)/kc2m) < CN2)) + { + ic = (i-lci)/kc1i; + jc = (j-lcj)/kc2j; + nc = (n-lcn)/kc3n; + mc = (m-lcm)/kc4m; + if (C4[ic][jc][nc][mc] != (ic*NL/10+jc*NL/100+nc*NL/1000+mc)) + erri = i*NL/10 + j*NL/100+ n*NL/1000+ m; + } + } + } + + #pragma dvm get_actual(erri) + + if (erri == ER) + ansyes(tname); + else + ansno(tname); + + free(B4); + free(C4); +} + +void ansyes(const char name[]) +{ + printf("%s - complete\n", name); +} + +void ansno(const char name[]) +{ + printf("%s - ***error\n", name); +} diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr11.fdv new file mode 100644 index 0000000..a9124cb --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr11.fdv @@ -0,0 +1,591 @@ + program ACR11 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR11========================' +C -------------------------------------------------- + call acr1101 +C -------------------------------------------------- + call acr1102 +C -------------------------------------------------- + call acr1103 +C ------------------------------------------------- + call acr1104 +C ------------------------------------------------- + call acr1105 +C ------------------------------------------------- + call acr1106 +C -------------------------------------------------- + call acr1107 +C -------------------------------------------------- + call acr1108 +C -------------------------------------------------- + call acr1109 +C ------------------------------------------------- + call acr1110 +C ------------------------------------------------- + +C + print *,'=== END OF ACR11 ========================= ' + end +C ---------------------------------------------ACR1101 + subroutine ACR1101 + integer,parameter :: N = 8, NL=1000 + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop +!dvm$ distribute A(BLOCK) + + tname='ACR1101' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + + do i=2,N-1 + C(i) = C(i-1)+C(i+1) + enddo +!dvm$ actual (nloop, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(1:1)),stage(iloop) + do i=2,N-1 + A(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-1 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ---------------------------------------------ACR1102 + subroutine ACR1102 + integer,parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:),C(:) + integer nloop + +!dvm$ distribute A(BLOCK) + + tname='ACR1102' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=1,N-1 + C(i) = C(i)+C(i+1) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(0:1)),stage(iloop) + do i=1,N-1 + A(i) = A(i)+A(i+1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-1 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -----------------------------------------ACR1103 + subroutine acr1103 + integer,parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(BLOCK) + + tname='ACR1103' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=2,N + C(i) = C(i)+ C(i-1) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + + +!dvm$ parallel (i) on A(i),across(A(1:0)),stage(iloop) + do i=2,N + A(i) =A(i)+ A(i-1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-1 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + + + + +C -------------------------------------------ACR1104 + + subroutine ACR1104 + integer,parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(BLOCK) +!dvm$ shadow A(2:2) + + tname='ACR1104' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=3,N-2 + C(i) = C(i-1)+C(i+1)+C(i+2)+C(i-2) + enddo +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(2:2)),stage(iloop) + do i=3,N-2 + A(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=3,N-2 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR1105 + + subroutine ACR1105 + integer,parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:),C(:) + integer nloop + +!dvm$ distribute A(BLOCK) +!dvm$ shadow A(2:2) + + tname='ACR1105' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=2,N-2 + C(i) = C(i+1)+C(i+2) + enddo +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(0:2)),stage(iloop) + do i=2,N-2 + A(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-2 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C -------------------------------------------ACR1106 + + subroutine ACR1106 + integer,parameter :: N = 16, NL=1000 + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop +!dvm$ distribute A(BLOCK) +!dvm$ shadow A(2:2) + + tname='ACR1106' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=3,N + C(i) = C(i-1)+C(i-2) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + + +!dvm$ parallel (i) on A(i),across(A(2:0)),stage(iloop) + do i=3,N + A(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=3,N + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C -------------------------------------------ACR1107 + + subroutine acr1107 + integer,parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(BLOCK) +!dvm$ shadow A(3:3) + + tname='ACR1107' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=4,N-3 + C(i) = C(i-1)+C(i+1)+C(i+2)+C(i-2)+C(i-3)+C(i+3) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(3:3)),stage(iloop) + do i=4,N-3 + A(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2)+A(i-3)+A(i+3) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=4,N-3 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR1108 + + subroutine acr1108 + integer,parameter :: N = 24, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(BLOCK) +!dvm$ shadow A(3:3) + + tname='ACR1108' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=2,N-3 + C(i) = C(i+1)+C(i+2)+C(i+3) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + + +!dvm$ parallel (i) on A(i),across(A(0:3)),stage(iloop) + do i=2,N-3 + A(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-3 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR1109 + + subroutine acr1109 + integer,parameter :: N = 24, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(BLOCK) +!dvm$ shadow A(3:3) + + tname='ACR1109' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + + do i=4,N + C(i) = C(i-1)+C(i-2)+C(i-3) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(3:0)),stage(iloop) + do i=4,N + A(i) = A(i-1)+A(i-2)+A(i-3) + + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=4,N + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C --------------------------------------------acr1110 + + subroutine acr1110 + integer,parameter :: N = 60, NL=1000 + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(BLOCK) +!dvm$ shadow A(11:11) + + tname='ACR1110' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=12,N-11 + C(i) = C(i-9)+C(i+9)+C(i+10)+C(i-10)+C(i-11)+C(i+11) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + + +!dvm$ parallel (i) on A(i),across(A(11:11)),stage(iloop) + do i=12,N-11 + A(i) = A(i-9)+A(i+9)+A(i+10)+A(i-10)+A(i-11)+A(i+11) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=12,N-11 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer:: AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr12.fdv new file mode 100644 index 0000000..1b9949f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr12.fdv @@ -0,0 +1,587 @@ + program ACR12 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR12========================' +C -------------------------------------------------- + call acr1201 +C -------------------------------------------------- + call acr1202 +C -------------------------------------------------- + call acr1203 +C ------------------------------------------------- + call acr1204 +C ------------------------------------------------- + call acr1205 +C ------------------------------------------------- + call acr1206 +C -------------------------------------------------- + call acr1207 +C -------------------------------------------------- + call acr1208 +C -------------------------------------------------- + call acr1209 +C ------------------------------------------------- + call acr1210 +C ------------------------------------------------- + +C + print *,'=== END OF ACR12 ========================= ' + end +C ---------------------------------------------ACR1201 + subroutine acr1201 + + integer, parameter :: N = 8, NL=1000 + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) + + tname='ACR1201' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + + do i=2,N-1 + C(i) = C(i-1)+C(i+1) + enddo +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + + +!dvm$ parallel (i) on A(i),across(A(1:1)),stage(iloop) + do i=2,N-1 + A(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-1 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C ---------------------------------------------ACR1202 + subroutine acr1202 + integer, parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) + + tname='ACR1202' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=1,N-1 + C(i) = C(i)+C(i+1) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(0:1)),stage(iloop) + do i=1,N-1 + A(i) = A(i)+A(i+1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-1 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -----------------------------------------ACR1203 + subroutine acr1203 + integer, parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) + + tname='ACR1203' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=2,N + C(i) =C(i)+ C(i-1) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(1:0)),stage(iloop) + do i=2,N + A(i) =A(i)+ A(i-1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-1 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C -------------------------------------------ACR1204 + + subroutine acr1204 + integer, parameter :: N = 16, NL=1000 + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) +!dvm$ shadow A(2:2) + + tname='ACR1204' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=3,N-2 + C(i) = C(i-1)+C(i+1)+C(i+2)+C(i-2) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(2:2)),stage(iloop) + do i=3,N-2 + A(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=3,N-2 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR1205 + + subroutine acr1205 + integer, parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:),C(:) + integer nloop + +!dvm$ distribute A(*) +!dvm$ shadow A(2:2) + + tname='ACR1205' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=2,N-2 + C(i) = C(i+1)+C(i+2) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(0:2)),stage(iloop) + do i=2,N-2 + A(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-2 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C -------------------------------------------ACR1206 + + subroutine acr1206 + integer, parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop +!dvm$ distribute A(*) +!dvm$ shadow A(2:2) + + tname='ACR1206' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=3,N + C(i) = C(i-1)+C(i-2) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(2:0)),stage(iloop) + do i=3,N + A(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=3,N + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C -------------------------------------------ACR1207 + + subroutine acr1207 + integer, parameter :: N = 16, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) +!dvm$ shadow A(3:3) + + tname='ACR1207' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=4,N-3 + C(i) = C(i-1)+C(i+1)+C(i+2)+C(i-2)+C(i-3)+C(i+3) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(3:3)),stage(iloop) + do i=4,N-3 + A(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2)+A(i-3)+A(i+3) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=4,N-3 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR1208 + + subroutine acr1208 + integer, parameter :: N = 24, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) +!dvm$ shadow A(3:3) + + tname='ACR1208' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=2,N-3 + C(i) = C(i+1)+C(i+2)+C(i+3) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(0:3)),stage(iloop) + do i=2,N-3 + A(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=2,N-3 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR1209 + + subroutine acr1209 + integer, parameter :: N = 24, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) +!dvm$ shadow A(3:3) + + tname='ACR1209' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + + do i=4,N + C(i) = C(i-1)+C(i-2)+C(i-3) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(3:0)),stage(iloop) + do i=4,N + A(i) = A(i-1)+A(i-2)+A(i-3) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=4,N + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C --------------------------------------------ACR1210 + + subroutine acr1210 + integer, parameter :: N = 50, NL=1000 + + character*7 tname + integer,allocatable:: A(:), C(:) + integer nloop + +!dvm$ distribute A(*) +!dvm$ shadow A(11:11) + + tname='ACR1210' + allocate (A(N), C(N)) + nloop=NL + + do iloop=0,2 + NNL=NL + call serial1(C,N,NNL) + do i=12,N-11 + C(i) = C(i-9)+C(i+9)+C(i+10)+C(i-10)+C(i-11)+C(i+11) + enddo + +!dvm$ actual (nloop, C) +!dvm$ region + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on A(i),across(A(11:11)),stage(iloop) + do i=12,N-11 + A(i) = A(i-9)+A(i+9)+A(i+10)+A(i-10)+A(i-11)+A(i+11) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=12,N-11 + if (A(i).ne. C(i)) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual (nloop) + enddo + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr21.fdv new file mode 100644 index 0000000..b243e99 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr21.fdv @@ -0,0 +1,977 @@ + program ACR21 + +c TESTING OF THE ACROSS CLAUSE. +c DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR21========================' +C -------------------------------------------------- + call acr2101 +C -------------------------------------------------- + call acr2102 +C -------------------------------------------------- + call acr2103 +C ------------------------------------------------- + call acr2104 +C ------------------------------------------------- + call acr2105 +C ------------------------------------------------- + call acr2106 +C -------------------------------------------------- + call acr2107 +C -------------------------------------------------- + call acr2108 +C -------------------------------------------------- + call acr2109 +C ------------------------------------------------- + call acr2110 +C ------------------------------------------------- + call acr2111 +C ------------------------------------------------- + call acr2112 +C ------------------------------------------------- + call acr2113 +C ------------------------------------------------- + call acr2114 +C ------------------------------------------------- + call acr2115 +C ------------------------------------------------- + print *,'=== END OF ACR21 ========================= ' + end +C ---------------------------------------------ACR2101 + subroutine ACR2101 + + integer,parameter :: N = 16, M=16, NL=1000 + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + integer nloopi,nloopj + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='ACR2101' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i+1,j)+C(i,j+1)+C(i-1,j)+C(i,j-1) + enddo + enddo +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(1:1,1:1)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i+1,j)+A(i,j+1)+A(i-1,j)+A(i,j-1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi,nloopj) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C ---------------------------------------------ACR2102 + subroutine ACR2102 + integer,parameter :: N = 16,M=16, NL=1000 + + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + integer nloopi,nloopj + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='ACR2102' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i+1,j) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual(nloopi,nloopj) +!dvm$ region +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,0:0)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C -----------------------------------------ACR2103 + subroutine acr2103 + integer,parameter :: N = 16,M=16, NL=1000 + + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) + + tname='ACR2103' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i-1,j)+C(i,j+1) + enddo + enddo +!dvm$ actual (nloopi,nloopj,C(:,:)) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(1:0,0:1)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i-1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C ------------------------------------------ACR2104 + subroutine acr2104 + integer,parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow A(1:1,0:1) + tname='ACR2104' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i+1,j)+C(i,j+1) + enddo + enddo +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,0:1)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i+1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C ------------------------------------------ACR2105 + subroutine acr2105 + integer,parameter :: N = 16,M=16, NL=1000 + integer,allocatable:: A(:,:), C(:,:) + character*7 tname + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow A(0:1,1:1) + + tname='ACR2105' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i,j-1)+C(i+1,j) + enddo + enddo +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,1:0)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i,j-1)+A(i+1,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C -------------------------------------------ACR2106 + + subroutine acr2106 + integer,parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A + + tname='ACR2106' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i+2,j)+C(i,j+2)+C(i+2,j)+C(i-2,j)+C(i,j-2) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(2:2,2:2)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i+2,j)+A(i,j+2)+A(i+2,j)+A(i-2,j)+A(i,j-2) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR2107 + + subroutine acr2107 + + integer,parameter :: N = 16,M=16, NL=1000 + integer,allocatable:: A(:,:), C(:,:) + character*7 tname + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A + + tname='ACR2107' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i+2,j)+C(i,j+2)+C(i,j-2) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:2,2:2)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) =A(i+2,j)+A(i,j+2)+A(i,j-2) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR2108 + + subroutine acr2108 + integer,parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A + + tname='ACR2108' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i-1,j)+C(i,j-1)+C(i-2,j)+C(i+2,j) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(2:2,2:0)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i-1,j)+A(i,j-1)+A(i-2,j)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR2109 + + subroutine acr2109 + integer,parameter :: N = 16,M=16, NL=1000 + integer,allocatable:: A(:,:), C(:,:) + character*7 tname + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(2:2,0:2) :: A + + tname='ACR2109' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i,j+2)+ C(i+1,j)+C(i+2,j) + enddo + enddo + + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(2:2,0:2)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i,j+2)+ A(i+1,j)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C -------------------------------------------ACR2110 + + subroutine acr2110 + integer,parameter :: N = 16,M=16, NL=1000 + integer,allocatable:: A(:,:), C(:,:) + character*7 tname + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3) :: A + + tname='ACR2110' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=4,N-3 + do j=4,M-3 + C(i,j) =C(i+1,j)+C(i,j+2)+C(i+3,j)+C(i,j-3)+ + * C(i-2,j)+C(i,j-1) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(3:3,3:3)),stage(iloop) + do j=4,M-3 + do i=4,N-3 + A(i,j) = A(i+1,j)+A(i,j+2)+A(i+3,j)+A(i,j-3)+ + * A(i-2,j)+A(i,j-1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=4,M-3 + do i=4,N-3 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C -------------------------------------------ACR2111 + + subroutine ACR2111 + integer,parameter :: N = 16,M=16, NL=1000 + integer,allocatable:: A(:,:), C(:,:) + character*7 tname + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(3:3,0:3) :: A + + tname='ACR2111' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i,j)+C(i,j+1) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:0,0:1)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C --------------------------------------------ACR2112 + + subroutine acr2112 + integer,parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3) :: A + + tname='ACR2112' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i,j)+C(i+1,j) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,0:0)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i,j)+A(i+1,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C --------------------------------------------ACR2113 + + subroutine acr2113 + integer,parameter :: N = 16,M=16, NL=1000 + integer,allocatable:: A(:,:), C(:,:) + character*7 tname + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(3:3,3:0) :: A + + tname='ACR2113' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=4,N-3 + do j=4,M-3 + C(i,j) =C(i,j-3)+C(i+3,j)+C(i-3,j) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(3:3,3:0)),stage(iloop) + do j=4,M-3 + do i=4,N-3 + A(i,j) = A(i,j-3)+A(i+3,j)+A(i-3,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=4,M-3 + do i=4,N-3 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C --------------------------------------------ACR2114 + + subroutine acr2114 + integer,parameter :: N = 16,M=16, NL=1000 + integer,allocatable:: A(:,:), C(:,:) + character*7 tname + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(3:0,3:3) :: A + + tname='ACR2114' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=4,N-3 + do j=4,M-3 + C(i,j) =C(i-3,j)+C(i,j+3) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(3:0,3:3)),stage(iloop) + do j=4,M-3 + do i=4,N-3 + A(i,j) = A(i-3,j)+A(i,j+3) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=4,M-3 + do i=4,N-3 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C --------------------------------------------ACR2115 + + subroutine acr2115 + integer,parameter :: N = 59,M=59, NL=1000 + character*7 tname + integer,allocatable:: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11) :: A + + tname='ACR2115' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=12,N-11 + do j=12,M-11 + C(i,j) =C(i+11,j)+C(i,j+10)+C(i+9,j)+ + *C(i,j-11)+C(i-10,j)+C(i,j-9) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj) +!dvm$ region + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(11:11,11:11)),stage(iloop) + do j=12,M-11 + do i=12,N-11 + A(i,j) = A(i+11,j)+A(i,j+10)+A(i+9,j)+ + *A(i,j-11)+A(i-10,j)+A(i,j-9) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=12,M-11 + do i=12,N-11 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr22.fdv new file mode 100644 index 0000000..8c0a6d6 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr22.fdv @@ -0,0 +1,995 @@ + program ACR22 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR22========================' +C -------------------------------------------------- + call acr2201 +C -------------------------------------------------- + call acr2202 +C -------------------------------------------------- + call acr2203 +C ------------------------------------------------- + call acr2204 +C ------------------------------------------------- + call acr2205 +C ------------------------------------------------- + call acr2206 +C -------------------------------------------------- + call acr2207 +C -------------------------------------------------- + call acr2208 +C -------------------------------------------------- + call acr2209 +C ------------------------------------------------- + call acr2210 +C ------------------------------------------------- + call acr2211 +C ------------------------------------------------- + call acr2212 +C ------------------------------------------------- + call acr2213 +C ------------------------------------------------- + call acr2214 +C ------------------------------------------------- + call acr2215 +C ------------------------------------------------- + print *,'=== END OF ACR22 ========================= ' + end +C ---------------------------------------------ACR2201 + subroutine ACR2201 + + integer, parameter :: N = 16,M=16, NL=1000 + + + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj + +!dvm$ distribute A(*,BLOCK) + tname='ACR2201' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i+1,j)+C(i,j+1)+C(i-1,j)+C(i,j-1) + enddo + enddo + +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C),out (A) + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(1:1,1:1)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i+1,j)+A(i,j+1)+A(i-1,j)+A(i,j-1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C ---------------------------------------------ACR2202 + subroutine ACR2202 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,*) + tname='ACR2202' + + do iloop=0,2 + allocate (A(N,M), C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i+1,j) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,0:0)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + deallocate (A, C) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C -----------------------------------------ACR2203 + subroutine acr2203 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(*,BLOCK) + tname='ACR2203' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i-1,j)+C(i,j+1) + enddo + enddo +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(1:0,0:1)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i-1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi,nloopj) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C ------------------------------------------ACR2204 + subroutine acr2204 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,*) +!dvm$ shadow A(1:1,0:1) + tname='ACR2204' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i+1,j)+C(i,j+1) + enddo + enddo +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region in (C) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,0:1)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i+1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C ------------------------------------------ACR2205 + subroutine acr2205 + + integer, parameter :: N = 16,M=16, NL=1000 + + + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(*,BLOCK) +!dvm$ shadow A(0:1,1:1) + + tname='ACR2205' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + do i=2,N-1 + do j=2,M-1 + C(i,j) = C(i,j-1)+C(i+1,j) + enddo + enddo +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,1:0)),stage(iloop) + do j=2,M-1 + do i=2,N-1 + A(i,j) = A(i,j-1)+A(i+1,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=2,M-1 + do i=2,N-1 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end + +C -------------------------------------------ACR2206 + + subroutine acr2206 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,*) +!dvm$ shadow(2:2,2:2) :: A + tname='ACR2206' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i+2,j)+C(i,j+2)+C(i+2,j)+C(i-2,j)+C(i,j-2) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(2:2,2:2)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i+2,j)+A(i,j+2)+A(i+2,j)+A(i-2,j)+A(i,j-2) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR2207 + + subroutine acr2207 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(*,BLOCK) +!dvm$ shadow(2:2,2:2) :: A + tname='ACR2207' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i+2,j)+C(i,j+2)+C(i,j-2) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi) +!dvm$ region + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:2,2:2)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) =A(i+2,j)+A(i,j+2)+A(i,j-2) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR2208 + + subroutine acr2208 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,*) +!dvm$ shadow(2:2,2:2) :: A + tname='ACR2208' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i-1,j)+C(i,j-1)+C(i-2,j)+C(i+2,j) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C),out (A) + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(2:2,2:0)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i-1,j)+A(i,j-1)+A(i-2,j)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C -------------------------------------------ACR2209 + + subroutine acr2209 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(*,BLOCK) +!dvm$ shadow(2:2,0:2) :: A + + tname='ACR2209' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i,j+2)+ C(i+1,j)+C(i+2,j) + enddo + enddo + nloopi=NL + nloopj=NL +!dvm$ actual (nloopi) +!dvm$ region inout (C) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(2:2,0:2)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i,j+2)+ A(i+1,j)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR2210 + + subroutine acr2210 + integer, parameter :: N = 16,M=16, NL=1000 + + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,*) +!dvm$ shadow(3:3,3:3) :: A + + tname='ACR2210' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=4,N-3 + do j=4,M-3 + C(i,j) =C(i+1,j)+C(i,j+2)+C(i+3,j)+C(i,j-3)+ + * C(i-2,j)+C(i,j-1) + enddo + enddo + nloopi=NL + nloopj=NL + +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(3:3,3:3)),stage(iloop) + do j=4,M-3 + do i=4,N-3 + A(i,j) = A(i+1,j)+A(i,j+2)+A(i+3,j)+A(i,j-3)+ + * A(i-2,j)+A(i,j-1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j = 4,M-3 + do i= 4,N-3 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C -------------------------------------------ACR2211 + + subroutine ACR2211 + integer, parameter :: N = 16,M=16, NL=1000 + + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(*,BLOCK) +!dvm$ shadow(3:3,0:3) :: A + + tname='ACR2211' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i,j)+C(i,j+1) + enddo + enddo + nloopi=NL + nloopj=NL + +!dvm$ actual (nloopi) +!dvm$ region + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:0,0:1)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C --------------------------------------------ACR2212 + + subroutine acr2212 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,*) +!dvm$ shadow(0:3,3:3) :: A + + tname='ACR2212' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=3,N-2 + do j=3,M-2 + C(i,j) =C(i,j)+C(i+1,j) + enddo + enddo + nloopi=NL + nloopj=NL + +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(0:1,0:0)),stage(iloop) + do j=3,M-2 + do i=3,N-2 + A(i,j) = A(i,j)+A(i+1,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=3,M-2 + do i=3,N-2 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C --------------------------------------------ACR2213 + + subroutine acr2213 + integer, parameter :: N = 16,M=16, NL=1000 + + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(*,BLOCK) +!dvm$ shadow(3:3,3:0) :: A + + tname='ACR2213' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=4,N-3 + do j=4,M-3 + C(i,j) =C(i,j-3)+C(i+3,j)+C(i-3,j) + enddo + enddo + nloopi=NL + nloopj=NL + +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(3:3,3:0)),stage(iloop) + do j=4,M-3 + do i=4,N-3 + A(i,j) = A(i,j-3)+A(i+3,j)+A(i-3,j) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=4,M-3 + do i=4,N-3 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C --------------------------------------------ACR2214 + + subroutine acr2214 + integer, parameter :: N = 16,M=16, NL=1000 + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(BLOCK,*) +!dvm$ shadow(3:0,3:3) :: A + + tname='ACR2214' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=4,N-3 + do j=4,M-3 + C(i,j) =C(i-3,j)+C(i,j+3) + enddo + enddo + nloopi=NL + nloopj=NL + + +!dvm$ actual (nloopi,nloopj) +!dvm$ region + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(3:0,3:3)),stage(iloop) + do j=4,M-3 + do i=4,N-3 + A(i,j) = A(i-3,j)+A(i,j+3) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=4,M-3 + do i=4,N-3 + if (A(i,j).ne.c(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C --------------------------------------------ACR2215 + + subroutine acr2215 + integer, parameter :: N = 58,M=58, NL=1000 + + character*7 tname + integer, allocatable :: A(:,:), C(:,:) + integer nloopi,nloopj +!dvm$ distribute A(*,BLOCK) +!dvm$ shadow(11:11,11:11) :: A + tname='ACR2215' + allocate (A(N,M), C(N,M)) + + do iloop=0,2 + NNL=NL + call serial2(C,N,M,NNL) + do i=12,N-11 + do j=12,M-11 + C(i,j) =C(i+11,j)+C(i,j+10)+C(i+9,j)+ + *C(i,j-11)+C(i-10,j)+C(i,j-9) + enddo + enddo + nloopi=NL + nloopj=NL + +!dvm$ actual (nloopi,nloopj,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (j,i) on A(i,j) + do j=1,M + do i=1,N + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j),across(A(11:11,11:11)),stage(iloop) + do j=12,M-11 + do i=12,N-11 + A(i,j) = A(i+11,j)+A(i,j+10)+A(i+9,j)+ + *A(i,j-11)+A(i-10,j)+A(i,j-9) + enddo + enddo + +!dvm$ parallel (j,i) on A(i,j), reduction( min( nloopi),min(nloopj)) + do j=12,M-11 + do i=12,N-11 + if (A(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr31.fdv new file mode 100644 index 0000000..33185ef --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr31.fdv @@ -0,0 +1,781 @@ + program ACR31 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR31========================' +C -------------------------------------------------- + call acr3101 +C -------------------------------------------------- + call acr3102 +C -------------------------------------------------- + call acr3103 +C ------------------------------------------------- + call acr3104 +C ------------------------------------------------- + call acr3105 +C ------------------------------------------------- + call acr3106 +C -------------------------------------------------- + call acr3107 +C -------------------------------------------------- + call acr3108 +C---------------------------------------------------- + call acr3109 +C---------------------------------------------------- + +C +C + print *,'=== END OF ACR31 ========================= ' + end +C ---------------------------------------------ACR3101 + subroutine acr3101 + + integer, parameter :: N = 16,M=8,K=8, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + tname='ACR3101' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + C(i,j,ii) = C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+C(i-1,j,ii)+ + *C(i,j-1,ii)+ C(i,j,ii-1) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ parallel (ii,j,i) on A(i,j,ii),across(A(1:1,1:1,1:1)), +!dvm$*stage(iloop) + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + A(i,j,ii) = A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+A(i-1,j,ii)+ + *A(i,j-1,ii)+ A(i,j,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3102 + subroutine acr3102 + + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A + tname='ACR3102' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii)=C(i+2,j,ii) +C(i,j-2,ii) + + * C(i,j,ii-1) +C(i-1,j,ii) + + * C(i+1,j,ii) +C(i,j-1,ii) + + * C(i,j+2,ii) +C(i,j,ii+2) + + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region in (C) + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(1:2,2:2,1:2)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii)=A(i+2,j,ii) +A(i,j-2,ii) + + * A(i,j,ii-1) +A(i-1,j,ii) + + * A(i+1,j,ii) +A(i,j-1,ii) + + * A(i,j+2,ii) +A(i,j,ii+2) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3103 + subroutine acr3103 + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A + tname='ACR3103' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii) =C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i,j-2,ii)+ C(i,j-1,ii)+C(i+1,j,ii)+ + * C(i,j+1,ii)+C(i,j,ii+1) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(0:2,2:2,0:2)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii) =A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i,j-2,ii)+ A(i,j-1,ii)+A(i+1,j,ii)+ + * A(i,j+1,ii)+A(i,j,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3104 + subroutine acr3104 + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A + tname='ACR3104' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii) =C(i+2,j,ii)+C(i,j,ii-2)+ + *C(i-2,j,ii)+ C(i,j-2,ii)+C(i-1,j,ii)+C(i,j-1,ii)+ + *C(i,j,ii-1)+C(i+1,j,ii) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii) +!dvm$ region + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(2:2,2:0,2:0)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii) =A(i+2,j,ii)+A(i,j,ii-2)+ + *A(i-2,j,ii)+ A(i,j-2,ii)+A(i-1,j,ii)+A(i,j-1,ii)+ + *A(i,j,ii-1)+A(i+1,j,ii) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3105 + subroutine acr3105 + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:2,2:2,0:2) :: A + tname='ACR3105' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii) =C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i,j-2,ii)+C(i,j-1,ii)+C(i+1,j,ii)+C(i,j+1,ii)+ + * C(i,j,ii+1) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region in (C) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(0:2,2:2,0:2)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii) =A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i,j-2,ii)+A(i,j-1,ii)+A(i+1,j,ii)+A(i,j+1,ii)+ + * A(i,j,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C --------------------------------------------ACR3106 + subroutine acr3106 + integer, parameter :: N = 16,M=16,K=16, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3) :: A + tname='ACR3106' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + C(i,j,ii) = C(i+3,j,ii)+C(i,j+3,ii)+C(i,j,ii+3)+ + * C(i-3,j,ii)+C(i,j-3,ii)+C(i,j,ii-3)+ + * C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i-2,j,ii)+C(i,j-2,ii)+C(i,j,ii-2)+ + * C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+ + * C(i-1,j,ii)+C(i,j-1,ii)+C(i,j,ii-1) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(3:3,3:3,3:3)), +!dvm$*stage(iloop) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii) = A(i+3,j,ii)+A(i,j+3,ii)+A(i,j,ii+3)+ + * A(i-3,j,ii)+A(i,j-3,ii)+A(i,j,ii-3)+ + * A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i-2,j,ii)+A(i,j-2,ii)+A(i,j,ii-2)+ + * A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+ + * A(i-1,j,ii)+A(i,j-1,ii)+A(i,j,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(A,C) + end + + +C --------------------------------------------ACR3107 + subroutine acr3107 + integer, parameter :: N = 16,M=16,K=16, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,0:3,3:0) :: A + tname='ACR3107' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + C(i,j,ii) = C(i+3,j,ii)+C(i,j+3,ii)+C(i-3,j,ii)+ + * C(i,j,ii-3)+C(i+2,j,ii)+C(i,j+2,ii)+ + * C(i-2,j,ii)+C(i,j,ii-2)+ + * C(i+1,j,ii)+C(i,j+1,ii)+C(i+1,j,ii)+ + * C(i,j+1,ii)+C(i-1,j,ii)+C(i,j,ii-1) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(3:3,0:3,3:0)), +!dvm$*stage(iloop) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii) = A(i+3,j,ii)+A(i,j+3,ii)+A(i-3,j,ii)+ + * A(i,j,ii-3)+A(i+2,j,ii)+A(i,j+2,ii)+ + * a(i-2,j,ii)+A(i,j,ii-2)+ + * A(i+1,j,ii)+A(i,j+1,ii)+A(i+1,j,ii)+ + * A(i,j+1,ii)+A(i-1,j,ii)+A(i,j,ii-1) + enddo + enddo + enddo +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C --------------------------------------------ACR3108 + subroutine acr3108 + integer, parameter :: N = 16,M=16,K=16, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,0:3,0:3) :: A + tname='ACR3108' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + + do i=1,N-3 + do j=1,M-3 + do ii=1,K-3 + C(i,j,ii) = C(i+3,j,ii)+C(i,j+3,ii)+C(i,j,ii+3)+ + * C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(0:3,0:3,0:3)), +!dvm$*stage(iloop) + do ii=1,K-3 + do j=1,M-3 + do i=1,N-3 + A(i,j,ii) = A(i+3,j,ii)+A(i,j+3,ii)+A(i,j,ii+3)+ + * A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C --------------------------------------------ACR3109 + subroutine acr3109 + integer, parameter :: N = 58,M=58,K=58, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11) :: A + tname='ACR3109' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + C(i,j,ii) = C(i+11,j,ii)+C(i,j+11,ii)+C(i,j,ii+11)+ + * C(i-11,j,ii)+C(i,j-11,ii)+C(i,j,ii-11)+ + * C(i+10,j,ii)+C(i,j+10,ii)+C(i,j,ii+10)+ + * C(i-10,j,ii)+C(i,j-10,ii)+C(i,j,ii-10)+ + * C(i-9,j,ii) +C(i,j-9,ii) +C(i,j,ii-9)+ + * C(i+9,j,ii) +C(i,j+9,ii) +C(i,j,ii+9) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(11:11,11:11,11:11)), +!dvm$*stage(iloop) + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + A(i,j,ii) = A(i+11,j,ii)+A(i,j+11,ii)+A(i,j,ii+11)+ + * A(i-11,j,ii)+A(i,j-11,ii)+A(i,j,ii-11)+ + * A(i+10,j,ii)+A(i,j+10,ii)+A(i,j,ii+10)+ + * A(i-10,j,ii)+A(i,j-10,ii)+A(i,j,ii-10)+ + * A(i-9,j,ii)+A(i,j-9,ii)+A(i,j,ii-9)+ + * A(i+9,j,ii)+A(i,j+9,ii)+A(i,j,ii+9) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr32.fdv new file mode 100644 index 0000000..82a6abe --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr32.fdv @@ -0,0 +1,772 @@ + program ACR32 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR32========================' +C -------------------------------------------------- + call acr3201 +C -------------------------------------------------- + call acr3202 +C -------------------------------------------------- + call acr3203 +C ------------------------------------------------- + call acr3204 +C ------------------------------------------------- + call acr3205 +C ------------------------------------------------- + call acr3206 +C -------------------------------------------------- + call acr3207 +C -------------------------------------------------- + call acr3208 +C---------------------------------------------------- + call acr3209 +C---------------------------------------------------- + +C +C + print *,'=== END OF ACR32 ========================= ' + end +C ---------------------------------------------ACR3201 + subroutine acr3201 + integer, parameter :: N = 16,M=8,K=8, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(*,BLOCK,BLOCK) + tname='ACR3201' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + C(i,j,ii) = C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+C(i-1,j,ii)+ + *C(i,j-1,ii)+ C(i,j,ii-1) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii),across(A(1:1,1:1,1:1)), +!dvm$*stage(iloop) + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + A(i,j,ii)=A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+A(i-1,j,ii)+ + *A(i,j-1,ii)+ A(i,j,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3202 + subroutine acr3202 + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A + tname='ACR3202' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii)=C(i+2,j,ii)+C(i,j-2,ii) + + * C(i,j,ii-1)+C(i-1,j,ii) + + * C(i+1,j,ii)+C(i,j-1,ii) + + * C(i,j+2,ii)+C(i,j,ii+2) + + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(1:2,2:2,1:2)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii)=A(i+2,j,ii)+A(i,j-2,ii) + + * A(i,j,ii-1)+A(i-1,j,ii) + + * A(i+1,j,ii)+A(i,j-1,ii) + + * A(i,j+2,ii)+A(i,j,ii+2) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3203 + subroutine acr3203 + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,*) +!dvm$ shadow(2:2,2:2,2:2) :: A + tname='ACR3203' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii) =C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i,j-2,ii)+ C(i,j-1,ii)+C(i+1,j,ii)+ + * C(i,j+1,ii)+C(i,j,ii+1) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii) +!dvm$ region in (C) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(0:2,2:2,0:2)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii) =A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i,j-2,ii)+ A(i,j-1,ii)+A(i+1,j,ii)+ + * A(i,j+1,ii)+A(i,j,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3204 + subroutine acr3204 + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(*,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A + tname='ACR3204' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii) =C(i+2,j,ii)+C(i,j,ii-2)+ + *C(i-2,j,ii)+ C(i,j-2,ii)+C(i-1,j,ii)+C(i,j-1,ii)+ + *C(i,j,ii-1)+C(i+1,j,ii) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(2:2,2:0,2:0)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii) =A(i+2,j,ii)+A(i,j,ii-2)+ + *A(i-2,j,ii)+ A(i,j-2,ii)+A(i-1,j,ii)+A(i,j-1,ii)+ + *A(i,j,ii-1)+A(i+1,j,ii) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end +C ---------------------------------------------ACR3205 + subroutine acr3205 + integer, parameter :: N = 16,M=10,K=10, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ shadow(0:2,2:2,0:2) :: A + tname='ACR3205' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + C(i,j,ii) =C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i,j-2,ii)+C(i,j-1,ii)+C(i+1,j,ii)+C(i,j+1,ii)+ + * C(i,j,ii+1) + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(0:2,2:2,0:2)), +!dvm$*stage(iloop) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii) =A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i,j-2,ii)+A(i,j-1,ii)+A(i+1,j,ii)+A(i,j+1,ii)+ + * A(i,j,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C --------------------------------------------ACR3206 + subroutine acr3206 + integer, parameter :: N = 16,M=16,K=16, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,*) +!dvm$ shadow(3:3,3:3,3:3) :: A + tname='ACR3206' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + C(i,j,ii) = C(i+3,j,ii)+C(i,j+3,ii)+C(i,j,ii+3)+ + * C(i-3,j,ii)+C(i,j-3,ii)+C(i,j,ii-3)+ + * C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i-2,j,ii)+C(i,j-2,ii)+C(i,j,ii-2)+ + * C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+ + * C(i-1,j,ii)+C(i,j-1,ii)+C(i,j,ii-1) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C) + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(3:3,3:3,3:3)), +!dvm$*stage(iloop) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii) = A(i+3,j,ii)+A(i,j+3,ii)+A(i,j,ii+3)+ + * A(i-3,j,ii)+A(i,j-3,ii)+A(i,j,ii-3)+ + * A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i-2,j,ii)+A(i,j-2,ii)+A(i,j,ii-2)+ + * A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+ + * A(i-1,j,ii)+A(i,j-1,ii)+A(i,j,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + + +C --------------------------------------------ACR3207 + subroutine acr3207 + integer, parameter :: N = 16,M=16,K=16, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(*,BLOCK,BLOCK) +!dvm$ shadow(3:3,0:3,3:0) :: A + tname='ACR3207' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + C(i,j,ii) = C(i+3,j,ii)+C(i,j+3,ii)+C(i-3,j,ii)+ + * C(i,j,ii-3)+C(i+2,j,ii)+C(i,j+2,ii)+ + * C(i-2,j,ii)+C(i,j,ii-2)+ + * C(i+1,j,ii)+C(i,j+1,ii)+C(i+1,j,ii)+ + * C(i,j+1,ii)+C(i-1,j,ii)+C(i,j,ii-1) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(3:3,0:3,3:0)), +!dvm$*stage(iloop) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii) = A(i+3,j,ii)+A(i,j+3,ii)+A(i-3,j,ii)+ + * A(i,j,ii-3)+A(i+2,j,ii)+A(i,j+2,ii)+ + * a(i-2,j,ii)+A(i,j,ii-2)+ + * A(i+1,j,ii)+A(i,j+1,ii)+A(i+1,j,ii)+ + * A(i,j+1,ii)+A(i-1,j,ii)+A(i,j,ii-1) + enddo + enddo + enddo +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + + +C --------------------------------------------ACR3208 + subroutine acr3208 + integer, parameter :: N = 16,M=16,K=16, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ shadow(0:3,0:3,0:3) :: A + tname='ACR3208' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=1,N-3 + do j=1,M-3 + do ii=1,K-3 + C(i,j,ii) = C(i+3,j,ii)+C(i,j+3,ii)+C(i,j,ii+3)+ + * C(i+2,j,ii)+C(i,j+2,ii)+C(i,j,ii+2)+ + * C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(0:3,0:3,0:3)), +!dvm$*stage(iloop) + do ii=1,K-3 + do j=1,M-3 + do i=1,N-3 + A(i,j,ii) = A(i+3,j,ii)+A(i,j+3,ii)+A(i,j,ii+3)+ + * A(i+2,j,ii)+A(i,j+2,ii)+A(i,j,ii+2)+ + * A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C --------------------------------------------ACR3209 + subroutine acr3209 + integer, parameter :: N = 58,M=58,K=58, NL=1000 + integer,allocatable :: A(:,:,:), C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname +!dvm$ distribute A(BLOCK,BLOCK,*) +!dvm$ shadow(11:11,11:11,11:11) :: A + tname='ACR3209' + allocate (A(N,M,K), C(N,M,K)) + + do iloop=0,2 + NNL=NL + call serial3(C,N,M,K,NNL) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + C(i,j,ii) = C(i+11,j,ii)+C(i,j+11,ii)+C(i,j,ii+11)+ + * C(i-11,j,ii)+C(i,j-11,ii)+C(i,j,ii-11)+ + * C(i+10,j,ii)+C(i,j+10,ii)+C(i,j,ii+10)+ + * C(i-10,j,ii)+C(i,j-10,ii)+C(i,j,ii-10)+ + * C(i-9,j,ii) +C(i,j-9,ii) +C(i,j,ii-9)+ + * C(i+9,j,ii) +C(i,j+9,ii) +C(i,j,ii+9) + enddo + enddo + enddo + + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual (nloopi,nloopj,nloopii,C) +!dvm$ region inout (C),out (A) + + +!dvm$ parallel (ii,j,i) on A(i,j,ii) + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*across(A(11:11,11:11,11:11)), +!dvm$*stage(iloop) + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + A(i,j,ii) = A(i+11,j,ii)+A(i,j+11,ii)+A(i,j,ii+11)+ + * A(i-11,j,ii)+A(i,j-11,ii)+A(i,j,ii-11)+ + * A(i+10,j,ii)+A(i,j+10,ii)+A(i,j,ii+10)+ + * A(i-10,j,ii)+A(i,j-10,ii)+A(i,j,ii-10)+ + * A(i-9,j,ii)+A(i,j-9,ii)+A(i,j,ii-9)+ + * A(i+9,j,ii)+A(i,j+9,ii)+A(i,j,ii+9) + enddo + enddo + enddo + +!dvm$ parallel (ii,j,i) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + enddo + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, C) + end + +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr41.fdv new file mode 100644 index 0000000..938a38a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr41.fdv @@ -0,0 +1,887 @@ + program ACR41 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR41========================' +C -------------------------------------------------- + call acr4101 +C -------------------------------------------------- + call acr4102 +C -------------------------------------------------- + call acr4103 +C ------------------------------------------------- + call acr4104 +C ------------------------------------------------- + call acr4105 +C ------------------------------------------------- + call acr4106 +C -------------------------------------------------- + call acr4107 +C -------------------------------------------------- + call acr4108 +C---------------------------------------------------- +c call acr4109 +C---------------------------------------------------- + +C +C + print *,'=== END OF ACR41 ========================= ' + end +C ---------------------------------------------ACR4101 + subroutine ACR4101 + integer, parameter :: N = 16,M=8,K=8,L=8, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4101' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + C(i,j,ii,jj)= + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in(C,B),out (A) + + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(1:1,1:1,1:1,1:1)) + do jj=2,L-1 + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + A(i,j,ii,jj)= + * A(i+1,j,ii,jj)+A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj)+A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=2,L-1 + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B, C) + end +C ---------------------------------------------ACR4102 + subroutine ACR4102 + integer, parameter :: N = 16,M=10,K=10,L=10, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4102' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+2)+ + * C(i-1,j,ii,jj)+ C(i,j-2,ii,jj)+ + * C(i,j,ii-2,jj)+ C(i,j,ii,jj-1)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii,jj+1)+ C(i,j-1,ii,jj)+ + * C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region + + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj),across(A(1:2,2:2,2:1,1:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+2)+ + * A(i-1,j,ii,jj)+ A(i,j-2,ii,jj)+ + * A(i,j,ii-2,jj)+ A(i,j,ii,jj-1)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii,jj+1)+ A(i,j-1,ii,jj)+ + * A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -----------------------------------------ACR4103 + subroutine ACR4103 + integer, parameter :: N = 16,M=10,K=10,L=10, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4103' + allocate (B(N,M,K,L), C(N,M,K,L), A(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii-2,jj)+ + * C(i,j,ii,jj-2)+ C(i-1,j,ii,jj)+ + * C(i,j-1,ii,jj)+ C(i,j,ii-1,jj)+ + * C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:0,2:2,2:0,2:0)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii-2,jj)+ + * A(i,j,ii,jj-2)+ A(i-1,j,ii,jj)+ + * A(i,j-1,ii,jj)+ A(i,j,ii-1,jj)+ + * A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A ,B, C) + end +C ------------------------------------------ACR4104 + subroutine ACR4104 + integer, parameter :: N = 16,M=10,K=10,L=10, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4104' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = C(i+2,j,ii,jj)+ + * C(i,j,ii,jj+2)+ C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii-2,jj)+ + * C(i+1,j,ii,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:2,2:0,2:0,0:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = A(i+2,j,ii,jj)+ + * A(i,j,ii,jj+2)+ A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii-2,jj)+ + * A(i+1,j,ii,jj)+ A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+ A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate ( A, B, C) + end +C ------------------------------------------ACR4105 + subroutine ACR4105 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:0,0:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4105' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj)= + * C(i+2,j,ii,jj)+ C(i,j,ii+2,jj)+ + * C(i,j,ii,jj+2)+ C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j,ii+1,jj)+ + * C(i,j,ii,jj+1)+ C(i-1,j,ii,jj)+ + * C(i,j-1,ii,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:2,2:0,0:2,2:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj)= + * A(i+2,j,ii,jj)+ A(i,j,ii+2,jj)+ + * A(i,j,ii,jj+2)+ A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j,ii+1,jj)+ + * A(i,j,ii,jj+1)+ A(i-1,j,ii,jj)+ + * A(i,j-1,ii,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C --------------------------------------------ACR4106 + subroutine ACR4106 + integer, parameter :: N = 32,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3,3:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4106' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj+3)+ + * C(i-3,j,ii,jj)+ C(i,j-3,ii,jj)+ + * C(i,j,ii-3,jj)+ C(i,j,ii,jj-3)+ + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+2,jj)+ C(i,j,ii,jj+2)+ + * C(i-2,j,ii,jj)+ C(i,j-2,ii,jj)+ + * C(i,j,ii-2,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(3:3,3:3,3:3,3:3)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj+3)+ + * A(i-3,j,ii,jj)+ A(i,j-3,ii,jj)+ + * A(i,j,ii-3,jj)+ A(i,j,ii,jj-3)+ + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+2,jj)+ A(i,j,ii,jj+2)+ + * A(i-2,j,ii,jj)+ A(i,j-2,ii,jj)+ + * A(i,j,ii-2,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+ A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4107 + subroutine ACR4107 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,0:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4107' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj+3)+ + * C(i,j-3,ii,jj)+ C(i+2,j,ii,jj)+ + * C(i,j+2,ii,jj)+ C(i,j,ii+2,jj)+ + * C(i,j,ii,jj+2)+ C(i,j-2,ii,jj)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i,j-1,ii,jj) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region + + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(0:3,3:3,0:3,0:3)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj+3)+ + * A(i,j-3,ii,jj)+ A(i+2,j,ii,jj)+ + * A(i,j+2,ii,jj)+ A(i,j,ii+2,jj)+ + * A(i,j,ii,jj+2)+ A(i,j-2,ii,jj)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+1)+ + * A(i,j-1,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4108 + subroutine ACR4108 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,3:0) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4108' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj-3)+ + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+2,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(0:3,0:3,0:3,3:0)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj-3)+ + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+2,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4109 + subroutine ACR4109 + integer, parameter :: N = 48,M=48,K=48,L=48, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11,11:11) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4109' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + C(i,j,ii,jj) = + * C(i+11,j,ii,jj)+ C(i,j+11,ii,jj)+ + * C(i,j,ii+11,jj)+ C(i,j,ii,jj+11)+ + * C(i-11,j,ii,jj)+ C(i,j-11,ii,jj)+ + * C(i,j,ii-11,jj)+ C(i,j,ii,jj-11) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(11:11,11:11,11:11,11:11)) + do jj=12,L-11 + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + A(i,j,ii,jj) = + * A(i+11,j,ii,jj)+ A(i,j+11,ii,jj)+ + * A(i,j,ii+11,jj)+ A(i,j,ii,jj+11)+ + * A(i-11,j,ii,jj)+ A(i,j-11,ii,jj)+ + * A(i,j,ii-11,jj)+ A(i,j,ii,jj-11) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=12,L-11 + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate ( A, B, C) + end +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr42.fdv new file mode 100644 index 0000000..81acd7a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr42.fdv @@ -0,0 +1,881 @@ + program ACR42 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR42========================' +C -------------------------------------------------- + call acr4201 +C -------------------------------------------------- + call acr4202 +C -------------------------------------------------- + call acr4203 +C ------------------------------------------------- + call acr4204 +C ------------------------------------------------- + call acr4205 +C ------------------------------------------------- + call acr4206 +C -------------------------------------------------- + call acr4207 +C -------------------------------------------------- + call acr4208 +C---------------------------------------------------- + call acr4209 +C---------------------------------------------------- + +C +C + print *,'=== END OF ACR42 ========================= ' + end +C ---------------------------------------------ACR4201 + subroutine ACR4201 + integer, parameter :: N = 16,M=8,K=8,L=8, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4201' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + C(i,j,ii,jj)= + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*across(A(1:1,1:1,1:1,1:1)) + do jj=2,L-1 + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + A(i,j,ii,jj)= + * A(i+1,j,ii,jj)+A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj)+A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=2,L-1 + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ---------------------------------------------ACR4202 + subroutine ACR4202 + integer, parameter :: N = 16,M=8,K=8,L=8, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4202' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+2)+ + * C(i-1,j,ii,jj)+ C(i,j-2,ii,jj)+ + * C(i,j,ii-2,jj)+ C(i,j,ii,jj-1)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii,jj+1)+ C(i,j-1,ii,jj)+ + * C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),across(A(1:2,2:2,2:1,1:2)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + A(i,j,ii,jj) = + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+2)+ + * A(i-1,j,ii,jj)+ A(i,j-2,ii,jj)+ + * A(i,j,ii-2,jj)+ A(i,j,ii,jj-1)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii,jj+1)+ A(i,j-1,ii,jj)+ + * A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -----------------------------------------ACR4203 + subroutine ACR4203 + integer, parameter :: N = 16,M=8,K=8,L=8, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4203' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii-2,jj)+ + * C(i,j,ii,jj-2)+ C(i-1,j,ii,jj)+ + * C(i,j-1,ii,jj)+ C(i,j,ii-1,jj)+ + * C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out( A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:0,2:2,2:0,2:0)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii-2,jj)+ + * A(i,j,ii,jj-2)+ A(i-1,j,ii,jj)+ + * A(i,j-1,ii,jj)+ A(i,j,ii-1,jj)+ + * A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ------------------------------------------ACR4204 + subroutine ACR4204 + integer, parameter :: N = 16,M=8,K=8,L=8, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4204' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = C(i+2,j,ii,jj)+ + * C(i,j,ii,jj+2)+ C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii-2,jj)+ + * C(i+1,j,ii,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:2,2:0,2:0,0:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = A(i+2,j,ii,jj)+ + * A(i,j,ii,jj+2)+ A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii-2,jj)+ + * A(i+1,j,ii,jj)+ A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+ A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ------------------------------------------ACR4205 + subroutine ACR4205 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(2:2,2:0,0:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4205' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj)= + * C(i+2,j,ii,jj)+ C(i,j,ii+2,jj)+ + * C(i,j,ii,jj+2)+ C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j,ii+1,jj)+ + * C(i,j,ii,jj+1)+ C(i-1,j,ii,jj)+ + * C(i,j-1,ii,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:2,2:0,0:2,2:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj)= + * A(i+2,j,ii,jj)+ A(i,j,ii+2,jj)+ + * A(i,j,ii,jj+2)+ A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j,ii+1,jj)+ + * A(i,j,ii,jj+1)+ A(i-1,j,ii,jj)+ + * A(i,j-1,ii,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C --------------------------------------------ACR4206 + subroutine ACR4206 + integer, parameter :: N = 32,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(3:3,3:3,3:3,3:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4206' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj+3)+ + * C(i-3,j,ii,jj)+ C(i,j-3,ii,jj)+ + * C(i,j,ii-3,jj)+ C(i,j,ii,jj-3)+ + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+2,jj)+ C(i,j,ii,jj+2)+ + * C(i-2,j,ii,jj)+ C(i,j-2,ii,jj)+ + * C(i,j,ii-2,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(3:3,3:3,3:3,3:3)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj+3)+ + * A(i-3,j,ii,jj)+ A(i,j-3,ii,jj)+ + * A(i,j,ii-3,jj)+ A(i,j,ii,jj-3)+ + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+2,jj)+ A(i,j,ii,jj+2)+ + * A(i-2,j,ii,jj)+ A(i,j-2,ii,jj)+ + * A(i,j,ii-2,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+ A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4207 + subroutine ACR4207 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(0:3,3:3,0:3,0:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4207' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj+3)+ + * C(i,j-3,ii,jj)+ C(i+2,j,ii,jj)+ + * C(i,j+2,ii,jj)+ C(i,j,ii+2,jj)+ + * C(i,j,ii,jj+2)+ C(i,j-2,ii,jj)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i,j-1,ii,jj) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(0:3,3:3,0:3,0:3)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj+3)+ + * A(i,j-3,ii,jj)+ A(i+2,j,ii,jj)+ + * A(i,j+2,ii,jj)+ A(i,j,ii+2,jj)+ + * A(i,j,ii,jj+2)+ A(i,j-2,ii,jj)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+1)+ + * A(i,j-1,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4208 + subroutine ACR4208 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(0:3,3:3,0:3,3:0) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4208' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj-3)+ + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+2,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(0:3,0:3,0:3,3:0)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj-3)+ + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+2,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4209 + subroutine ACR4209 + integer, parameter :: N = 48,M=48,K=48,L=48, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(11:11,11:11,11:11,11:11) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4209' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + C(i,j,ii,jj) = + * C(i+11,j,ii,jj)+ C(i,j+11,ii,jj)+ + * C(i,j,ii+11,jj)+ C(i,j,ii,jj+11)+ + * C(i-11,j,ii,jj)+ C(i,j-11,ii,jj)+ + * C(i,j,ii-11,jj)+ C(i,j,ii,jj-11) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(11:11,11:11,11:11,11:11)) + do jj=12,L-11 + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + A(i,j,ii,jj) = + * A(i+11,j,ii,jj)+ A(i,j+11,ii,jj)+ + * A(i,j,ii+11,jj)+ A(i,j,ii,jj+11)+ + * A(i-11,j,ii,jj)+ A(i,j-11,ii,jj)+ + * A(i,j,ii-11,jj)+ A(i,j,ii,jj-11) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=12,L-11 + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr43.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr43.fdv new file mode 100644 index 0000000..fbec076 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/acr43.fdv @@ -0,0 +1,883 @@ + program ACR43 + +c TESTING OF THE ACROSS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT +c FLOW-DEP-LENGTH ON BOTH SIDES + + print *,'===START OF ACR43========================' +C -------------------------------------------------- + call acr4301 +C -------------------------------------------------- + call acr4302 +C -------------------------------------------------- + call acr4303 +C ------------------------------------------------- + call acr4304 +C ------------------------------------------------- + call acr4305 +C ------------------------------------------------- + call acr4306 +C -------------------------------------------------- + call acr4307 +C -------------------------------------------------- + call acr4308 +C---------------------------------------------------- + call acr4309 +C---------------------------------------------------- + +C +C + print *,'=== END OF ACR43 ========================= ' + end +C ---------------------------------------------ACR4301 + subroutine ACR4301 + integer, parameter :: N = 16,M=8,K=8,L=8, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4301' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + C(i,j,ii,jj)= + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*across(A(1:1,1:1,1:1,1:1)) + do jj=2,L-1 + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + A(i,j,ii,jj)= + * A(i+1,j,ii,jj)+A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj)+A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=2,L-1 + do ii=2,K-1 + do j=2,M-1 + do i=2,N-1 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ---------------------------------------------ACR4302 + subroutine ACR4302 + integer, parameter :: N = 16,M=10,K=10,L=10, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4302' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+2)+ + * C(i-1,j,ii,jj)+ C(i,j-2,ii,jj)+ + * C(i,j,ii-2,jj)+ C(i,j,ii,jj-1)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii,jj+1)+ C(i,j-1,ii,jj)+ + * C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in( C),out( A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj),across(A(1:2,2:2,2:1,1:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+2)+ + * A(i-1,j,ii,jj)+ A(i,j-2,ii,jj)+ + * A(i,j,ii-2,jj)+ A(i,j,ii,jj-1)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii,jj+1)+ A(i,j-1,ii,jj)+ + * A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -----------------------------------------ACR4303 + subroutine ACR4303 + integer, parameter :: N = 16,M=10,K=10,L=10, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4303' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii-2,jj)+ + * C(i,j,ii,jj-2)+ C(i-1,j,ii,jj)+ + * C(i,j-1,ii,jj)+ C(i,j,ii-1,jj)+ + * C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:0,2:2,2:0,2:0)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii-2,jj)+ + * A(i,j,ii,jj-2)+ A(i-1,j,ii,jj)+ + * A(i,j-1,ii,jj)+ A(i,j,ii-1,jj)+ + * A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ------------------------------------------ACR4304 + subroutine ACR4304 + integer, parameter :: N = 16,M=10,K=10,L=10, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4304' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj) = C(i+2,j,ii,jj)+ + * C(i,j,ii,jj+2)+ C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii-2,jj)+ + * C(i+1,j,ii,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:2,2:0,2:0,0:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj) = A(i+2,j,ii,jj)+ + * A(i,j,ii,jj+2)+ A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii-2,jj)+ + * A(i+1,j,ii,jj)+ A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+ A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ------------------------------------------ACR4305 + subroutine ACR4305 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:0,0:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4305' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + C(i,j,ii,jj)= + * C(i+2,j,ii,jj)+ C(i,j,ii+2,jj)+ + * C(i,j,ii,jj+2)+ C(i-2,j,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j,ii+1,jj)+ + * C(i,j,ii,jj+1)+ C(i-1,j,ii,jj)+ + * C(i,j-1,ii,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(2:2,2:0,0:2,2:2)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + A(i,j,ii,jj)= + * A(i+2,j,ii,jj)+ A(i,j,ii+2,jj)+ + * A(i,j,ii,jj+2)+ A(i-2,j,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j,ii+1,jj)+ + * A(i,j,ii,jj+1)+ A(i-1,j,ii,jj)+ + * A(i,j-1,ii,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=3,L-2 + do ii=3,K-2 + do j=3,M-2 + do i=3,N-2 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C --------------------------------------------ACR4306 + subroutine ACR4306 + integer, parameter :: N = 32,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3,3:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4306' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj+3)+ + * C(i-3,j,ii,jj)+ C(i,j-3,ii,jj)+ + * C(i,j,ii-3,jj)+ C(i,j,ii,jj-3)+ + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+2,jj)+ C(i,j,ii,jj+2)+ + * C(i-2,j,ii,jj)+ C(i,j-2,ii,jj)+ + * C(i,j,ii-2,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i-1,j,ii,jj)+ C(i,j-1,ii,jj)+ + * C(i,j,ii-1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(3:3,3:3,3:3,3:3)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj+3)+ + * A(i-3,j,ii,jj)+ A(i,j-3,ii,jj)+ + * A(i,j,ii-3,jj)+ A(i,j,ii,jj-3)+ + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+2,jj)+ A(i,j,ii,jj+2)+ + * A(i-2,j,ii,jj)+ A(i,j-2,ii,jj)+ + * A(i,j,ii-2,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+1)+ + * A(i-1,j,ii,jj)+ A(i,j-1,ii,jj)+ + * A(i,j,ii-1,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4307 + subroutine ACR4307 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,0:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4307' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj+3)+ + * C(i,j-3,ii,jj)+ C(i+2,j,ii,jj)+ + * C(i,j+2,ii,jj)+ C(i,j,ii+2,jj)+ + * C(i,j,ii,jj+2)+ C(i,j-2,ii,jj)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj+1)+ + * C(i,j-1,ii,jj) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C),out (A) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(0:3,3:3,0:3,0:3)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj+3)+ + * A(i,j-3,ii,jj)+ A(i+2,j,ii,jj)+ + * A(i,j+2,ii,jj)+ A(i,j,ii+2,jj)+ + * A(i,j,ii,jj+2)+ A(i,j-2,ii,jj)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj+1)+ + * A(i,j-1,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4308 + subroutine ACR4308 + integer, parameter :: N = 16,M=16,K=16,L=16, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,3:0) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4308' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + C(i,j,ii,jj) = + * C(i+3,j,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j,ii+3,jj)+ C(i,j,ii,jj-3)+ + * C(i+2,j,ii,jj)+ C(i,j+2,ii,jj)+ + * C(i,j,ii+2,jj)+ C(i,j,ii,jj-2)+ + * C(i+1,j,ii,jj)+ C(i,j+1,ii,jj)+ + * C(i,j,ii+1,jj)+ C(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(0:3,0:3,0:3,3:0)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + A(i,j,ii,jj) = + * A(i+3,j,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j,ii+3,jj)+ A(i,j,ii,jj-3)+ + * A(i+2,j,ii,jj)+ A(i,j+2,ii,jj)+ + * A(i,j,ii+2,jj)+ A(i,j,ii,jj-2)+ + * A(i+1,j,ii,jj)+ A(i,j+1,ii,jj)+ + * A(i,j,ii+1,jj)+ A(i,j,ii,jj-1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=4,L-3 + do ii=4,K-3 + do j=4,M-3 + do i=4,N-3 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C -------------------------------------------ACR4309 + subroutine ACR4309 + integer, parameter :: N = 58,M=58,K=58,L=58, NL=1000 + integer, allocatable :: A(:,:,:,:), B(:,:,:,:), C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11,11:11) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + tname='ACR4309' + allocate (B(N,M,K,L), A(N,M,K,L), C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + C(i,j,ii,jj) = + * C(i+11,j,ii,jj)+ C(i,j+11,ii,jj)+ + * C(i,j,ii+11,jj)+ C(i,j,ii,jj+11)+ + * C(i-11,j,ii,jj)+ C(i,j-11,ii,jj)+ + * C(i,j,ii-11,jj)+ C(i,j,ii,jj-11) + enddo + enddo + enddo + enddo + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual (nloopi,nloopj,nloopii,nloopjj,C) +!dvm$ region in (C) + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj) + do jj=1,L + do ii=1,K + do j=1,M + do i=1,N + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*across(A(11:11,11:11,11:11,11:11)) + do jj=12,L-11 + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + A(i,j,ii,jj) = + * A(i+11,j,ii,jj)+ A(i,j+11,ii,jj)+ + * A(i,j,ii+11,jj)+ A(i,j,ii,jj+11)+ + * A(i-11,j,ii,jj)+ A(i,j-11,ii,jj)+ + * A(i,j,ii-11,jj)+ A(i,j,ii,jj-11) + enddo + enddo + enddo + enddo + +!dvm$ parallel (jj,ii,j,i) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do jj=12,L-11 + do ii=12,K-11 + do j=12,M-11 + do i=12,N-11 + if (A(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A, B, C) + end +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/settings b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/settings new file mode 100644 index 0000000..fd6919c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ACROSS/settings @@ -0,0 +1 @@ +ALLOW_MULTIDEV=0 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align11.fdv new file mode 100644 index 0000000..d33c1f1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align11.fdv @@ -0,0 +1,441 @@ + program ALIGN11 + +c TESTING align CLAUSE . + + print *,'===START OF align11========================' +C -------------------------------------------------- +c 111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] normal + call align111 +C -------------------------------------------------- +c 1111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] small array + call align1111 +C -------------------------------------------------- +c 1112 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[2*i+1] small array + call align1112 +C -------------------------------------------------- +c 112 ALIGN arrB[i] WITH arrA[i+4] shift along i + call align112 +C -------------------------------------------------- +c 113 ALIGN arrB[i] WITH arrA[-i+9] reverse on i +c call align113 +C -------------------------------------------------- +c 114 ALIGN arrB[i] WITH arrA[2*i+8] stretching along i + call align114 +C -------------------------------------------------- +c 115 ALIGN arrB[*] WITH arrA[*] + call align115 +C -------------------------------------------------- +C +C + print *,'=== END OF align11 ========================= ' + end + +C ----------------------------------------------------align111 +c 111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] normal + subroutine align111 + integer, parameter :: AN1=8,BN1=8,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=0 + character*9 tname + integer,allocatable :: A1(:),B1(:) + integer erri,i +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align111' + allocate (A1(AN1),B1(BN1)) + erri= ER +c call stralign111 + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + end +C ----------------------------------------------------align1111 +c 1111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] small array + subroutine align1111 + integer, parameter :: AN1=5,BN1=2,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=0 + character*9 tname + integer,allocatable :: A1(:),B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align1111' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align1112 +c 1112 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[2*i+1] small array + subroutine align1112 + integer, parameter :: AN1=5,BN1=2,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=2,k2i=0,li=1 + character*9 tname + integer,allocatable :: A1(:),B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align1112' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align112 +c 112 ALIGN arrB[i] WITH arrA[i+4] shift along i + subroutine align112 + integer, parameter :: AN1=8,BN1=4,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=4 + character*9 tname + integer,allocatable :: A1(:),B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align112' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align113 +c 113 ALIGN arrB[i] WITH arrA[-i+9] reverse on i + subroutine align113 + integer, parameter :: AN1=8,BN1=8,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=-1,k2i=0,li=9 + character*9 tname + integer,allocatable :: A1(:),B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align113' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align114 +c 114 ALIGN arrB[i] WITH arrA[2*i+8] stretching along i + subroutine align114 + integer, parameter :: AN1=24,BN1=8,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=2,k2i=0,li=8 + character*9 tname + integer,allocatable :: A1(:),B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + + tname='align114' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1),inout(erri) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align115 +c 115 ALIGN arrB[*] WITH arrA[*] + subroutine align115 + integer, parameter :: AN1=24,BN1=8,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[*] WITH arrA[*] + integer, parameter :: k1i=0,k2i=0,li=0 + character*9 tname + integer,allocatable :: A1(:),B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(*) WITH A1(*) + + tname='align115' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ),private(j) + do i=1,AN1 + do j=1,BN1 + if (B1(j) .eq.(j)) then + else + erri = min(erri,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align12.fdv new file mode 100644 index 0000000..cd9610b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align12.fdv @@ -0,0 +1,233 @@ + program ALIGN12 + +c TESTING align CLAUSE . + + print *,'===START OF align12========================' +C -------------------------------------------------- +c 121 arrA1[BLOCK] arrB2[][] ALIGN arrB[][i] WITH arrA[i] matrix compression: +c column on vector element + call align121 +C ------------------------------------------------- +c 122 ALIGN arrB[i][ ] WITH arrA[2*i+1] matrix compression: +c line on vector element + call align122 +C ------------------------------------------------- +c 123 ALIGN arrB[][ ] WITH arrA[] + call align123 +C ------------------------------------------------- +C +C + print *,'=== END OF align12 ========================= ' + end + +C ----------------------------------------------------align121 +c 121 arrA1[BLOCK] arrB2[][] ALIGN arrB[][i] WITH arrA[i] matrix compression: +c column on vector element + subroutine align121 + integer, parameter :: AN1=8,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB(*,i) WITH arrA[k1i*i+li] + integer, parameter :: k1i=1,k2i=0,li=0 + character*9 tname + integer, allocatable :: A1(:),B2(:,:) + integer s,cs,erri,i,j,ib,jb +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B2(*,i) WITH A1(k1i*i+li) + + tname='align121' + allocate (A1(AN1),B2(BN1,BN2)) + erri= ER +c call stralign121 + NNL=NL + s=0 + +!dvm$ actual(erri, s) +!dvm$ region local(A1,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i) on A1(i), private(ib,jb,j) + do i=1,AN1 + A1(i) = i + do j=1,BN1 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN2) )then + ib = j + jb = (i-li)/k1i + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + s = s + B2(i,j) + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + cs = cs + i*NL+j + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri,s,cs + endif + deallocate (B2,A1) + + end +C ----------------------------------------------------align122 +c 122 ALIGN arrB[i][ ] WITH arrA[2*i+1] matrix compression: +c line on vector element + subroutine align122 + integer, parameter :: AN1=16,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB(i,*) WITH arrA[k1i*i+li] + integer, parameter :: k1i=2,k2i=0,li=1 + character*9 tname + integer, allocatable :: A1(:),B2(:,:) + integer s,cs,erri,i,j,ib,jb +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B2(i,*) WITH A1(k1i*i+li) + + + tname='align122' + allocate (A1(AN1),B2(BN1,BN2)) + erri= ER +c call stralign122 + NNL=NL + s=0 + +!dvm$ actual(erri, s) +!dvm$ region local(A1,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i) on A1(i), private(ib,jb,j) + do i=1,AN1 + A1(i) = i + do j=1,BN2 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) )then + jb = j + ib = (i-li)/k1i + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + s = s + B2(i,j) + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + cs = cs + i*NL+j + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri,s,cs + endif + deallocate (B2,A1) + end +C ----------------------------------------------------align123 +c 123 ALIGN arrB[][ ] WITH arrA[] + subroutine align123 + integer, parameter :: AN1=16,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB(*,*) WITH arrA[*] + integer, parameter :: k1i=0,k2i=0,li=0 + character*9 tname + integer, allocatable :: A1(:),B2(:,:) + integer s,erri,i,j,ib,jb +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B2(*,*) WITH A1(*) + + + tname='align123' + allocate (A1(AN1),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri )), private(ib,jb) + do i=1,AN1 + do ib=1,BN1 + do jb=1,BN2 + if (B2(ib,jb) .eq.(ib*NL+jb)) then + else + erri = min(erri,ib*NL/10+jb) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + + if ((erri .eq.ER) + * ) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri + endif + deallocate (B2,A1) + + end +C ------------------------------------------------------------ + + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align21.fdv new file mode 100644 index 0000000..095d59e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align21.fdv @@ -0,0 +1,299 @@ + program ALIGN21 + +c TESTING align CLAUSE . +c arrA2[BLOCK][ BLOCK] arrB1[] + print *,'===START OF align21========================' +C -------------------------------------------------- +c 211 ALIGN arrB[i] WITH arrA[1][i] vector arrB on section +* (the first line of arrA) + call align211 +C ------------------------------------------------- +c 212 ALIGN arrB[i] WITH arrA[2*i+2][2] vector arrB on section +* (the second column of arrA) with stretching and shift + call align212 +C ------------------------------------------------- +c 213 ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA + call align213 +C ------------------------------------------------- +c 214 ALIGN arrB[i] WITH arrA[2*i+2][ ] vector arrB on replication on +* every column of arrA with stretching and shift + call align214 +C ------------------------------------------------- +C +C + print *,'=== END OF align21 ========================= ' + end + +C ----------------------------------------------------align211 +c 211 arrA2[BLOCK][ BLOCK] arrB1[] ALIGN arrB[i] WITH arrA[1][i]vector arrB on section +* (the first line of arrA) + subroutine align211 + integer, parameter :: AN1=8,AN2=8,BN1=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(1,i) + integer, parameter :: k1i=0,k2i=0,li=1,k1j=1,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B1(:) + integer erri,i,j,ia,ja,ib,jb +cdvm$ distribute A2(BLOCK,BLOCK) +cdvm$ ALIGN B1(i) WITH A2(1,i) + + + tname='align211' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B1) +*dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +*dvm$ parallel (i,j) on A2(i,j), private (ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ((i .eq. 1) ) then + if ( + * (j .le. BN1) + * ) then + ib = j + B1(ib) = ib + endif + endif + enddo + enddo + +*dvm$ parallel (i) on B1(i),reduction( min( erri ) ), private(ia,ja) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=1 + ja=i + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + end +C ----------------------------------------------------align212 +c 212 ALIGN arrB[i] WITH arrA[2*i+2][2] vector arrB on section +* (the second column of arrA) with stretching and shift + subroutine align212 + integer, parameter :: AN1=14,AN2=3,BN1=6,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(k1i*i+li,lj) + integer, parameter :: k1i=2,k2i=0,li=2,k1j=0,k2j=0,lj=2 + character*9 tname + integer, allocatable :: A2(:,:),B1(:) + integer erri + +cdvm$ distribute A2(BLOCK,BLOCK) +cdvm$ ALIGN B1(i) WITH A2(k1i*i+li,lj) + + tname='align212' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B1) +*dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +*dvm$ parallel (i,j) on A2(i,j), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ((j .eq. lj) .and. + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) + * ) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + enddo + +*dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia,ja) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i*i+li + ja=lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align213 +c 213 ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA + subroutine align213 + integer, parameter :: AN1=8,AN2=8,BN1=6,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[][k1j * i + lj] + integer, parameter :: k1i=0,k2i=0,li=0,k1j=1,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B1(:) + integer s,cs,erri,i,j,ia,ja,ib,jb + +cdvm$ distribute A2(BLOCK,BLOCK) +cdvm$ ALIGN B1(i) WITH A2(*,k1j * i + lj) + + + tname='align213' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B1) +*dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +*dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ( + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((j-lj)/k1j) .le. BN1) )then + ib = (j-lj)/k1j + if (B1(ib) .eq.(ib)) then + else + erri = min(erri,ib) + endif + endif + enddo + enddo + +*dvm$ parallel (i) on B1(i), reduction( min( erri ),sum(s) ) + do i=1,BN1 + s = s + B1(i) + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = ((1 + BN1)* BN1/ 2) +c write (*,*) erri,s,cs + + if ((erri .eq.ER) .and. + * (s .eq.cs )) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align214 +c 214 ALIGN arrB[i] WITH arrA[2*i+2][ ] vector arrB on replication on +* every column of arrA with stretching and shift + subroutine align214 + integer, parameter :: AN1=28,AN2=8,BN1=5,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(k1i*i+li,*) + integer, parameter :: k1i=2,k2i=0,li=2,k1j=0,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B1(:) + integer s,erri,i,j,ia,ja,ib,jb + +cdvm$ distribute A2(BLOCK,BLOCK) +cdvm$ ALIGN B1(i) WITH A2(k1i*i+li,*) + + + tname='align214' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B1) +*dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +*dvm$ parallel (i,j) on A2(i,j), reduction( min( erri )), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) )then + ib = (i-li)/k1i + if (B1(ib) .eq.(ib)) then + else + erri = min(erri,ib) + endif + endif + enddo + enddo + +*dvm$ parallel (i) on B1(i), reduction( min( erri ),sum(s) ) + do i=1,BN1 + s = s + B1(i) + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + + if ((erri .eq.ER) .and. + * (s .eq. ((1 + BN1)* BN1/ 2))) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri,s + endif + deallocate (B1,A2) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align22.fdv new file mode 100644 index 0000000..a3309c3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align22.fdv @@ -0,0 +1,598 @@ + program ALIGN22 + +c TESTING align CLAUSE . + + print *,'===START OF align22========================' +C -------------------------------------------------- +c 221 arrA2[BLOCK][ BLOCK] arrB2[][] ALIGN arrB[i][j] WITH arrA[i][j] normal + call align221 +C ------------------------------------------------- +c 222 ALIGN arrB[i][j] WITH arrA[i][2*j] stretching along j + call align222 +C ------------------------------------------------- +c 223 ALIGN arrB[i][j] WITH arrA[i+4][j] shift along i + call align223 +C ------------------------------------------------- +c 224 ALIGN arrB[i][j] WITH arrA[-i+9][j] reverse on i +c call align224 +C ------------------------------------------------- +c 225 ALIGN arrB[i][j] WITH arrA[i+4][j+4]shift along i and j + call align225 + call align2251 +C ------------------------------------------------- +c 226 ALIGN arrB[i][j] WITH arrA[j][i] rotation + call align226 +C ------------------------------------------------- +c 227 ALIGN arrB[i][j] WITH arrA[j+1][i] rotation and shift + call align227 +C ------------------------------------------------- +C +C + print *,'=== END OF align22 ========================= ' + end + +C ----------------------------------------------------align221 +c 221 arrA2[BLOCK][ BLOCK] arrB2[][] ALIGN arrB[i][j] WITH arrA[i][j] normal + subroutine align221 + integer, parameter :: AN1=8,AN2=8,BN1=8,BN2=8,NL=1000,ER=10000 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(i,j) + + + tname='align221' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + B2(i,j) = i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=i + ja=j + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end + + +C ----------------------------------------------------align222 +c 222 ALIGN arrB[i][j] WITH arrA[i][2*j] stretching along j + subroutine align222 + integer, parameter :: AN1=8,AN2=8,BN1=8,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=0,k1j=0,k2j=2,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) + + tname='align222' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end + +C ----------------------------------------------------align223 +c 223 ALIGN arrB[i][j] WITH arrA[i+4][j] shift along i + subroutine align223 + integer, parameter :: AN1=8,AN2=8,BN1=4,BN2=8,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) + + + tname='align223' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end + +C ----------------------------------------------------align224 +c 224 ALIGN arrB[i][j] WITH arrA[-i+9][j] reverse on i + subroutine align224 + integer, parameter :: AN1=8,AN2=8,BN1=8,BN2=8,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=-1,k2i=0,li=9,k1j=0,k2j=1,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) + + + tname='align224' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) + +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end + +C ----------------------------------------------------align225 +c 225 ALIGN arrB[i][j] WITH arrA[i+4][j+4]shift along i and j + subroutine align225 + integer, parameter :: AN1=8,AN2=8,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=4 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) + + + tname='align225' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end +C ----------------------------------------------------align2251 +c 2251 ALIGN arrB[i][j] WITH arrA[i+1][2*j]shift along i and j + subroutine align2251 + integer, parameter :: AN1=3,AN2=4,BN1=2,BN2=2,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=1,k1j=0,k2j=2,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) + + + tname='align2251' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end +C ----------------------------------------------------align226 +c 226 ALIGN arrB[i][j] WITH arrA[j][i] rotation + subroutine align226 + integer, parameter :: AN1=4,AN2=4,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k2i * j + li][k1j * i + lj] + integer, parameter :: k1i=0,k2i=1,li=0,k1j=1,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k2i * j + li,k1j * i + lj) + + + tname='align226' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k2i) * k2i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((i-li)/k2i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((i-li)/k2i) .le. BN2) .and. + * (((j-lj)/k1j) .le. BN1)) then + ib = (j-lj)/k1j + jb = (i-li)/k2i + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=k2i * j + li + ja=k1j * i + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end + + +C ----------------------------------------------------align227 +c 227 ALIGN arrB[i][j] WITH arrA[j+1][i] rotation and shift + subroutine align227 + integer, parameter :: AN1=8,AN2=8,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k2i * j + li][k1j * i + lj] + integer, parameter :: k1i=0,k2i=1,li=1,k1j=1,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B2(:,:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k2i * j + li,k1j * i + lj) + + tname='align227' + allocate (A2(AN1,AN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k2i) * k2i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((i-li)/k2i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((i-li)/k2i) .le. BN2) .and. + * (((j-lj)/k1j) .le. BN1)) then + ib = (j-lj)/k1j + jb = (i-li)/k2i + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri )), private(ia,ja) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + ia=k2i * j + li + ja=k1j * i + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A2) + end + + +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align24.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align24.fdv new file mode 100644 index 0000000..aeb4d43 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align24.fdv @@ -0,0 +1,536 @@ + program ALIGN24 + +c TESTING align CLAUSE . + + print *,'===START OF align24========================' +C -------------------------------------------------- +c call forcat +C -------------------------------------------------- +c 241 arrA2[BLOCK][ BLOCK] arrB4[ ][ ][ ][ ] ALIGN arrB[i][j][][] WITH arrA[i][j] +c matrix compression + call align241 +C ------------------------------------------------- +c 242 ALIGN arrB[ ][ j][][i] WITH arrA[i+4][ 2*j] matrix compression + call align2421 + call align2422 +C ------------------------------------------------- +c 243 ALIGN arrB[ ][ ][i][] WITH arrA[1][i] matrix compression +c and replication !! + call align243 +C ------------------------------------------------- + print *,'=== END OF align24 ========================' + end + +C ----------------------------------------------------align241 +c 241 arrA2[BLOCK][ BLOCK] arrB4[ ][ ][ ][ ] ALIGN arrB[i][j][][] WITH arrA[i][j] +c matrix compression + + subroutine align241 + integer, parameter :: AN1=5,AN2=5,BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][][] WITH arrA[k1i*i+li][k2j*j+lj] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,*,*) WITH A2(k1i * i + li,k2j * j + lj) + + + tname='align241' + allocate (A2(AN1,AN2), B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb,n,m,nb,mb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL/10 + j + do n=1,BN3 + do m=1,BN4 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = n + mb = m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri,s,cs + print *,B4 + endif + deallocate (B4,A2) + end + +C ----------------------------------------------------align242 +c 242 ALIGN arrB[ ][ j][][i] WITH arrA[i+4][ 2*j] matrix compression + + subroutine align242 + + integer, parameter :: AN1=3,AN2=4,BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[][j][][i] WITH arrA[k1i*i+li][k2j*j+lj] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=1 + integer, parameter :: k1j=0,k2j=2,k3j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B4(*,j,*,i) WITH A2(k1i * i + li,k2j * j + lj) + + tname='align242' + allocate (A2(AN1,AN2), B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb,n,m,nb,mb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL/10 + j + do n=1,BN1 + do m=1,BN3 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN4) .and. + * (((j-lj)/k2j) .le. BN2) + * ) then + mb = (i-li)/k1i + jb = (j-lj)/k2j + ib = n + nb = m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A2) + + end + +C ----------------------------------------------------align2421 +c 2421 ALIGN arrB[ ][ i][][j] WITH arrA[j+4][ 2*i] matrix compression + + subroutine align2421 + integer, parameter :: AN1=12,AN2=9,BN1=4,BN2=4,BN3=4,BN4=4 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[][i][][j] WITH arrA[k2i*j+li][k1j*i+lj] + integer, parameter :: k1i=0,k2i=1,k3i=0,li=4 + integer, parameter :: k1j=2,k2j=0,k3j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B4(*,i,*,j) WITH A2(k2i * j + li,k1j * i + lj) + + tname='align2421' + allocate (A2(AN1,AN2), B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb,nb,mb,n,m) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL/10 + j + do n=1,BN1 + do m=1,BN3 + if ( + * ((i-li) .eq.(((i-li)/k2i) * k2i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((i-li)/k2i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((i-li)/k2i) .le. BN4) .and. + * (((j-lj)/k1j) .le. BN2) + * ) then + mb = (i-li)/k2i + jb = (j-lj)/k1j + ib = n + nb = m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A2) + + end + +C ----------------------------------------------------align2422 +c 2422 ALIGN arrB[ ][ i][][j] WITH arrA[j+1][ 2*i] matrix compression + + subroutine align2422 + integer, parameter :: AN1=3,AN2=4,BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[][i][][j] WITH arrA[k2i*j+li][k1j*i+lj] + integer, parameter :: k1i=0,k2i=1,k3i=0,li=1 + integer, parameter :: k1j=2,k2j=0,k3j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B4(*,i,*,j) WITH A2(k2i * j + li,k1j * i + lj) + + + tname='align2422' + allocate (A2(AN1,AN2), B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb,nb,mb,n,m) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL/10 + j + do n=1,BN1 + do m=1,BN3 + if ( + * ((i-li) .eq.(((i-li)/k2i) * k2i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((i-li)/k2i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((i-li)/k2i) .le. BN4) .and. + * (((j-lj)/k1j) .le. BN2) + * ) then + mb = (i-li)/k2i + jb = (j-lj)/k1j + ib = n + nb = m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B4,A2) + + end + +C ----------------------------------------------------align243 +c 243 ALIGN arrB[ ][ ][i][] WITH arrA[1][i] matrix compression +c and replication !! + + subroutine align243 + integer, parameter :: AN1=3,AN2=4,BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: PN=2,NL=10000,ER=100000 + +c parameters for ALIGN arrB[][ ][i][ ] WITH arrA[li][k1j*i+lj] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=1 + integer, parameter :: k1j=1,k2j=0,k3j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B4(*,*,i,*) WITH A2(li,k1j * i + lj) + + + tname='align243' + allocate (A2(AN1,AN2), B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb,nb,mb,n,m,k) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL/10 + j + if (i .eq. (li)) then + do n=1,BN1 + do m=1,BN2 + do k=1,BN4 + if ( + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((j-lj)/k1j) .le. BN3) + * ) then + mb = k + jb = m + ib = n + nb = ((j-lj)/k1j) + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + endif + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B4,A2) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align32.fdv new file mode 100644 index 0000000..7190467 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align32.fdv @@ -0,0 +1,390 @@ + program ALIGN32 + +c TESTING align CLAUSE . + + print *,'===START OF align32========================' +C -------------------------------------------------- +c 321 arrA3[BLOCK][ BLOCK] [ BLOCK] arrB2[][] ALIGN arrB[i][j] WITH arrA[i][j][1] +c matrix on section + call align321 +C ------------------------------------------------- +c 322 ALIGN arrB[i][j] WITH arrA[j][i][5] matrix on section with rotation + call align322 +C ------------------------------------------------- +c 323 ALIGN arrB[i][j] WITH arrA[j][1][2*i] matrix on section with +c rotation and stretching + call align323 +C ------------------------------------------------- +c 324 ALIGN arrB[i][j] WITH arrA[][i][j] matrix replication + call align324 +C ------------------------------------------------- + print *,'=== END OF align32 ========================' + end + +C ----------------------------------------------------align321 +c 321 arrA3[BLOCK][ BLOCK] [ BLOCK] arrB2[][] ALIGN arrB[i][j] WITH arrA[i][j][1] +c matrix on section + + subroutine align321 + integer, parameter :: AN1=5,AN2=5,AN3=5,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj][ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=1 + character*9 tname + integer, allocatable :: A3(:,:,:),B2(:,:) + integer s,cs,erri,i,j,n,ia,ja,na,ib,jb,nb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A3(k1i * i + li,k2j * j + lj,ln) + + tname='align321' + allocate (A3(AN1,AN2,AN3), B2(BN1,BN2)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A3,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + if ( (n .eq. ln ) .and. + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL/10 + jb*NL/100 + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri ),sum(s) ), +!dvm$* private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + s = s + B2(i,j) + if (B2(i,j) .eq.(i*NL/10 + j*NL/100)) then + else + erri = min(erri,i*NL/10 + j*NL/100) + endif + ia=k1i * i + li + ja=k2j * j + lj + na = ln + if (A3(ia,ja,na) .eq.(ia*NL/10 + ja*NL/100 + na)) then + else + erri = min(erri,ia*NL/10 + ja*NL/100 + na) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + cs = cs + i*NL/10 + j*NL/100 + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs + endif + deallocate (B2,A3) + + end + +C ----------------------------------------------------align322 +c 322 ALIGN arrB[i][j] WITH arrA[j][i][5] matrix on section with rotation + + subroutine align322 + integer, parameter :: AN1=5,AN2=5,AN3=5,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k2i * j + li][k1j * i + lj][ln] + integer, parameter :: k1i=0,k2i=1,k3i=0,li=0 + integer, parameter :: k1j=1,k2j=0,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=5 + character*9 tname + integer, allocatable :: A3(:,:,:),B2(:,:) + integer s,cs,erri,i,j,n,ia,ja,na,ib,jb,nb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A3(k2i * j + li,k1j * i + lj,ln) + + + tname='align322' + allocate (A3(AN1,AN2,AN3), B2(BN1,BN2)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A3,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + if ( (n .eq. ln ) .and. + * ((i-li) .eq.(((i-li)/k2i) * k2i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((i-li)/k2i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((i-li)/k2i) .le. BN2) .and. + * (((j-lj)/k1j) .le. BN1) + * ) then + ib = (j-lj)/k1j + jb = (i-li)/k2i + B2(ib,jb) = ib*NL/10 + jb*NL/100 + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri ),sum(s) ), +!dvm$* private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + s = s + B2(i,j) + if (B2(i,j) .eq.(i*NL/10 + j*NL/100)) then + else + erri = min(erri,i*NL/10 + j*NL/100) + endif + ia=k2i * j + li + ja=k1j * i + lj + na = ln + if (A3(ia,ja,na) .eq.(ia*NL/10 + ja*NL/100 + na)) then + else + erri = min(erri,ia*NL/10 + ja*NL/100 + na) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + cs = cs + i*NL/10 + j*NL/100 + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A3) + + end + +C ----------------------------------------------------align323 +c 323 ALIGN arrB[i][j] WITH arrA[j][1][2*i] matrix on section with +c rotation and stretching + subroutine align323 + integer, parameter :: AN1=5,AN2=2,AN3=8,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k2i * j + li][lj][k1n * i + ln] + integer, parameter :: k1i=0,k2i=1,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=0,k3j=0,lj=1 + integer, parameter :: k1n=2,k2n=0,k3n=0,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:),B2(:,:) + integer s,cs,erri,i,j,n,ia,ja,na,ib,jb,nb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A3(k2i * j + li,lj,k1n * i + ln) + + tname='align323' + allocate (A3(AN1,AN2,AN3), B2(BN1,BN2)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A3,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =0 + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + if ( (j .eq. lj ) .and. + * ((i-li) .eq.(((i-li)/k2i) * k2i)) .and. + * ((n-ln) .eq.(((n-ln)/k1n) *k1n)) .and. + * (((i-li)/k2i) .gt. 0) .and. + * (((n-ln)/k1n) .gt. 0) .and. + * (((i-li)/k2i) .le. BN2) .and. + * (((n-ln)/k1n) .le. BN1) + * ) then + ib = (n-ln)/k1n + jb = (i-li)/k2i + B2(ib,jb) = ib*NL/10 + jb*NL/100 + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri ),sum(s) ), +!dvm$* private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + s = s + B2(i,j) + if (B2(i,j) .eq.(i*NL/10 + j*NL/100)) then + else + erri = min(erri,i*NL/10 + j*NL/100) + endif + ia=k2i * j + li + ja=lj + na = k1n * i + ln + if (A3(ia,ja,na) .eq.(ia*NL/10 + ja*NL/100 + na)) then + else + erri = min(erri,ia*NL/10 + ja*NL/100 + na) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + cs = cs + i*NL/10 + j*NL/100 + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs + endif + deallocate (B2,A3) + + end +C ----------------------------------------------------align324 +c 324 ALIGN arrB[i][j] WITH arrA[][i][j] matrix replication + subroutine align324 + integer, parameter :: AN1=4,AN2=6,AN3=6,BN1=4,BN2=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[*,k1j * i + lj,k2n * j + ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=1,k2j=0,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=1,k3n=0,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:),B2(:,:) + integer s,cs,erri,i,j,n,ia,ja,na,ib,jb,nb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A3(*,k1j * i + lj,k2n * j + ln) + + + tname='align324' + allocate (A3(AN1,AN2,AN3), B2(BN1,BN2)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A3,B2) +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =i*NL/10 + j*NL/100 + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ), +!dvm$* private(ib,jb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + if ( + * ((j-lj) .eq.(((j-lj)/k1j) * k1j)) .and. + * ((n-ln) .eq.(((n-ln)/k2n) *k2n)) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((n-ln)/k2n) .gt. 0) .and. + * (((j-lj)/k1j) .le. BN1) .and. + * (((n-ln)/k2n) .le. BN2) + * ) then + jb = (n-ln)/k2n + ib = (j-lj)/k1j + if (B2(ib,jb) .eq.(ib*NL/10 + jb*NL/100)) then + else + erri = ib*NL/10 + jb*NL/100 + endif + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j) on B2(i,j), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + s = s + B2(i,j) + if (B2(i,j) .eq.(i*NL/10 + j*NL/100)) then + else + erri = min(erri,i*NL/10 + j*NL/100) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + cs = cs + i*NL/10 + j*NL/100 + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B2,A3) + + end +C ------------------------------------------------- + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align33.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align33.fdv new file mode 100644 index 0000000..945671d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align33.fdv @@ -0,0 +1,120 @@ + program ALIGN33 + +c TESTING align CLAUSE . + + print *,'===START OF align33========================' +C -------------------------------------------------- +c 331 arrA3[BLOCK][BLOCK] [BLOCK] arrB3[][][] +c ALIGN arrB[i][j][k] WITH arrA[i][ j][k] normal + call align331 +C ------------------------------------------------- +C + print *,'=== END OF align33 ========================= ' + end + +C ----------------------------------------------------align331 +c 331 arrA3[BLOCK][BLOCK] [BLOCK] arrB3[][][] +c ALIGN arrB[i][j][n] WITH arrA[i][ j][n] normal + + subroutine align331 + integer, parameter :: AN1=5,AN2=5,AN3=5,BN1=2,BN2=2,BN3=2 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,k3n*n+ln) + + tname='align331' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + s=0 + m=-1 + +!dvm$ actual(erri,s) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =0 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + B3(ib,jb,nb)=ib*NL/10+jb*NL/100+nb*NL/1000 + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on B3(i,j,n), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000))then + else + erri = min(erri, i*NL/10 + j*NL/100+ n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000 + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B3 + endif + deallocate (B3,A3) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align44.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align44.fdv new file mode 100644 index 0000000..d8f2f75 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/align44.fdv @@ -0,0 +1,926 @@ + program ALIGN44 + +c TESTING align CLAUSE . + + print *,'===START OF align44========================' +C -------------------------------------------------- +c 441 arrA4[BLOCK][BLOCK] [BLOCK] [BLOCK] arrB4[][][][] +c ALIGN arrB[i][j][k][l] WITH arrA[i][ j][k][l] normal + call align441 +C ------------------------------------------------- +c 442 ALIGN arrB[i][j][k][l] WITH arrA[l][i][j][k] rotation + call align442 +C ------------------------------------------------- +c 443 ALIGN arrB[i][j][k][l] WITH arrA[i][2* j][k][3*l] stretching + call align443 +C ------------------------------------------------- +c 444 ALIGN arrB[i][j][k][l] WITH arrA[i+2][ j][k][ l+3] shift + call align444 +C ------------------------------------------------- +c 445 ALIGN arrB[i][j][k][l] WITH arrA[i][ j][-k+8][- l+8] reverse +c call align445 +C ------------------------------------------------- +c 446 ALIGN arrB[i][j][ ][l] WITH arrA[i][ j][2][ l] +c compression and replication + call align446 +C ------------------------------------------------- +c 447 ALIGN arrB[][j][k][i] WITH arrA[i][ j][ ][ k] +c compression and replication + call align447 +C ------------------------------------------------- +c 448 ALIGN arrB[][i][j][] WITH arrA[i][ j][1][3] +c compression and replication + call align448 +C ------------------------------------------------- +C + print *,'=== END OF align44 ========================= ' + end + +C ----------------------------------------------------align441 +c 441 arrA4[BLOCK][BLOCK] [BLOCK] [BLOCK] arrB4[][][][] +c ALIGN arrB[i][j][n][m] WITH arrA[i][ j][n][m] normal + + subroutine align441 + integer, parameter :: AN1=5,AN2=5,AN3=5,AN4=5 + integer, parameter :: BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA[k1i*i+li][k2j*j+lj] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + + + tname='align441' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) *k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + mb = (m-lm)/k4m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------align442 +c 442 ALIGN arrB[i][j][k][l] WITH arrA[l][i][j][k] rotation + + subroutine align442 + integer, parameter :: AN1=4,AN2=4,AN3=4,AN4=4 + integer, parameter :: BN1=4,BN2=4,BN3=4,BN4=4 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA4(k4i*n+li,k1j*i+lj,k2n*j+ln,k3m*n+lm) + integer, parameter :: k1i=0,k2i=0,k3i=0,k4i=1,li=0 + integer, parameter :: k1j=1,k2j=0,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=1,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=1,k4m=0,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k4i*m+li,k1j*i+lj,k2n*j+ln,k3m*n+lm) + + + tname='align442' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k4i) * k4i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * ((n-ln) .eq.(((n-ln)/k2n) * k2n)) .and. + * ((m-lm) .eq.(((m-lm)/k3m) *k3m)) .and. + * (((i-li)/k4i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((n-ln)/k2n) .gt. 0) .and. + * (((m-lm)/k3m) .gt. 0) .and. + * (((i-li)/k4i) .le. BN4) .and. + * (((j-lj)/k1j) .le. BN1) .and. + * (((n-ln)/k2n) .le. BN2) .and. + * (((m-lm)/k3m) .le. BN3) + * ) then + mb = (i-li)/k4i + ib = (j-lj)/k1j + jb = (n-ln)/k2n + nb = (m-lm)/k3m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------align443 +c 443 ALIGN arrB[i][j][k][l] WITH arrA[i][2* j][k][3*l] stretching + + subroutine align443 + integer, parameter :: AN1=3,AN2=4,AN3=3,AN4=6 + integer, parameter :: BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=3,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + + tname='align443' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) *k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + mb = (m-lm)/k4m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------align444 +c 444 ALIGN arrB[i][j][k][l] WITH arrA[i+2][ j][k][ l+3] shift + + subroutine align444 + integer, parameter :: AN1=4,AN2=4,AN3=3,AN4=6 + integer, parameter :: BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=3 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + + + tname='align444' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s = 0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) *k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + mb = (m-lm)/k4m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------align445 +c 445 ALIGN arrB[i][j][k][l] WITH arrA[i][ j][-k+4][- l+3] reverse + + subroutine align445 + integer, parameter :: AN1=4,AN2=4,AN3=8,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=2 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,k4n=0,ln=4 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=-1,lm=3 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + + + tname='align445' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) *k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + mb = (m-lm)/k4m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------align446 +c 446 ALIGN arrB[i][j][ ][l] WITH arrA[i][ j][2][ l] +c compression and replication !! + + subroutine align446 + integer, parameter :: AN1=4,AN2=4,AN3=4,AN4=4 + integer, parameter :: BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][*][m] WITH arrA4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm) + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=2 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,*,m) WITH A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm) + + + tname='align446' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(k,ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if (n .eq. ln ) then + do k = 1,BN3 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) *k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = k + mb = (m-lm)/k4m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------align447 +c 447 ALIGN arrB[][j][k][i] WITH arrA[i][ j][ ][ k] +c compression and replication !! + + subroutine align447 + integer, parameter :: AN1=4,AN2=4,AN3=4,AN4=4 + integer, parameter :: BN1=4,BN2=4,BN3=4,BN4=4 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[*][j][n][i] WITH arrA4(k1i*i+li,k2j*j+lj,*,k3m*n+lm) + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=1,k4m=0,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(*,j,n,i) WITH A4(k1i*i+li,k2j*j+lj,*,k3m*n+lm) + + tname='align447' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(k,ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + do k = 1,BN1 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((m-lm) .eq.(((m-lm)/k3m) *k3m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((m-lm)/k3m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN4) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((m-lm)/k3m) .le. BN3) + * ) then + mb = (i-li)/k1i + jb = (j-lj)/k2j + ib = k + nb = (m-lm)/k3m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri,s,cs + print *,B4 + endif + deallocate (B4,A4) + + end +C ----------------------------------------------------align448 +c 448 ALIGN arrB[][i][j][] WITH arrA[i][ j][1][3] +c compression and replication + + subroutine align448 + integer, parameter :: AN1=4,AN2=4,AN3=4,AN4=4 + integer, parameter :: BN1=4,BN2=4,BN3=4,BN4=4 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[*][i][j][*] WITH arrA4(k1i*i+li,k2j*j+lj,ln,lm) + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=1 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=0,lm=3 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(*,i,j,*) WITH A4(k1i*i+li,k2j*j+lj,ln,lm) + + tname='align448' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(k,l,ib,jb,nb,mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if ((n .eq. ln ) .and. (m .eq. lm)) then + do k = 1,BN1 + do l = 1,BN4 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN2) .and. + * (((j-lj)/k2j) .le. BN3) + * ) then + jb = (i-li)/k1i + nb = (j-lj)/k2j + ib = k + mb = l + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B4 + endif + deallocate (B4,A4) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignfloat11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignfloat11.fdv new file mode 100644 index 0000000..ac8850f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignfloat11.fdv @@ -0,0 +1,449 @@ + program ALIGNFLOAT11 + +c TESTING align CLAUSE . + + print *,'===START OF alignfloat11========================' +C -------------------------------------------------- +c 111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] normal + call align111 +C -------------------------------------------------- +c 1111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] small array + call align1111 +C -------------------------------------------------- +c 1112 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[2*i+1] small array + call align1112 +C -------------------------------------------------- +c 112 ALIGN arrB[i] WITH arrA[i+4] shift along i + call align112 +C -------------------------------------------------- +c 113 ALIGN arrB[i] WITH arrA[-i+9] reverse on i +c call align113 +C -------------------------------------------------- +c 114 ALIGN arrB[i] WITH arrA[2*i+8] stretching along i + call align114 +C -------------------------------------------------- +c 115 ALIGN arrB[*] WITH arrA[*] + call align115 +C -------------------------------------------------- +C +C + print *,'=== END OF alignfloat11 ========================= ' + end + +C ----------------------------------------------------align111 +c 111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] normal + subroutine align111 + integer, parameter :: AN1=8,BN1=8,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=0 + character*9 tname + integer, allocatable :: A1(:) + real, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align111' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align1111 +c 1111 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[i] small array + subroutine align1111 + integer, parameter :: AN1=5,BN1=2,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=0 + character*9 tname + real, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align1111' + allocate (A1(AN1),B1(BN1)) + erri= ER +c call stralign1111 + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align1112 +c 1112 arrA1[BLOCK] arrB1[ ] ALIGN arrB[i] WITH arrA[2*i+1] small array + subroutine align1112 + integer, parameter :: AN1=5,BN1=2,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=2,k2i=0,li=1 + character*9 tname + complex, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align1112' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align112 +c 112 ALIGN arrB[i] WITH arrA[i+4] shift along i + subroutine align112 + integer, parameter :: AN1=8,BN1=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=4 + character*9 tname + real, allocatable :: B1(:) + complex, allocatable :: A1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align112' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align113 +c 113 ALIGN arrB[i] WITH arrA[-i+9] reverse on i + subroutine align113 + integer, parameter :: AN1=8,BN1=8,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=-1,k2i=0,li=9 + character*9 tname + real, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align113' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align114 +c 114 ALIGN arrB[i] WITH arrA[2*i+8] stretching along i + subroutine align114 + integer, parameter :: AN1=24,BN1=8,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=2,k2i=0,li=8 + character*9 tname + integer, allocatable :: A1(:) + complex, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) + + tname='align114' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ----------------------------------------------------align115 +c 115 ALIGN arrB[*] WITH arrA[*] + subroutine align115 + integer, parameter :: AN1=24,BN1=8,NL=1000,ER=10000 +c parameters for ALIGN arrB[*] WITH arrA[*] + integer, parameter :: k1i=0,k2i=0,li=0 + character*9 tname + integer, allocatable :: A1(:) + real, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(*) WITH A1(*) + + tname='align115' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction(min(erri)), private(j) + do i=1,AN1 + do j=1,BN1 + if (B1(j) .eq.(j)) then + else + erri = min(erri,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignplus21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignplus21.fdv new file mode 100644 index 0000000..95d8a09 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignplus21.fdv @@ -0,0 +1,569 @@ + program ALIGNPLUS21 + +c TESTING align CLAUSE . +c arrA2[*][ BLOCK] arrB1[] +c or arrA2[ BLOCK][*] arrB1[] + print *, '===START OF alignplus21==================' +C -------------------------------------------------- +c 211 ALIGN arrB[i] WITH arrA[1][i] vector arrB on section +* (the first line of arrA) + call align211 +C ------------------------------------------------- +c 212 ALIGN arrB[i] WITH arrA[2*i+2][2] vector arrB on section +* (the second column of arrA) with stretching and shift + call align212 +C ------------------------------------------------- +c 213 ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA + call align213 +C ------------------------------------------------- +c 214 ALIGN arrB[i] WITH arrA[2*i+2][ ] vector arrB on replication on +* every column of arrA with stretching and shift + call align214 +C -------------------------------------------------- +c 215 ALIGN arrB[i] WITH arrA[1][i] vector arrB on section +* (the first line of arrA) + call align215 +C ------------------------------------------------- +c 216 ALIGN arrB[i] WITH arrA[2*i+2][2] vector arrB on section +* (the second column of arrA) with stretching and shift + call align216 +C ------------------------------------------------- +c 217 ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA + call align217 +C ------------------------------------------------- +c 218 ALIGN arrB[i] WITH arrA[2*i+2][ ] vector arrB on replication on +* every column of arrA with stretching and shift + call align218 +C ------------------------------------------------- + print *, '=== END OF alignplus21 ==================' +C +C + end + +C ----------------------------------------------------align211 +c 211 arrA2[*][ BLOCK] arrB1[] ALIGN arrB[i] WITH arrA[1][i]vector arrB on section +* (the first line of arrA) + subroutine align211 + integer, parameter :: AN1=8,AN2=8,BN1=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(1,i) + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(*,BLOCK) +!dvm$ ALIGN B1(i) WITH A2(1,i) + + tname='align211' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ((i .eq. 1) ) then + if ( + * (j .le. BN1) + * ) then + ib = j + B1(ib) = ib + endif + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia,ja) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=1 + ja=i + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = i*NL/10+j + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align212 +c 212 ALIGN arrB[i] WITH arrA[2*i+2][2] vector arrB on section +* (the second column of arrA) with stretching and shift + subroutine align212 + integer, parameter :: AN1=14,AN2=3,BN1=6,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(k1i*i+li,lj) + integer, parameter :: k1i=2,k2i=0,li=2,k1j=0,k2j=0,lj=2 + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer :: erri, i + +!dvm$ distribute A2(*,BLOCK) +!dvm$ ALIGN B1(i) WITH A2(k1i*i+li,lj) + + tname='align212' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ((j .eq. lj) .and. + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) + * ) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia,ja) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i*i+li + ja=lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align213 +c 213 ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA + subroutine align213 + integer, parameter :: AN1=8,AN2=8,BN1=6,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[][k1j * i + lj] + integer, parameter :: k1i=0,k2i=0,li=0,k1j=1,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer s,cs,erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(*,BLOCK) +!dvm$ ALIGN B1(i) WITH A2(*,k1j * i + lj) + + tname='align213' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ( + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((j-lj)/k1j) .le. BN1) )then + ib = (j-lj)/k1j + if (B1(ib) .eq.(ib)) then + else + erri = min(erri,ib) + endif + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ),sum(s) ) + do i=1,BN1 + s = s + B1(i) + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = ((1 + BN1)* BN1/ 2) +c write (*,*) erri,s,cs + + if ((erri .eq.ER) .and. + * (s .eq.cs )) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align214 +c 214 ALIGN arrB[i] WITH arrA[2*i+2][ ] vector arrB on replication on +* every column of arrA with stretching and shift + subroutine align214 + integer, parameter :: AN1=28,AN2=8,BN1=5,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(k1i*i+li,*) + integer, parameter :: k1i=2,k2i=0,li=2,k1j=0,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer s,erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(*,BLOCK) +!dvm$ ALIGN B1(i) WITH A2(k1i*i+li,*) + + tname='align214' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri )), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) )then + ib = (i-li)/k1i + if (B1(ib) .eq.(ib)) then + else + erri = min(erri,ib) + endif + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ),sum(s) ) + do i=1,BN1 + s = s + B1(i) + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + if ((erri .eq.ER) .and. + * (s .eq. ((1 + BN1)* BN1/ 2))) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri,s + endif + deallocate(B1,A2) + end +C ----------------------------------------------------align215 +c 215 arrA2[*][ BLOCK] arrB1[] ALIGN arrB[i] WITH arrA[1][i]vector arrB on section +* (the first line of arrA) + subroutine align215 + integer, parameter :: AN1=8,AN2=8,BN1=4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(1,i) + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,*) +!dvm$ ALIGN B1(i) WITH A2(1,i) + + tname='align215' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ((i .eq. 1) ) then + if ( + * (j .le. BN1) + * ) then + ib = j + B1(ib) = ib + endif + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia,ja) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=1 + ja=i + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align216 +c 216 ALIGN arrB[i] WITH arrA[2*i+2][2] vector arrB on section +* (the second column of arrA) with stretching and shift + subroutine align216 + integer, parameter :: AN1=14,AN2=3,BN1=6,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(k1i*i+li,lj) + integer, parameter :: k1i=2,k2i=0,li=2,k1j=0,k2j=0,lj=2 + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer :: erri, i + +!dvm$ distribute A2(BLOCK,*) +!dvm$ ALIGN B1(i) WITH A2(k1i*i+li,lj) + + tname='align216' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =0 + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ((j .eq. lj) .and. + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) + * ) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ) ), private(ia,ja) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + ia=k1i*i+li + ja=lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align217 +c 217 ALIGN arrB[i] WITH arrA[][i] vector replication on every line of arrA + subroutine align217 + integer, parameter :: AN1=8,AN2=8,BN1=6,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[][k1j * i + lj] + integer, parameter :: k1i=0,k2i=0,li=0,k1j=1,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer s,cs,erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,*) +!dvm$ ALIGN B1(i) WITH A2(*,k1j * i + lj) + + tname='align217' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ( + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((j-lj)/k1j) .le. BN1) )then + ib = (j-lj)/k1j + if (B1(ib) .eq.(ib)) then + else + erri = min(erri,ib) + endif + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ),sum(s) ) + do i=1,BN1 + s = s + B1(i) + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = ((1 + BN1)* BN1/ 2) + if ((erri .eq.ER) .and. + * (s .eq.cs )) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A2) + + end +C ----------------------------------------------------align218 +c 218 ALIGN arrB[i] WITH arrA[2*i+2][ ] vector arrB on replication on +* every column of arrA with stretching and shift + subroutine align218 + integer, parameter :: AN1=28,AN2=8,BN1=5,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(k1i*i+li,*) + integer, parameter :: k1i=2,k2i=0,li=2,k1j=0,k2j=0,lj=0 + character*9 tname + integer, allocatable :: A2(:,:), B1(:) + integer s,erri,i,j,ia,ja,ib,jb + +!dvm$ distribute A2(BLOCK,*) +!dvm$ ALIGN B1(i) WITH A2(k1i*i+li,*) + + tname='align218' + allocate (A2(AN1,AN2),B1(BN1)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A2,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri )), private(ib) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) )then + ib = (i-li)/k1i + if (B1(ib) .eq.(ib)) then + else + erri = min(erri,ib) + endif + endif + enddo + enddo + +!dvm$ parallel (i) on B1(i), reduction( min( erri ),sum(s) ) + do i=1,BN1 + s = s + B1(i) + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + if ((erri .eq.ER) .and. + * (s .eq. ((1 + BN1)* BN1/ 2))) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri,s + endif + deallocate (B1,A2) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignplus33.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignplus33.fdv new file mode 100644 index 0000000..4a1c6e8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/ALIGN/alignplus33.fdv @@ -0,0 +1,478 @@ + program ALIGNPLUS33 + +c TESTING align CLAUSE . + + print *, '====START OF alignplus33================' +c -------------------------------------------------- +c 331 arrA3[*][BLOCK] [BLOCK] arrB3[][][] +c ALIGN arrB[i][j][k] WITH arrA[i][ j][k] normal + call align331 +C -------------------------------------------------- +c 332 arrA3[*][BLOCK] [BLOCK] arrB3[][][] +c ALIGN arrB[*][i][*] WITH arrA[*][ 3][i] + call align332 +c -------------------------------------------------- +c 333 arrA3[BLOCK][*] [BLOCK] arrB3[][][] +c ALIGN arrB[i][j][k] WITH arrA[i+4][2*j+1][3*k+1] +C call align333 +C -------------------------------------------------- +c 334 arrA3[BLOCK][BLOCK] [*] arrB3[][][] +c ALIGN arrB[*][i][*] WITH arrA[*][ 7][2*i-1] + call align334 +C -------------------------------------------------- +c 335 arrA3[BLOCK][*] [BLOCK] arrB3[][][] +c ALIGN arrB[*][i][*] WITH arrA[*][ 1][i] + call align335 +C ------------------------------------------------- + print *, '==== END OF alignplus33 ================' +C + end + +C ----------------------------------------------------align331 +c 331 arrA3[*][BLOCK] [BLOCK] arrB3[][][] +c ALIGN arrB[i][j][n] WITH arrA[i][ j][n] normal + + subroutine align331 + integer, parameter :: AN1=5,AN2=5,AN3=5,BN1=2,BN2=2,BN3=2 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +cdvm$ distribute A3(*,BLOCK,BLOCK) +cdvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,k3n*n+ln) + + tname='align331' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + s=0 + m=-1 + +!dvm$ actual(erri,s) +!dvm$ region local(A3,B3) +*dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =0 + enddo + enddo + enddo + +*dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + B3(ib,jb,nb)=ib*NL/10+jb*NL/100+nb*NL/1000 + endif + enddo + enddo + enddo + +*dvm$ parallel (i,j,n) on B3(i,j,n), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000 + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B3 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------align332 +c 332 arrA3[*][BLOCK] [BLOCK] arrB3[][][] +c ALIGN arrB[*][i][*] WITH arrA[*][ 3][i] normal + + subroutine align332 + integer, parameter :: AN1=4,AN2=4,AN3=4,BN1=2,BN2=2,BN3=2 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[*][i][*] WITH arrA[*][lj][k1n*i+ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=0,k3j=0,lj=3 + integer, parameter :: k1n=1,k2n=0,k3n=0,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,k,l,ia,ja,na,ma,ib,jb,nb,mb, + * Avalue,Bvalue + +cdvm$ distribute A3(*,BLOCK,BLOCK) +cdvm$ ALIGN B3(*,i,*) WITH A3(*,lj,k1n*i+ln) + + tname='align332' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +*dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(k,l,ib,jb,nb), +!dvm$& reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10+j*NL/100+n*NL/1000 + if ((j .eq. lj ) ) then + do k = 1,BN1 + do l = 1,BN3 + if ( + * ((n-ln) .eq.(((n-ln)/k1n) * k1n)) .and. + * (((n-ln)/k1n) .gt. 0) .and. + * (((n-ln)/k1n) .le. BN2) + * ) then + ib = k + jb = ((n-ln)/k1n) + nb = l + if (B3(ib,jb,nb).eq. + * (ib*NL/10+jb*NL/100+nb*NL/1000))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000) + endif + endif + enddo + enddo + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + cs=0 + s=0 + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B3 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------align333 +c 333 arrA3[BLOCK][*] [BLOCK] arrB3[][][] +c ALIGN arrB[i][j][k] WITH arrA[i+4][2*j+1][3*k+1] + + subroutine align333 + integer, parameter :: AN1=8,AN2=8,AN3=13,BN1=4,BN2=3,BN3=4 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=4 + integer, parameter :: k1j=0,k2j=2,k3j=0,lj=1 + integer, parameter :: k1n=0,k2n=0,k3n=3,ln=1 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +cdvm$ distribute A3(BLOCK,*,BLOCK) +cdvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,k3n*n+ln) + + tname='align333' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + s=0 + +!dvm$ actual(erri,s) +!dvm$ region local(A3,B3) +*dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =0 + enddo + enddo + enddo + +*dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + B3(ib,jb,nb)=ib*NL/10+jb*NL/100+nb*NL/1000 + endif + enddo + enddo + enddo + +*dvm$ parallel (i,j,n) on B3(i,j,n), reduction( min( erri ),sum(s) ) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri,s) + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000 + enddo + enddo + enddo + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B3 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------align334 +c 334 arrA3[BLOCK][BLOCK] [*] arrB3[][][] +c ALIGN arrB[*][i][*] WITH arrA[*][ 7][2*i-1] + + subroutine align334 + integer, parameter :: AN1=5,AN2=7,AN3=9,BN1=4,BN2=3,BN3=5 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[*][i][*] WITH arrA[*][lj][k1n*i+ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=0,k3j=0,lj=7 + integer, parameter :: k1n=2,k2n=0,k3n=0,ln=-1 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,k,l,ia,ja,na,ma,ib,jb,nb,mb, + * Avalue,Bvalue + +cdvm$ distribute A3(BLOCK,BLOCK,*) +cdvm$ ALIGN B3(*,i,*) WITH A3(*,lj,k1n*i+ln) + + tname='align334' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +*dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(k,l,ib,jb,nb), +!dvm$& reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10+j*NL/100+n*NL/1000 + if ((j .eq. lj ) ) then + do k = 1,BN1 + do l = 1,BN3 + if ( + * ((n-ln) .eq.(((n-ln)/k1n) * k1n)) .and. + * (((n-ln)/k1n) .gt. 0) .and. + * (((n-ln)/k1n) .le. BN2) + * ) then + ib = k + jb = ((n-ln)/k1n) + nb = l + if (B3(ib,jb,nb).eq. + * (ib*NL/10+jb*NL/100+nb*NL/1000))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000) + endif + endif + enddo + enddo + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + cs=0 + s=0 + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B3 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------align335 +c 335 arrA3[BLOCK][*] [BLOCK] arrB3[][][] +c ALIGN arrB[*][i][*] WITH arrA[*][ 1][i] + + subroutine align335 + integer, parameter :: AN1=5,AN2=7,AN3=9,BN1=4,BN2=3,BN3=5 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for ALIGN arrB[*][i][*] WITH arrA[*][lj][k1n*i+ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=0,k3j=0,lj=1 + integer, parameter :: k1n=1,k2n=0,k3n=0,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,k,l,ia,ja,na,ma,ib,jb,nb,mb, + * Avalue,Bvalue + +cdvm$ distribute A3(BLOCK,*,BLOCK) +cdvm$ ALIGN B3(*,i,*) WITH A3(*,lj,k1n*i+ln) + + tname='align335' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +*dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(k,l,ib,jb,nb), +!dvm$& reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10+j*NL/100+n*NL/1000 + if ((j .eq. lj ) ) then + do k = 1,BN1 + do l = 1,BN3 + if ( + * ((n-ln) .eq.(((n-ln)/k1n) * k1n)) .and. + * (((n-ln)/k1n) .gt. 0) .and. + * (((n-ln)/k1n) .le. BN2) + * ) then + ib = k + jb = ((n-ln)/k1n) + nb = l + if (B3(ib,jb,nb).eq. + * (ib*NL/10+jb*NL/100+nb*NL/1000))then + else + erri = min(erri,i*NL/10 + j*NL/100+ n*NL/1000) + endif + endif + enddo + enddo + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + cs=0 + s=0 + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri,s,cs +c print *,B3 + endif + deallocate (B3,A3) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons01234.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons01234.fdv new file mode 100644 index 0000000..b72b0b2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons01234.fdv @@ -0,0 +1,4834 @@ + program CONS01234 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING DISTRIBUTION WITH NO BLOCKS. + + print *,'===START OF CONS01234========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons0101 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons0102 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons0103 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons0104 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons0105 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons0106 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons0107 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons0108 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons0109 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons0110 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons0111 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons0112 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons0113 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons0114 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons0115 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons0116 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons0201 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons0202 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons0203 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons0204 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons0205 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons0206 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons0207 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons0208 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons0209 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons0210 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons0211 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons0212 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons0213 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons0214 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons0215 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons0216 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons0301 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons0302 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons0303 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons0304 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons0305 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons0306 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons0307 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons0308 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons0309 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons0310 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons0311 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons0312 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons0313 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons0314 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons0315 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons0316 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons0401 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons0402 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons0403 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons0404 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons0405 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons0406 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons0407 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons0408 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons0409 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons0410 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons0411 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons0412 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons0413 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons0414 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons0415 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons0416 +C -------------------------------------------------- +C + print *,'=== END OF CONS01234 ========================= ' + end +C ---------------------------------------------cons0101 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS0101 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N),C(N)) + tname='CONS0101' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0102 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS0102 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N),W(N),C(N)) + tname='CONS0102' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0103 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0103 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ DISTRIBUTE ( * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N),W(N),C(N)) + tname='CONS0103' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!DVM$ PARALLEL (I) ON A(I), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0104 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0104 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N),C(N)) + tname='CONS0104' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0105 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS0105 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N),C(N,N)) + tname='CONS0105' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0106 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS0106 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N,N),W(N,N),C(N,N)) + tname='CONS0106' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(W(I,:)) + DO I = 1, N + DO J = 1, N + W(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0107 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0107 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ DISTRIBUTE ( * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N,N),W(N,N),C(N,N)) + tname='CONS0107' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON A(I), private(J), CONSISTENT(W(I,:)) + DO I = 1, N + DO J = 1, N + W(I,J) = A(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0108 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0108 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N),C(N,N)) + tname='CONS0108' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0109 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS0109 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N),C(N,N,N)) + tname='CONS0109' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0110 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS0110 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0110' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(W(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + W(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0111 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0111 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ DISTRIBUTE ( * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0111' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON A(I), private(J,K), CONSISTENT(W(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + W(I,J,K) = A(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0112 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0112 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N),C(N,N,N)) + tname='CONS0112' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0113 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS0113 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0113' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0114 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS0114 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0114' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(W(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + W(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0115 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0115 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ DISTRIBUTE ( * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0115' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON A(I), private(J,K,L), CONSISTENT(W(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + W(I,J,K,L)=A(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0116 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0116 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( * ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0116' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0201 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS0201 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS0201' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0202 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS0202 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N),W(N),C(N)) + tname='CONS0202' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0203 +C consistent arrays with 1 dimensions + subroutine CONS0203 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ DISTRIBUTE ( *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N),W(N),C(N)) + tname='CONS0203' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0204 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0204 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS0204' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0205 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS0205 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS0205' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0206 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS0206 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS0206' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0207 +C consistent arrays with 2 dimensions + subroutine CONS0207 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ DISTRIBUTE ( *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS0207' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0208 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0208 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS0208' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0209 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS0209 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS0209' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0210 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS0210 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0210' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0211 +C consistent arrays with 3 dimensions + subroutine CONS0211 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ DISTRIBUTE ( *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0211' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = A(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0212 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0212 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS0212' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0213 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS0213 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0213' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0214 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS0214 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0214' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0215 +C consistent arrays with 4 dimensions + subroutine CONS0215 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ DISTRIBUTE ( *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0215' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=A(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0216 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0216 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0216' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0301 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS0301 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS0301' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0302 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS0302 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS0302' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0303 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0303 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS0303' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0304 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0304 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS0304' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0305 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS0305 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS0305' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0306 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS0306 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS0306' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0307 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0307 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS0307' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0308 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0308 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS0308' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0309 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS0309 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS0309' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0310 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS0310 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0310' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0311 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0311 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0311' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0312 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0312 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS0312' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0313 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS0313 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0313' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0314 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS0314 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0314' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0315 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0315 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0315' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0316 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0316 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0316' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0401 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS0401 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS0401' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0402 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS0402 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS0402' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0403 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0403 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS0403' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0404 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0404 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS0404' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0405 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS0405 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS0405' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0406 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS0406 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS0406' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0407 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0407 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS0407' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0408 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0408 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS0408' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0409 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS0409 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS0409' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0410 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS0410 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0410' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0411 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0411 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS0411' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0412 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0412 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS0412' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0413 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS0413 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0413' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons0414 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS0414 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0414' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons0415 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS0415 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ DISTRIBUTE ( *, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS0415' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons0416 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS0416 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS0416' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons11.fdv new file mode 100644 index 0000000..fea541c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons11.fdv @@ -0,0 +1,1113 @@ + program CONS11 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING ( BLOCK ) DISTRIBUTION. + + print *,'===START OF CONS11========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1101 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1102 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1103 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1104 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1105 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1106 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1107 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1108 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1109 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1110 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1111 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1112 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1113 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1114 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1115 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1116 +C -------------------------------------------------- + +C + print *,'=== END OF CONS11 ========================= ' + end +C ---------------------------------------------cons1101 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1101 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N),C(N)) + tname='CONS1101' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1102 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1102 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N),W(N),C(N)) + tname='CONS1102' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1103 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1103 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N),W(N),C(N)) + tname='CONS1103' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!DVM$ PARALLEL (I) ON A(I), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1104 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1104 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N),C(N)) + tname='CONS1104' + DO I = 1, N + C(I) = I + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1105 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1105 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N),C(N,N)) + tname='CONS1105' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1106 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1106 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N,N),W(N,N),C(N,N)) + tname='CONS1106' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(W(I,:)) + DO I = 1, N + DO J = 1, N + W(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1107 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1107 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N,N),W(N,N),C(N,N)) + tname='CONS1107' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON A(I), private(J), CONSISTENT(W(I,:)) + DO I = 1, N + DO J = 1, N + W(I,J) = A(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1108 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1108 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N),C(N,N)) + tname='CONS1108' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J), CONSISTENT(V(I,:)) + DO I = 1, N + DO J = 1, N + V(I,J) = B(I) + (N - 1) * J + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1109 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1109 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N),C(N,N,N)) + tname='CONS1109' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1110 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1110 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1110' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(W(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + W(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1111 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1111 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1111' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON A(I), private(J,K), CONSISTENT(W(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + W(I,J,K) = A(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1112 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1112 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N),C(N,N,N)) + tname='CONS1112' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K), CONSISTENT(V(I,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + V(I,J,K) = B(I) + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1113 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1113 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1113' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1114 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1114 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1114' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(W(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + W(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1115 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1115 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:),A(:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N),A(N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1115' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON A(I) + DO I = 1, N + A(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON A(I), private(J,K,L), CONSISTENT(W(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + W(I,J,K,L)=A(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1116 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1116 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1116' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (I) ON B(I) + DO I = 1, N + B(I) = I + ENDDO +!DVM$ PARALLEL (I) ON B(I), private(J,K,L), CONSISTENT(V(I,:,:,:)) + DO I = 1, N + DO J = 1, N + DO K = 1, N + DO L = 1, N + V(I,J,K,L)=B(I)+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (I) ON B(I), REDUCTION(MIN(ERROR)) + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons1234.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons1234.fdv new file mode 100644 index 0000000..2adb18e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons1234.fdv @@ -0,0 +1,11332 @@ + program CONS1234 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING DISTRIBUTION WITH ONE BLOCK. + + print *,'===START OF CONS1234========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1201 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1202 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1203 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1204 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1205 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1206 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1207 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1208 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1209 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1210 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1211 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1212 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1213 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1214 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1215 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1216 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1217 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1218 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1219 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1220 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1221 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1222 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1223 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1224 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1225 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1226 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1227 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1228 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1229 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1230 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1231 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1232 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1301 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1302 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1303 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1304 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1305 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1306 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1307 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1308 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1309 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1310 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1311 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1312 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1313 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1314 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1315 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1316 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1317 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1318 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1319 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1320 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1321 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1322 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1323 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1324 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1325 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1326 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1327 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1328 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1329 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1330 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1331 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1332 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1333 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1334 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1335 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1336 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1337 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1338 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1339 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1340 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1341 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1342 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1343 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1344 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1345 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1346 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1347 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1348 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1401 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1402 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1403 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1404 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1405 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1406 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1407 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1408 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1409 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1410 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1411 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1412 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1413 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1414 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1415 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1416 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1417 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1418 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1419 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1420 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1421 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1422 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1423 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1424 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1425 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1426 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1427 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1428 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1429 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1430 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1431 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1432 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1433 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1434 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1435 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1436 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1437 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1438 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1439 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1440 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1441 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1442 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1443 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1444 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1445 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1446 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1447 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1448 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons1449 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons1450 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons1451 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons1452 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons1453 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons1454 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons1455 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons1456 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons1457 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons1458 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons1459 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons1460 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons1461 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons1462 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons1463 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons1464 +C -------------------------------------------------- +C + print *,'=== END OF CONS1234 ========================= ' + end +C ---------------------------------------------cons1201 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1201 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS1201' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1202 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1202 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N),W(N),C(N)) + tname='CONS1202' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1203 +C consistent arrays with 1 dimensions + subroutine CONS1203 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N),W(N),C(N)) + tname='CONS1203' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1204 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1204 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS1204' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1205 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1205 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS1205' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1206 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1206 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1206' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1207 +C consistent arrays with 2 dimensions + subroutine CONS1207 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1207' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1208 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1208 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS1208' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1209 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1209 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS1209' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1210 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1210 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1210' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1211 +C consistent arrays with 3 dimensions + subroutine CONS1211 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1211' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = A(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1212 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1212 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS1212' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1213 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1213 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1213' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1214 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1214 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1214' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1215 +C consistent arrays with 4 dimensions + subroutine CONS1215 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1215' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=A(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1216 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1216 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1216' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1217 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1217 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS1217' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1218 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1218 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N),W(N),C(N)) + tname='CONS1218' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1219 +C consistent arrays with 1 dimensions + subroutine CONS1219 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N),W(N),C(N)) + tname='CONS1219' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1220 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1220 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS1220' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1221 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1221 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS1221' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1222 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1222 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1222' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1223 +C consistent arrays with 2 dimensions + subroutine CONS1223 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1223' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1224 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1224 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS1224' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1225 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1225 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS1225' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1226 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1226 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1226' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1227 +C consistent arrays with 3 dimensions + subroutine CONS1227 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1227' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = A(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1228 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1228 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS1228' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1229 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1229 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1229' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1230 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1230 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1230' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1231 +C consistent arrays with 4 dimensions + subroutine CONS1231 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1231' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=A(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1232 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1232 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1232' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1301 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1301 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS1301' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1302 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1302 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS1302' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1303 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1303 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS1303' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1304 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1304 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS1304' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1305 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1305 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS1305' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1306 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1306 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1306' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1307 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1307 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1307' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1308 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1308 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS1308' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1309 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1309 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1309' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1310 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1310 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1310' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1311 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1311 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1311' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1312 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1312 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1312' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1313 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1313 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1313' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1314 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1314 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1314' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1315 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1315 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1315' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1316 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1316 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1316' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1317 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1317 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS1317' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1318 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1318 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS1318' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1319 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1319 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS1319' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1320 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1320 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS1320' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1321 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1321 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS1321' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1322 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1322 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1322' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1323 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1323 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1323' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1324 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1324 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS1324' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1325 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1325 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1325' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1326 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1326 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1326' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1327 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1327 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1327' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1328 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1328 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1328' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1329 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1329 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1329' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1330 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1330 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1330' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1331 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1331 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1331' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1332 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1332 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1332' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1333 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1333 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS1333' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1334 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1334 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS1334' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1335 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1335 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS1335' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1336 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1336 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS1336' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1337 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1337 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS1337' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1338 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1338 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1338' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1339 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1339 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1339' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1340 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1340 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS1340' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1341 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1341 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1341' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1342 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1342 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1342' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1343 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1343 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1343' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1344 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1344 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1344' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1345 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1345 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1345' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1346 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1346 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1346' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1347 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1347 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1347' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1348 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1348 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1348' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1401 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1401 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1401' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1402 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1402 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1402' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1403 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1403 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1403' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1404 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1404 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1404' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1405 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1405 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1405' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1406 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1406 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1406' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1407 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1407 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1407' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1408 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1408 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1408' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1409 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1409 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1409' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1410 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1410 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1410' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1411 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1411 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1411' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1412 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1412 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1412' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1413 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1413 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1413' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1414 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1414 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1414' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1415 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1415 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1415' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1416 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1416 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1416' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1417 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1417 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1417' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1418 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1418 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1418' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1419 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1419 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1419' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1420 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1420 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1420' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1421 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1421 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1421' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1422 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1422 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1422' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1423 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1423 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1423' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1424 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1424 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1424' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1425 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1425 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1425' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1426 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1426 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1426' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1427 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1427 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1427' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1428 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1428 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1428' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1429 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1429 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1429' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1430 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1430 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1430' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1431 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1431 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1431' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1432 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1432 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1432' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1433 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1433 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1433' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1434 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1434 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1434' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1435 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1435 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1435' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1436 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1436 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1436' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1437 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1437 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1437' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1438 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1438 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1438' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1439 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1439 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1439' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1440 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1440 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1440' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1441 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1441 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1441' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1442 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1442 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1442' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1443 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1443 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1443' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1444 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1444 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1444' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1445 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1445 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1445' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1446 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1446 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1446' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1447 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1447 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1447' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1448 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1448 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1448' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1449 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS1449 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1449' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1450 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS1450 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1450' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1451 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1451 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS1451' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1452 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1452 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS1452' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1453 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS1453 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1453' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1454 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS1454 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1454' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1455 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1455 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS1455' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1456 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1456 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS1456' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1457 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS1457 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1457' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1458 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS1458 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1458' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1459 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1459 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS1459' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1460 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1460 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS1460' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1461 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS1461 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1461' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons1462 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS1462 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1462' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons1463 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS1463 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS1463' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons1464 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS1464 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS1464' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=(I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons22.fdv new file mode 100644 index 0000000..3449556 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons22.fdv @@ -0,0 +1,1185 @@ + program CONS22 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING ( BLOCK, BLOCK ) DISTRIBUTION. + + print *,'===START OF CONS22========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2201 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2202 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2203 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2204 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2205 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2206 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2207 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2208 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2209 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2210 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2211 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2212 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2213 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2214 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2215 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2216 +C -------------------------------------------------- + +C + print *,'=== END OF CONS22 ========================= ' + end +C ---------------------------------------------cons2201 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2201 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS2201' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2202 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2202 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N),W(N),C(N)) + tname='CONS2202' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2203 +C consistent arrays with 1 dimensions + subroutine CONS2203 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N),W(N),C(N)) + tname='CONS2203' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2204 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2204 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N),C(N)) + tname='CONS2204' + DO I = 1, N + C(I) = I + (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2205 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2205 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS2205' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2206 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2206 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2206' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2207 +C consistent arrays with 2 dimensions + subroutine CONS2207 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2207' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2208 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2208 + INTEGER,PARAMETER:: N=16, ER=10000 + integer,allocatable:: B(:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N),C(N,N)) + tname='CONS2208' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2209 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2209 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS2209' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2210 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2210 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2210' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2211 +C consistent arrays with 3 dimensions + subroutine CONS2211 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2211' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K), CONSISTENT(W(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + W(I,J,K) = A(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2212 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2212 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N),C(N,N,N)) + tname='CONS2212' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K), CONSISTENT(V(I,J,:)) + DO J = 1, N + DO I = 1, N + DO K = 1, N + V(I,J,K) = B(I,J) + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2213 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2213 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2213' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2214 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2214 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2214' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2215 +C consistent arrays with 4 dimensions + subroutine CONS2215 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:),A(:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N),A(N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2215' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J) + DO J = 1, N + DO I = 1, N + A(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J), private(K,L), CONSISTENT(W(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + W(I,J,K,L)=A(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2216 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2216 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2216' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (J,I) ON B(I,J) + DO J = 1, N + DO I = 1, N + B(I,J) = I+(N-1)*J + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J), private(K,L), CONSISTENT(V(I,J,:,:)) + DO J = 1, N + DO I = 1, N + DO L = 1, N + DO K = 1, N + V(I,J,K,L)=B(I,J)+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (J,I) ON B(I,J), REDUCTION(MIN(ERROR)) + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons234.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons234.fdv new file mode 100644 index 0000000..c5d2cba --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons234.fdv @@ -0,0 +1,11628 @@ + program CONS234 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING DISTRIBUTION WITH TWO BLOCKS. + + print *,'===START OF CONS234========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2301 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2302 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2303 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2304 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2305 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2306 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2307 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2308 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2309 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2310 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2311 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2312 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2313 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2314 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2315 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2316 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2317 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2318 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2319 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2320 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2321 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2322 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2323 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2324 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2325 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2326 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2327 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2328 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2329 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2330 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2331 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2332 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2333 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2334 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2335 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2336 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2337 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2338 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2339 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2340 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2341 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2342 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2343 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2344 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2345 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2346 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2347 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2348 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2401 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2402 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2403 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2404 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2405 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2406 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2407 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2408 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2409 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2410 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2411 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2412 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2413 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2414 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2415 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2416 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2417 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2418 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2419 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2420 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2421 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2422 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2423 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2424 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2425 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2426 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2427 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2428 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2429 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2430 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2431 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2432 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2433 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2434 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2435 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2436 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2437 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2438 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2439 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2440 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2441 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2442 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2443 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2444 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2445 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2446 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2447 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2448 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2449 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2450 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2451 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2452 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2453 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2454 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2455 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2456 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2457 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2458 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2459 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2460 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2461 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2462 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2463 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2464 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2465 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2466 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2467 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2468 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2469 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2470 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2471 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2472 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2473 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2474 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2475 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2476 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2477 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2478 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2479 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2480 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons2481 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons2482 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons2483 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons2484 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons2485 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons2486 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons2487 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons2488 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons2489 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons2490 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons2491 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons2492 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons2493 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons2494 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons2495 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons2496 +C -------------------------------------------------- +C + print *,'=== END OF CONS234 ========================= ' + end +C ---------------------------------------------cons2301 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2301 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS2301' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2302 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2302 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS2302' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2303 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2303 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS2303' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2304 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2304 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS2304' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2305 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2305 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS2305' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2306 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2306 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2306' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2307 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2307 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2307' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2308 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2308 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS2308' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2309 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2309 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2309' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2310 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2310 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2310' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2311 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2311 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2311' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2312 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2312 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2312' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2313 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2313 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2313' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2314 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2314 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2314' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2315 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2315 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2315' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2316 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2316 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2316' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2317 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2317 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS2317' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2318 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2318 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS2318' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2319 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2319 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS2319' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2320 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2320 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS2320' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2321 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2321 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS2321' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2322 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2322 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2322' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2323 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2323 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2323' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2324 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2324 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS2324' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2325 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2325 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2325' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2326 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2326 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2326' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2327 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2327 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2327' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2328 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2328 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2328' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2329 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2329 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2329' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2330 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2330 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2330' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2331 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2331 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2331' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2332 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2332 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2332' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2333 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2333 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS2333' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2334 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2334 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS2334' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2335 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2335 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS2335' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2336 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2336 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS2336' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2337 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2337 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS2337' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2338 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2338 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2338' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2339 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2339 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2339' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2340 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2340 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS2340' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2341 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2341 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2341' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2342 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2342 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2342' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2343 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2343 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2343' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2344 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2344 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2344' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2345 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2345 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2345' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2346 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2346 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2346' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2347 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2347 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2347' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2348 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2348 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2348' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2401 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2401 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2401' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2402 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2402 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2402' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2403 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2403 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2403' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2404 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2404 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2404' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2405 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2405 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2405' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2406 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2406 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2406' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2407 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2407 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2407' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2408 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2408 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2408' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2409 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2409 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2409' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2410 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2410 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2410' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2411 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2411 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2411' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2412 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2412 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2412' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2413 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2413 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2413' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2414 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2414 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2414' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2415 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2415 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2415' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2416 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2416 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2416' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2417 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2417 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2417' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2418 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2418 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2418' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2419 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2419 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2419' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2420 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2420 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2420' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2421 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2421 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2421' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2422 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2422 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2422' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2423 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2423 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2423' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2424 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2424 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2424' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2425 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2425 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2425' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2426 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2426 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2426' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2427 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2427 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2427' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2428 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2428 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2428' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2429 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2429 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2429' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2430 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2430 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2430' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2431 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2431 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2431' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2432 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2432 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2432' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2433 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2433 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2433' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2434 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2434 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2434' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2435 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2435 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2435' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2436 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2436 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2436' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2437 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2437 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2437' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2438 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2438 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2438' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2439 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2439 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2439' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2440 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2440 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2440' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2441 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2441 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2441' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2442 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2442 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2442' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2443 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2443 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2443' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2444 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2444 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2444' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2445 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2445 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2445' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2446 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2446 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2446' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2447 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2447 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2447' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2448 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2448 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2448' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2449 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2449 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2449' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2450 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2450 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2450' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2451 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2451 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2451' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2452 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2452 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2452' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2453 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2453 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2453' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2454 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2454 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2454' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2455 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2455 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2455' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2456 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2456 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2456' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2457 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2457 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2457' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2458 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2458 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2458' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2459 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2459 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2459' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2460 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2460 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2460' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2461 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2461 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2461' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2462 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2462 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2462' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2463 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2463 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2463' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2464 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2464 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2464' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2465 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2465 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2465' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2466 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2466 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2466' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2467 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2467 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2467' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2468 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2468 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2468' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2469 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2469 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2469' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2470 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2470 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2470' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2471 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2471 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2471' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2472 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2472 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2472' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2473 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2473 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2473' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2474 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2474 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2474' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2475 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2475 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2475' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2476 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2476 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2476' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2477 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2477 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2477' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2478 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2478 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2478' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2479 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2479 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2479' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2480 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2480 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2480' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2481 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS2481 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2481' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2482 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS2482 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2482' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2483 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2483 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS2483' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2484 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2484 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS2484' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2485 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS2485 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2485' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2486 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS2486 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2486' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2487 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2487 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS2487' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2488 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2488 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS2488' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2489 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS2489 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2489' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2490 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS2490 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2490' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2491 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2491 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS2491' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2492 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2492 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS2492' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2493 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS2493 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2493' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons2494 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS2494 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2494' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons2495 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS2495 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS2495' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons2496 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS2496 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS2496' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons33.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons33.fdv new file mode 100644 index 0000000..99554bd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons33.fdv @@ -0,0 +1,1261 @@ + program CONS33 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING ( BLOCK, BLOCK, BLOCK ) DISTRIBUTION. + + print *,'===START OF CONS33========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons3301 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons3302 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons3303 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons3304 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons3305 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons3306 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons3307 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons3308 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons3309 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons3310 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons3311 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons3312 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons3313 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons3314 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons3315 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons3316 +C -------------------------------------------------- + +C + print *,'=== END OF CONS33 ========================= ' + end +C ---------------------------------------------cons3301 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS3301 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS3301' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3302 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS3302 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N),W(N),C(N)) + tname='CONS3302' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3303 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3303 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N),W(N),C(N)) + tname='CONS3303' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3304 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3304 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N),C(N)) + tname='CONS3304' + DO I = 1, N + C(I) = I + (N - 1) + (N - 1) * (N - 1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3305 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS3305 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS3305' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3306 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS3306 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3306' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3307 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3307 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3307' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3308 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3308 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N),C(N,N)) + tname='CONS3308' + DO J = 1, N + DO I = 1, N + C(I,J) = I + (N - 1) * J + (N - 1) * (N - 1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3309 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS3309 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3309' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3310 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS3310 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3310' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3311 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3311 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3311' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3312 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3312 + INTEGER,PARAMETER:: N=16, ER=100000 + integer,allocatable:: B(:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3312' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K) = I + (N - 1) * J + (N - 1) * (N - 1) * K + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3313 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS3313 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3313' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3314 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS3314 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3314' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3315 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3315 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:),A(:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N),A(N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3315' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K), private(L), CONSISTENT(W(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + W(I,J,K,L)=A(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3316 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3316 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3316' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (K,J,I) ON B(I,J,K) + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K) = I+(N-1)*J+(N-1)*(N-1)*K + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), private(L), CONSISTENT(V(I,J,K,:)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + DO L = 1, N + V(I,J,K,L)=B(I,J,K)+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (K,J,I) ON B(I,J,K), REDUCTION(MIN(ERROR)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons34.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons34.fdv new file mode 100644 index 0000000..fe3cc2c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons34.fdv @@ -0,0 +1,5274 @@ + program CONS34 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING DISTRIBUTION WITH THREE BLOCKS. + + print *,'===START OF CONS34========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons3401 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons3402 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons3403 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons3404 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons3405 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons3406 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons3407 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons3408 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons3409 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons3410 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons3411 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons3412 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons3413 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons3414 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons3415 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons3416 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons3417 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons3418 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons3419 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons3420 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons3421 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons3422 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons3423 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons3424 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons3425 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons3426 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons3427 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons3428 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons3429 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons3430 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons3431 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons3432 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons3433 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons3434 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons3435 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons3436 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons3437 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons3438 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons3439 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons3440 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons3441 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons3442 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons3443 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons3444 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons3445 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons3446 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons3447 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons3448 +C -------------------------------------------------- + +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons3449 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons3450 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons3451 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons3452 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons3453 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons3454 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons3455 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons3456 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons3457 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons3458 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons3459 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons3460 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons3461 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons3462 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons3463 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons3464 +C -------------------------------------------------- +C + print *,'=== END OF CONS34 ========================= ' + end +C ---------------------------------------------cons3401 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS3401 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3401' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3402 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS3402 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3402' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3403 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3403 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3403' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3404 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3404 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3404' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3405 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS3405 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3405' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3406 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS3406 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3406' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3407 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3407 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3407' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3408 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3408 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3408' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3409 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS3409 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3409' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3410 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS3410 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3410' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3411 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3411 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3411' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3412 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3412 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3412' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3413 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS3413 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3413' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3414 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS3414 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3414' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3415 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3415 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3415' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3416 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3416 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( *, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3416' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3417 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS3417 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3417' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3418 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS3418 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3418' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3419 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3419 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3419' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3420 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3420 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3420' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3421 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS3421 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3421' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3422 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS3422 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3422' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3423 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3423 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3423' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3424 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3424 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3424' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3425 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS3425 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3425' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3426 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS3426 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3426' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3427 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3427 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3427' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3428 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3428 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3428' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3429 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS3429 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3429' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3430 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS3430 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3430' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3431 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3431 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3431' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3432 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3432 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, *, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3432' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3433 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS3433 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3433' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3434 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS3434 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3434' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3435 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3435 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3435' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3436 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3436 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3436' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3437 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS3437 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3437' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3438 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS3438 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3438' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3439 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3439 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3439' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3440 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3440 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3440' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3441 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS3441 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3441' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3442 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS3442 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3442' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3443 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3443 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3443' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3444 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3444 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3444' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3445 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS3445 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3445' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3446 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS3446 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3446' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3447 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3447 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3447' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3448 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3448 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, *, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3448' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3449 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS3449 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3449' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3450 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS3450 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3450' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3451 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3451 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS3451' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3452 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3452 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS3452' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3453 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS3453 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3453' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3454 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS3454 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3454' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3455 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3455 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS3455' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3456 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3456 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS3456' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3457 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS3457 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3457' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3458 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS3458 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3458' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3459 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3459 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS3459' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3460 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3460 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS3460' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3461 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS3461 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3461' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons3462 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS3462 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3462' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons3463 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS3463 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS3463' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons3464 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS3464 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, * ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS3464' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons44.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons44.fdv new file mode 100644 index 0000000..cf27f2e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/CONSISTENT/cons44.fdv @@ -0,0 +1,1333 @@ + program CONS44 + +c TESTING OF THE CONSISTENT CLAUSE'. +c CHECKING ( BLOCK, BLOCK, BLOCK, BLOCK ) DISTRIBUTION. + + print *,'===START OF CONS44========================' +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + call cons4401 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + call cons4402 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + call cons4403 +C -------------------------------------------------- +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + call cons4404 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + call cons4405 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + call cons4406 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + call cons4407 +C -------------------------------------------------- +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + call cons4408 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + call cons4409 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + call cons4410 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + call cons4411 +C -------------------------------------------------- +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + call cons4412 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + call cons4413 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + call cons4414 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + call cons4415 +C -------------------------------------------------- +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + call cons4416 +C -------------------------------------------------- + +C + print *,'=== END OF CONS44 ========================= ' + end +C ---------------------------------------------cons4401 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array + subroutine CONS4401 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS4401' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons4402 +C consistent arrays with 1 dimensions +C two consistent arrays and one distributed array + subroutine CONS4402 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:),W(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N),W(N),C(N)) + tname='CONS4402' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons4403 +C consistent arrays with 1 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS4403 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:),W(:) + *,C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N),W(N),C(N)) + tname='CONS4403' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!DVM$ PARALLEL (I) ON A(I,1,1,1), CONSISTENT(W(I)) + DO I = 1, N + W(I) = A(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + DO I = 1, N + IF(W(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons4404 +C consistent arrays with 1 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS4404 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:),C(:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N),C(N)) + tname='CONS4404' + DO I = 1, N + C(I)=I+(N-1)+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (I) ON B(I,1,1,1), CONSISTENT(V(I)) + DO I = 1, N + V(I) = B(I,1,1,1) + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO I = 1, N + IF(V(I) .NE. C(I)) THEN + IERR = C(I) + EXIT + ENDIF + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons4405 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array + subroutine CONS4405 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS4405' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons4406 +C consistent arrays with 2 dimensions +C two consistent arrays and one distributed array + subroutine CONS4406 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:),W(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS4406' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons4407 +C consistent arrays with 2 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS4407 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:),W(:,:) + *,C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N),W(N,N),C(N,N)) + tname='CONS4407' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON A(I,J,1,1), CONSISTENT(W(I,J)) + DO J = 1, N + DO I = 1, N + W(I,J) = A(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + DO J = 1, N + DO I = 1, N + IF(W(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons4408 +C consistent arrays with 2 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS4408 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:),C(:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N),C(N,N)) + tname='CONS4408' + DO J = 1, N + DO I = 1, N + C(I,J)=I+(N-1)*J+(N-1)*(N-1)+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (J,I) ON B(I,J,1,1), CONSISTENT(V(I,J)) + DO J = 1, N + DO I = 1, N + V(I,J) = B(I,J,1,1) + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO J = 1, N + DO I = 1, N + IF(V(I,J) .NE. C(I,J)) THEN + IERR = C(I,J) + EXIT + ENDIF + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons4409 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array + subroutine CONS4409 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS4409' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons4410 +C consistent arrays with 3 dimensions +C two consistent arrays and one distributed array + subroutine CONS4410 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),W(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS4410' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons4411 +C consistent arrays with 3 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS4411 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:),W(:,:,:) + *,C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N),W(N,N,N),C(N,N,N)) + tname='CONS4411' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON A(I,J,K,1), CONSISTENT(W(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K) = A(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons4412 +C consistent arrays with 3 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS4412 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:),C(:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N),C(N,N,N)) + tname='CONS4412' + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1) + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (K,J,I) ON B(I,J,K,1), CONSISTENT(V(I,J,K)) + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K) = B(I,J,K,1) + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K) .NE. C(I,J,K)) THEN + IERR = C(I,J,K) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons4413 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array + subroutine CONS4413 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS4413' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END +C ---------------------------------------------cons4414 +C consistent arrays with 4 dimensions +C two consistent arrays and one distributed array + subroutine CONS4414 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),W(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS4414' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, W, C) + END +C ---------------------------------------------cons4415 +C consistent arrays with 4 dimensions +C two consistent arrays and two distributed arrays + subroutine CONS4415 + INTEGER,PARAMETER:: N=8, ER=10000 + integer,allocatable::B(:,:,:,:),A(:,:,:,:),V(:,:,:,:),W(:,:,:,:) + *,C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: A +!DVM$ CONSISTENT V +!DVM$ CONSISTENT W + allocate (B(N,N,N,N),A(N,N,N,N),V(N,N,N,N),W(N,N,N,N),C(N,N,N,N)) + tname='CONS4415' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + A(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON A(I,J,K,L), CONSISTENT(W(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + W(I,J,K,L)=A(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V, W) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(W(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, A, V, W, C) + END +C ---------------------------------------------cons4416 +C consistent arrays with 4 dimensions +C one consistent array and one distributed array +C big data + subroutine CONS4416 + INTEGER,PARAMETER:: N=16, ER=1000000 + integer,allocatable:: B(:,:,:,:),V(:,:,:,:),C(:,:,:,:) + character*8 tname + INTEGER ERROR,IERR +!DVM$ DISTRIBUTE ( BLOCK, BLOCK, BLOCK, BLOCK ) :: B +!DVM$ CONSISTENT V + allocate (B(N,N,N,N),V(N,N,N,N),C(N,N,N,N)) + tname='CONS4416' + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + C(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ region +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + B(I,J,K,L)=I+(N-1)*J+(N-1)*(N-1)*K+(N-1)*(N-1)*(N-1)*L + ENDDO + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), CONSISTENT(V(I,J,K,L)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + V(I,J,K,L)=B(I,J,K,L) + ENDDO + ENDDO + ENDDO + ENDDO +!dvm$ end region +!dvm$ get_actual (V) + IERR = ER + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + IF(V(I,J,K,L) .NE. C(I,J,K,L)) THEN + IERR = C(I,J,K,L) + EXIT + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ERROR = ER +!DVM$ PARALLEL (L,K,J,I) ON B(I,J,K,L), REDUCTION(MIN(ERROR)) + DO L = 1, N + DO K = 1, N + DO J = 1, N + DO I = 1, N + ERROR = MIN(ERROR,IERR) + ENDDO + ENDDO + ENDDO + ENDDO + IF(ERROR .EQ. ER) THEN + call ansyes(tname) + ELSE + call ansno(tname) + ENDIF + deallocate (B, V, C) + END + +C -------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr1.fdv new file mode 100644 index 0000000..bb52d04 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr1.fdv @@ -0,0 +1,350 @@ + program DISTR1 + +c TESTING distribute and redistribute CLAUSE . + + print *,'===START OF distr1========================' +C -------------------------------------------------- +c 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*] + call distr11 +C -------------------------------------------------- +c 12 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] + call distr12 +C -------------------------------------------------- +c 13 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*] small array + call distr13 +C -------------------------------------------------- +c 14 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] small array + call distr14 +C -------------------------------------------------- +c 21 DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][ BLOCK] + call distr21 +C -------------------------------------------------- +c 22 DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[*][*] + call distr22 +C -------------------------------------------------- +c 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][ BLOCK] + call distr23 +C ------------------------------------------------- +C +C + print *,'=== END OF distr1 ========================= ' + end + +C ----------------------------------------------------distr11 +c 11 DISTR arrA1[BLOCK] REDISTR arrA1[*] + subroutine distr11 + integer, parameter :: AN1=8,NL=1000,ER=10000 + integer :: erri= ER, i + integer, allocatable :: A1(:) + character(9) :: tname = 'distr11' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + + end +C ---------------------------------------------distr12 +c 12 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] + subroutine distr12 + integer, parameter :: AN1=8,NL=1000,ER=10000 + integer :: erri= ER,i + integer, allocatable :: A1(:) + character(9), parameter :: tname='distr12' + +!dvm$ distribute A1(*) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +c !dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ----------------------------------------------------distr13 +c 13 DISTR arrA1[BLOCK] REDISTR arrA1[*] small array + subroutine distr13 + integer, parameter :: AN1=5,NL=1000,ER=10000 + integer :: erri= ER,i + integer, allocatable :: A1(:) + character(*), parameter :: tname='distr13 ' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ---------------------------------------------distr14 +c 14 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] small array + subroutine distr14 + integer, parameter :: AN1=5,NL=1000,ER=10000 + integer :: erri=ER,i + integer, allocatable :: A1(:) + character(9) :: tname='distr14' + +!dvm$ distribute A1(*) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +c !dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ----------------------------------------------------distr21 +c 21 DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][ BLOCK] + subroutine distr21 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri=ER,i + integer, allocatable :: A2(:,:) + character(9), parameter :: tname='distr21' + +!dvm$ distribute A2(BLOCK,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end + +C ----------------------------------------------------distr22 +c 22 DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[*][*] + subroutine distr22 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri=ER,i + integer, allocatable :: A2(:,:) + character(9) :: tname='distr22' + +!dvm$ distribute A2(*,BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end + +C ----------------------------------------------------distr23 +c 23 DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][ BLOCK] + subroutine distr23 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri=ER,i + integer, allocatable :: A2(:,:) + character(9) :: tname='distr23' + +!dvm$ distribute A2(*,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +c *dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ redistribute A2(*,BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr2.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr2.fdv new file mode 100644 index 0000000..35161b5 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr2.fdv @@ -0,0 +1,303 @@ + program DISTR2 + +c TESTING distr CLAUSE . + + print *,'===START OF distr2========================' +C ------------------------------------------------- +c 24 DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[*][*] + call distr24 +C ------------------------------------------------- +c 32 DISTRIBUTE arrA3[BLOCK][*][ BLOCK] REDISTRIBUTE arrA3[*][BLOCK][BLOCK] + call distr32 +C ------------------------------------------------- +c 33 DISTRIBUTE arrA3[BLOCK][*][ BLOCK] REDISTRIBUTE arrA3[*][BLOCK][*] + call distr33 +C ------------------------------------------------- +c 41 DISTRIBUTE arrA4[*][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + call distr41 +C ------------------------------------------------- +c 42 DISTRIBUTE arrA4[BLOCK][*][BLOCK][*] REDISTRIBUTE arrA4[*][BLOCK][BLOCK][*] + call distr42 +C ------------------------------------------------- +C +C + print *,'=== END OF distr2 ========================= ' + end + + +C ----------------------------------------------------distr24 +c 24 DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[*][*] + subroutine distr24 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,ia,ja,ib,jb + integer, allocatable :: A2(:,:) + character(9) :: tname = 'distr24' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end + +C ----------------------------------------------------distr32 +c 32 DISTRIBUTE arrA3[BLOCK] [][ BLOCK] REDISTRIBUTE arrA3[] [BLOCK][BLOCK] + subroutine distr32 + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,ia,ja,na,ib,jb,nb + integer, allocatable :: A3(:,:,:) + character(9) :: tname = 'distr32' + +!dvm$ distribute A3(BLOCK,*,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,BLOCK,BLOCK) +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) .eq.(i*NL/10 + j*NL/100 + n)) then + else + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distr33 +c 33 DISTRIBUTE arrA3[BLOCK] [][ BLOCK] REDISTRIBUTE arrA3[] [BLOCK][BLOCK] + subroutine distr33 + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,ia,ja,na,ib,jb,nb + integer, allocatable :: A3(:,:,:) + character(9) :: tname = 'distr33' + +!dvm$ distribute A3(BLOCK,*,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,BLOCK,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) .eq.(i*NL/10 + j*NL/100 + n)) then + else + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distr41 +c 41 DISTRIBUTE arrA4[*][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + subroutine distr41 + integer, parameter :: AN1=8,AN2=8,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A4(:,:,:,:) + character(9) :: tname = 'distr41' + +!dvm$ distribute A4(*,*,BLOCK,BLOCK) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,*,*,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) .eq.(i*NL/10+j*NL/100+n*NL/1000+m)) then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end + + +C ----------------------------------------------------distr42 +c 42 DISTRIBUTE arrA4[BLOCK][*][BLOCK][*] REDISTRIBUTE arrA4[*][BLOCK][BLOCK][*] + subroutine distr42 + integer, parameter :: AN1=8,AN2=8,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A4(:,:,:,:) + character(9) :: tname = 'distr42' + +!dvm$ distribute A4(BLOCK,*,BLOCK,*) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,BLOCK,BLOCK,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) .eq.(i*NL/10+j*NL/100+n*NL/1000+m)) then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr3.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr3.fdv new file mode 100644 index 0000000..4120c7a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr3.fdv @@ -0,0 +1,136 @@ + program DISTR3 + +c TESTING distr CLAUSE . + + print *,'===START OF distr3========================' +C ------------------------------------------------- +c 31 DISTRIBUTE arrA3[BLOCK][BLOCK][ BLOCK] REDISTRIBUTE arrA3[*][*][*] + call distr31 +C ------------------------------------------------- +c 43 DISTRIBUTE arrA4[BLOCK][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][*] + call distr43 +C ------------------------------------------------- +C + print *,'=== END OF distr3 ========================= ' + end + + +C ----------------------------------------------------distr31 +c 31 DISTRIBUTE arrA3[BLOCK][BLOCK][ BLOCK] REDISTRIBUTE arrA3[*][*][*] + subroutine distr31 + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri = ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A3(:,:,:) + character(9) :: tname = 'distr31' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,*) +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) .eq.(i*NL/10 + j*NL/100 + n)) then + else + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distr43 +c 43 DISTRIBUTE arrA4[BLOCK][*][BLOCK][BLOCK] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][*] + subroutine distr43 + integer, parameter :: AN1=8,AN2=8,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A4(:,:,:,:) + character(9), parameter :: tname = 'distr43' + +!dvm$ distribute A4(BLOCK,*,BLOCK,BLOCK) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(BLOCK,BLOCK,BLOCK,*) +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) .eq.(i*NL/10+j*NL/100+n*NL/1000+m)) then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr4.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr4.fdv new file mode 100644 index 0000000..59d7d50 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distr4.fdv @@ -0,0 +1,251 @@ + program DISTR4 + +c TESTING distr CLAUSE . + + print *,'===START OF distr4========================' +C ------------------------------------------------- +c 44 DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] + call distr44 +C ------------------------------------------------- +c 45 DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + call distr45 +C ------------------------------------------------- +c 46 DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] +c small array + call distr46 +C ------------------------------------------------- +c 47 DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] +c small array + call distr47 +C ------------------------------------------------- +C + print *,'=== END OF distr4 ========================= ' + end + + +C ----------------------------------------------------distr44 +c 44 DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] + subroutine distr44 + integer, parameter :: AN1=8,AN2=8,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A4(:,:,:,:) + character(9), parameter :: tname = 'distr44' + +!dvm$ distribute A4(*,*,*,*) +!dvm$ dynamic A4 + + allocate ( A4(AN1,AN2,AN3,AN4)) + +c *dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ redistribute A4(BLOCK,BLOCK,BLOCK,BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) .eq.(i*NL/10+j*NL/100+n*NL/1000+m)) then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A4) + + end + +C ----------------------------------------------------distr45 +c 45 DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + subroutine distr45 + integer, parameter :: AN1=8,AN2=8,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A4(:,:,:,:) + character(9), parameter :: tname = 'distr45' + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ dynamic A4 + + allocate ( A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,*,*,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) .eq.(i*NL/10+j*NL/100+n*NL/1000+m)) then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A4) + + end + +C ----------------------------------------------------distr46 +c 46 DISTRIBUTE arrA4[*][*][*][*] REDISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] + subroutine distr46 + integer, parameter :: AN1=5,AN2=4,AN3=3,AN4=2,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A4(:,:,:,:) + character(9), parameter :: tname = 'distr46' + +!dvm$ distribute A4(*,*,*,*) +!dvm$ dynamic A4 + + allocate ( A4(AN1,AN2,AN3,AN4)) + +c *dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ redistribute A4(BLOCK,BLOCK,BLOCK,BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) .eq.(i*NL/10+j*NL/100+n*NL/1000+m)) then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A4) + + end + +C ----------------------------------------------------distr47 +c 47 DISTRIBUTE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + subroutine distr47 + integer, parameter :: AN1=1,AN2=2,AN3=3,AN4=4,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + integer, allocatable :: A4(:,:,:,:) + character(9), parameter :: tname = 'distr47' + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ dynamic A4 + + allocate ( A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,*,*,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) .eq.(i*NL/10+j*NL/100+n*NL/1000+m)) then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A4) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distrfloat1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distrfloat1.fdv new file mode 100644 index 0000000..694873a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR/distrfloat1.fdv @@ -0,0 +1,352 @@ + program DISTRFLOAT1 + +c TESTING distribute and redistribute CLAUSE . + + print *, '===START OF distrfloat1==================' +C -------------------------------------------------- +c 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*] + call distrf11 +C -------------------------------------------------- +c 12 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] +c call distr12 +C -------------------------------------------------- +c 13 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[*] small array + call distrf13 +C -------------------------------------------------- +c 14 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] small array +c call distrf14 +C -------------------------------------------------- +c 21 DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][ BLOCK] + call distrf21 +C -------------------------------------------------- +c 22 DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[*][*] +c call distrf22 +C -------------------------------------------------- +c 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][ BLOCK] + call distrf23 +C ------------------------------------------------- +C + print *, '=== END OF distrfloat1 ==================' +C + end + +C ----------------------------------------------------distrf11 +c 11 DISTR arrA1[BLOCK] REDISTR arrA1[*] + subroutine distrf11 + integer, parameter :: AN1=8,NL=1000,ER=10000 + integer :: erri= ER,i + real, allocatable :: A1(:) + character(10) :: tname = 'distrf11' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ---------------------------------------------distrf12 +c 12 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] + subroutine distrf12 + integer, parameter :: AN1=8,NL=1000,ER=10000 + integer :: erri= ER,i + real*8, allocatable :: A1(:) + character(10) :: tname = 'distrf12' + +!dvm$ distribute A1(*) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +c *dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + + end +C ----------------------------------------------------distrf13 +c 13 DISTR arrA1[BLOCK] REDISTR arrA1[*] small array + subroutine distrf13 + integer, parameter :: AN1=5,NL=1000,ER=10000 + integer :: erri= ER,i + complex, allocatable :: A1(:) + character(10) :: tname = 'distrf13' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ---------------------------------------------distrf14 +c 14 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[BLOCK] small array + subroutine distrf14 + integer, parameter :: AN1=5,NL=1000,ER=10000 + integer :: erri= ER,i + complex*16, allocatable :: A1(:) + character(10), parameter :: tname = 'distrf14' + +!dvm$ distribute A1(*) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +c *dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ----------------------------------------------------distrf21 +c 21 DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][ BLOCK] + subroutine distrf21 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i + real, allocatable :: A2(:,:) + character(10), parameter :: tname = 'distrf21' + +!dvm$ distribute A2(BLOCK,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end + +C ----------------------------------------------------distrf22 +c 22 DISTRIBUTE arrA2[*][BLOCK] REDISTRIBUTE arrA2[*][*] + subroutine distrf22 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i + real*8, allocatable :: A2(:,:) + character(10), parameter :: tname = 'distrf22' + +!dvm$ distribute A2(*,BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end + +C ----------------------------------------------------distrf23 +c 23 DISTRIBUTE arrA2[BLOCK][*] REDISTRIBUTE arrA2[*][ BLOCK] + subroutine distrf23 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i + complex, allocatable :: A2(:,:) + character(10), parameter :: tname = 'distrf23' + +!dvm$ distribute A2(*,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +c *dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ redistribute A2(*,BLOCK) + +!dvm$ actual(erri) +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .eq.(i*NL+j)) then + else + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen1.fdv new file mode 100644 index 0000000..c89bf3e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen1.fdv @@ -0,0 +1,979 @@ + program DISTRGEN1 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! GEN_BLOCK, BLOCK, * distributions + + integer nproc + number_of_processors()=1 + + print *,'===START OF distrgen1 ========================' + + nproc = number_of_processors() + + if (nproc > 4 ) then ! may be temporary + goto 1 + endif + +C -------------------------------------------------- +c 11 DISTRIBUTE arrA1 [GEN_BLOCK] +c REDISTRIBUTE arrA1[BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] + call distrg11 (nproc) +C -------------------------------------------------- +c 12 DISTRIBUTE arrA1[BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[BLOCK] + call distrg12 (nproc) +C -------------------------------------------------- +c 13 DISTRIBUTE arrA1 [GEN_BLOCK] +c REDISTRIBUTE arrA1[*] +c REDISTRIBUTE arrA1[GEN_BLOCK] + call distrg13 (nproc) +C -------------------------------------------------- +c 14 DISTRIBUTE arrA1[*] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[*] + call distrg14 (nproc) +C -------------------------------------------------- +c 15 DISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] + call distrg15 (nproc) +C -------------------------------------------------- +c 151 DISTRIBUTE arrA1[GEN_BLOCK] +c with 0 in BS.1 +c REDISTRIBUTE arrA1[GEN_BLOCK] + call distrg151 (nproc) +C -------------------------------------------------- +c 152 DISTRIBUTE arrA1[GEN_BLOCK] +c with 0 in BS.2 +c REDISTRIBUTE arrA1[GEN_BLOCK] + call distrg152 (nproc) +C -------------------------------------------------- +c 21 DISTRIBUTE arrA2[BLOCK][*] +c REDISTRIBUTE arrA2[*][GEN_BLOCK] + call distrg21 (nproc) +C -------------------------------------------------- +c 22 DISTRIBUTE arrA2[*][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][*] + call distrg22 (nproc) +C -------------------------------------------------- +c 23 DISTRIBUTE arrA2[*][GEN_BLOCK] +c REDISTRIBUTE arrA2[*][*] + call distrg23 (nproc) +C -------------------------------------------------- +c 24 DISTRIBUTE arrA2[*][*] +c REDISTRIBUTE arrA2[GEN_BLOCK][*] + call distrg24 (nproc) +C ------------------------------------------------- + + 1 print *,'=== END OF distrgen1 ========================= ' + + end + +C ----------------------------------------------------distrg11 +c 11 DISTRIBUTE arrA1 [GEN_BLOCK] +c REDISTRIBUTE arrA1[BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] + + subroutine distrg11 (nproc) + integer, parameter :: AN1=16,ER=10000 + integer :: erri= ER, i + + integer :: BS11(1) = (/16/) + integer :: BS12(1) = (/16/) + integer :: BS21(2) = (/6,10/) + integer :: BS22(2) = (/8,8/) + integer :: BS31(3) = (/3,7,6/) + integer :: BS32(3) = (/4,5,7/) + integer :: BS41(4) = (/3,4,8,1/) + integer :: BS42(4) = (/4,4,5,3/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrg11 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS1)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS11)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS21)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS31)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS41)) + case default + goto 10 + endselect + + A1 = 5 + +!dvm$ actual(A1) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + i + enddo +!dvm$ end region + +!dvm$ redistribute A1(BLOCK) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + 2 + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS2)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS12)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS22)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS32)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= (i+7)) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrg11 + +C ----------------------------------------------------distrg12 +c 12 DISTRIBUTE arrA1[BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[BLOCK] + + subroutine distrg12 (nproc) + integer nproc + + integer, parameter :: AN1=14,ER=10000 + integer :: erri= ER, i + + integer :: BS1(1) = (/14/) + integer :: BS2(2) = (/6,8/) + integer :: BS3(3) = (/3,5,6/) + integer :: BS4(4) = (/4,3,5,2/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrg12 ' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region inout (A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS1)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS2)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS3)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS4)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + 2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + A1(i) = A1(i) - 2 + if (A1(i) /= i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrg12 + +C ----------------------------------------------------distrg13 +c 13 DISTRIBUTE arrA1 [GEN_BLOCK] +c REDISTRIBUTE arrA1[*] +c REDISTRIBUTE arrA1[GEN_BLOCK] + + subroutine distrg13 (nproc) + integer, parameter :: AN1=24,ER=10000 + integer :: erri= ER, i + + integer :: BS11(1) = (/24/) + integer :: BS12(1) = (/24/) + integer :: BS21(2) = (/3,21/) + integer :: BS22(2) = (/17,7/) + integer :: BS31(3) = (/13,1,10/) + integer :: BS32(3) = (/4,12,8/) + integer :: BS41(4) = (/5,7,3,9/) + integer :: BS42(4) = (/10,1,12,1/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrg13 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS1)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS11)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS21)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS31)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS41)) + case default + goto 10 + endselect + + A1 = 3 + +!dvm$ actual(A1) + +!dvm$ region inout(A1(:AN1)) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i)*i + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ region inout(A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i)*2 + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS2)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS12)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS22)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS32)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region inlocal(A1) +!dvm$ parallel (i) on A1(i), reduction( min(erri) ) + do i=1,AN1 + if (A1(i) /= (i*6)) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrg13 + +C ---------------------------------------------distrg14 +c 14 DISTRIBUTE arrA1[*] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[*] + + subroutine distrg14 (nproc) + integer nproc + integer, parameter :: AN1=13,ER=10000 + integer :: erri= ER, i + + integer :: BS1(1) = (/13/) + integer :: BS2(2) = (/6,7/) + integer :: BS3(3) = (/2,1,10/) + integer :: BS4(4) = (/4,3,5,1/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrg14 ' + +!dvm$ distribute A1(*) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + + A1 = 4 + +!dvm$ actual(A1) + +!dvm$ region inout(A1(1:AN1)) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =A1(i)+i + enddo +!dvm$ end region + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS1)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS2)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS3)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS4)) + case default + goto 10 + endselect + +!dvm$ region inout (A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) - 2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + A1(i) = A1(i) - 2 + if (A1(i) /= (i)) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end + +C ---------------------------------------------distrg15 +c 15 DISTRIBUTE arrA1[GEN_BLOCK] different BS1 and BS2 +c REDISTRIBUTE arrA1[GEN_BLOCK] + + subroutine distrg15 (nproc) + integer, parameter :: AN1=15,ER=10000 + integer :: erri= ER, i + + integer :: BS11(1) = (/15/) + integer :: BS12(1) = (/15/) + integer :: BS21(2) = (/5,10/) + integer :: BS22(2) = (/8,7/) + integer :: BS31(3) = (/2,7,6/) + integer :: BS32(3) = (/4,4,7/) + integer :: BS41(4) = (/3,4,7,1/) + integer :: BS42(4) = (/4,4,5,2/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrg15 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS1)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS11)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS21)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS31)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS41)) + case default + goto 10 + endselect + +!dvm$ region inout (A1(1:5), A1(6:AN1)) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i*4 + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS2)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS12)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS22)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS32)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region in(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i*4) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrg15 + +C ---------------------------------------------distrg151 +c 151 DISTRIBUTE arrA1[GEN_BLOCK] +c with 0 in BS.1 +c REDISTRIBUTE arrA1[GEN_BLOCK] + + subroutine distrg151 (nproc) + integer, parameter :: AN1=9,ER=10000 + integer :: erri= ER, i + + integer :: BS11(1) = (/9/) ! (/0/) causes RTS err 036.027 + integer :: BS12(1) = (/9/) + integer :: BS21(2) = (/0,9/) + integer :: BS22(2) = (/8,1/) + integer :: BS31(3) = (/2,0,7/) + integer :: BS32(3) = (/3,5,1/) + integer :: BS41(4) = (/3,4,2,0/) + integer :: BS42(4) = (/4,3,1,1/) + + integer, allocatable :: A1(:) + character(10), parameter :: tname='distrg151 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS1)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS11)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS21)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS31)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS41)) + case default + goto 10 + endselect + +!dvm$ region in(A1), out(A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i*6 + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS2)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS12)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS22)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS32)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region inlocal (A1(1:AN1)) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i*6) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrg151 + +C ---------------------------------------------distrg152 +c 152 DISTRIBUTE arrA1[GEN_BLOCK] +c with 0 in BS.2 +c REDISTRIBUTE arrA1[GEN_BLOCK] + + subroutine distrg152 (nproc) + integer, parameter :: AN1=10,ER=10000 + integer :: erri= ER, i + + integer :: BS11(1) = (/10/) + integer :: BS12(1) = (/10/) ! (/0/) causes RTS err 036.027 + integer :: BS21(2) = (/1,9/) + integer :: BS22(2) = (/10,0/) + integer :: BS31(3) = (/2,1,7/) + integer :: BS32(3) = (/3,7,0/) + integer :: BS41(4) = (/3,4,2,1/) + integer :: BS42(4) = (/4,3,0,3/) + + integer, allocatable :: A1(:) + character(10), parameter :: tname='distrg152 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS1)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS11)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS21)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS31)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i*2 + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS2)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS12)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS22)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS32)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i*2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrg152 + +C ----------------------------------------------------distrg21 +c 21 DISTRIBUTE arrA2[BLOCK][*] +c REDISTRIBUTE arrA2[*][GEN_BLOCK] + + subroutine distrg21 (nproc) + integer nproc + + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER, i + + integer :: BSj1(1) = (/8/) + integer :: BSj2(2) = (/6,2/) + integer :: BSj3(3) = (/2,5,1/) + integer :: BSj4(4) = (/2,3,1,2/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrg21 ' + +!dvm$ distribute A2(BLOCK,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region inout(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + + select case(nproc) + case(1) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg21 + +C ----------------------------------------------------distrg22 +c 22 DISTRIBUTE arrA2[*][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][*] + + subroutine distrg22 (nproc) + integer nproc + integer, parameter :: AN1=7,AN2=12,NL=1000,ER=10000 + integer :: erri= ER, i + + integer :: BSi1(1) = (/7/) + integer :: BSi2(2) = (/6,1/) + integer :: BSi3(3) = (/2,4,1/) + integer :: BSi4(4) = (/2,2,1,2/) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrg22 ' + +!dvm$ distribute A2(*,BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =2*i*NL+j + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),*) + + select case(nproc) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1), * ) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2), * ) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3), * ) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4), * ) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region inlocal(A1) +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (2*i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg22 + +C ----------------------------------------------------distr23 +c 23 DISTRIBUTE arrA2[*][GEN_BLOCK] +c REDISTRIBUTE arrA2[*][*] + + subroutine distrg23 (nproc) + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER, i + + integer :: BSj1(1) = (/8/) + integer :: BSj2(2) = (/6,2/) + integer :: BSj3(3) = (/2,2,4/) + integer :: BSj4(4) = (/1,2,2,3/) + + integer, allocatable :: A2(:,:) + character(10) :: tname='distrg23 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(*,GEN_BLOCK(BSj)) + + select case(nproc) + case(1) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(*, GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + +!dvm$ region in(A2), out(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =3*i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual(erri) + +!dvm$ region in(A2), local(A2) +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (3*i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg23 + +C ----------------------------------------------------distrg24 +c 24 DISTRIBUTE arrA2[*][*] +c REDISTRIBUTE arrA2[GEN_BLOCK][*] + subroutine distrg24 (nproc) + integer, parameter :: AN1=6,AN2=24,NL=1000,ER=10000 + + integer :: erri= ER, i + + integer :: BSi1(1) = (/6/) + integer :: BSi2(2) = (/5,1/) + integer :: BSi3(3) = (/2,3,1/) + integer :: BSi4(4) = (/2,1,1,2/) + + integer, allocatable :: A2(:,:) + character(10) :: tname='distrg24 ' + +!dvm$ distribute A2(*,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BS1),*) + + select case(nproc) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),*) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),*) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),*) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),*) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region inout(A2) +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg24 + +C ------------------------------------------------- + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen2.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen2.fdv new file mode 100644 index 0000000..605a696 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen2.fdv @@ -0,0 +1,1036 @@ + program DISTRG2 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! GEN_BLOCK, BLOCK, * distributions + + integer PROCESSORS_RANK, PROCESSORS_SIZE + integer psize(2), rank + + PROCESSORS_RANK() = 2 + PROCESSORS_SIZE(i) = 1 + + print *,'===START OF distrgen2========================' + + rank = PROCESSORS_RANK() + + do i=1,rank + psize(i)=PROCESSORS_SIZE(i) + if (psize(i) > 4) then !may be temporary + goto 1 + endif + enddo + +C ------------------------------------------------- +c 25 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] other blocks + call distrg25 (psize) +C ------------------------------------------------- +c 26 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[BLOCK][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + call distrg26 (psize) +C ------------------------------------------------- +c 27 DISTRIBUTE arrA2[GEN_BLOCK][BLOCK] +c REDISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + call distrg27 (psize) +C ------------------------------------------------- +c 28 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[BLOCK][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + call distrg28 (psize) +C ------------------------------------------------- +c 29 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[*][*] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + call distrg29 (psize) +C ------------------------------------------------- +c 210 DISTRIBUTE arrA2[GEN_BLOCK][*] +c REDISTRIBUTE arrA2[*][*] +c REDISTRIBUTE arrA2[*][GEN_BLOCK] + call distrg210 (psize) +C ---------------------------------------------------- + + 1 print *,'=== END OF distrgen2 ========================= ' + + end + +C ----------------------------------------------------distrg25 +c 25 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] other blocks + + subroutine distrg25 (psize) + integer psize(2) + + integer, parameter :: AN1=10,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, dimension(1) :: BSi11=(/10/) + integer, dimension(1) :: BSi12=(/10/) + integer, dimension(2) :: BSi21=(/5,5/) + integer, dimension(2) :: BSi22=(/6,4/) + integer, dimension(3) :: BSi31=(/2,3,5/) + integer, dimension(3) :: BSi32=(/8,1,1/) + integer, dimension(4) :: BSi41=(/2,3,4,1/) + integer, dimension(4) :: BSi42=(/2,1,3,4/) + + integer, dimension(1) :: BSj11=(/12/) + integer, dimension(1) :: BSj12=(/12/) + integer, dimension(2) :: BSj21=(/7,5/) + integer, dimension(2) :: BSj22=(/5,7/) + integer, dimension(3) :: BSj31=(/5,6,1/) + integer, dimension(3) :: BSj32=(/2,6,4/) + integer, dimension(4) :: BSj41=(/1,4,2,5/) + integer, dimension(4) :: BSj42=(/2,4,4,2/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrg25 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + + A2 = 1 + +!dvm$ actual(A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j)+ i*NL+j + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .ne.(i*NL+j) + 1) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg25 + +C ----------------------------------------------------distrg26 +c 26 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[BLOCK][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + + subroutine distrg26 (psize) + integer psize(2) + + integer, parameter :: AN1=16,AN2=16,NL=1000,ER=10000 + integer :: erri= ER,i + + integer, dimension(1) :: BSi11=(/16/) + integer, dimension(1) :: BSi12=(/16/) + integer, dimension(2) :: BSi21=(/5,11/) + integer, dimension(2) :: BSi22=(/10,6/) + integer, dimension(3) :: BSi31=(/6,3,7/) + integer, dimension(3) :: BSi32=(/8,4,4/) + integer, dimension(4) :: BSi41=(/4,3,4,5/) + integer, dimension(4) :: BSi42=(/2,5,3,6/) + + integer, dimension(1) :: BSj11=(/16/) + integer, dimension(1) :: BSj12=(/16/) + integer, dimension(2) :: BSj21=(/7,9/) + integer, dimension(2) :: BSj22=(/10,6/) + integer, dimension(3) :: BSj31=(/5,6,5/) + integer, dimension(3) :: BSj32=(/6,6,4/) + integer, dimension(4) :: BSj41=(/1,8,2,5/) + integer, dimension(4) :: BSj42=(/4,4,4,4/) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrg26 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region out(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK,BLOCK) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) + 1 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region in(A2), local(A2) +!dvm$ parallel (i,j) on A2(i,j), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) - 1 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg26 + +C ----------------------------------------------------distrg27 +c 27 DISTRIBUTE arrA2[GEN_BLOCK][BLOCK] +c REDISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + + subroutine distrg27 (psize) + integer psize(2) + + integer, parameter :: AN1=11,AN2=15,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, dimension(1) :: BSi11=(/11/) + integer, dimension(1) :: BSi12=(/11/) + integer, dimension(2) :: BSi21=(/6,5/) + integer, dimension(2) :: BSi22=(/7,4/) + integer, dimension(3) :: BSi31=(/4,3,4/) + integer, dimension(3) :: BSi32=(/8,2,1/) + integer, dimension(4) :: BSi41=(/3,3,4,1/) + integer, dimension(4) :: BSi42=(/2,2,3,4/) + + integer, dimension(1) :: BSj11=(/15/) + integer, dimension(1) :: BSj12=(/15/) + integer, dimension(2) :: BSj21=(/10,5/) + integer, dimension(2) :: BSj22=(/8,7/) + integer, dimension(3) :: BSj31=(/5,6,4/) + integer, dimension(3) :: BSj32=(/2,7,8/) + integer, dimension(4) :: BSj41=(/4,4,2,5/) + integer, dimension(4) :: BSj42=(/2,3,7,4/) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrg27 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi1),BLOCK) + + select case(psize(1)) + + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),BLOCK) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),BLOCK) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),BLOCK) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),BLOCK) + case default + goto 10 + endselect + + A2 = 5 + +!dvm$ actual(A2) + +!dvm$ region inout (A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j)+ i*NL+j + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj1)) + + select case(psize(2)) + + case(1) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) * 2 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi2),BLOCK) + + select case(psize(1)) + + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),BLOCK) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),BLOCK) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),BLOCK) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),BLOCK) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region in(A2), local(A2) +!dvm$ parallel (i,j) on A2(i,j), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) / 2 + if (A2(i,j) /= (i*NL+j+5)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg27 + +C ----------------------------------------------------distrg28 +c 28 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[BLOCK][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + + subroutine distrg28 (psize) + integer psize(2) + + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, dimension(1) :: BSi1=(/8/) + integer, dimension(2) :: BSi2=(/6,2/) + integer, dimension(3) :: BSi3=(/3,3,2/) + integer, dimension(4) :: BSi4=(/2,2,2,2/) + + integer, dimension(1) :: BSj1=(/8/) + integer, dimension(2) :: BSj2=(/4,4/) + integer, dimension(3) :: BSj3=(/5,1,2/) + integer, dimension(4) :: BSj4=(/2,1,2,3/) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrg28 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj1)) + + select case(psize(2)) + + case(1) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(BLOCK, GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + +!dvm$ region out(A2(1:AN1, 1:AN2)) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK, BLOCK) + +!dvm$ region inout(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) + 5 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi2),BLOCK) + + select case(psize(1)) + + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),BLOCK) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),BLOCK) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),BLOCK) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),BLOCK) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) - 5 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg28 + +C ----------------------------------------------------distrg29 +c 29 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[*][*] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + + subroutine distrg29 (psize) + integer psize(2) + + integer, parameter :: AN1=10,AN2=14,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, dimension(1) :: BSi11=(/10/) + integer, dimension(1) :: BSi12=(/10/) + integer, dimension(2) :: BSi21=(/5,5/) + integer, dimension(2) :: BSi22=(/6,4/) + integer, dimension(3) :: BSi31=(/2,3,5/) + integer, dimension(3) :: BSi32=(/8,1,1/) + integer, dimension(4) :: BSi41=(/2,3,4,1/) + integer, dimension(4) :: BSi42=(/2,1,3,4/) + + integer, dimension(1) :: BSj11=(/14/) + integer, dimension(1) :: BSj12=(/14/) + integer, dimension(2) :: BSj21=(/7,7/) + integer, dimension(2) :: BSj22=(/5,9/) + integer, dimension(3) :: BSj31=(/5,6,3/) + integer, dimension(3) :: BSj32=(/2,6,6/) + integer, dimension(4) :: BSj41=(/3,4,2,5/) + integer, dimension(4) :: BSj42=(/4,4,5,1/) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrg29 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi1), GEN_BLOCK(BSj1)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region out (A2(1:AN1, 1:4)), out(A2(1:AN1, 5:AN2)) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ region in(A2), out (A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) * 3 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) / 3 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg29 + +C ----------------------------------------------------distrg210 +c 210 DISTRIBUTE arrA2[GEN_BLOCK][*] +c REDISTRIBUTE arrA2[*][*] +c REDISTRIBUTE arrA2[*][GEN_BLOCK] + + subroutine distrg210 (psize) + integer psize(2) + + integer, parameter :: AN1=8,AN2=6,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, dimension(1) :: BSi1=(/8/) + integer, dimension(2) :: BSi2=(/6,2/) + integer, dimension(3) :: BSi3=(/3,3,2/) + integer, dimension(4) :: BSi4=(/1,2,2,3/) + + integer, dimension(1) :: BSj1=(/6/) + integer, dimension(2) :: BSj2=(/2,4/) + integer, dimension(3) :: BSj3=(/4,1,1/) + integer, dimension(4) :: BSj4=(/2,1,2,1/) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrg210 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi1),*) + + select case(psize(1)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),*) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),*) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),*) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),*) + case default + goto 10 + endselect + +!dvm$ region out (A2(1:3, 1:AN2), A2(4:AN1, 1:AN2)) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) * 3 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(*,GEN_BLOCK(BSj2)) + + select case(psize(1)) ! it's true - psize(1)) + case(1) +!dvm$ redistribute A2(*,GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(*,GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(*,GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(*,GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region inlocal (A2) +!dvm$ parallel (i,j) on A2(i,j), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) / 3 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrg210 + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen3.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen3.fdv new file mode 100644 index 0000000..b1bb4b7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_GEN/distrgen3.fdv @@ -0,0 +1,2855 @@ + program DISTRG3 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! GEN_BLOCK, BLOCK, * distributions + + integer PROCESSORS_RANK, PROCESSORS_SIZE + integer psize(3), rank + + PROCESSORS_RANK() = 3 + PROCESSORS_SIZE(i) = 1 + + print *,'===START OF distrgen3========================' + + rank = PROCESSORS_RANK() + + do i=1,rank + psize(i)=PROCESSORS_SIZE(i) + if (psize(i) > 4) then !may be temporary + goto 1 + endif + enddo +C ------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 1 .and. psize(3) == 1) !range 1 1 1 + >.or. + > (psize(1) == 1 .and. psize(2) == 2 .and. psize(3) == 3) !range 1 2 3 + >.or. + > (psize(1) == 2 .and. psize(2) == 3 .and. psize(3) == 2) !range 2 3 2 + >.or. + > (psize(1) == 3 .and. psize(2) == 1 .and. psize(3) == 4) !range 3 1 4 + >.or. + > (psize(1) == 4 .and. psize(2) == 2 .and. psize(3) == 2)) !range 4 2 2 + >then +! 31 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] other blocks + call distrg31 (psize) + endif +! ------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 1 .and. psize(3) == 1) !range 1 1 1 + >.or. + > (psize(1) == 1 .and. psize(2) == 3 .and. psize(3) == 4) !range 1 3 4 + >.or. + > (psize(1) == 2 .and. psize(2) == 2 .and. psize(3) == 3) !range 2 2 3 + >.or. + > (psize(1) == 3 .and. psize(2) == 4 .and. psize(3) == 1) !range 3 4 1 + >.or. + > (psize(1) == 4 .and. psize(2) == 2 .and. psize(3) == 2)) !range 4 2 2 + >then +! 32 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [BLOCK][BLOCK][BLOCK] +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + call distrg32 (psize) + endif +! ------------------------------------------------- +! 33 DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] allocatable +! DISTRIBUTE arrB3[BLOCK][GEN_BLOCK][GEN_BLOCK] static +! REDISTRIBUTE [GEN_BLOCK][BLOCK][BLOCK] +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + call distrg33 (psize) +! ------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 1 .and. psize(3) == 1) !range 1 1 1 + >.or. + > (psize(1) == 1 .and. psize(2) == 2 .and. psize(3) == 2) !range 1 2 2 + >.or. + > (psize(1) == 2 .and. psize(2) == 4 .and. psize(3) == 2) !range 2 4 2 + >.or. + > (psize(1) == 3 .and. psize(2) == 1 .and. psize(3) == 2) !range 3 1 2 + >.or. + > (psize(1) == 4 .and. psize(2) == 1 .and. psize(3) == 4) !range 4 1 4 + >) then +! 34 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] !static +! REDISTRIBUTE [GEN_BLOCK][*][BLOCK] +! DISTRIBUTE arrB3[GEN_BLOCK][*][BLOCK] !static +! REDISTRIBUTE [BLOCK][GEN_BLOCK][*] + call distrg34 (psize) + endif +! ------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 1 .and. psize(3) == 1) !range 1 1 1 + >.or. + > (psize(1) == 1 .and. psize(2) == 3 .and. psize(3) == 2) !range 1 3 2 + >.or. + > (psize(1) == 2 .and. psize(2) == 2 .and. psize(3) == 4) !range 2 2 4 + >.or. + > (psize(1) == 3 .and. psize(2) == 2 .and. psize(3) == 2) !range 3 2 2 + >.or. + > (psize(1) == 4 .and. psize(2) == 2 .and. psize(3) == 2)) !range 4 2 2 + >then + +! 35 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE arrA2[*][*][*] +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + call distrg35 (psize) + endif +! ------------------------------------------------- +! 36 DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + call distrg36 (psize) +! ------------------------------------------------- +! 37 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] + call distrg37 (psize) +! ------------------------------------------------- +! 38 DISTRIBUTE arrA3 [GEN_BLOCK][*][GEN_BLOCK] +! REDISTRIBUTE [*][GEN_BLOCK][*] +! REDISTRIBUTE[GEN_BLOCK][GEN_BLOCK][*] +! REDISTRIBUTE[*][GEN_BLOCK][GEN_BLOCK] + call distrg38 (psize) +! ------------------------------------------------- +! 39 DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [GEN_BLOCK][*][*] +! REDISTRIBUTE[GEN_BLOCK][*][GEN_BLOCK] + call distrg39 (psize) +! ------------------------------------------------- +! 310 DISTRIBUTE arrA3 [GEN_BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [*][*][GEN_BLOCK] +! REDISTRIBUTE[*][GEN_BLOCK][BLOCK] + call distrg310 (psize) +! ------------------------------------------------- +! 311 DISTRIBUTE arrA3 [GEN_BLOCK][*][*] +! REDISTRIBUTE [*][*][*] +! REDISTRIBUTE [BLOCK][*][GEN_BLOCK] + call distrg311 (psize) + +! ------------------------------------------------- + + 1 print *,'=== END OF distrgen3 ========================= ' + + end + +! ----------------------------------------------------distrg31 +! 31 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 1 1 +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 2 3 +! range 2 3 2 +! range 3 1 4 +! range 4 2 2 + subroutine distrg31 (psize) + integer psize(3) + + integer, parameter :: AN1=6,AN2=6,AN3=6,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi111=(/6/) !range 1 1 1 + integer, dimension(1) :: BSj111=(/6/) + integer, dimension(1) :: BSk111=(/6/) + + integer, dimension(1) :: BSi11=(/6/) !range 1 2 3 + integer, dimension(1) :: BSi12=(/6/) + integer, dimension(2) :: BSj11=(/5,1/) + integer, dimension(2) :: BSj12=(/2,4/) + integer, dimension(3) :: BSk11=(/1,4,1/) + integer, dimension(3) :: BSk12=(/1,2,3/) + + integer, dimension(2) :: BSi21=(/4,2/) !range 2 3 2 + integer, dimension(2) :: BSi22=(/1,5/) + integer, dimension(3) :: BSj21=(/3,2,1/) + integer, dimension(3) :: BSj22=(/5,1,0/) + integer, dimension(2) :: BSk21=(/2,4/) + integer, dimension(2) :: BSk22=(/5,1/) + + integer, dimension(3) :: BSi31=(/2,2,2/) !range 3 1 4 + integer, dimension(3) :: BSi32=(/3,2,1/) + integer, dimension(1) :: BSj31=(/6/) + integer, dimension(1) :: BSj32=(/6/) + integer, dimension(4) :: BSk31=(/1,2,2,1/) + integer, dimension(4) :: BSk32=(/2,2,1,1/) + + integer, dimension(4) :: BSi41=(/2,1,2,1/) !range 4 2 2 + integer, dimension(4) :: BSi42=(/1,2,1,2/) + integer, dimension(2) :: BSj41=(/5,1/) + integer, dimension(2) :: BSj42=(/2,4/) + integer, dimension(2) :: BSk41=(/4,2/) + integer, dimension(2) :: BSk42=(/6,0/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg31 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ distribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + +!dvm$ region out(A3) +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12),GEN_BLOCK(BSk12)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region in(A3) +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg31 + +! ----------------------------------------------------distrg32 +! 32 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 1 1 +! REDISTRIBUTE [BLOCK][BLOCK][BLOCK] range 1 3 4 +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 2 2 3 +! range 3 4 1 +! range 4 2 2 + subroutine distrg32 (psize) + integer psize(3) + + integer, parameter :: AN1=8,AN2=6,AN3=14,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi111=(/8/) !range 1 1 1 + integer, dimension(1) :: BSj111=(/6/) + integer, dimension(1) :: BSk111=(/14/) + + integer, dimension(1) :: BSi11=(/8/) !range 1 3 4 + integer, dimension(1) :: BSi12=(/8/) + integer, dimension(3) :: BSj11=(/2,4,0/) + integer, dimension(3) :: BSj12=(/3,2,1/) + integer, dimension(4) :: BSk11=(/1,4,3,6/) + integer, dimension(4) :: BSk12=(/5,2,4,3/) + + integer, dimension(2) :: BSi21=(/6,2/) !range 2 2 3 + integer, dimension(2) :: BSi22=(/1,7/) + integer, dimension(2) :: BSj21=(/3,3/) + integer, dimension(2) :: BSj22=(/5,1/) + integer, dimension(3) :: BSk21=(/10,3,1/) + integer, dimension(3) :: BSk22=(/4,8,2/) + + integer, dimension(3) :: BSi31=(/3,2,3/) !range 3 4 1 + integer, dimension(3) :: BSi32=(/2,4,2/) + integer, dimension(4) :: BSj31=(/2,1,1,2/) + integer, dimension(4) :: BSj32=(/1,2,3,0/) + integer, dimension(1) :: BSk31=(/14/) + integer, dimension(1) :: BSk32=(/14/) + + integer, dimension(4) :: BSi41=(/3,2,1,2/) !range 4 2 2 + integer, dimension(4) :: BSi42=(/4,1,2,1/) + integer, dimension(2) :: BSj41=(/5,1/) + integer, dimension(2) :: BSj42=(/2,4/) + integer, dimension(2) :: BSk41=(/7,7/) + integer, dimension(2) :: BSk42=(/6,8/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg32 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ distribute A3(GEN_BLOCK(BSi),GEN_BLOCK(BSj),GEN_BLOCK(BSk)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 1 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,BLOCK,BLOCK) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 1 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),GEN_BLOCK(BSj),GEN_BLOCK(BSk)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12),GEN_BLOCK(BSk12)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region inlocal(A3) +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 2)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg32 + +! ----------------------------------------------------distrg33 +! 33 DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] allocatable +! DISTRIBUTE arrB3[BLOCK][GEN_BLOCK][GEN_BLOCK] static +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + + subroutine distrg33 (psize) + integer psize(3) + + integer, parameter :: AN1=12,AN2=17,AN3=16,NL=1000,ER=10000 + integer, parameter :: BN1=10,BN2=10,BN3=10 + integer :: erria=ER, errib=ER,i,j,k + + integer, dimension(1) :: BSai11=(/12/) + integer, dimension(1) :: BSai12=(/12/) + integer, dimension(2) :: BSai21=(/3,9/) + integer, dimension(2) :: BSai22=(/11,1/) + integer, dimension(3) :: BSai31=(/4,0,8/) + integer, dimension(3) :: BSai32=(/6,4,2/) + integer, dimension(4) :: BSai41=(/1,2,3,6/) !rem + integer, dimension(4) :: BSai42=(/3,8,0,1/) + + integer, dimension(1) :: BSaj11=(/17/) + integer, dimension(1) :: BSaj12=(/17/) + integer, dimension(2) :: BSaj21=(/3,14/) + integer, dimension(2) :: BSaj22=(/4,13/) + integer, dimension(3) :: BSaj31=(/6,1,10/) + integer, dimension(3) :: BSaj32=(/11,6,0/) + integer, dimension(4) :: BSaj41=(/5,0,11,1/) + integer, dimension(4) :: BSaj42=(/11,3,1,2/) + + integer, dimension(1) :: BSak11=(/16/) + integer, dimension(1) :: BSak12=(/16/) + integer, dimension(2) :: BSak21=(/12,4/) + integer, dimension(2) :: BSak22=(/7,9/) !rem + integer, dimension(3) :: BSak31=(/2,4,10/) + integer, dimension(3) :: BSak32=(/3,1,12/) + integer, dimension(4) :: BSak41=(/6,2,5,3/) + integer, dimension(4) :: BSak42=(/1,7,6,2/) + + + integer, dimension(1) :: BSbi11=(/10/) + integer, dimension(1) :: BSbi12=(/10/) + integer, dimension(2) :: BSbi21=(/3,7/) + integer, dimension(2) :: BSbi22=(/1,9/) + integer, dimension(3) :: BSbi31=(/3,2,5/) + integer, dimension(3) :: BSbi32=(/2,6,2/) + integer, dimension(4) :: BSbi41=(/1,2,5,2/) + integer, dimension(4) :: BSbi42=(/3,1,0,6/) + + integer, dimension(1) :: BSbj11=(/10/) + integer, dimension(1) :: BSbj12=(/10/) + integer, dimension(2) :: BSbj21=(/6,4/) + integer, dimension(2) :: BSbj22=(/7,3/) + integer, dimension(3) :: BSbj31=(/1,5,4/) + integer, dimension(3) :: BSbj32=(/3,1,6/) + integer, dimension(4) :: BSbj41=(/5,0,2,3/) + integer, dimension(4) :: BSbj42=(/2,3,4,1/) + + integer, dimension(1) :: BSbk11=(/10/) + integer, dimension(1) :: BSbk12=(/10/) + integer, dimension(2) :: BSbk21=(/5,5/) + integer, dimension(2) :: BSbk22=(/2,8/) + integer, dimension(3) :: BSbk31=(/1,1,8/) + integer, dimension(3) :: BSbk32=(/3,5,2/) + integer, dimension(4) :: BSbk41=(/1,2,3,4/) + integer, dimension(4) :: BSbk42=(/4,3,2,1/) + + integer, allocatable :: A3(:,:,:) + integer B3(BN1,BN2,BN3) + character(10), parameter :: tname='distrg33 ' + +!dvm$ distribute :: A3 +!dvm$ distribute :: B3 +!dvm$ dynamic A3, B3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSaj1),GEN_BLOCK(BSak1)) +!!!!dvm$ redistribute B3(BLOCK,GEN_BLOCK(BSbj1),GEN_BLOCK(BSbk1)) + + select case(psize(2)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj11),GEN_BLOCK(BSak11)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj11),GEN_BLOCK(BSbk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj11),GEN_BLOCK(BSak21)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj11),GEN_BLOCK(BSbk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj11),GEN_BLOCK(BSak31)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj11),GEN_BLOCK(BSbk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj11),GEN_BLOCK(BSak41)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj11),GEN_BLOCK(BSbk41)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj21),GEN_BLOCK(BSak11)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj21),GEN_BLOCK(BSbk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj21),GEN_BLOCK(BSak21)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj21),GEN_BLOCK(BSbk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj21),GEN_BLOCK(BSak31)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj21),GEN_BLOCK(BSbk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj21),GEN_BLOCK(BSak41)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj21),GEN_BLOCK(BSbk41)) + case default + goto 10 + endselect + + case (3) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj31),GEN_BLOCK(BSak11)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj31),GEN_BLOCK(BSbk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj31),GEN_BLOCK(BSak21)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj31),GEN_BLOCK(BSbk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj31),GEN_BLOCK(BSak31)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj31),GEN_BLOCK(BSbk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj31),GEN_BLOCK(BSak41)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj31),GEN_BLOCK(BSbk41)) + case default + goto 10 + endselect + + case (4) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj41),GEN_BLOCK(BSak11)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj41),GEN_BLOCK(BSbk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj41),GEN_BLOCK(BSak21)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj41),GEN_BLOCK(BSbk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj41),GEN_BLOCK(BSak31)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj41),GEN_BLOCK(BSbk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSaj41),GEN_BLOCK(BSak41)) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj41),GEN_BLOCK(BSbk41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region out (A3, B3) +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo + +!dvm$ parallel (i,j,k) on B3(i,j,k) + do i=1,BN1 + do j=1,BN2 + do k=1,BN3 + B3(i,j,k) = (i*NL/10 + j*NL/100 + k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSai2),BLOCK,BLOCK) +!!!!dvm$ redistribute B3(GEN_BLOCK(BSbi2),BLOCK,BLOCK) + + select case(psize(1)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai11),BLOCK,BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi11),BLOCK,BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai21),BLOCK,BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi21),BLOCK,BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai31),BLOCK,BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi31),BLOCK,BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai41),BLOCK,BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi41),BLOCK,BLOCK) + case default + goto 10 + endselect + +!dvm$ region inout (A3, B3) +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ parallel (i,j,k) on B3(i,j,k) + do i=1,BN1 + do j=1,BN2 + do k=1,BN3 + B3(i,j,k) = B3(i,j,k)/ 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSai2),GEN_BLOCK(BSaj2),BLOCK) +!!!!dvm$ redistribute A3(GEN_BLOCK(BSbi2),GEN_BLOCK(BSbj2),BLOCK) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai12),GEN_BLOCK(BSaj12),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi12),GEN_BLOCK(BSbj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai12),GEN_BLOCK(BSaj22),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi12),GEN_BLOCK(BSbj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai12),GEN_BLOCK(BSaj32),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi12),GEN_BLOCK(BSbj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai12),GEN_BLOCK(BSaj42),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi12),GEN_BLOCK(BSbj42),BLOCK) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai22),GEN_BLOCK(BSaj12),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi22),GEN_BLOCK(BSbj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai22),GEN_BLOCK(BSaj22),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi22),GEN_BLOCK(BSbj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai22),GEN_BLOCK(BSaj32),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi22),GEN_BLOCK(BSbj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai22),GEN_BLOCK(BSaj42),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi22),GEN_BLOCK(BSbj42),BLOCK) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai32),GEN_BLOCK(BSaj12),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi32),GEN_BLOCK(BSbj12),BLOCK) !rem + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai32),GEN_BLOCK(BSaj22),BLOCK) !rem +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi32),GEN_BLOCK(BSbj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai32),GEN_BLOCK(BSaj32),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi32),GEN_BLOCK(BSbj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai32),GEN_BLOCK(BSaj42),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi32),GEN_BLOCK(BSbj42),BLOCK) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai42),GEN_BLOCK(BSaj12),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi42),GEN_BLOCK(BSbj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai42),GEN_BLOCK(BSaj22),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi42),GEN_BLOCK(BSbj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai42),GEN_BLOCK(BSaj32),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi42),GEN_BLOCK(BSbj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai42),GEN_BLOCK(BSaj42),BLOCK) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi42),GEN_BLOCK(BSbj42),BLOCK) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erria, errib) + +!dvm$ region inlocal (a3), inlocal (B3) +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erria)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k)/ 2 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erria = min(erria,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ parallel (i,j,k) on B3(i,j,k), reduction(min(errib)) + do i=1,BN1 + do j=1,BN2 + do k=1,BN3 + if (B3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + errib = min(errib,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erria, errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg33 + +! ----------------------------------------------------distrg34 +! 34 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] static range 1 1 1 +! REDISTRIBUTE [GEN_BLOCK][*][BLOCK] range 1 2 2 +! DISTRIBUTE arrB3[GEN_BLOCK][*][BLOCK] static range 2 4 2 +! REDISTRIBUTE [BLOCK][GEN_BLOCK][*] range 3 1 2 +! range 4 1 4 + subroutine distrg34 (psize) + integer psize(3) + + integer, parameter :: AN1=16,AN2=16,AN3=16,NL=1000,ER=10000 + integer, parameter :: BN1=12,BN2=17,BN3=11 + integer :: erria=ER, errib=ER,i,j,k + + integer, dimension(1) :: BSai111=(/16/) !range 1 1 1 + integer, dimension(1) :: BSaj111=(/16/) + integer, dimension(1) :: BSak111=(/16/) + + integer, dimension(1) :: BSai11=(/16/) !range 1 2 2 + integer, dimension(1) :: BSai12=(/16/) + integer, dimension(2) :: BSaj11=(/6,10/) + integer, dimension(2) :: BSaj12=(/4,12/) + integer, dimension(2) :: BSak11=(/10,6/) + integer, dimension(2) :: BSak12=(/12,4/) + + integer, dimension(2) :: BSai21=(/2,14/) !range 2 4 2 + integer, dimension(2) :: BSai22=(/13,3/) + integer, dimension(4) :: BSaj21=(/3,4,3,6/) + integer, dimension(4) :: BSaj22=(/6,6,2,2/) + integer, dimension(2) :: BSak21=(/1,15/) + integer, dimension(2) :: BSak22=(/7,9/) + + integer, dimension(3) :: BSai31=(/3,2,11/) !range 3 1 2 + integer, dimension(3) :: BSai32=(/2,12,2/) + integer, dimension(1) :: BSaj31=(/16/) + integer, dimension(1) :: BSaj32=(/16/) + integer, dimension(2) :: BSak31=(/3,13/) + integer, dimension(2) :: BSak32=(/4,12/) + + integer, dimension(4) :: BSai41=(/1,2,5,8/) !range 4 1 4 + integer, dimension(4) :: BSai42=(/3,11,0,2/) + integer, dimension(1) :: BSaj41=(/16/) + integer, dimension(1) :: BSaj42=(/16/) +c integer, dimension(4) :: BSak41=(/1,5,0,10/) + integer, dimension(4) :: BSak41=(/1,5,2,8/) !rem + integer, dimension(4) :: BSak42=(/6,2,5,3/) + + integer, dimension(1) :: BSbi111=(/12/) !range 1 1 1 + integer, dimension(1) :: BSbj111=(/17/) + integer, dimension(1) :: BSbk111=(/11/) + + + integer, dimension(1) :: BSbi11=(/12/) !range 1 2 2 + integer, dimension(1) :: BSbi12=(/12/) + integer, dimension(2) :: BSbj11=(/6,11/) + integer, dimension(2) :: BSbj12=(/14,3/) + integer, dimension(2) :: BSbk11=(/10,1/) + integer, dimension(2) :: BSbk12=(/4,7/) + + integer, dimension(2) :: BSbi21=(/5,7/) !range 2 4 2 + integer, dimension(2) :: BSbi22=(/3,9/) + integer, dimension(4) :: BSbj21=(/5,2,8,2/) + integer, dimension(4) :: BSbj22=(/7,3,2,5/) + integer, dimension(2) :: BSbk21=(/5,6/) + integer, dimension(2) :: BSbk22=(/3,8/) + + integer, dimension(3) :: BSbi31=(/3,4,5/) !range 3 1 2 + integer, dimension(3) :: BSbi32=(/4,6,2/) + integer, dimension(1) :: BSbj31=(/17/) + integer, dimension(1) :: BSbj32=(/17/) + integer, dimension(2) :: BSbk31=(/4,7/) + integer, dimension(2) :: BSbk32=(/8,3/) + + integer, dimension(4) :: BSbi41=(/4,1,5,2/) !range 4 1 4 +c integer, dimension(4) :: BSbi42=(/3,4,2,4/) + integer, dimension(4) :: BSbi42=(/3,4,2,3/) + integer, dimension(1) :: BSbj41=(/17/) + integer, dimension(1) :: BSbj42=(/17/) +c integer, dimension(4) :: BSbk41=(/1,4,2,5/) + integer, dimension(4) :: BSbk41=(/1,4,2,4/) + integer, dimension(4) :: BSbk42=(/2,3,4,2/) + + integer A3(AN1,AN2,AN3), B3(BN1,BN2,BN3) + character(10), parameter :: tname='distrg34 ' + +!dvm$ distribute :: A3 +!dvm$ distribute :: B3 +!dvm$ dynamic A3, B3 + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSai1),GEN_BLOCK(BSaj1),GEN_BLOCK(BSak1)) +!!!!dvm$ redistribute B3(GEN_BLOCK(BSbi1),*, BLOCK) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai111),GEN_BLOCK(BSaj111),GEN_BLOCK(BSak111)) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi111),*, BLOCK) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai11),GEN_BLOCK(BSaj11),GEN_BLOCK(BSak11)) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi11),*, BLOCK) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai21),GEN_BLOCK(BSaj21),GEN_BLOCK(BSak21)) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi21),*, BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai31),GEN_BLOCK(BSaj31),GEN_BLOCK(BSak31)) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi31),*, BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai41),GEN_BLOCK(BSaj41),GEN_BLOCK(BSak41)) +!dvm$ redistribute +!dvm$* B3(GEN_BLOCK(BSbi41),*, BLOCK) + case default + goto 10 + endselect + A3 = 10 + B3 = 7 +!dvm$ actual(A3, B3) + +!dvm$ region in(A3,B3), out(A3,B3) +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo + +!dvm$ parallel (i,j,k) on B3(i,j,k) + do i=1,BN1 + do j=1,BN2 + do k=1,BN3 + B3(i,j,k) = B3(i,j,k) + (i*NL/10 + j*NL/100 + k) + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSai1),*,BLOCK) +!!!!dvm$ redistribute B3(BLOCK, GEN_BLOCK(BSbj2),*) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai111),*,BLOCK) +!dvm$ redistribute +!dvm$* B3(BLOCK, GEN_BLOCK(BSbj111),*) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai12),*,BLOCK) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj12),*) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai22),*,BLOCK) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj22),*) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai32),*,BLOCK) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj32),*) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSai42),*,BLOCK) +!dvm$ redistribute +!dvm$* B3(BLOCK,GEN_BLOCK(BSbj42),*) + case default + goto 10 + endselect + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erria)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 10 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erria = min(erria,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ parallel (i,j,k) on B3(i,j,k), reduction (min(errib)) + do i=1,BN1 + do j=1,BN2 + do k=1,BN3 + if (B3(i,j,k) /= (i*NL/10 + j*NL/100 + k+ 7)) then + errib = min(errib,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erria, errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + 10 continue + end subroutine distrg34 + +! ----------------------------------------------------distrg35 +! 35 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 1 1 +! REDISTRIBUTE arrA2[*][*][*] range 1 3 2 +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 2 2 4 +! range 3 2 2 +! range 4 2 2 + subroutine distrg35 (psize) + integer psize(3) + + integer, parameter :: AN1=16,AN2=16,AN3=16,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi111=(/16/) !range 1 1 1 + integer, dimension(1) :: BSj111=(/16/) + integer, dimension(1) :: BSk111=(/16/) + + integer, dimension(1) :: BSi11=(/16/) !range 1 3 2 + integer, dimension(1) :: BSi12=(/16/) + integer, dimension(3) :: BSj11=(/6,5,5/) + integer, dimension(3) :: BSj12=(/3,2, 11/) + integer, dimension(2) :: BSk11=(/12,4/) + integer, dimension(2) :: BSk12=(/10,6/) + + integer, dimension(2) :: BSi21=(/6,10/) !range 2 2 4 + integer, dimension(2) :: BSi22=(/1,15/) + integer, dimension(2) :: BSj21=(/4,12/) + integer, dimension(2) :: BSj22=(/5,11/) + integer, dimension(4) :: BSk21=(/10,4,1,1/) + integer, dimension(4) :: BSk22=(/5,3,2,6/) + + integer, dimension(3) :: BSi31=(/3,2,11/) !range 3 2 2 + integer, dimension(3) :: BSi32=(/12,1,3/) + integer, dimension(2) :: BSj31=(/6,10/) + integer, dimension(2) :: BSj32=(/4,12/) + integer, dimension(2) :: BSk31=(/3,13/) + integer, dimension(2) :: BSk32=(/15,1/) + + integer, dimension(4) :: BSi41=(/3,2,1,10/) !range 4 2 2 + integer, dimension(4) :: BSi42=(/4,8,2,2/) + integer, dimension(2) :: BSj41=(/13,3/) + integer, dimension(2) :: BSj42=(/12,4/) + integer, dimension(2) :: BSk41=(/7,9/) + integer, dimension(2) :: BSk42=(/10,6/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg35 ' + +!dvm$ distribute ::A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 3 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,*) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 3 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12),GEN_BLOCK(BSk12)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 6)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg35 + +! ----------------------------------------------------distrg36 +! 36 DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + + subroutine distrg36 (psize) + integer psize(3) + + integer, parameter :: AN1=12,AN2=12,AN3=5,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi11=(/12/) + integer, dimension(1) :: BSi12=(/12/) + integer, dimension(2) :: BSi21=(/10,2/) + integer, dimension(2) :: BSi22=(/4,8/) + integer, dimension(3) :: BSi31=(/4,2,6/) + integer, dimension(3) :: BSi32=(/6,4,2/) + integer, dimension(4) :: BSi41=(/4,2,4,2/) + integer, dimension(4) :: BSi42=(/4,1,6,1/) + + integer, dimension(1) :: BSj11=(/12/) + integer, dimension(1) :: BSj12=(/12/) + integer, dimension(2) :: BSj21=(/4,8/) + integer, dimension(2) :: BSj22=(/5,7/) + integer, dimension(3) :: BSj31=(/3,3,6/) + integer, dimension(3) :: BSj32=(/6,4,2/) + integer, dimension(4) :: BSj41=(/5,1,2,4/) + integer, dimension(4) :: BSj42=(/2,1,3,6/) + + integer, dimension(1) :: BSk11=(/5/) + integer, dimension(1) :: BSk12=(/5/) + integer, dimension(2) :: BSk21=(/0,5/) + integer, dimension(2) :: BSk22=(/3,2/) + integer, dimension(3) :: BSk31=(/2,2,1/) + integer, dimension(3) :: BSk32=(/1,1,3/) + integer, dimension(4) :: BSk41=(/1,0,2,2/) + integer, dimension(4) :: BSk42=(/1,0,1,3/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg36 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk1)) + + select case(psize(1)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),BLOCK,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),BLOCK,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),BLOCK,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),BLOCK,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),BLOCK,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),BLOCK,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),BLOCK,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),BLOCK,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),BLOCK,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),BLOCK,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),BLOCK,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),BLOCK,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),BLOCK,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),BLOCK,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),BLOCK,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),BLOCK,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),BLOCK) + + select case(psize(2)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + + select case(psize(2)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj12),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj12),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj12),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj12),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj22),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj22),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj22),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj22),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case (3) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj32),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj32),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj32),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj32),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case (4) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj42),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj42),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj42),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj42),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),BLOCK) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj42),BLOCK) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj42),BLOCK) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj42),BLOCK) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42),BLOCK) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) / 4 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg36 + +! ----------------------------------------------------distrg37 +! 37 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] + + subroutine distrg37 (psize) + integer psize(3) + + integer, parameter :: AN1=10,AN2=15,AN3=15,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi11=(/10/) + integer, dimension(1) :: BSi12=(/10/) + integer, dimension(2) :: BSi21=(/6,4/) + integer, dimension(2) :: BSi22=(/2,8/) + integer, dimension(3) :: BSi31=(/2,3,5/) + integer, dimension(3) :: BSi32=(/3,4,3/) + integer, dimension(4) :: BSi41=(/4,1,3,2/) + integer, dimension(4) :: BSi42=(/3,3,2,2/) + + integer, dimension(1) :: BSj11=(/15/) + integer, dimension(1) :: BSj12=(/15/) + integer, dimension(2) :: BSj21=(/3,12/) + integer, dimension(2) :: BSj22=(/10,5/) + integer, dimension(3) :: BSj31=(/6,4,5/) + integer, dimension(3) :: BSj32=(/3,2,10/) + integer, dimension(4) :: BSj41=(/5,2,3,5/) + integer, dimension(4) :: BSj42=(/2,4,8,1/) + + integer, dimension(1) :: BSk11=(/15/) + integer, dimension(1) :: BSk12=(/15/) + integer, dimension(2) :: BSk21=(/10,5/) + integer, dimension(2) :: BSk22=(/7,8/) + integer, dimension(3) :: BSk31=(/1,11,3/) + integer, dimension(3) :: BSk32=(/5,7,3/) + integer, dimension(4) :: BSk41=(/3,4,2,6/) + integer, dimension(4) :: BSk42=(/4,2,5,4/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg37 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ distribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),BLOCK) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),BLOCK) + + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj42),BLOCK) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + + select case(psize(2)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj11),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj11),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj11),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj21),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj21),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj21),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (3) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj31),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj31),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj31),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (4) + select case(psize(3)) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj41),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj41),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj41),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk2)) + + select case(psize(1)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case (3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) / 4 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg37 + +! ----------------------------------------------------distrg38 +! 38 DISTRIBUTE arrA3 [GEN_BLOCK][*][GEN_BLOCK] +! REDISTRIBUTE [*][GEN_BLOCK][*] +! REDISTRIBUTE[GEN_BLOCK][GEN_BLOCK][*] +! REDISTRIBUTE[*][GEN_BLOCK][GEN_BLOCK] + + subroutine distrg38 (psize) + integer psize(3) + + integer, parameter :: AN1=5,AN2=6,AN3=12,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi11=(/5/) + integer, dimension(1) :: BSi12=(/5/) + integer, dimension(2) :: BSi21=(/4,1/) + integer, dimension(2) :: BSi22=(/3,2/) + integer, dimension(3) :: BSi31=(/3,1,1/) + integer, dimension(3) :: BSi32=(/1,2,2/) + integer, dimension(4) :: BSi41=(/1,2,1,1/) + integer, dimension(4) :: BSi42=(/3,1,0,2/) + + integer, dimension(1) :: BSj11=(/6/) + integer, dimension(1) :: BSj12=(/6/) + integer, dimension(2) :: BSj21=(/2,4/) + integer, dimension(2) :: BSj22=(/4,2/) + integer, dimension(3) :: BSj31=(/2,3,1/) + integer, dimension(3) :: BSj32=(/1,2,3/) + integer, dimension(4) :: BSj41=(/2,1,2,1/) + integer, dimension(4) :: BSj42=(/1,1,3,1/) + + integer, dimension(1) :: BSk11=(/12/) + integer, dimension(1) :: BSk12=(/12/) + integer, dimension(2) :: BSk21=(/10,2/) + integer, dimension(2) :: BSk22=(/5,7/) + integer, dimension(3) :: BSk31=(/2,6,4/) + integer, dimension(3) :: BSk32=(/3,4,5/) + integer, dimension(4) :: BSk41=(/2,4,5,1/) + integer, dimension(4) :: BSk42=(/3,2,4,3/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg38 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),*,GEN_BLOCK(BSk1)) + + select case(psize(1)) + case(1) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),*,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),*,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),*,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),*,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),*,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),*,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),*,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),*,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),*,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),*,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),*,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),*,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),*,GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),*,GEN_BLOCK(BSk21)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),*,GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),*,GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 5 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(*,GEN_BLOCK(BSj2),*) + + select case(psize(1)) ! it's true - psize(1) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj12),*) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj22),*) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj32),*) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj42),*) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 5 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),*) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 5 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(*,GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + + select case(psize(1)) ! it's true - psize(1) + case(1) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj12),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj12),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj12),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj12),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj22),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj22),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj22),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj22),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj32),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj32),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj32),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj32),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj42),GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj42),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj42),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj42),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 15)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg38 + +! ----------------------------------------------------distrg39 +! 39 DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] +! REDISTRIBUTE [GEN_BLOCK][*][*] +! REDISTRIBUTE[GEN_BLOCK][*][GEN_BLOCK] + + subroutine distrg39 (psize) + integer psize(3) + + integer, parameter :: AN1=10,AN2=16,AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi11=(/10/) + integer, dimension(1) :: BSi12=(/10/) + integer, dimension(2) :: BSi21=(/6,4/) + integer, dimension(2) :: BSi22=(/2,8/) + integer, dimension(3) :: BSi31=(/5,2,3/) + integer, dimension(3) :: BSi32=(/2,4,4/) + integer, dimension(4) :: BSi41=(/3,2,1,4/) + integer, dimension(4) :: BSi42=(/5,1,1,3/) + + integer, dimension(1) :: BSj11=(/16/) + integer, dimension(1) :: BSj12=(/16/) + integer, dimension(2) :: BSj21=(/5,11/) + integer, dimension(2) :: BSj22=(/12,4/) + integer, dimension(3) :: BSj31=(/6,2,8/) + integer, dimension(3) :: BSj32=(/10,3,3/) + integer, dimension(4) :: BSj41=(/6,3,5,2/) + integer, dimension(4) :: BSj42=(/3,2,1,10/) + + integer, dimension(1) :: BSk11=(/10/) + integer, dimension(1) :: BSk12=(/10/) + integer, dimension(2) :: BSk21=(/9,1/) + integer, dimension(2) :: BSk22=(/4,6/) + integer, dimension(3) :: BSk31=(/10,0,0/) + integer, dimension(3) :: BSk32=(/5,3,2/) + integer, dimension(4) :: BSk41=(/0,2,3,5/) + integer, dimension(4) :: BSk42=(/0,4,0,6/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg39 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(*,GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + + select case(psize(1)) ! it's true - psize(1) + case(1) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 5 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),*,*) + + select case(psize(1)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),*,*) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),*,*) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),*,*) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),*,*) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 5 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),*,GEN_BLOCK(BSk2)) + + select case(psize(1)) + case(1) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 10)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg39 + +! ----------------------------------------------------distrg310 +! 310 DISTRIBUTE arrA3 [GEN_BLOCK][GEN_BLOCK][BLOCK] +! REDISTRIBUTE [*][*][GEN_BLOCK] +! REDISTRIBUTE[*][GEN_BLOCK][BLOCK] + + subroutine distrg310 (psize) + integer psize(3) + + integer, parameter :: AN1=20,AN2=15,AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi11=(/20/) + integer, dimension(1) :: BSi12=(/20/) + integer, dimension(2) :: BSi21=(/2,18/) + integer, dimension(2) :: BSi22=(/12,8/) + integer, dimension(3) :: BSi31=(/3,12,5/) + integer, dimension(3) :: BSi32=(/2,4,14/) + integer, dimension(4) :: BSi41=(/3,12,3,2/) + integer, dimension(4) :: BSi42=(/4,6,2,8/) + + integer, dimension(1) :: BSj11=(/15/) + integer, dimension(1) :: BSj12=(/15/) + integer, dimension(2) :: BSj21=(/3,12/) + integer, dimension(2) :: BSj22=(/5,10/) + integer, dimension(3) :: BSj31=(/6,3,6/) + integer, dimension(3) :: BSj32=(/3,1,11/) + integer, dimension(4) :: BSj41=(/5,1,3,6/) + integer, dimension(4) :: BSj42=(/2,2,6,5/) + + integer, dimension(1) :: BSk11=(/10/) + integer, dimension(1) :: BSk12=(/10/) + integer, dimension(2) :: BSk21=(/1,9/) + integer, dimension(2) :: BSk22=(/6,4/) + integer, dimension(3) :: BSk31=(/3,3,4/) + integer, dimension(3) :: BSk32=(/1,2,7/) + integer, dimension(4) :: BSk41=(/2,4,1,3/) + integer, dimension(4) :: BSk42=(/1,6,2,1/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg310 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),BLOCK) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),BLOCK) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 8 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(*,*,GEN_BLOCK(BSk2)) + + select case(psize(1)) ! it's true - psize(1) + case(1) +!dvm$ redistribute +!dvm$* A3(*,*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,*,GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 8 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(*,GEN_BLOCK(BSj2),BLOCK) + + select case(psize(1)) ! it's true - psize(1) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj12),BLOCK) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj42),BLOCK) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 16)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg310 + +! ---------------------------------------------------------distrg311 +! 311 DISTRIBUTE arrA3 [GEN_BLOCK][*][*] +! REDISTRIBUTE [*][*][*] +! REDISTRIBUTE[BLOCK][*][GEN_BLOCK] + + subroutine distrg311 (psize) + integer psize(3) + + integer, parameter :: AN1=8,AN2=16,AN3=24,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, dimension(1) :: BSi11=(/8/) + integer, dimension(1) :: BSi12=(/8/) + integer, dimension(2) :: BSi21=(/1,7/) + integer, dimension(2) :: BSi22=(/5,3/) + integer, dimension(3) :: BSi31=(/1,5,2/) + integer, dimension(3) :: BSi32=(/2,2,4/) + integer, dimension(4) :: BSi41=(/1,2,3,2/) + integer, dimension(4) :: BSi42=(/4,1,2,1/) + + integer, dimension(1) :: BSj11=(/16/) + integer, dimension(1) :: BSj12=(/16/) + integer, dimension(2) :: BSj21=(/4,12/) + integer, dimension(2) :: BSj22=(/7,9/) + integer, dimension(3) :: BSj31=(/3,12,1/) + integer, dimension(3) :: BSj32=(/6,2,8/) + integer, dimension(4) :: BSj41=(/4,1,2,9/) + integer, dimension(4) :: BSj42=(/2,3,6,5/) + + integer, dimension(1) :: BSk11=(/24/) + integer, dimension(1) :: BSk12=(/24/) + integer, dimension(2) :: BSk21=(/20,4/) + integer, dimension(2) :: BSk22=(/10,14/) + integer, dimension(3) :: BSk31=(/5,11,8/) + integer, dimension(3) :: BSk32=(/6,7,11/) + integer, dimension(4) :: BSk41=(/12,4,6,2/) + integer, dimension(4) :: BSk42=(/10,8,2,4/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrg311 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),*,*) + + select case(psize(1)) + case(1) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),*,*) + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),*,*) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),*,*) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),*,*) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 6 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,*) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 6 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(BLOCK,*, GEN_BLOCK(BSk2)) + + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(BLOCK,*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute +!dvm$* A3(BLOCK,*,GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(BLOCK,*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(BLOCK,*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + +!dvm$ get_actual(erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 12)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrg311 + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix1.fdv new file mode 100644 index 0000000..9a3a5f0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix1.fdv @@ -0,0 +1,564 @@ + program DISTRMIX1 + + integer nproc + number_of_processors()=1 + +! Testing DISTRIBUTE and REDISTRIBUTE directive +! GEN_BLOCK, WGT_BLOCK, MULT_BLOCK distributions + + print *,'===START OF distrmix1========================' + + nproc = number_of_processors() + +C -------------------------------------------------- +c 11 DISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] + call distrmix11 +C -------------------------------------------------- +c 12 DISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] + call distrmix12 +C -------------------------------------------------- + + if (nproc > 4 ) then ! may be temporary + goto 1 + endif + +C -------------------------------------------------- +c 13 DISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] + call distrmix13 (nproc) +C -------------------------------------------------- +c 14 DISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] + call distrmix14 (nproc) +C -------------------------------------------------- +c 15 DISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] + call distrmix15 (nproc) +C -------------------------------------------------- +c 16 DISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] + call distrmix16 (nproc) +C ------------------------------------------------- +C + 1 print *,'=== END OF distrmix1 ========================= ' + + end + +C ----------------------------------------------------distrmix11 +c 11 DISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] + + subroutine distrmix11 + integer nproc + + integer, parameter :: AN1=64,ER=10000 + integer :: erri=ER,i + + integer, parameter :: m1 = 4, m2 = 2 + + double precision :: WB(7) = (/2.1,4.6,3.,2.0,1.5,2.,3.1/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrmix11 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ redistribute A1(MULT_BLOCK(m1)) + + A1 = 5 + +!dvm$ actual(A1) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + i + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB,7)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + 5 + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m2)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction(min(erri)) + do i=1,AN1 + if (A1(i) /= i + 10) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrmix11 + +C ---------------------------------------------distrmix12 +c 12 DISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] + + subroutine distrmix12 + + integer, parameter :: AN1=75,ER=10000 + integer :: erri=ER,i + + integer, parameter :: m1 = 15 + + double precision :: WB1(6) = (/3.1,1.6,2.,3.0,0.5,2./) + double precision :: WB2(8) + > = (/1.5,2.1,2.6,4.2,2.5,3.5,1.,2.1/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrmix12 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ redistribute A1(WGT_BLOCK(WB1,6)) + + A1 = 0 + +!dvm$ actual(A1) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + i + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i)**2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB2,8)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction(min(erri)) + do i=1,AN1 + if (A1(i) /= i**2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrmix12 + +C ----------------------------------------------------distrm13 +c 13 DISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] + + subroutine distrmix13 (nproc) + integer nproc + + integer, parameter :: AN1=30,ER=10000 + integer :: erri=ER,i + + integer, parameter :: m1 = 5, m2 = 3 + + integer :: BS1(1) = (/30/) + integer :: BS2(2) = (/25,5/) + integer :: BS3(3) = (/3,15,12/) + integer :: BS4(4) = (/14,3,11,2/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrmix13 ' + +!dvm$ distribute A1(MULT_BLOCK(m1)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BSnproc)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS1)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS2)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS3)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS4)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i)*2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m2)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min(erri) ) + do i=1,AN1 + if (A1(i) /= i*2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrmix13 + +C ----------------------------------------------------distrmmix14 +c 14 DISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[MULT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] + + subroutine distrmix14 (nproc) + integer nproc + + integer, parameter :: AN1=35,ER=10000 + integer :: m1 = 7 + integer :: erri= ER, i + + integer :: BS11(1) = (/35/) + integer :: BS12(1) = (/35/) + integer :: BS21(2) = (/15,20/) + integer :: BS22(2) = (/8,27/) + integer :: BS31(3) = (/12,17,6/) + integer :: BS32(3) = (/14,4,17/) + integer :: BS41(4) = (/5,7,12,11/) + integer :: BS42(4) = (/14,10,5,6/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrmix14 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS1)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS11)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS21)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS31)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i*4 + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + 4 + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS2)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS12)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS22)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS32)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i*4 + 4) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrmix14 + +C ----------------------------------------------------distrmix15 +c 15 DISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] + + subroutine distrmix15 (nproc) + integer nproc + + integer, parameter :: AN1=10,ER=10000 + integer :: erri= ER, i + + integer :: BS1(1) = (/10/) + integer :: BS2(2) = (/6,4/) + integer :: BS3(3) = (/2,4,4/) + integer :: BS4(4) = (/3,1,4,2/) + + double precision, dimension(6) :: WB1=(/1.0, 2., 2., 3.0, 1., 1./) + double precision, dimension(5) :: WB2=(/2.0, 1., 2., 2.0, 2./) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrmix15 ' + +!dvm$ distribute A1(WGT_BLOCK(WB1,6)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS1)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS2)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS3)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS4)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i)*A1(i) + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB2,5)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .ne.i**2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrmix15 + +C ----------------------------------------------------distrmix16 +c 16 DISTRIBUTE arrA1[GEN_BLOCK] +c REDISTRIBUTE arrA1[WGT_BLOCK] +c REDISTRIBUTE arrA1[GEN_BLOCK] + + subroutine distrmix16 (nproc) + integer nproc + + integer, parameter :: AN1=12,ER=10000 + integer :: erri= ER, i + + integer :: BS11(1) = (/12/) + integer :: BS12(1) = (/12/) + integer :: BS21(2) = (/8,4/) + integer :: BS22(2) = (/2,10/) !rem + integer :: BS31(3) = (/4,4,4/) + integer :: BS32(3) = (/2,3,7/) + integer :: BS41(4) = (/2,3,4,3/) + integer :: BS42(4) = (/6,1,3,2/) + + double precision, dimension(7) :: + > WB1=(/1.0, 2., 2., 3.0, 1., 1., 0.5/) + double precision, dimension(6) :: + > WB2=(/2.0, 0.1, 2.5, 2.0, 2., 0.7/) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrmix16 ' + +!dvm$ distribute :: A1 +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS1)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS11)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS21)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS31)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB1,7)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + A1(i) + enddo +!dvm$ end region + +!!!!dvm$ redistribute A1(GEN_BLOCK(BS2)) + + select case(nproc) + case(1) +!dvm$ redistribute A1(GEN_BLOCK(BS12)) + case(2) +!dvm$ redistribute A1(GEN_BLOCK(BS22)) + case (3) +!dvm$ redistribute A1(GEN_BLOCK(BS32)) + case(4) +!dvm$ redistribute A1(GEN_BLOCK(BS42)) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) .ne.i*2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A1) + + end subroutine distrmix16 + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix2.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix2.fdv new file mode 100644 index 0000000..51da563 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix2.fdv @@ -0,0 +1,1775 @@ + program DISTRMIX2 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! GEN_BLOCK, WGT_BLOCK, MULT_BLOCK, BLOCK distributions + + integer PROCESSORS_RANK, PROCESSORS_SIZE + integer psize(2), rank + + PROCESSORS_RANK() = 2 + PROCESSORS_SIZE(i) = 1 + + print *,'===START OF distrmix2========================' + +C ------------------------------------------------- +c 21 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + call distrmix21 +C ------------------------------------------------- +c 22 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + call distrmix22 +C ------------------------------------------------- +c 23 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] + call distrmix23 +C ------------------------------------------------- + rank = PROCESSORS_RANK() + + do i=1,rank + psize(i)=PROCESSORS_SIZE(i) + if (psize(i) > 4) then ! may be temporary + goto 1 + endif + enddo + +C ------------------------------------------------- + +c 24 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + call distrmix24 (psize) +C ------------------------------------------------- +c 25 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + call distrmix25 (psize) +C ------------------------------------------------- +c 26 DISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + call distrmix26 (psize) +C ------------------------------------------------- +c 27 DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][BLOCK] + call distrmix27 (psize) +C ------------------------------------------------- +c 28 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK] + call distrmix28 (psize) +C ------------------------------------------------- +c 29 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [BLOCK][MULT_BLOCK] + call distrmix29 (psize) +C ------------------------------------------------- +c 210 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + call distrmix210 (psize) +C ------------------------------------------------- +c 211 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK] + call distrmix211 (psize) +C ------------------------------------------------- +c 212 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + call distrmix212 (psize) +C ------------------------------------------------- +c 213 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + call distrmix213 (psize) +C ------------------------------------------------- +C + 1 print *,'=== END OF distrmix2 ========================= ' + + end + +C ----------------------------------------------------distrmix21 +c 21 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + + subroutine distrmix21 + + integer, parameter :: AN1=10,AN2=56,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m11 = 2, m21 = 7 + integer, parameter :: m12 = 5, m22 = 8 + + double precision, dimension(8) :: + > WB1=(/1.0,2.,1.,3.2,1.0, 1.5, 2.3, 2./) + double precision, dimension(7) :: + > WB2=(/1.3, 1.5, 2.2, 1.6, 2.6, 0.5, 1.7/) + + integer A2(AN1,AN2) !static array + character(*), parameter :: tname='distrmix21 ' + +!dvm$ distribute A2(MULT_BLOCK(m11),MULT_BLOCK(m21)) +!dvm$ dynamic A2 + + A2 = 3 + +!dvm$ actual(A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB1,8),WGT_BLOCK(WB2,7)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) + 3 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m12),MULT_BLOCK(m22)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)+6) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end subroutine distrmix21 + +C ----------------------------------------------------distrmix22 +c 22 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + + subroutine distrmix22 + + integer, parameter :: AN1=16,AN2=32,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m1 = 2, m2 = 4 + + double precision, dimension(7) :: + > WB1=(/2.4, 1.2, 3.0, 0.2, 1.5, 2.8, 2.1/) + double precision, dimension(6) :: + > WB2=(/2.0, 1.2, 2.6, 1.6, 3.5, 0.7/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix22 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,7),WGT_BLOCK(WB2,6)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 4 + +!dvm$ actual(A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m1),MULT_BLOCK(m2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) - 4 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,6),WGT_BLOCK(WB1,7)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate(A2) + + end subroutine distrmix22 + +C ----------------------------------------------------distrmix23 +c 23 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] + + subroutine distrmix23 + + integer, parameter :: AN1=18,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m11 = 2, m21 = 2 + integer, parameter :: m12 = 3, m22 = 3 + + double precision, dimension(10) :: + > WB1=(/2., 1.2, 2., 2.5, 0.2, 1.5, 1., 2.8, 2.1, 3./) + double precision, dimension(8) :: + > WB2=(/3.0, 3.5, 2.0, 1.2, 2.6, 1.6, 3.5, 0.7/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix23 ' + +!dvm$ distribute A2(MULT_BLOCK(m11),MULT_BLOCK(m21)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 5 + +!dvm$ actual(A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB1,10),MULT_BLOCK(m22)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) - 4 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m12),WGT_BLOCK(WB2,8)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)+ 1) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate(A2) + + end subroutine distrmix23 + +C ----------------------------------------------------distrmix24 +c 24 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] + + subroutine distrmix24 (psize) + integer psize(2) + + integer, parameter :: AN1=30,AN2=30,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m1 = 3, m2 = 5 + + integer, dimension(1) :: BSi1=(/30/) + integer, dimension(2) :: BSi2=(/25,5/) + integer, dimension(3) :: BSi3=(/12,4,14/) + integer, dimension(4) :: BSi4=(/8,7,5,10/) + + integer, dimension(1) :: BSj1=(/30/) + integer, dimension(2) :: BSj2=(/12,18/) + integer, dimension(3) :: BSj3=(/5,16,9/) + integer, dimension(4) :: BSj4=(/10,4,14,2/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix24 ' + +!dvm$ distribute A2(MULT_BLOCK(m1),MULT_BLOCK(m2)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),GEN_BLOCK(BSj)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) * 2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m2),MULT_BLOCK(m1)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) / 2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix24 + +C ----------------------------------------------------distrmix25 +c 25 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + + subroutine distrmix25 (psize) + integer psize(2) + + integer, parameter :: AN1=16,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m1 = 2, m2 = 3 + + integer, dimension(1) :: BSi11=(/16/) + integer, dimension(1) :: BSi12=(/16/) + integer, dimension(2) :: BSi21=(/15,1/) + integer, dimension(2) :: BSi22=(/6,10/) + integer, dimension(3) :: BSi31=(/3,8,5/) + integer, dimension(3) :: BSi32=(/7,3,6/) + integer, dimension(4) :: BSi41=(/2,3,4,7/) + integer, dimension(4) :: BSi42=(/5,1,6,4/) + + integer, dimension(1) :: BSj11=(/12/) + integer, dimension(1) :: BSj12=(/12/) + integer, dimension(2) :: BSj21=(/7,5/) + integer, dimension(2) :: BSj22=(/5,7/) + integer, dimension(3) :: BSj31=(/5,6,1/) + integer, dimension(3) :: BSj32=(/2,6,4/) + integer, dimension(4) :: BSj41=(/1,4,2,5/) + integer, dimension(4) :: BSj42=(/2,4,4,2/) + + integer :: A2(AN1,AN2) ! static array + character(*), parameter :: tname='distrmix25 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + + A2 = 2 + +!dvm$ actual(A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m1),MULT_BLOCK(m2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + 2 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj22)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj22)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj22)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) + if (A2(i,j) /= (i*NL+j)+ 4) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 continue + + end subroutine distrmix25 + +C ----------------------------------------------------distrmix26 +c 26 DISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] + + subroutine distrmix26 (psize) + integer psize(2) + + integer, parameter :: AN1=52,AN2=50,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m1 = 13, m2 = 5 + + double precision, dimension(6) :: + > WB1=(/2.4, 2.2, 0.2, 3.5, 1.2, 1./) + double precision, dimension(8) :: + > WB2=(/1.0, 2.5, 3.0, 2.8, 1.6, 1., 0.5, 1.7/) + + integer, dimension(1) :: BSi1=(/52/) + integer, dimension(2) :: BSi2=(/15,37/) + integer, dimension(3) :: BSi3=(/20,28,4/) + integer, dimension(4) :: BSi4=(/6,24,4,18/) + + integer, dimension(1) :: BSj1=(/50/) + integer, dimension(2) :: BSj2=(/16,34/) + integer, dimension(3) :: BSj3=(/22,28,0/) + integer, dimension(4) :: BSj4=(/11,14,8,17/) !rem + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix26 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,6),MULT_BLOCK(m2)) + +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m1),WGT_BLOCK(WB2,8)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) * 5 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),GEN_BLOCK(BSj)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)* 5) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix26 + +C ----------------------------------------------------distrmix27 +c 27 DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][BLOCK] + + subroutine distrmix27 (psize) + integer psize (2) + + integer, parameter :: AN1=8,AN2=64,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m1 = 2, m2 = 8 + + double precision, dimension(7) :: + > WB=(/2., 3.2, 2., 3.5, 1.2, 1., 4./) + + integer, dimension(1) :: BSi1=(/8/) + integer, dimension(2) :: BSi2=(/2,6/) + integer, dimension(3) :: BSi3=(/4,3,1/) + integer, dimension(4) :: BSi4=(/2,3,2,1/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix27 ' + +!dvm$ distribute A2(BLOCK,MULT_BLOCK(m2)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =(i*NL+j)*2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m1),WGT_BLOCK(WB,7)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) * 2 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),BLOCK) + + select case(psize(1)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),BLOCK) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),BLOCK) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),BLOCK) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),BLOCK) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)* 4) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix27 + +C ----------------------------------------------------distrmix28 +c 28 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK] + + subroutine distrmix28 (psize) + integer psize (2) + + integer, parameter :: AN1=42,AN2=16,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m1 = 3, m2 = 2 + + double precision, dimension(6) :: + > WB1=(/2., 3., 1.2, 1.5, 1., 1.5/) + double precision, dimension(7) :: + > WB2=(/2.2, 1.5, 3.0, 2.8, 2.6, 1.4, 0.5/) + + integer, dimension(1) :: BSj1=(/16/) + integer, dimension(2) :: BSj2=(/12,4/) + integer, dimension(3) :: BSj3=(/5,1,10/) + integer, dimension(4) :: BSj4=(/2,4,6,4/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix28 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ distribute A2(BLOCK(m1),GEN_BLOCK(Bj)) + + select case(psize(2)) + case(1) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =(i*NL+j)*3 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB1,6),MULT_BLOCK(m2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j)*2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK, WGT_BLOCK(WB2,7)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)*6) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end + +C ----------------------------------------------------distrmix29 +c 29 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [BLOCK][MULT_BLOCK] + + subroutine distrmix29 (psize) + integer psize(2) + + integer, parameter :: AN1=21,AN2=48, NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, parameter :: m1 = 3, m2 = 2 + + double precision, dimension(9) :: + > WB=(/2.2, 1.5, 3.0, 2.8, 2.6, 1.4, 0.5, 1., 2./) + + integer, dimension(1) :: BSi1=(/21/) + integer, dimension(2) :: BSi2=(/15,6/) + integer, dimension(3) :: BSi3=(/10,6,5/) + integer, dimension(4) :: BSi4=(/6,4,8,3/) + + integer, dimension(1) :: BSj1=(/48/) + integer, dimension(2) :: BSj2=(/16,32/) + integer, dimension(3) :: BSj3=(/20,18,10/) + integer, dimension(4) :: BSj4=(/2,42,1,3/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix29 ' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ redistribute A2(WGT_BLOCK(WB,9),BLOCK) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =(i*NL+j) + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),GEN_BLOCK(BSj)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj2)) + case (3) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j)*4 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK, MULT_BLOCK(m2)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)*4) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix29 + +C ----------------------------------------------------distrmix210 +c 210 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + + subroutine distrmix210 (psize) + integer psize(2) + + integer, parameter :: AN1=9,AN2=11,NL=1000,ER=10000 + integer :: erri= ER,i,j + + integer, dimension(1) :: BSi1=(/9/) + integer, dimension(2) :: BSi2=(/3,6/) + integer, dimension(3) :: BSi3=(/1,3,5/) + integer, dimension(4) :: BSi4=(/2,3,1,3/) + + integer, dimension(1) :: BSj1=(/11/) + integer, dimension(2) :: BSj2=(/7,4/) + integer, dimension(3) :: BSj3=(/5,6,0/) + integer, dimension(4) :: BSj4=(/2,3,2,4/) + + double precision, dimension(6) :: + > WB1=(/1.0, 1.2, 2.5, 1.4, 2.5, 1.3/) + double precision, dimension(4) :: + > WB2=(/1.0,2.,1.5,1.7/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix210' + +!dvm$ distribute A2(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,4)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),GEN_BLOCK(BSj)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) * 2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,4),WGT_BLOCK(WB1,6)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .ne.(i*NL+j)*2) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix210 + +C ----------------------------------------------------distrmix211 +c 211 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK] + + subroutine distrmix211 (psize) + integer psize(2) + + integer, parameter :: AN1=16,AN2=16,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(7) :: + > WB=(/1.0, 1.2, 2.5, 1.4, 2.5, 1.3, 2./) + + integer, dimension(1) :: BSi1=(/16/) + integer, dimension(2) :: BSi2=(/10,6/) + integer, dimension(3) :: BSi3=(/8,3,5/) + integer, dimension(4) :: BSi4=(/2,3,4,7/) !rem + + integer, dimension(1) :: BSj1=(/16/) + integer, dimension(2) :: BSj2=(/7,9/) + integer, dimension(3) :: BSj3=(/5,6,5/) + integer, dimension(4) :: BSj4=(/1,4,8,3/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix211' + +!dvm$ distribute A2(WGT_BLOCK(WB,7),BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + 2 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),GEN_BLOCK(BSj)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + 2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK,WGT_BLOCK(WB,5)) + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) .ne.(i*NL+j + 4)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix211 + +C ----------------------------------------------------distrmix212 +c 212 DISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][GEN_BLOCK] + + subroutine distrmix212 (psize) + integer psize(2) + + integer, parameter :: AN1=6,AN2=28,NL=1000,ER=10000 + integer :: erri= ER,i + + double precision, dimension(8) :: + > WB1=(/1.0, 1.2, 2.5, 1.4, 2.5, 1.3, 1., 2./) + double precision, dimension(5) :: + > WB2=(/2., 1.3, 2., 1.0, 1.7/) + + integer, dimension(1) :: BSi11=(/6/) + integer, dimension(1) :: BSi12=(/6/) + integer, dimension(2) :: BSi21=(/1,5/) + integer, dimension(2) :: BSi22=(/4,2/) + integer, dimension(3) :: BSi31=(/0,4,2/) + integer, dimension(3) :: BSi32=(/1,3,2/) + integer, dimension(4) :: BSi41=(/2,3,1,0/) + integer, dimension(4) :: BSi42=(/1,2,1,2/) + + integer, dimension(1) :: BSj11=(/28/) + integer, dimension(1) :: BSj12=(/28/) + integer, dimension(2) :: BSj21=(/13,15/) + integer, dimension(2) :: BSj22=(/7,21/) + integer, dimension(3) :: BSj31=(/8,8,12/) + integer, dimension(3) :: BSj32=(/5,18,5/) + integer, dimension(4) :: BSj41=(/2,12,3,11/) + integer, dimension(4) :: BSj42=(/6,4,8,10/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix212' + +!dvm$ distribute :: A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ distribute A2(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +! print *, 'A2 =' +! print *, A2 + +!dvm$ redistribute A2(WGT_BLOCK(WB1,8),WGT_BLOCK(WB2,5)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + 1 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2)) + + select case(psize(1)) + + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj22)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi12),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi22),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj22)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi32),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj12)) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj22)) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj32)) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) - 1 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +! print *, 'A2 =' +! print *, A2 + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix212 + +C ----------------------------------------------------distrmix213 +c 213 DISTRIBUTE arrA2[BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA2[GEN_BLOCK][BLOCK] + + subroutine distrmix213 (psize) + integer psize(2) + + integer, parameter :: AN1=27,AN2=14,NL=1000,ER=10000 + integer :: erri= ER,i + + integer, parameter :: m1 = 3, m2 = 2 + + double precision, dimension(4) :: + > WB=(/1.2, 1.6, 2.0, 1.8/) + + integer, dimension(1) :: BSi1=(/27/) + integer, dimension(2) :: BSi2=(/13,14/) + integer, dimension(3) :: BSi3=(/11,13,3/) + integer, dimension(4) :: BSi4=(/3,5,11,8/) + + integer, dimension(1) :: BSj1=(/14/) + integer, dimension(2) :: BSj2=(/12,2/) + integer, dimension(3) :: BSj3=(/5,6,3/) + integer, dimension(4) :: BSj4=(/2,3,5,4/) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrmix213' + +!dvm$ distribute ::A2 +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!!!!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj)) + + select case(psize(2)) + case(1) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj1)) + case(2) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj2)) + case(3) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj3)) + case(4) +!dvm$ redistribute A2(BLOCK,GEN_BLOCK(BSj4)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + 4 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB,4), MULT_BLOCK(m2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) + 4 + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A2(GEN_BLOCK(BSi),BLOCK) + + select case(psize(1)) + case(1) +!dvm$ redistribute A2(GEN_BLOCK(BSi1),BLOCK) + case(2) +!dvm$ redistribute A2(GEN_BLOCK(BSi2),BLOCK) + case(3) +!dvm$ redistribute A2(GEN_BLOCK(BSi3),BLOCK) + case(4) +!dvm$ redistribute A2(GEN_BLOCK(BSi4),BLOCK) + case default + goto 10 + endselect + +!dvm$ actual(erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= i*NL+j+8) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A2) + + end subroutine distrmix213 + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix3.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix3.fdv new file mode 100644 index 0000000..bf3fbb7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MIX/distrmix3.fdv @@ -0,0 +1,3403 @@ + program DISTRMIX3 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! GEN_BLOCK, WGT_BLOCK, MULT_BLOCK, BLOCK, * distributions + + integer PROCESSORS_RANK, PROCESSORS_SIZE + integer psize(3), rank + + PROCESSORS_RANK() = 3 + PROCESSORS_SIZE(i) = 1 + + print *,'===START OF distrmix3========================' + +C ------------------------------------------------- +c 31 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + call distrmix31 +C ------------------------------------------------- +c 32 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + call distrmix32 +C ------------------------------------------------- +c 33 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + call distrmix33 +C ------------------------------------------------- +c 34 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][WGT_BLOCK] + call distrmix34 +C ------------------------------------------------- +c 35 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE [WGT_BLOCK][BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][MULT_BLOCK][WGT_BLOCK] + call distrmix35 +C ------------------------------------------------- +c 36 DISTRIBUTE arrA3[WGT_BLOCK][MULT_BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK] + call distrmix36 +C ------------------------------------------------- +c 37 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][BLOCK] +c REDISTRIBUTE [BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK] + call distrmix37 +C ------------------------------------------------- +c 38 DISTRIBUTE arrA3[MULT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE [*][*][*] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][*] + call distrmix38 +C ------------------------------------------------- +c 39 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] +c REDISTRIBUTE [WGT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE [*][MULT_BLOCK][*] + call distrmix39 +C ------------------------------------------------- +c 310 DISTRIBUTE arrA3[WGT_BLOCK][*][*] +c REDISTRIBUTE [MULT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE [*][WGT_BLOCK][MULT_BLOCK] + call distrmix310 +C ------------------------------------------------- + + rank = PROCESSORS_RANK() + + do i=1,rank + psize(i)=PROCESSORS_SIZE(i) + if (psize(i) > 4) then ! may be temporary + goto 1 + endif + enddo + +C ------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 1 .and. psize(3) == 1) !range 1 1 1 + >.or. + > (psize(1) == 1 .and. psize(2) == 2 .and. psize(3) == 3) !range 1 2 3 + >.or. + > (psize(1) == 2 .and. psize(2) == 3 .and. psize(3) == 2) !range 2 3 2 + >.or. + > (psize(1) == 3 .and. psize(2) == 4 .and. psize(3) == 1) !range 3 4 1 + >.or. + > (psize(1) == 4 .and. psize(2) == 1 .and. psize(3) == 4)) !range 4 1 4 + >then +c 311 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + call distrmix311 (psize) + endif +C------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 1 .and. psize(3) == 1) !range 1 1 1 + >.or. + > (psize(1) == 1 .and. psize(2) == 4 .and. psize(3) == 4) !range 1 4 4 + >.or. + > (psize(1) == 2 .and. psize(2) == 4 .and. psize(3) == 2) !range 2 4 2 + >.or. + > (psize(1) == 3 .and. psize(2) == 1 .and. psize(3) == 3) !range 3 1 3 + >.or. + > (psize(1) == 4 .and. psize(2) == 2 .and. psize(3) == 2)) !range 4 2 2 + >then +c 312 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] + call distrmix312 (psize) + endif +C------------------------------------------------- +c 313 DISTRIBUTE arrA3[BLOCK][BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][WGT_BLOCK] + call distrmix313 (psize) +C ------------------------------------------------- +c 314 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK] + call distrmix314 (psize) +C ------------------------------------------------- +c 315 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + call distrmix315 (psize) +C ------------------------------------------------- +c 316 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + call distrmix316 (psize) +C ------------------------------------------------- +c 317 DISTRIBUTE arrA3[GEN_BLOCK][*][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][*] +c REDISTRIBUTE [*][GEN_BLOCK][BLOCK] + call distrmix317 (psize) +C ------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 1 .and. psize(3) == 1) !range 1 1 1 + >.or. + > (psize(1) == 1 .and. psize(2) == 4 .and. psize(3) == 3) !range 1 4 3 + >.or. + > (psize(1) == 2 .and. psize(2) == 3 .and. psize(3) == 2) !range 2 3 2 + >.or. + > (psize(1) == 3 .and. psize(2) == 1 .and. psize(3) == 4) !range 3 1 4 + >.or. + > (psize(1) == 4 .and. psize(2) == 2 .and. psize(3) == 2)) !range 4 2 2 + >then +c 318 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + call distrmix318 (psize) + endif +C ------------------------------------------------- + if + > ((psize(1) == 1 .and. psize(2) == 2 .and. psize(3) == 1) !range 1 2 1 + >.or. + > (psize(1) == 2 .and. psize(2) == 2 .and. psize(3) == 2) !range 2 2 2 + >.or. + > (psize(1) == 3 .and. psize(2) == 2 .and. psize(3) == 2) !range 3 2 2 + >.or. + > (psize(1) == 4 .and. psize(2) == 4 .and. psize(3) == 1)) !range 4 4 1 + >then + +c 319 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + call distrmix319 (psize) + endif +C ------------------------------------------------- +c 320 DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrB3[WGT_BLOCK][BLOCK][WGT_BLOCK] + call distrmix320 (psize) +C ------------------------------------------------- +c 321 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] ! static +c REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] + call distrmix321 (psize) +C ------------------------------------------------- +c 322 DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK][BLOCK] + call distrmix322 (psize) +C ------------------------------------------------- +c 323 DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][*] + call distrmix323 (psize) +C ------------------------------------------------- +c 324 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][*] +c REDISTRIBUTE [*][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][*][GEN_BLOCK] + call distrmix324 (psize) +C ------------------------------------------------- +c 325 DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [*][WGT_BLOCK][*] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] + call distrmix325 (psize) +C ------------------------------------------------- +C + 1 print *,'=== END OF distrmix3 ========================= ' + + end + +C ----------------------------------------------------distrmix31 +c 31 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + + subroutine distrmix31 + + integer, parameter :: AN1=32,AN2=32,AN3=32,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m11 = 4, m21 = 8, m31 = 2 + integer, parameter :: m12 = 2, m22 = 4, m32 = 4 + + double precision, dimension(7) :: + > WB1=(/2.0,1.5,4.,3.0, 2., 3., 2./) + double precision, dimension(8):: + > WB2=(/1.0,1.,2.,2.0,1.,1.,2.,2./) + double precision, dimension(7) :: + > WB3=(/2.0,2.,2.6,3.0, 1., 1.5, 1./) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix31 ' + + +!dvm$ distribute A3(MULT_BLOCK(m11),MULT_BLOCK(m21),MULT_BLOCK(m31)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,7),WGT_BLOCK(WB2,8),WGT_BLOCK(WB3,7)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m12),MULT_BLOCK(m22),MULT_BLOCK(m32)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) + 2) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix31 + +C ----------------------------------------------------distrmix32 +c 32 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + + subroutine distrmix32 + + integer, parameter :: AN1=16,AN2=16,AN3=12,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 2, m2 = 4, m3 = 4 + + double precision, dimension(6) :: + > WB1=(/2.0,5.,0.,3.0, 2., 3./) + double precision, dimension(8):: + > WB2=(/1.2,2.,4.,2.5,3.,1.,3.,2./) + double precision, dimension(7) :: + > WB3=(/2.3,1.2,4.6,3.0, 1.5, 2.5, 1.2/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix32 ' + +!dvm$ distribute +!dvm$* A3(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,8),WGT_BLOCK(WB3,7)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 10 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),MULT_BLOCK(m3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB2,8),WGT_BLOCK(WB3,7),WGT_BLOCK(WB1,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 12)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix32 + +C----------------------------------------------------distrmix33 +c 33 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + + subroutine distrmix33 + + integer, parameter :: AN1=12,AN2=18,AN3=20,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m11 = 2, m21 = 3, m31 = 2 + integer, parameter :: m12 = 6, m22 = 9, m32 = 5 + + double precision, dimension(7) :: + > WB1=(/2.2, 2.4, 4., 2.5, 3.5, 1.,3./) + double precision, dimension(6):: + > WB2=(/1.2, 2., 2.5, 3., 1.5, 3./) + double precision, dimension(5) :: + > WB3=(/4.3, 2.2, 2.6, 2.0, 2.5/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix33 ' + +!dvm$ distribute A3(MULT_BLOCK(m11),WGT_BLOCK(WB2,6),MULT_BLOCK(m31)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 7 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,7),MULT_BLOCK(m21),WGT_BLOCK(WB3,5)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1, AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 5 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(MULT_BLOCK(m12),MULT_BLOCK(m22),MULT_BLOCK(m32)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 2)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix33 + +C------------------------------------------------------distrmix34 +c 34 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][WGT_BLOCK] + + subroutine distrmix34 + + integer, parameter :: AN1=35,AN2=28,AN3=16,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 7, m2 = 7, m3 = 4 + + double precision, dimension(8) :: + > WB1=(/2., 2., 4., 2.7, 3.5, 2., 1., 3./) + double precision, dimension(6):: + > WB2=(/12., 2.5, 3., 1.5, 3., 2./) + double precision, dimension(7) :: + > WB3=(/4.,3., 2.2, 2.6, 2.0, 2.5, 1./) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix34 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,8),WGT_BLOCK(WB2,6),MULT_BLOCK(m3)) + + A3 = 0 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB2,6),MULT_BLOCK(m2),WGT_BLOCK(WB3,7)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k)*2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(MULT_BLOCK(m1),WGT_BLOCK(WB3,7),WGT_BLOCK(WB1,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) * 2) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix34 + +C------------------------------------------------------distrmix35 +c 35 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE [WGT_BLOCK][BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][MULT_BLOCK][WGT_BLOCK] + + subroutine distrmix35 + + integer, parameter :: AN1= 10, AN2=21, AN3=32,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 2, m2 = 3, m3 = 4 + + double precision, dimension(7) :: + > WB1=(/2., 4., 3., 2.5, 5., 1., 2./) + double precision, dimension(10):: + > WB2=(/1., 2., 5., 3., 1., 3., 2., 3., 2., 1./) + double precision, dimension(8) :: + > WB3=(/2.3, 2.2, 1.6, 1., 2.0, 2.5, 3., 2./) + + integer A3(AN1,AN2,AN3) ! static array + character(12), parameter :: tname='distrmix35 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),WGT_BLOCK(WB2,10),BLOCK) +!dvm$ dynamic A3 + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 5 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,7),BLOCK,MULT_BLOCK(m3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(BLOCK, MULT_BLOCK(m2),WGT_BLOCK(WB3,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 7)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end subroutine distrmix35 + +C------------------------------------------------------distrmix36 +c 36 DISTRIBUTE arrA3[WGT_BLOCK][MULT_BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK] + + subroutine distrmix36 + + integer, parameter :: AN1=16,AN2=28,AN3=16,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 2, m2 = 7, m3 = 4 + + double precision, dimension(8) :: + > WB1=(/1.2,2.,4.,2.5,3.,1.,3.,2./) + double precision, dimension(7):: + > WB2=(/2.,2.,4.,2.5,3.,1.,3./) + double precision, dimension(7) :: + > WB3=(/2.5,2.2,4.2,2.0, 1.5, 3.5, 1.2/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix36 ' + +!dvm$ distribute A3(WGT_BLOCK(WB1,8),MULT_BLOCK(m2),BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = (i*NL/10 + j*NL/100 + k) * 3 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(MULT_BLOCK(m1),BLOCK,WGT_BLOCK(WB3,7)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(BLOCK, WGT_BLOCK(WB2,7),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) * 6) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix36 + +C -----------------------------------------------------distrmix37 +c 37 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][BLOCK] +c REDISTRIBUTE [BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK][MULT_BLOCK] + + subroutine distrmix37 + + integer, parameter :: AN1=10,AN2=10,AN3=30,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 2, m2 = 5, m3 = 3 + + double precision, dimension(6) :: + > WB2=(/4., 2.5, 3., 1., 3., 2./) + double precision, dimension(8):: + > WB3=(/1.,2.,3.,3.5, 4., 1., 3., 2./) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix37 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),BLOCK,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = (i*NL/10 + j*NL/100 + k) * 3 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(BLOCK,BLOCK,WGT_BLOCK(WB3,8)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(BLOCK, WGT_BLOCK(WB2,6),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) * 6) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix37 + +C------------------------------------------------------distrmix38 +c 38 DISTRIBUTE arrA3[MULT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE [*][*][*] +c REDISTRIBUTE [WGT_BLOCK][MULT_BLOCK][*] + + subroutine distrmix38 + + integer, parameter :: AN1=16,AN2=16,AN3=16,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 2, m2 = 1, m3 = 4 + + double precision, dimension(11) :: + > WB=(/2.2, 3.,3., 2.5, 2., 1., 4., 2., 1., 5., 2./) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix38 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),*,WGT_BLOCK(WB,11)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 5 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + (i*NL/10 + j*NL/100 + k) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,*) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB,8),MULT_BLOCK(m2),*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) + 7) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix38 + +C ----------------------------------------------------distrmix39 +C 39 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] +c REDISTRIBUTE [WGT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE [*][MULT_BLOCK][*] + + subroutine distrmix39 + + integer, parameter :: AN1=18,AN2=6,AN3=30,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 3, m2 = 2, m3 = 5 + + double precision, dimension(11) :: + > WB=(/3.2, 2., 2., 1.5, 4., 2., 3., 2.5, 1.6, 3., 2./) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix39 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),BLOCK,*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 7 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + (i*NL/10 + j*NL/100 + k) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB,11),*,WGT_BLOCK(WB,7)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 4 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(*,MULT_BLOCK(m2),*) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) + 11) then + erri = min(erri, i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix39 + +C ----------------------------------------------------distrmix310 +c 310 DISTRIBUTE arrA3[WGT_BLOCK][*][*] +c REDISTRIBUTE [MULT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE [*][WGT_BLOCK][MULT_BLOCK] + + subroutine distrmix310 + + integer, parameter :: AN1=25,AN2=35,AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 5, m2 = 7, m3 = 2 + + double precision, dimension(12) :: + > WB=(/3., 1., 2., 1.5, 3., 4., 3., 2.5, 1.6, 3., 1.2, 1./) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix310 ' + +!dvm$ distribute A3(WGT_BLOCK(WB,12),*,*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(MULT_BLOCK(m1), *, WGT_BLOCK(WB,8)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(*,MULT_BLOCK(m2),WGT_BLOCK(WB,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) - 2) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrmix310 + +C ----------------------------------------------------distrmix311 +c 311 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] range 1 1 1 +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 2 3 +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] range 2 3 2 +c range 3 2 2 +c range 4 1 4 + subroutine distrmix311 (psize) + integer psize(3) + + integer, parameter :: AN1=15,AN2=15,AN3=28,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m11 = 3, m21 = 5, m31 = 4 + integer, parameter :: m12 = 5, m22 = 3, m32 = 7 + + integer, dimension(1) :: BSi111=(/15/) !range 1 1 1 + integer, dimension(1) :: BSj111=(/15/) + integer, dimension(1) :: BSk111=(/28/) + + integer, dimension(1) :: BSi1=(/15/) !range 1 2 3 + integer, dimension(2) :: BSj1=(/8,7/) + integer, dimension(3) :: BSk1=(/12,10,6/) + + integer, dimension(2) :: BSi2=(/4,11/) !range 2 3 2 + integer, dimension(3) :: BSj2=(/7,5,3/) + integer, dimension(2) :: BSk2=(/10,18/) + + integer, dimension(3) :: BSi3=(/2,8,5/) !range 3 4 1 + integer, dimension(4) :: BSj3=(/3,2,6,4/) + integer, dimension(1) :: BSk3=(/28/) + + integer, dimension(4) :: BSi4=(/1,2,4,8/) !range 4 1 4 + integer, dimension(1) :: BSj4=(/15/) + integer, dimension(4) :: BSk4=(/12,4,6,6/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix311 ' + +!dvm$ distribute A3(MULT_BLOCK(m11),MULT_BLOCK(m21),MULT_BLOCK(m31)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),BLOCK,GEN_BLOCK(BSk)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m12),MULT_BLOCK(m22),MULT_BLOCK(m32)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) * 2) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix311 + +C ----------------------------------------------------distrmix312 +c 312 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 1 1 +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] range 1 4 4 +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] range 2 4 2 +c range 3 1 3 +c range 4 2 2 + subroutine distrmix312 (psize) + integer psize(3) + + integer, parameter :: AN1=24,AN2=10,AN3=24,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 3, m2 = 2, m3 = 4 + + double precision, dimension(10) :: + > WB=(/2., 2.5, 3., 4., 3.5, 2.5, 2.6, 3., 2.2, 3./) + + integer, dimension(1) :: BSi111=(/24/) !range 1 1 1 + integer, dimension(1) :: BSj111=(/10/) + integer, dimension(1) :: BSk111=(/24/) + + integer, dimension(1) :: BSi11=(/24/) !range 1 4 4 + integer, dimension(1) :: BSi12=(/24/) + integer, dimension(4) :: BSj11=(/3,2,4,1/) + integer, dimension(4) :: BSj12=(/4,2,1,3/) + integer, dimension(4) :: BSk11=(/10,4,3,7/) + integer, dimension(4) :: BSk12=(/5,6,7,6/) + + integer, dimension(2) :: BSi21=(/14,10/) !range 2 4 2 + integer, dimension(2) :: BSi22=(/8,16/) + integer, dimension(4) :: BSj21=(/3,2,1,4/) + integer, dimension(4) :: BSj22=(/5,3,2,0/) + integer, dimension(2) :: BSk21=(/20,4/) + integer, dimension(2) :: BSk22=(/16,8/) + + integer, dimension(3) :: BSi31=(/8,12,4/) !range 3 1 3 + integer, dimension(3) :: BSi32=(/3,10,11/) + integer, dimension(1) :: BSj31=(/10/) + integer, dimension(1) :: BSj32=(/10/) + integer, dimension(3) :: BSk31=(/7,9,8/) + integer, dimension(3) :: BSk32=(/4,6,14/) + + integer, dimension(4) :: BSi41=(/2,6,12,4/) !range 4 2 2 + integer, dimension(4) :: BSi42=(/3,2,9,10/) + integer, dimension(2) :: BSj41=(/6,4/) + integer, dimension(2) :: BSj42=(/10,0/) + integer, dimension(2) :: BSk41=(/14,10/) + integer, dimension(2) :: BSk42=(/6,18/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix312 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 30 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),WGT_BLOCK(WB,10),MULT_BLOCK(m3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 30 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),BLOCK) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),BLOCK) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12),BLOCK) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22),BLOCK) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32),BLOCK) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42),BLOCK) + case default + goto 10 + endselect + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 30 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 30)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix312 + +C------------------------------------------------------distrmix313 +c 313 DISTRIBUTE arrA3[BLOCK][BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][GEN_BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][WGT_BLOCK] + + subroutine distrmix313 (psize) + integer psize(3) + + integer, parameter :: AN1=12,AN2=24,AN3=36,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 2, m2 = 3, m3 = 4 + + double precision, dimension(9) :: + > WB=(/1., 2.5, 3., 4., 2.5, 2.6, 3.5, 4.2, 3./) + + integer, dimension(1) :: BSj1=(/24/) + integer, dimension(2) :: BSj2=(/21,3/) + integer, dimension(3) :: BSj3=(/7,9,8/) + integer, dimension(4) :: BSj4=(/10,4,6,4/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix313 ' + +!dvm$ distribute A3(BLOCK, BLOCK, MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 20 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj),BLOCK) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),BLOCK) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),BLOCK) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),BLOCK) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),BLOCK) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 5 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),WGT_BLOCK(WB,9)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 20 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 5)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix313 + +C-----------------------------------------------------distrmix314 +c 314 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][BLOCK][WGT_BLOCK] +c + subroutine distrmix314 (psize) + integer psize(3) + + integer, parameter :: AN1=24,AN2=15,AN3=12,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 4, m2 = 3, m3 = 2 + + double precision, dimension(10) :: + > WB=(/3., 2., 2., 4., 2., 3., 2.5, 2.6, 1.2, 2./) + + integer, dimension(1) :: BSi1=(/24/) + integer, dimension(2) :: BSi2=(/14,10/) + integer, dimension(3) :: BSi3=(/12,8,4/) + integer, dimension(4) :: BSi4=(/6,6,5,7/) + + integer, dimension(1) :: BSj1=(/15/) + integer, dimension(2) :: BSj2=(/7,8/) + integer, dimension(3) :: BSj3=(/3,4,8/) + integer, dimension(4) :: BSj4=(/1,6,3,5/) + + integer, dimension(1) :: BSk1=(/12/) + integer, dimension(2) :: BSk2=(/4,8/) + integer, dimension(3) :: BSk3=(/6,2,4/) + integer, dimension(4) :: BSk4=(/2,3,6,1/) + + integer A3(AN1,AN2,AN3) ! static + character(12), parameter :: tname='distrmix314 ' + +!dvm$ distribute A3(WGT_BLOCK(WB,10), BLOCK, MULT_BLOCK(m3)) +!dvm$ dynamic A3 + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),BLOCK,GEN_BLOCK(BSk)) + + select case(psize(1)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),BLOCK,MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 2)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 continue + + end subroutine distrmix314 + +C ----------------------------------------------------distrmix315 +c 315 DISTRIBUTE arrA3[MULT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + + subroutine distrmix315 (psize) + integer psize(3) + + integer, parameter :: AN1=21, AN2=14, AN3=16, NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 3, m2 = 2, m3 = 4 + + double precision, dimension(8) :: + > WB1=(/2., 4., 3., 1., 2.5, 2.6, 2.2, 2./) + double precision, dimension(10) :: + > WB2=(/4., 2., 2.5, 4., 2., 3., 3.5, 1.6, 3.2, 2./) + + integer, dimension(1) :: BSi1=(/21/) + integer, dimension(2) :: BSi2=(/14,7/) + integer, dimension(3) :: BSi3=(/10,8,3/) + integer, dimension(4) :: BSi4=(/6,6,5,4/) + + integer, dimension(1) :: BSj1=(/14/) + integer, dimension(2) :: BSj2=(/3,11/) + integer, dimension(3) :: BSj3=(/4,3,7/) + integer, dimension(4) :: BSj4=(/2,6,2,4/) + + integer, dimension(1) :: BSk1=(/16/) + integer, dimension(2) :: BSk2=(/4,12/) + integer, dimension(3) :: BSk3=(/6,3,7/) !rem + integer, dimension(4) :: BSk4=(/2,3,6,5/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix315 ' + +!dvm$ distribute +!dvm$* A3 (MULT_BLOCK(m1), WGT_BLOCK(WB1,8), WGT_BLOCK(WB2,10)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 12 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj),GEN_BLOCK(BSk)) + + select case(psize(2)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 12 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),WGT_BLOCK(WB1,6),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 20 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 4)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno (tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix315 + +C-----------------------------------------------------distrmix316 +c 316 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][MULT_BLOCK] + + subroutine distrmix316 (psize) + integer psize(3) + + integer, parameter :: AN1=33,AN2=44,AN3=55,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 3, m2 = 11, m3 = 5 + + double precision, dimension (7) :: + > WB1=(/3., 2.5, 2., 4., 2.5, 2.0, 3.5/) + double precision, dimension(8) :: + > WB2=(/4., 3., 2.5, 2., 2., 3., 3.5, 2.6/) + + integer, dimension(1) :: BSi1=(/33/) + integer, dimension(2) :: BSi2=(/23,10/) + integer, dimension(3) :: BSi3=(/12,15,6/) + integer, dimension(4) :: BSi4=(/6,13,11,3/) !rem + + integer, dimension(1) :: BSj1=(/44/) + integer, dimension(2) :: BSj2=(/14,30/) + integer, dimension(3) :: BSj3=(/11,21,12/) + integer, dimension(4) :: BSj4=(/6,14,10,14/) + + integer, dimension(1) :: BSk1=(/55/) + integer, dimension(2) :: BSk2=(/28,27/) + integer, dimension(3) :: BSk3=(/12,18,25/) + integer, dimension(4) :: BSk4=(/10,18,15,12/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix316 ' + +!dvm$ distribute +!dvm$* A3(WGT_BLOCK(WB1,7), WGT_BLOCK(WB2,8), MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),GEN_BLOCK(BSj),BLOCK) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),BLOCK) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj2),BLOCK) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj3),BLOCK) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj4),BLOCK) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj1),BLOCK) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),BLOCK) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj3),BLOCK) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj4),BLOCK) + case default + goto 10 + endselect + + case(3) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj1),BLOCK) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj2),BLOCK) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3),BLOCK) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj4),BLOCK) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj1),BLOCK) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj2),BLOCK) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj3),BLOCK) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4),BLOCK) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 5 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),WGT_BLOCK(WB1,7),MULT_BLOCK(m2)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 2 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 5)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix316 + +C-----------------------------------------------------distrmix317 +c 317 DISTRIBUTE arrA3[GEN_BLOCK][*][GEN_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][WGT_BLOCK][*] +c REDISTRIBUTE [*][GEN_BLOCK][BLOCK] range 3 4 1 + + subroutine distrmix317 (psize) + integer psize(3) + + integer, parameter :: AN1=12,AN2=16,AN3=12,NL=1000,ER=100000 + integer :: erri=ER,i,j,k + + integer, parameter :: m1 = 2, m2 = 4, m3 = 3 + + double precision, dimension(8) :: + > WB=(/2., 1., 2.5, 3., 4., 3., 3.5, 4./) + + integer, dimension(1) :: BSi1=(/12/) + integer, dimension(2) :: BSi2=(/4,8/) + integer, dimension(3) :: BSi3=(/2,7,3/) + integer, dimension(4) :: BSi4=(/2,3,4,3/) + + integer, dimension(1) :: BSj1=(/16/) + integer, dimension(2) :: BSj2=(/11,5/) + integer, dimension(3) :: BSj3=(/8,2,6/) + integer, dimension(4) :: BSj4=(/1,3,4,8/) !rem + + integer, dimension(1) :: BSk1=(/12/) + integer, dimension(2) :: BSk2=(/2,10/) + integer, dimension(3) :: BSk3=(/1,4,7/) + integer, dimension(4) :: BSk4=(/2,4,3,3/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix317 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),*,GEN_BLOCK(BSk)) + select case(psize(1)) + case(1) + select case(psize(2)) ! it's is true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),*,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),*,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),*,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),*,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) ! it's is true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),*,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),*,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),*,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),*,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(3) + select case(psize(2)) ! it's is true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),*,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),*,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),*,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),*,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) ! it's is true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),*,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),*,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),*,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),*,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10+j*NL/100+k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),WGT_BLOCK(WB,8),*) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$* redistribute A3(*,GEN_BLOCK(BSj),BLOCK) + + select case (psize(1)) !rem + case(1) +!dvm$ redistribute A3(*,GEN_BLOCK(BSj1),BLOCK) + case(2) +!dvm$ redistribute A3(*,GEN_BLOCK(BSj2),BLOCK) + case(3) +!dvm$ redistribute A3(*,GEN_BLOCK(BSj3),BLOCK) + case(4) +!dvm$ redistribute A3(*,GEN_BLOCK(BSj4),BLOCK) + case default + goto 10 + endselect + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) / 2 + if (A3(i,j,k) /= i*NL/10+j*NL/100+k) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix317 + +C ----------------------------------------------------distrmix318 +c 318 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 1 1 +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] range 1 4 3 +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 2 3 2 +c range 3 1 4 +c range 4 2 2 + subroutine distrmix318 (psize) + integer psize(3) + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(7) :: + > WB1=(/2.0, 1.2, 2.5, 1.4, 2.5, 1.3, 1./) + double precision, dimension(5) :: + > WB2=(/2., 1.3, 2., 1.0, 1.7/) + double precision, dimension(6) :: + > WB3=(/2., 3., 1.3, 2., 1.0, 1.7/) + + integer, dimension(1) :: BSi111=(/8/) !range 1 1 1 + integer, dimension(1) :: BSj111=(/8/) + integer, dimension(1) :: BSk111=(/8/) + + integer, dimension(1) :: BSi11=(/8/) !range 1 4 3 + integer, dimension(1) :: BSi12=(/8/) + integer, dimension(4) :: BSj11=(/3,2,2,1/) + integer, dimension(4) :: BSj12=(/4,2,1,1/) + integer, dimension(3) :: BSk11=(/4,3,1/) + integer, dimension(3) :: BSk12=(/2,4,2/) + + integer, dimension(2) :: BSi21=(/6,2/) !range 2 3 2 + integer, dimension(2) :: BSi22=(/4,4/) + integer, dimension(3) :: BSj21=(/3,2,3/) + integer, dimension(3) :: BSj22=(/3,1,4/) + integer, dimension(2) :: BSk21=(/1,7/) + integer, dimension(2) :: BSk22=(/2,6/) + + integer, dimension(3) :: BSi31=(/3,2,3/) !range 3 1 4 + integer, dimension(3) :: BSi32=(/4,2,2/) + integer, dimension(1) :: BSj31=(/8/) + integer, dimension(1) :: BSj32=(/8/) + integer, dimension(4) :: BSk31=(/1,3,2,2/) + integer, dimension(4) :: BSk32=(/1,1,4,2/) + + integer, dimension(4) :: BSi41=(/3,2,1,2/) !range 4 2 2 + integer, dimension(4) :: BSi42=(/5,1,1,1/) + integer, dimension(2) :: BSj41=(/5,3/) + integer, dimension(2) :: BSj42=(/6,2/) + integer, dimension(2) :: BSk41=(/2,6/) + integer, dimension(2) :: BSk42=(/1,7/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix318 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,7),WGT_BLOCK(WB2,5),WGT_BLOCK(WB3,6)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 1 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi12),GEN_BLOCK(BSj12),GEN_BLOCK(BSk12)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi22),GEN_BLOCK(BSj22),GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi32),GEN_BLOCK(BSj32),GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi42),GEN_BLOCK(BSj42),GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 1)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix318 + +C ----------------------------------------------------distrmix319 +c +c 319 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] range 1 1 1 +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][GEN_BLOCK] range 1 2 1 +c REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] range 2 2 2 +c range 3 2 2 +c range 4 4 1 + subroutine distrmix319 (psize) + integer psize(3) + + integer, parameter :: AN1=12,AN2=6,AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(6) :: + > WB1=(/2.0, 1.2, 2., 2.4, 2.3, 1.6/) + double precision, dimension(5) :: + > WB2=(/2.4, 1.8, 2., 1.0, 1.7/) + double precision, dimension(8) :: + > WB3=(/2., 3., 1.3, 2., 1.0, 1.7, 3., 4./) + + integer, dimension(1) :: BSi111=(/8/) !range 1 1 1 + integer, dimension(1) :: BSj111=(/8/) + integer, dimension(1) :: BSk111=(/8/) + + integer, dimension(1) :: BSi1=(/12/) !range 1 2 1 + integer, dimension(2) :: BSj1=(/5,1/) + integer, dimension(1) :: BSk1=(/10/) !rem + + integer, dimension(2) :: BSi2=(/6,6/) !range 2 2 2 + integer, dimension(2) :: BSj2=(/4,2/) + integer, dimension(2) :: BSk2=(/3,7/) + + integer, dimension(3) :: BSi3=(/5,2,5/) !range 3 2 2 + integer, dimension(2) :: BSj3=(/2,4/) + integer, dimension(2) :: BSk3=(/2,8/) + + integer, dimension(4) :: BSi4=(/4,2,4,2/) !range 4 4 1 !rem + integer, dimension(4) :: BSj4=(/1,1,2,2/) + integer, dimension(1) :: BSk4=(/10/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix319 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,5),WGT_BLOCK(WB3,8)) + + A3 = 10 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k)+ i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),GEN_BLOCK(BSj),GEN_BLOCK(BSk)) + + select case(psize(1)) + case(1) + if (psize(2) == 1 .and. psize(3) == 1) then +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi111),GEN_BLOCK(BSj111),GEN_BLOCK(BSk111)) + else +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + endif + case(2) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute +!dvm$* A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB2,5),WGT_BLOCK(WB3,6),WGT_BLOCK(WB1,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 12 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix319 + +C ----------------------------------------------------distrmix320 +c 320 DISTRIBUTE arrA3[BLOCK][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE arrB3[WGT_BLOCK][BLOCK][WGT_BLOCK] + + subroutine distrmix320 (psize) + integer psize(3) + + integer, parameter :: AN1=5,AN2=7,AN3=6,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(7) :: + > WB1=(/2.0, 2.2, 3., 2.4, 2.3, 1.6, 0.5/) + double precision, dimension(6) :: + > WB2=(/2.4, 1.8, 3., 2.0, 1.7, 1./) + double precision, dimension(8) :: + > WB3=(/1., 3.5, 2.3, 2., 1.5, 1.7, 3., 2./) + + integer, dimension(1) :: BSi1=(/5/) + integer, dimension(2) :: BSi2=(/1,4/) + integer, dimension(3) :: BSi3=(/1,2,2/) + integer, dimension(4) :: BSi4=(/2,1,1,1/) + + integer, dimension(1) :: BSj1=(/7/) + integer, dimension(2) :: BSj2=(/3,4/) + integer, dimension(3) :: BSj3=(/2,4,1/) + integer, dimension(4) :: BSj4=(/1,2,1,3/) + + integer, dimension(1) :: BSk1=(/6/) + integer, dimension(2) :: BSk2=(/3,3/) + integer, dimension(3) :: BSk3=(/2,3,1/) + integer, dimension(4) :: BSk4=(/3,2,0,1/) + + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix320 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj),GEN_BLOCK(BSk)) + + select case(psize(2)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj1),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj2),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj3),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(BLOCK,GEN_BLOCK(BSj4),GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + + A3 = 5 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,7),BLOCK,WGT_BLOCK(WB3,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 5 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix320 + +C ----------------------------------------------------distrmix321 +c 321 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] + + subroutine distrmix321 (psize) + integer psize(3) + + integer, parameter :: AN1=16,AN2=16,AN3=16,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(6) :: + > WB1=(/2.5, 3.6, 2.4, 2.3, 1.2, 0.5/) + double precision, dimension(5) :: + > WB2=(/1.4, 2.8, 3., 3.0, 1.1/) + double precision, dimension(7) :: + > WB3=(/1., 2.3, 2.2, 3.5, 1.7, 3., 2./) + + integer, dimension(1) :: BSi1=(/16/) + integer, dimension(2) :: BSi2=(/11,5/) + integer, dimension(3) :: BSi3=(/1,12,3/) + integer, dimension(4) :: BSi4=(/6,4,5,1/) + + integer, dimension(1) :: BSj1=(/16/) + integer, dimension(2) :: BSj2=(/3,13/) + integer, dimension(3) :: BSj3=(/2,4,10/) + integer, dimension(4) :: BSj4=(/5,1,7,3/) + + integer, dimension(1) :: BSk1=(/16/) + integer, dimension(2) :: BSk2=(/10,6/) + integer, dimension(3) :: BSk3=(/2,8,6/) + integer, dimension(4) :: BSk4=(/3,2,10,1/) + + integer A3(AN1,AN2,AN3) ! static array + character(12), parameter :: tname='distrmix321 ' + +!dvm$ distribute A3(WGT_BLOCK(WB1,6),BLOCK,WGT_BLOCK(WB3,7)) +!dvm$ dynamic A3 + + A3 = 20 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k)+ i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),BLOCK,GEN_BLOCK(BSk)) + + select case(psize(1)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 20 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 continue + + end subroutine distrmix321 + +C ----------------------------------------------------distrmix322 +c 322 DISTRIBUTE arrA3[GEN_BLOCK][BLOCK][GEN_BLOCK] +c REDISTRIBUTE [BLOCK][WGT_BLOCK][BLOCK] + + subroutine distrmix322 (psize) + integer psize(3) + + integer, parameter :: AN1=24,AN2=16,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(5) :: + > WB1=(/ 3.2, 2.4, 2.0, 1.0, 2.5/) + double precision, dimension(4) :: + > WB2=(/2.1, 2.5, 3., 1.1/) + double precision, dimension(6) :: + > WB3=(/2.3, 2.0, 3.5, 1.5, 3., 2./) + + integer, dimension(1) :: BSi1=(/24/) + integer, dimension(2) :: BSi2=(/11,13/) + integer, dimension(3) :: BSi3=(/10,12,2/) + integer, dimension(4) :: BSi4=(/6,14,3,1/) + + integer, dimension(1) :: BSj1=(/16/) + integer, dimension(2) :: BSj2=(/12,4/) + integer, dimension(3) :: BSj3=(/3,7,6/) + integer, dimension(4) :: BSj4=(/4,2,6,4/) + + integer, dimension(1) :: BSk1=(/8/) + integer, dimension(2) :: BSk2=(/2,6/) + integer, dimension(3) :: BSk3=(/3,1,4/) + integer, dimension(4) :: BSk4=(/4,2,1,1/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix322 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),BLOCK,GEN_BLOCK(BSk)) + + select case(psize(1)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk1)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk2)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk3)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),BLOCK,GEN_BLOCK(BSk4)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + + A3 = 15 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,WGT_BLOCK(WB2,4),BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 15)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix322 + +C ----------------------------------------------------distrmix323 +c 323 DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE [GEN_BLOCK][GEN_BLOCK][*] + + subroutine distrmix323 (psize) + integer psize(3) + + integer, parameter :: AN1=8,AN2=11,AN3=11,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(7) :: + > WB1=(/ 3.2, 2.4, 1., 2., 2.0, 1.0, 2.5/) + double precision, dimension(6) :: + > WB2=(/3.1, 2.5, 4., 2.1, 2., 2./) + double precision, dimension(6) :: + > WB3=(/1.2, 3.0, 2.4, 1.0, 3., 2.5/) + + integer, dimension(1) :: BSi1=(/8/) + integer, dimension(2) :: BSi2=(/2,6/) + integer, dimension(3) :: BSi3=(/1,3,4/) + integer, dimension(4) :: BSi4=(/3,2,1,2/) + + integer, dimension(1) :: BSj1=(/11/) + integer, dimension(2) :: BSj2=(/3,8/) + integer, dimension(3) :: BSj3=(/1,7,3/) + integer, dimension(4) :: BSj4=(/5,3,1,2/) + + integer, dimension(1) :: BSk1=(/11/) + integer, dimension(2) :: BSk2=(/1,10/) + integer, dimension(3) :: BSk3=(/3,4,4/) + integer, dimension(4) :: BSk4=(/4,2,2,3/) + + integer :: A3(AN1,AN2,AN3) + character(12), parameter :: tname='distrmix323 ' + +!dvm$ distribute A3(BLOCK,WGT_BLOCK(WB2,6),BLOCK) +!dvm$ dynamic A3 + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi),GEN_BLOCK(BSj),*) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj2),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj3),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj4),*) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj1),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj2),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj3),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi2),GEN_BLOCK(BSj4),*) + case default + goto 10 + endselect + + case(3) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj1),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj2),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj3),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi3),GEN_BLOCK(BSj4),*) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj1),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj2),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj3),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi4),GEN_BLOCK(BSj4),*) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 continue + + end subroutine distrmix323 + +C ----------------------------------------------------distrmix324 +c 324 DISTRIBUTE arrA3[GEN_BLOCK][GEN_BLOCK][*] +c REDISTRIBUTE [*][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [GEN_BLOCK][*][GEN_BLOCK] +c + subroutine distrmix324 (psize) + integer psize(3) + + integer, parameter :: AN1=12,AN2=12,AN3=21,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(7) :: + > WB1=(/2.0, 1.2, 2.5, 1.4, 2.5, 1.3, 1./) + double precision, dimension(5) :: + > WB2=(/2., 1.3, 2., 1.0, 1.7/) + double precision, dimension(6) :: + > WB3=(/2., 3., 1.3, 2., 1.0, 1.7/) + + integer, dimension(1) :: BSi11=(/12/) + integer, dimension(1) :: BSi12=(/12/) + integer, dimension(2) :: BSi21=(/8,4/) + integer, dimension(2) :: BSi22=(/2,10/) + integer, dimension(3) :: BSi31=(/1,6,5/) + integer, dimension(3) :: BSi32=(/4,6,2/) + integer, dimension(4) :: BSi41=(/3,2,4,3/) + integer, dimension(4) :: BSi42=(/4,2,2,4/) + + integer, dimension(1) :: BSj11=(/12/) + integer, dimension(1) :: BSj12=(/12/) + integer, dimension(2) :: BSj21=(/6,6/) + integer, dimension(2) :: BSj22=(/1,11/) + integer, dimension(3) :: BSj31=(/8,2,2/) + integer, dimension(3) :: BSj32=(/1,10,1/) + integer, dimension(4) :: BSj41=(/2,5,3,2/) + integer, dimension(4) :: BSj42=(/2,8,1,1/) + + integer, dimension(1) :: BSk11=(/21/) + integer, dimension(1) :: BSk12=(/21/) + integer, dimension(2) :: BSk21=(/11,10/) + integer, dimension(2) :: BSk22=(/7,14/) + integer, dimension(3) :: BSk31=(/1,5,15/) + integer, dimension(3) :: BSk32=(/4,6,11/) + integer, dimension(4) :: BSk41=(/1,2,10,8/) + integer, dimension(4) :: BSk42=(/12,4,2,3/) + + integer, allocatable :: A3(:,:,:) + character(*), parameter :: tname='distrmix324 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi1),GEN_BLOCK(BSj1),*) + + select case(psize(1)) + case(1) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi11),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi21),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case(3) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi31),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj11),*) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj21),*) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj31),*) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi41),GEN_BLOCK(BSj41),*) + case default + goto 10 + endselect + + case default + goto 10 + endselect + + A3 = 1 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k)+i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(*, WGT_BLOCK(WB2,5),WGT_BLOCK(WB3,6)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) * 2 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),*,GEN_BLOCK(BSk2)) + + select case(psize(1)) + case(1) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + case(2) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(3) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(4) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk22)) + case(3) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),*,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) / 2 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 1)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix324 + +C ----------------------------------------------------distrmix325 +c 325 DISTRIBUTE arrA3 [*][GEN_BLOCK][GEN_BLOCK] +c REDISTRIBUTE [*][WGT_BLOCK][*] +c REDISTRIBUTE [GEN_BLOCK][BLOCK][GEN_BLOCK] +c +c + subroutine distrmix325 (psize) + integer psize(3) + + integer, parameter :: AN1=7,AN2=6,AN3=7,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + + double precision, dimension(10) :: + > WB2=(/2.0, 1.2, 2.5, 1.0, 2.5, 1.3, 1., 3., 2., 1./) + + integer, dimension(1) :: BSi11=(/7/) + integer, dimension(1) :: BSi12=(/7/) + integer, dimension(2) :: BSi21=(/3,4/) + integer, dimension(2) :: BSi22=(/2,5/) + integer, dimension(3) :: BSi31=(/1,6,0/) + integer, dimension(3) :: BSi32=(/4,2,1/) + integer, dimension(4) :: BSi41=(/3,2,1,1/) + integer, dimension(4) :: BSi42=(/2,1,2,2/) + + integer, dimension(1) :: BSj11=(/6/) + integer, dimension(1) :: BSj12=(/6/) + integer, dimension(2) :: BSj21=(/2,4/) + integer, dimension(2) :: BSj22=(/0,6/) + integer, dimension(3) :: BSj31=(/2,2,2/) + integer, dimension(3) :: BSj32=(/1,3,2/) + integer, dimension(4) :: BSj41=(/2,1,1,2/) + integer, dimension(4) :: BSj42=(/3,0,2,1/) + + integer, dimension(1) :: BSk11=(/7/) + integer, dimension(1) :: BSk12=(/7/) + integer, dimension(2) :: BSk21=(/3,4/) + integer, dimension(2) :: BSk22=(/6,1/) + integer, dimension(3) :: BSk31=(/1,5,1/) + integer, dimension(3) :: BSk32=(/4,2,1/) + integer, dimension(4) :: BSk41=(/2,0,3,2/) + integer, dimension(4) :: BSk42=(/2,4,0,1/) + + integer, allocatable :: A3(:,:,:) + character(12), parameter :: tname='distrmix325 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!!!!dvm$ redistribute A3(*,GEN_BLOCK(BSj1),GEN_BLOCK(BSk1)) + + select case(psize(1)) ! it's true - psize(1) + case(1) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj11),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case(2) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj21),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (3) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj31),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case (4) + select case(psize(2)) ! it's true - psize(2) + case(1) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk11)) + case(2) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk21)) + case(3) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk31)) + case(4) +!dvm$ redistribute +!dvm$* A3(*,GEN_BLOCK(BSj41),GEN_BLOCK(BSk41)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 5 + enddo + enddo + enddo +!dvm$ end region + + + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + 5 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*, WGT_BLOCK(WB2,10), *) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 5 + enddo + enddo + enddo +!dvm$ end region + +!!!!dvm$ redistribute A3(GEN_BLOCK(BSi2),BLOCK,GEN_BLOCK(BSk2)) + + select case(psize(1)) + case(1) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi12),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(2) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi22),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case (3) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi32),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case(4) + select case(psize(3)) + case(1) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk12)) + case(2) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk22)) + case (3) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk32)) + case(4) +!dvm$ redistribute A3(GEN_BLOCK(BSi42),BLOCK,GEN_BLOCK(BSk42)) + case default + goto 10 + endselect + + case default + goto 10 + endselect + + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction(min(erri)) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 10)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + 10 deallocate (A3) + + end subroutine distrmix325 + + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult1.fdv new file mode 100644 index 0000000..dac94e9 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult1.fdv @@ -0,0 +1,553 @@ + program DISTRM1 + +! TESTING distribute and redistribute directive +! MULT_BLOCK distribution + + print *,'===START OF distrmult1========================' + +C -------------------------------------------------- +c 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[MULT_BLOCK] + call distrm11 +C -------------------------------------------------- +c 12 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] + call distrm12 +C -------------------------------------------------- +c 13 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[MULT_BLOCK] small array + call distrm13 +C -------------------------------------------------- +c 14 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array + call distrm14 +C -------------------------------------------------- +c 15 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[MULT_BLOCK] other m + call distrm15 +C -------------------------------------------------- +c 16 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[*] + call distrm16 +C -------------------------------------------------- +c 17 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[MULT_BLOCK] + call distrm17 +C -------------------------------------------------- +c 21 DISTRIBUTE arrA2[MULT_BLOCK][*] REDISTRIBUTE arrA2[*][MULT_BLOCK] + call distrm21 +C -------------------------------------------------- +c 22 DISTRIBUTE arrA2[*][MULT_BLOCK] REDISTRIBUTE arrA2[*][*] + call distrm22 +C -------------------------------------------------- +c 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][MULT_BLOCK] + call distrm23 +C ------------------------------------------------- +C + print *,'=== END OF distrmult1 ========================= ' + + end + +C ----------------------------------------------------distrm11 +c 11 DISTR arrA1[BLOCK] REDISTR arrA1[MULT_BLOCK] + + subroutine distrm11 + integer, parameter :: AN1=25,ER=10000 + integer :: erri=ER,i + integer, parameter :: m = 5 + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrm11 ' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction(min(erri)) + do i=1,AN1 + if (A1(i) /= i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrm11 + +C ---------------------------------------------distrm12 +c 12 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] + + subroutine distrm12 + + integer, parameter :: AN1=48,ER=10000 + integer :: erri=ER,i + integer, parameter :: m = 6 + integer, allocatable :: A1(:) + character(10), parameter :: tname='distrm12 ' + +!dvm$ distribute A1(MULT_BLOCK(m)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i ** 2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i**2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrm12 + +C ----------------------------------------------------distrm13 +c 13 DISTR arrA1[BLOCK] REDISTR arrA1[MULT_BLOCK] small array + + subroutine distrm13 + + integer, parameter :: AN1=4,ER=10000 + integer :: erri=ER,i + integer, parameter :: m = 4 + integer, allocatable :: A1(:) + character(10) :: tname='distrm13 ' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i*2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i*2 ) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrm13 +C ---------------------------------------------distrm14 +c 14 DISTRIBUTE arrA1[MULT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array + + subroutine distrm14 + + integer, parameter :: AN1=3,ER=10000 + integer :: erri=ER,i + integer, parameter :: m = 3 + integer, allocatable :: A1(:) + character(10) :: tname='distrm14 ' + +!dvm$ distribute A1(MULT_BLOCK(m)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + + A1 = 5 + +!dvm$ actual (A1) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + i + enddo +!dvm$ end region + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i+5) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrm14 + +C ----------------------------------------------------distrm15 +c 15 DISTR arrA1[MULT_BLOCK] REDISTR arrA1[MULT_BLOCK] other m + + subroutine distrm15 + + integer, parameter :: AN1=24,ER=10000 + integer :: erri=ER,i + integer, parameter :: m1 = 4, m2 = 3 + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrm15 ' + +!dvm$ distribute A1(MULT_BLOCK(m1)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m2)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrm15 + +C ----------------------------------------------------distrm16 +c 16 DISTR arrA1[MULT_BLOCK] REDISTR arrA1[*] + + subroutine distrm16 + + integer, parameter :: AN1=50,ER=10000 + integer :: erri=ER,i + integer, parameter :: m = 2 + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrm16 ' + +!dvm$ distribute A1(MULT_BLOCK(m)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i * 3 + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i*3 ) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrm16 + +C ---------------------------------------------distrm17 +c 17 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[MULT_BLOCK] + + subroutine distrm17 + + integer, parameter :: AN1=120,ER=10000 + integer :: erri=ER,i + integer, parameter :: m = 10 + integer, allocatable :: A1(:) + character(10), parameter :: tname='distrm17 ' + +!dvm$ distribute A1(*) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + + A1 = -2 + +!dvm$ actual (A1) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i - A1(i) + enddo +!dvm$ end region + +!dvm$ redistribute A1(MULT_BLOCK(m)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i+2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrm17 + +C ----------------------------------------------------distrm21 +c 21 DISTRIBUTE arrA2[MULT_BLOCK][*] REDISTRIBUTE arrA2[*][MULT_BLOCK] + + subroutine distrm21 + + integer, parameter :: AN1=36,AN2=25,NL=1000,ER=10000 + integer :: erri=ER,i + integer, parameter :: m1 = 6, m2 = 5 + integer, allocatable :: A2(:,:) + character(10) :: tname='distrm21' + +!dvm$ distribute A2(MULT_BLOCK(m1),*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,MULT_BLOCK(m2)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm21 + +C ----------------------------------------------------distrm22 +c 22 DISTRIBUTE arrA2[*][MULT_BLOCK] REDISTRIBUTE arrA2[*][*] + + subroutine distrm22 + + integer, parameter :: AN1=8,AN2=121,NL=1000,ER=10000 + integer :: erri=ER,i + integer, parameter :: m2 = 11 + integer, allocatable :: A2(:,:) + character(10) :: tname='distrm22' + +!dvm$ distribute A2(*,MULT_BLOCK(m2)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 4 + +!dvm$ actual(A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) + (i*NL+j) + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j+4)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm22 + +C ----------------------------------------------------distrm23 +c 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][MULT_BLOCK] + + subroutine distrm23 + + integer, parameter :: AN1=8,AN2=63,NL=1000,ER=10000 + integer :: erri=ER,i + integer, parameter :: m2 = 9 + integer, allocatable :: A2(:,:) + character(10) :: tname='distrm23' + +!dvm$ distribute A2(*,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,MULT_BLOCK(m2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm23 + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult2.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult2.fdv new file mode 100644 index 0000000..b47c2f2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult2.fdv @@ -0,0 +1,996 @@ + program DISTRM2 + +! TESTING distribute and redistribute directive +! MULT_BLOCK distribution + + print *,'===START OF distrmult2========================' + +C ------------------------------------------------- +c 24 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] REDISTRIBUTE arrA2[*][*] + call distrm24 +C ------------------------------------------------- +c 25 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + call distrm25 +C ------------------------------------------------- +c 26 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +C REDISTRIBUTE arrA2[BLOCK][BLOCK] + call distrm26 +C ------------------------------------------------- +c 27 DISTRIBUTE arrA2[BLOCK][BLOCK] +c REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + call distrm27 +C ------------------------------------------------- +c 28 DISTRIBUTE arrA2[MULT_BLOCK][BLOCK] +c REDISTRIBUTE arrA2[BLOCK][MULT_BLOCK] + call distrm28 +C ------------------------------------------------- +c 29 DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA2[MULT_BLOCK][BLOCK] + call distrm29 +C ------------------------------------------------- +c 210 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] other m1,m2 + call distrm210 +C ------------------------------------------------- +c 32 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK] [*] +c REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK] + call distrm32 +C ------------------------------------------------- +c 33 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] +c REDISTRIBUTE arrA3[MULT_BLOCK][*][BLOCK] + call distrm33 +C ------------------------------------------------- +c 34 DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] +c REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + call distrm34 +C ------------------------------------------------- +c 35 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] +c REDISTRIBUTE arrA3[*][*]MULT_BLOCK] + call distrm35 +C ------------------------------------------------- +c 36 DISTRIBUTE arrA3[MULT_BLOCK][*][BLOCK] +c REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] + call distrm36 +C ------------------------------------------------- +c 37 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] +c REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] + call distrm37 +C ------------------------------------------------- +c 38 DISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] +c REDISTRIBUTE arrA3[*][MULT_BLOCK][BLOCK] + call distrm38 +C ------------------------------------------------- +c 41 DISTRIBUTE arrA4[*][*][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA4[*][*][*][*] + call distrm41 +C ------------------------------------------------- +c 42 DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] +c REDISTRIBUTE arrA4[*][MULT_BLOCK][MULT_BLOCK][*] + call distrm42 +C ------------------------------------------------- +C + print *,'=== END OF distrmult2 ========================= ' + + end + +C ----------------------------------------------------distrm24 +c 24 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] REDISTRIBUTE arrA2[*][*] + + subroutine distrm24 + + integer, parameter :: AN1=15,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + integer, parameter :: m1 = 5, m2 = 3 + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrm24 ' + +!dvm$ distribute A2(MULT_BLOCK(m1),MULT_BLOCK(m2)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 4 + +!dvm$ actual (A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j)+ (i*NL+j) + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)+4 ) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm24 + +C ----------------------------------------------------distrm25 +c 25 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + + subroutine distrm25 + + integer, parameter :: AN1=18,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i,j + integer, parameter :: m1 = 3, m2 = 2 + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrm25 ' + +!dvm$ distribute A2(*,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 5 + +!dvm$ actual(A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + (i*NL+j) + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m1), MULT_BLOCK(m2)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) - 5 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm25 + +C ----------------------------------------------------distrm26 +c 26 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA2[BLOCK][BLOCK] + + subroutine distrm26 + + integer, parameter :: AN1=49,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + integer, parameter :: m1 = 7, m2 = 4 + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrm26 ' + +!dvm$ distribute A2(MULT_BLOCK(m1),MULT_BLOCK(m2)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK,BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm26 + +C ----------------------------------------------------distrm27 +c 27 DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] + + subroutine distrm27 + + integer, parameter :: AN1=8,AN2= 64,NL=1000,ER=10000 + integer :: erri= ER,i,j + integer, parameter :: m1 = 1, m2 = 8 + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrm27' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =(i*NL+j)*2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m1),MULT_BLOCK(m2)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)*2) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm27 + +C ----------------------------------------------------distrm28 +c 28 DISTRIBUTE arrA2[MULT_BLOCK][BLOCK] REDISTRIBUTE arrA2[BLOCK][MULT_BLOCK] + + subroutine distrm28 + + integer, parameter :: AN1=20,AN2=20,NL=1000,ER=10000 + integer :: erri= ER,i,j + integer, parameter :: m1 = 5, m2 = 4 + integer, allocatable :: A2(:,:) + character(10) :: tname='distrm28 ' + +!dvm$ distribute A2(MULT_BLOCK(m1),BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =(i*NL+j)*3 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK,MULT_BLOCK(m2)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)*3) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm28 + +C ----------------------------------------------------distrm29 +c 29 DISTRIBUTE arrA2[BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA2[MULT_BLOCK][BLOCK] + + subroutine distrm29 + + integer, parameter :: AN1=30,AN2=60,NL=1000,ER=10000 + integer :: erri= ER,i,j + integer, parameter :: m1 = 10, m2 = 10 + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrm29' + +!dvm$ distribute A2(BLOCK,MULT_BLOCK(m2)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = -1 + +!dvm$ actual (A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + (i*NL+j) + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m1),BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)-1) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm29 + +C ----------------------------------------------------distrm210 +c 210 DISTRIBUTE arrA2[MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK] other m1, m2 + + subroutine distrm210 + + integer, parameter :: AN1=24,AN2=24,NL=1000,ER=10000 + integer :: erri= ER,i,j + integer, parameter :: m1 = 3, m2 = 2 + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrm210 ' + +!dvm$ distribute A2(MULT_BLOCK(m1),MULT_BLOCK(m2)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(MULT_BLOCK(m2),MULT_BLOCK(m1)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrm210 + +C ----------------------------------------------------distrm32 +c 32 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK] [*] +c REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK] + + subroutine distrm32 + + integer, parameter :: AN1=16,AN2=12,AN3=8,NL=1000,ER=10000 + integer :: erri = ER,i,j,k + integer, parameter :: m1 = 2, m2 = 3 , m3 = 4 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm32 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,MULT_BLOCK(m2),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distrm33 +c 33 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] +c REDISTRIBUTE arrA3[MULT_BLOCK][*][BLOCK] + + subroutine distrm33 + + integer, parameter :: AN1=16,AN2=16,AN3=8,NL=1000,ER=10000 + integer :: erri = ER,i,j,k + integer, parameter :: m1 = 4, m2 = 2, m3 = 2 + integer, allocatable :: A3(:,:,:) + character(*), parameter :: tname='distrm33 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k*2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),*,MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k*2)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distrm34 +c 34 DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] +c REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] + + subroutine distrm34 + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 2, m2 = 1, m3 = 4 + integer, allocatable :: A3(:,:,:) + character(10) :: tname='distrm34' + +!dvm$ distribute A3(MULT_BLOCK(m1),*,MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 3 + +!dvm$ actual(A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 3)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distrm35 +c 35 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] +c REDISTRIBUTE arrA3[*][*][MULT_BLOCK] + + subroutine distrm35 + + integer, parameter :: AN1=18,AN2=28,AN3=38,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 3, m2 = 7 , m3 = 19 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm35 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distrm36 +c 36 DISTRIBUTE arrA3[MULT_BLOCK][*][BLOCK] +c REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] + + subroutine distrm36 + + integer, parameter :: AN1=121,AN2=12,AN3=35,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 11, m2 = 2, m3 = 7 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm36 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),*,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 10 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,*,MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k + 10)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distrm37 +c 37 DISTRIBUTE arrA3[MULT_BLOCK][BLOCK][*] +c REDISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] + + subroutine distrm37 + + integer, parameter :: AN1=8,AN2=28,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 2, m2 = 4, m3 = 2 + integer, allocatable :: A3(:,:,:) + character(*), parameter :: tname='distrm37 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),BLOCK,*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,*,MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distrm38 +c 38 DISTRIBUTE arrA3[BLOCK][*][MULT_BLOCK] REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK] + + subroutine distrm38 + + integer, parameter :: AN1=50,AN2=40,AN3=30,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 5, m2 = 4, m3 = 3 + integer, allocatable :: A3(:,:,:) + character(10) :: tname='distrm38' + +!dvm$ distribute A3(BLOCK, *, MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k*5 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,MULT_BLOCK(m2),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k*5)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end + +C ----------------------------------------------------distrm41 +c 41 DISTRIBUTE arrA4[*][*][MULT_BLOCK][MULT_BLOCK] REDISTRIBUTE arrA4[*][*][*][*] + + subroutine distrm41 + + integer, parameter :: AN1=16,AN2=16,AN3=16,AN4=16,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m + integer, parameter :: m1 = 2, m2 = 4, m3 = 2, m4 = 4 + integer, allocatable :: A4(:,:,:,:) + character(10), parameter :: tname='distrm41 ' + +!dvm$ distribute A4(*,*,MULT_BLOCK(m3),MULT_BLOCK(m4)) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,*,*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m)) then + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end + +C ----------------------------------------------------distrm42 +c 42 DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] +c REDISTRIBUTE arrA4[*][MULT_BLOCK][MULT_BLOCK][*] + + subroutine distrm42 + + integer, parameter :: AN1=28,AN2=25,AN3=27,AN4=21,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m + integer, parameter :: m1 = 7, m2 = 5, m3 = 9, m4 = 3 + integer, allocatable :: A4(:,:,:,:) + character(10) :: tname='distrm42 ' + +!dvm$ distribute A4(MULT_BLOCK(m1),*,MULT_BLOCK(m3),*) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + + A4 = 6 + +!dvm$ actual (A4) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = A4(i,j,n,m)+ i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,MULT_BLOCK(m2),MULT_BLOCK(m3),*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m+6)) then + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult3.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult3.fdv new file mode 100644 index 0000000..0dec62d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_MULT/distrmult3.fdv @@ -0,0 +1,668 @@ + program DISTRM3 + +! Testing DISTRIBUTE and REDISTRIBUTE directive +! use MULT_BLOCK distribution + + print *,'===START OF distrmult3========================' + +C ------------------------------------------------- +c 311 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][BLOCK][BLOCK] + call distrm311 +C ------------------------------------------------- +c 312 DISTRIBUTE arrA3DISTRIBUTE [BLOCK][BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + call distrm312 +C ------------------------------------------------- +c 313 DISTRIBUTE arrA2[_BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK] + call distrm313 +C ------------------------------------------------- +c 314 DISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK] +c REDISTRIBUTE arrA3[MULT_BLOCK][BLOCK][MULT_BLOCK] + call distrm314 +C ------------------------------------------------- +c 315 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] other m1,m2,m3 + call distrm315 +C ------------------------------------------------- +c 316 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA2[*][*][*] + call distrm316 +C ------------------------------------------------- +c 317 DISTRIBUTE arrA3[*][*][*] +c REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + call distrm317 +C ------------------------------------------------- +c 318 DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] +c REDISTRIBUTE arrA3[*][MULT_BLOCK][*] + call distrm318 +C ------------------------------------------------- +c 319 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] +c REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK] + call distrm319 +C ------------------------------------------------- +c 43 DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] +c REDISTRIBUTE arrA4[[*][MULT_BLOCK][*][MULT_BLOCK] + call distrm43 +C ------------------------------------------------- +C + print *,'=== END OF distrmult3 ========================= ' + + end + +C ----------------------------------------------------distrm311 +c 311 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [BLOCK][BLOCK][BLOCK] + + subroutine distrm311 + + integer, parameter :: AN1=14,AN2=12,AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 7, m2 = 3, m3 = 5 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm311 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 1 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,BLOCK,BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) + 1) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm311 + +C ----------------------------------------------------distrm312 +c 312 DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + + subroutine distrm312 + + integer, parameter :: AN1=15,AN2=15,AN3=25,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 5, m2 = 5, m3 = 5 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm312 ' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm312 + +C ----------------------------------------------------distrm313 +c 313 DISTRIBUTE arrA2[MULT_BLOCK][BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK] + + subroutine distrm313 + + integer, parameter :: AN1=24,AN2=24,AN3=24,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 2, m2 = 3, m3 = 4 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm313 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),BLOCK,MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 3 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,MULT_BLOCK(m2),BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm313 + +C ----------------------------------------------------distrm314 +c 314 DISTRIBUTE arrA3[BLOCK][MULT_BLOCK][BLOCK] +c REDISTRIBUTE arrA3[MULT_BLOCK][BLOCK][MULT_BLOCK] + + subroutine distrm314 + + integer, parameter :: AN1=20,AN2=30,AN3=30,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 5, m2 = 3, m3 = 3 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm314 ' + +!dvm$ distribute A3(BLOCK, MULT_BLOCK(m2),BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k*2 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(MULT_BLOCK(m1),BLOCK,MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k*2)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm314 + +C ----------------------------------------------------distrm315 +c 315 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE [MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] other m1,m2,m3 + + subroutine distrm315 + + integer, parameter :: AN1=16,AN2=16,AN3=16,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 2, m2 = 4, m3 = 8 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm315 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 5 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(MULT_BLOCK(m1),MULT_BLOCK(m2),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)+ 5) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm315 + +C ----------------------------------------------------distrm316 +c 316 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] +c REDISTRIBUTE arrA2[*][*][*] + + subroutine distrm316 + + integer, parameter :: AN1=12,AN2=12,AN3=48,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 3, m2 = 2, m3 = 6 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm316 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),MULT_BLOCK(m2),MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm316 + +C ----------------------------------------------------distrm317 +c 317 DISTRIBUTE arrA3[*][*][*] +c REDISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][MULT_BLOCK] + + subroutine distrm317 + + integer, parameter :: AN1= 10, AN2=35, AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 2, m2 = 5, m3 = 2 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm317 ' + +!dvm$ distribute A3(*,*,*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 7 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(MULT_BLOCK(m1),MULT_BLOCK(m2),MULT_BLOCK(m3)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) - 7 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k)) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm317 + +C ----------------------------------------------------distrm318 +c 318 DISTRIBUTE arrA3[MULT_BLOCK][*][MULT_BLOCK] +c REDISTRIBUTE arrA3[*][MULT_BLOCK][*] + + subroutine distrm318 + + integer, parameter :: AN1=11,AN2=14,AN3=24,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m1 = 1, m2 = 2, m3 = 6 + integer :: A3(AN1,AN2,AN3) !static array + character(10), parameter :: tname='distrm318 ' + +!dvm$ distribute A3(MULT_BLOCK(m1),*,MULT_BLOCK(m3)) +!dvm$ dynamic A3 + + A3 = 8 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,MULT_BLOCK(m2),*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) + 8) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end subroutine distrm318 + +C ----------------------------------------------------distrm319 +c 319 DISTRIBUTE arrA3[MULT_BLOCK][MULT_BLOCK][*] +c REDISTRIBUTE arrA3[*][MULT_BLOCK][MULT_BLOCK] + + subroutine distrm319 + + integer, parameter :: AN1= 30, AN2=12, AN3=30,NL=1000,ER=10000 + integer :: erri=ER,i,j,k + integer, parameter :: m11 = 2, m21 = 2, m31 = 2 + integer, parameter :: m12 = 5, m22 = 4, m32 = 10 + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrm319 ' + +!dvm$ distribute :: A3 +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ redistribute A3(MULT_BLOCK(m11),MULT_BLOCK(m21),*) + + A3 = -1 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + i*NL/10 + j*NL/100 + k + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(*,MULT_BLOCK(m21),MULT_BLOCK(m32)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,k) on A3(i,j,k), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do k=1,AN3 + A3(i,j,k) = A3(i,j,k) + 2 + if (A3(i,j,k) /= (i*NL/10 + j*NL/100 + k) + 1) then + erri = min(erri,i*NL/10 + j*NL/100 + k) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrm319 + +C ----------------------------------------------------distrm43 +c 43 DISTRIBUTE arrA4[MULT_BLOCK][*][MULT_BLOCK][*] +c REDISTRIBUTE arrA4[[*][MULT_BLOCK][*][MULT_BLOCK] + + subroutine distrm43 + + integer, parameter :: AN1=16,AN2=16,AN3=16,AN4=16,NL=1000,ER=100000 + integer, parameter :: m1 = 2, m2 = 4, m3 = 2, m4 = 4 + integer :: erri=ER,i,j,n,m + integer, allocatable :: A4(:,:,:,:) + character(10), parameter :: tname='distrm43 ' + +!dvm$ distribute +!dvm$* A4(MULT_BLOCK(m1),*,MULT_BLOCK(m3),*) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,MULT_BLOCK(m2),*,MULT_BLOCK(m4)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m)) then + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt1.fdv new file mode 100644 index 0000000..233f25f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt1.fdv @@ -0,0 +1,766 @@ + program DISTRW1 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! WGT_BLOCK distribution + + print *,'===START OF distrwgt1========================' + +C -------------------------------------------------- +c 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] + call distrw11 +C -------------------------------------------------- +c 12 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] + call distrw12 +C -------------------------------------------------- +c 13 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] small array + call distrw13 +C -------------------------------------------------- +c 14 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array + call distrw14 +C -------------------------------------------------- +c 15 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] other weigts + call distrw15 +C -------------------------------------------------- +c 16 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[*] + call distrw16 +C -------------------------------------------------- +c 17 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[WGT_BLOCK] + call distrw17 +C -------------------------------------------------- +c 18 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] with zero weigts + call distrw18 +C -------------------------------------------------- +c 181 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] with zero weigts +c REDISTRIBUTE arrA1[WGT_BLOCK] + call distrw181 +C -------------------------------------------------- +c 182 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[*] with zero weigts +c REDISTRIBUTE arrA1[WGT_BLOCK] + call distrw182 +C -------------------------------------------------- +c 21 DISTRIBUTE arrA2[WGT_BLOCK][*] REDISTRIBUTE arrA2[*][WGT_BLOCK] + call distrw21 +C -------------------------------------------------- +c 22 DISTRIBUTE arrA2[*][WGT_BLOCK] REDISTRIBUTE arrA2[*][*] + call distrw22 +C -------------------------------------------------- +c 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][WGT_BLOCK] + call distrw23 +C ------------------------------------------------- +C + print *,'=== END OF distrwgt1 ========================= ' + + end + +C ----------------------------------------------------distrw11 +c 11 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] + + subroutine distrw11 + + integer, parameter :: AN1=16,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrw11 ' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrw11 + +C ---------------------------------------------distrw12 +c 12 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] + + subroutine distrw12 + + integer, parameter :: AN1=8,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A1(:) + character(10), parameter :: tname='distrw12' + +!dvm$ distribute A1(WGT_BLOCK(WB,6)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i ** 2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min(erri) ) + do i=1,AN1 + if (A1(i) /= i ** 2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ----------------------------------------------------distrw13 +c 13 DISTRIBUTE arrA1[BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] small array + + subroutine distrw13 + + integer, parameter :: AN1=5,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A1(:) + character(10) :: tname='distrw13' + +!dvm$ distribute A1(BLOCK) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + + A1 = 2 + +!dvm$ actual (A1) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + i + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min(erri) ) + do i=1,AN1 + if (A1(i) /= i + 2) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end +C ---------------------------------------------distrw14 +c 14 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] small array + + subroutine distrw14 + + integer, parameter :: AN1=5,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A1(:) + character(10) :: tname='distrw14' + +!dvm$ distribute A1(WGT_BLOCK(WB,6)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + enddo +!dvm$ end region + +!dvm$ redistribute A1(BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end + +C ----------------------------------------------------distrw15 +c 15 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] other weigts + + subroutine distrw15 + + integer, parameter :: AN1=16,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB1=(/1.0, 2., 2., 3.0, 1., 1./) + double precision, dimension(6) :: WB2=(/2.0, 1., 2., 2.0, 2., 1./) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrw15 ' + +!dvm$ distribute A1(WGT_BLOCK(WB1,6)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i * 3 + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB2,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i * 3) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrw15 + +C ----------------------------------------------------distrw16 +c 16 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[*] + + subroutine distrw16 + + integer, parameter :: AN1=8,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrw16 ' + +!dvm$ distribute A1(WGT_BLOCK(WB,6)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i + 5 + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min(erri) ) + do i=1,AN1 + A1(i) = A1(i) - 5 + if (A1(i) /= i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrw16 + +C ---------------------------------------------distrw17 +c 17 DISTRIBUTE arrA1[*] REDISTRIBUTE arrA1[WGT_BLOCK] + + subroutine distrw17 + + integer, parameter :: AN1=28,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A1(:) + character(10), parameter :: tname='distrw17' + +!dvm$ distribute A1(*) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + + A1 = 6 + +!dvm$ actual (A1) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) - i + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= 6 - i) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrw17 + +C ----------------------------------------------------distrw18 +c 18 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[WGT_BLOCK] with zero weigts + + subroutine distrw18 + + integer, parameter :: AN1=17,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6):: WB1=(/1.0, 2., 2., 0., 1., 1./) + double precision, dimension(8):: WB2=(/0.,1.,0.2,2.,3.,1.,1.5,0./) + + integer, allocatable :: A1(:) + character(*), parameter :: tname='distrw18 ' + +!dvm$ distribute A1(WGT_BLOCK(WB1,6)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = i * 3 + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB2,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if (A1(i) /= i * 3) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrw18 + +C --------------------------------------------------distrw181 +c 181 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[BLOCK] with zero weigts +c REDISTRIBUTE arrA1[WGT_BLOCK] + subroutine distrw181 + + integer, parameter :: AN1=11,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(7) :: + > WB1=(/0., 2., 2., 0., 1., 1., 0./) + double precision, dimension(8) :: + > WB2=(/0., 1., 0., 2., 0., 3., 1.2, 1.5/) + + integer, allocatable :: A1(:) + character(10) :: tname='distrw181' + +!dvm$ distribute A1(WGT_BLOCK(WB1,7)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + + A1 = 2 + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + i + enddo +!dvm$ end region + +!dvm$ redistribute A1(BLOCK) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) * 2 + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB2,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + A1(i) = A1(i) / 2 + if (A1(i) /= (i+2)) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrw181 + +C --------------------------------------------------distrw182 +c 182 DISTRIBUTE arrA1[WGT_BLOCK] REDISTRIBUTE arrA1[*] with zero weigts +c REDISTRIBUTE arrA1[WGT_BLOCK] + subroutine distrw182 + + integer, parameter :: AN1=8,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(7) :: + > WB1=(/0.2, 2., 0., 0., 0., 1., 0./) + double precision, dimension(8) :: + > WB2=(/0., 1.1, 0., 2.5, 0., 3.3, 2.2, 0./) + + integer, allocatable :: A1(:) + character(10) :: tname='distrw182' + +!dvm$ distribute A1(WGT_BLOCK(WB1,7)) +!dvm$ dynamic A1 + + allocate (A1(AN1)) + + A1 = -5 + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) + i + enddo +!dvm$ end region + +!dvm$ redistribute A1(*) + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = A1(i) * 3 + enddo +!dvm$ end region + +!dvm$ redistribute A1(WGT_BLOCK(WB2,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + A1(i) = A1(i) / 3 + if (A1(i) /= (i-5)) then + erri = min(erri,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A1) + + end subroutine distrw182 + +C ----------------------------------------------------distrw21 +c 21 DISTRIBUTE arrA2[WGT_BLOCK][*] REDISTRIBUTE arrA2[*][WGT_BLOCK] + + subroutine distrw21 + + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A2(:,:) + character(10) :: tname='distrw21' + +!dvm$ distribute A2(WGT_BLOCK(WB,6),*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,WGT_BLOCK(WB,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw21 + +C ----------------------------------------------------distrw22 +c 22 DISTRIBUTE arrA2[*][WGT_BLOCK] REDISTRIBUTE arrA2[*][*] + + subroutine distrw22 + + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A2(:,:) + character(10) :: tname='distrw22' + +!dvm$ distribute A2(*,WGT_BLOCK(WB,6)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + 10 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)+10) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw22 + +C ----------------------------------------------------distrw23 +c 23 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[*][WGT_BLOCK] + + subroutine distrw23 + + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri=ER,i + + double precision, dimension(6) :: WB=(/1.0, 2., 2., 3.0, 1., 1./) + + integer, allocatable :: A2(:,:) + character(10) :: tname='distrw23' + +!dvm$ distribute A2(*,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =(i*NL+j) * 2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,WGT_BLOCK(WB,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) / 2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt2.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt2.fdv new file mode 100644 index 0000000..3c394fb --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt2.fdv @@ -0,0 +1,1334 @@ + program DISTRW2 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! WGT_BLOCK distribution + + print *,'===START OF distrwgt2========================' + +C ------------------------------------------------- +c 24 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[*][*] + call distrw24 +C ------------------------------------------------- +c 25 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + call distrw25 +C ------------------------------------------------- +c 26 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +C REDISTRIBUTE arrA2[BLOCK][BLOCK] + call distrw26 +C ------------------------------------------------- +c 27 DISTRIBUTE arrA2[BLOCK][BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + call distrw27 +C ------------------------------------------------- +c 28 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] +c REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK] + call distrw28 +C ------------------------------------------------- +c 29 DISTRIBUTE arrA2[BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA2[WGT_BLOCK][BLOCK] + call distrw29 +C ------------------------------------------------- +c 210 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] other weigths +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + call distrw210 +C ------------------------------------------------- +c 211 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + call distrw211 +C ------------------------------------------------- +c 212 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [BLOCK][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][BLOCK] + call distrw212 +C ------------------------------------------------- +c 213 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [*][*] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + call distrw213 +C ------------------------------------------------- +c 214 DISTRIBUTE arrA2[WGT_BLOCK][*] with zero weigths +c REDISTRIBUTE [*][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + call distrw214 +C ------------------------------------------------- +c 32 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK] [*] +c REDISTRIBUTE arrA3[*][WGT_BLOCK][WGT_BLOCK] + call distrw32 +C ------------------------------------------------- +c 33 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] +c REDISTRIBUTE arrA3[WGT_BLOCK][*][BLOCK] + call distrw33 +C ------------------------------------------------- +c 34 DISTRIBUTE arrA3[WGT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] + call distrw34 +C ------------------------------------------------- +c 35 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] +c REDISTRIBUTE arrA3[*][*][WGT_BLOCK] + call distrw35 +C ------------------------------------------------- +c 36 DISTRIBUTE arrA3[WGT_BLOCK][*][BLOCK] +c REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] + call distrw36 +C ------------------------------------------------- +c 37 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][*] +c REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] + call distrw37 +C ------------------------------------------------- +c 38 DISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE arrA3[*][WGT_BLOCK][BLOCK] + call distrw38 +C ------------------------------------------------- +c 41 DISTRIBUTE arrA4[*][*][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA4[*][*][*][*] + call distrw41 +C ------------------------------------------------- +c 42 DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][*] +c REDISTRIBUTE arrA4[*][WGT_BLOCK][WGT_BLOCK][*] + call distrw42 +C ------------------------------------------------- +C + print *,'=== END OF distrwgt2 ========================= ' + + end + +C ----------------------------------------------------distrw24 +c 24 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[*][*] + + subroutine distrw24 + + integer, parameter :: AN1=12,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(6) :: + > WB1=(/2., 2., 3., 1., 5., 1./) + double precision, dimension(7) :: + > WB2=(/3., 2., 2., 3., 1., 1., 4./) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrw24 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,7)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw24 + +C ----------------------------------------------------distrw25 +c 25 DISTRIBUTE arrA2[*][*] REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + + subroutine distrw25 + + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(5) :: WB1=(/1.0,2.,2.,3.0, 0./) + double precision, dimension(7) :: WB2=(/1.0,1.,2.,1.0, 1.,1.,1./) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrw25 ' + +!dvm$ distribute A2(*,*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j+10 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB1,5), WGT_BLOCK(WB2,7)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)+10) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw25 + +C ----------------------------------------------------distrw26 +c 26 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[BLOCK][BLOCK] + + subroutine distrw26 + + integer, parameter :: AN1=12,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(6) :: WB=(/1.0,4.,1.,1.0, 2., 1./) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrw26 ' + +!dvm$ distribute A2(WGT_BLOCK(WB,6),WGT_BLOCK(WB,6)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 3 + +!dvm$ actual (A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK,BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j) + 3) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw26 + +C ----------------------------------------------------distrw27 +c 27 DISTRIBUTE arrA2[BLOCK][BLOCK] REDISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] + + subroutine distrw27 + + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(6) :: WB=(/2.0,1.,3.,2.0, 1., 1./) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrw27' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =(i*NL+j) * 2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB,6),WGT_BLOCK(WB,4)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) / 2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw27 + +C ----------------------------------------------------distrw28 +c 28 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK] REDISTRIBUTE arrA2[BLOCK][WGT_BLOCK] + + subroutine distrw28 + + integer, parameter :: AN1=12,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(8) :: WB1=(/1.,2.,2.,3.,1.,1.,2.,4./) + double precision, dimension(6) :: WB2=(/1.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A2(:,:) + character(10) :: tname='distrw28 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,8),BLOCK) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK,WGT_BLOCK(WB2,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw28 + +C ----------------------------------------------------distrw29 +c 29 DISTRIBUTE arrA2[BLOCK][WGT_BLOCK] REDISTRIBUTE arrA2[WGT_BLOCK][BLOCK] + + subroutine distrw29 + + integer, parameter :: AN1=12,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(6) :: WB1=(/1.0,2.,2.,3.,3.,1./) + double precision, dimension(6) :: WB2=(/1.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A2(:,:) + character(10), parameter :: tname='distrw29' + +!dvm$ distribute A2(BLOCK,WGT_BLOCK(WB1,6)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 8 + +!dvm$ actual (A2) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =A2(i,j) * (i*NL+j) + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,6),BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)*8) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw29 + +C ----------------------------------------------------distrw210 +c 210 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] with other weigths + + subroutine distrw210 + + integer, parameter :: AN1=10,AN2=8,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(8) :: + > WB1 = (/1.0, 2., 1., 1.0, 3.2, 2., 3., 1./) + double precision, dimension(6) :: + > WB2 = (/1.0, 1., 2., 1.0, 2., 1./) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrw210 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,8),WGT_BLOCK(WB2,6)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,6),WGT_BLOCK(WB1,7)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw210 + +C ----------------------------------------------------distrw211 +c 211 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] with zero weigths + + subroutine distrw211 + + integer, parameter :: AN1=8,AN2=17,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(6) :: + > WB1=(/0., 1.0, 2., 1., 1.0, 0./) + double precision, dimension(9) :: + > WB2=(/1.0, 1., 0., 2., 0., 0., 1.0, 2., 1./) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrw211 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,9)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 1 + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,7),WGT_BLOCK(WB1,5)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j+1)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw211 + +C ----------------------------------------------------distrw212 +c 212 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [BLOCK][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][BLOCK] + + subroutine distrw212 + + integer, parameter :: AN1=10,AN2=12,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(7) :: + > WB1=(/2., 0., 2., 1.0, 1.0, 1., 0./) + double precision, dimension(8) :: + > WB2=(/3.2, 2., 3.1, 2., 1.0, 4., 0., 1./) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrw212 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,7),WGT_BLOCK(WB2,8)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 0 + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(BLOCK, WGT_BLOCK(WB1,6)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) * 2 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,7), BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j)*2) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw212 + +C ----------------------------------------------------distrw213 +c 213 DISTRIBUTE arrA2[WGT_BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [*][*] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + subroutine distrw213 + + integer, parameter :: AN1=16,AN2=7,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(8) :: + > WB1=(/2., 4., 2., 1.5, 1., 0.5, 0., 3./) + double precision, dimension(8) :: + > WB2=(/0., 0., 3.1, 2., 1.0, 4., 0., 1./) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrw213 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,8),WGT_BLOCK(WB2,8)) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 4 + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,*) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) * 3 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,6),WGT_BLOCK(WB1,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j+4)*3) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw213 + +C ----------------------------------------------------distrw214 +c 214 DISTRIBUTE arrA2[WGT_BLOCK][*] with zero weigths +c REDISTRIBUTE [*][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK] + subroutine distrw214 + + integer, parameter :: AN1=12,AN2=10,NL=1000,ER=10000 + integer :: erri= ER,i,j + + double precision, dimension(7) :: + > WB1=(/ 4., 0., 1.5, 1., 2., 0.5, 0./) + double precision, dimension(8) :: + > WB2=(/1.7, 0., 3.1, 2., 2.5, 4., 0., 1./) + + integer, allocatable :: A2(:,:) + character(*), parameter :: tname='distrw214 ' + +!dvm$ distribute A2(WGT_BLOCK(WB1,6),*) +!dvm$ dynamic A2 + + allocate (A2(AN1,AN2)) + + A2 = 0 + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + i*NL+j + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(*,WGT_BLOCK(WB2,8)) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = A2(i,j) + 3 + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A2(WGT_BLOCK(WB2,7),WGT_BLOCK(WB1,7)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + if (A2(i,j) /= (i*NL+j+3)) then + erri = min(erri,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A2) + + end subroutine distrw214 + +C ----------------------------------------------------distrw32 +c 32 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] +c REDISTRIBUTE arrA3[*][WGT_BLOCK][WGT_BLOCK] + + subroutine distrw32 + + integer, parameter :: AN1=16,AN2=12,AN3=8,NL=1000,ER=10000 + integer :: erri = ER,i,j,n + + double precision, dimension(7) :: WB1=(/1.,1.,2.,1.0,2.,2.,3.0/) + double precision, dimension(8) :: WB2=(/1.,2.,2.,3.,2.,1.,1.,1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw32 ' + +!dvm$ distribute A3(WGT_BLOCK(WB1,7),WGT_BLOCK(WB2,8),*) +!dvm$ dynamic A3 + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,WGT_BLOCK(WB2,7),WGT_BLOCK(WB1,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min(erri) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n)) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw32 + +C ----------------------------------------------------distrw33 +c 33 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] +c REDISTRIBUTE arrA3[WGT_BLOCK][*][BLOCK] + + subroutine distrw33 + + integer, parameter :: AN1=16,AN2=16,AN3=8,NL=1000,ER=10000 + integer :: erri = ER,i,j,n + + double precision, dimension(10) :: + > WB=(/1.,2.,2.,3., 2., 4., 2., 1.,1., 1./) + + integer, allocatable :: A3(:,:,:) + character(*), parameter :: tname='distrw33 ' + +!dvm$ distribute A3(WGT_BLOCK(WB,6),WGT_BLOCK(WB,8),*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 5 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(WGT_BLOCK(WB,10),*,WGT_BLOCK(WB,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 5) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw33 + +C ----------------------------------------------------distrw34 +c 34 DISTRIBUTE arrA3[WGT_BLOCK][*][WGT_BLOCK] +c REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] + + subroutine distrw34 + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n + + double precision, dimension(8) :: + > WB=(/1.0,2.,2.,3.,1.,2., 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10) :: tname='distrw34' + +!dvm$ distribute A3(WGT_BLOCK(WB,6),*,WGT_BLOCK(WB,8)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = (i*NL/10 + j*NL/100 + n) * 7 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(WGT_BLOCK(WB,6),WGT_BLOCK(WB,8),*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) * 7) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw34 + +C ----------------------------------------------------distrw35 +c 35 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] +c REDISTRIBUTE arrA3[*][*][WGT_BLOCK] + + subroutine distrw35 + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n + + double precision, dimension(6) :: WB1=(/1.0,2.,2.,3.0,1.5, 2.5/) + double precision, dimension(6) :: WB2=(/1.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw35 ' + +!dvm$ distribute A3(WGT_BLOCK(WB1,6),BLOCK,*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,WGT_BLOCK(WB2,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n)) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw35 + +C ----------------------------------------------------distrw36 +c 36 DISTRIBUTE arrA3[WGT_BLOCK][*][BLOCK] +c REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] + + subroutine distrw36 + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n + + double precision, dimension(6) :: WB=(/1.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw36 ' + +!dvm$ distribute A3(WGT_BLOCK(WB,6),*,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 2 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = (i*NL/10 + j*NL/100 + n) + A3(i,j,n) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,*,WGT_BLOCK(WB,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 2) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw36 + +C ----------------------------------------------------distrw37 +c 37 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][*] +c REDISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] + + subroutine distrw37 + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n + + double precision,dimension(6) :: WB1=(/0.5, 1.,1.,2.,2.,3./) + double precision,dimension(8) :: WB2=(/1.,2.,2.,3.,0.5,2.,1.,1./) + + integer, allocatable :: A3(:,:,:) + character(*), parameter :: tname='distrw37 ' + +!dvm$ distribute A3(WGT_BLOCK(WB1,6),BLOCK,*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,*,WGT_BLOCK(WB2,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n)) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw37 + +C ----------------------------------------------------distrw38 +c 38 DISTRIBUTE arrA3[BLOCK][*][WGT_BLOCK] REDISTRIBUTE arrA3[*][WGT_BLOCK][WGT_BLOCK] + + subroutine distrw38 + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n + + double precision, dimension(6) :: WB1=(/1.0,2.,2.,3.0, 4.,5./) + double precision, dimension(6) :: WB2=(/1.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10) :: tname='distrw38' + +!dvm$ distribute A3(BLOCK, *, WGT_BLOCK(WB1,6)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 5 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,WGT_BLOCK(WB2,6),WGT_BLOCK(WB1,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 5) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw38 + +C ----------------------------------------------------distrw41 +c 41 DISTRIBUTE arrA4[*][*][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA4[*][*][*][*] + + subroutine distrw41 + + integer, parameter :: AN1=8,AN2=8,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(8) :: WB=(/1.,2.,2.,3.,1.,1.,2.,1./) + + integer, allocatable :: A4(:,:,:,:) + character(10), parameter :: tname='distrw41 ' + +!dvm$ distribute A4(*,*,WGT_BLOCK(WB,6),WGT_BLOCK(WB,8)) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,*,*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m)) then + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end subroutine distrw41 + +C ----------------------------------------------------distrw42 +c 42 DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][*] REDISTRIBUTE arrA4[*][WGT_BLOCK][WGT_BLOCK][*] + + subroutine distrw42 + + integer, parameter :: AN1=8,AN2=8,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(6) :: WB1=(/1.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A4(:,:,:,:) + character(10) :: tname='distrw42 ' + +!dvm$ distribute A4(WGT_BLOCK(wb1,6),*,WGT_BLOCK(wb1,6),*) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + + A4 = 3 + +!dvm$ actual (A4) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = A4(i,j,n,m) + + > i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(*,WGT_BLOCK(wb1,6),WGT_BLOCK(wb1,6),*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m)+3) + > then + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end subroutine distrw42 + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt3.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt3.fdv new file mode 100644 index 0000000..b1cd362 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/DISTR_WGT/distrwgt3.fdv @@ -0,0 +1,835 @@ + program DISTRW3 + +! Testing DISTRIBUTE and REDISTRIBUTE directives +! WGT_BLOCK distribution + + print *,'===START OF distrwgt3========================' + +C ------------------------------------------------- +c 39 DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + call distrw39 +C ------------------------------------------------- +c 310 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][BLOCK][BLOCK] + call distrw310 +C ------------------------------------------------- +c 311 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] other weigths + call distrw311 +C ------------------------------------------------- +c 312 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] + call distrw312 +C ------------------------------------------------- +c 313 DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] + call distrw313 +C ------------------------------------------------- +c 314 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA2[*][*][*] + call distrw314 +C ------------------------------------------------- +c 315 DISTRIBUTE arrA3[*][*][*] +c REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + call distrw315 +C ------------------------------------------------- +c 316 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + call distrw316 +C ------------------------------------------------- +c 317 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][BLOCK] + call distrw317 +C ------------------------------------------------- +c 318 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] with zero weigths +c REDISTRIBUTE [*][WGT_BLOCK][*] +c REDISTRIBUTE [WGT_BLOCK][*][WGT_BLOCK] + call distrw318 +C ------------------------------------------------- +c 43 DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA4[BLOCK][WGT_BLOCK][BLOCK][*] + call distrw43 +C ------------------------------------------------- +C + print *,'=== END OF distrwgt3 ========================= ' + + end + +C ----------------------------------------------------distrw310 +c 39 DISTRIBUTE arrA3[BLOCK][BLOCK][BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + + subroutine distrw39 + + integer, parameter :: AN1=16,AN2=16,AN3=16,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(6) :: + > WB1=(/3.0,1.,2.,2.0, 2.5, 1.2/) + double precision, dimension(7) :: + > WB2=(/1.,3.,4.0,1.,2.,2.,4./) + double precision, dimension(8) :: + > WB3=(/5.0,1.,3.,6.0,2.,4.,3.,1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw39 ' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + 6 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,7),WGT_BLOCK(WB3,8)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) +6 ) + > then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw39 + +C ----------------------------------------------------distrw310 +c 310 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [BLOCK][BLOCK][BLOCK] + + subroutine distrw310 + + integer, parameter :: AN1=12,AN2=12,AN3=24,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(6) :: WB1=(/2.0,1.,1.,3.0, 2., 1./) + double precision, dimension(8):: WB2=(/1.0,1.,2.,2.0,1.,1.,2.,2./) + double precision, dimension(6) :: WB3=(/2.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw310 ' + +!dvm$ distribute A3(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,6),WGT_BLOCK(WB3,6)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 2 + +!dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,BLOCK,BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 2 ) + > then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw310 + +C ----------------------------------------------------distrw311 +c 311 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] other weigths + + subroutine distrw311 + + integer, parameter :: AN1=8,AN2=12,AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision,dimension(6):: WB1=(/2.0,1.,1.,3.0, 2.,1./) + double precision,dimension(8):: WB2=(/1.0,1.,2.,2.0,1.,1.,2.,2./) + double precision,dimension(6):: WB3=(/2.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw311 ' + + +!dvm$ distribute A3(WGT_BLOCK(WB1,5),WGT_BLOCK(WB2,8),WGT_BLOCK(WB3,6)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 5 + +!dvm$ actual(A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB3,6),WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 5) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw311 + +C ----------------------------------------------------distrw312 +c 312 DISTRIBUTE arrA2[WGT_BLOCK][BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] + + subroutine distrw312 + + integer, parameter :: AN1=30,AN2=10,AN3=5,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(7) :: + > WB1=(/2.0,1.,1.,3.0, 2.,4., 1./) + double precision, dimension(8):: WB2=(/1.0,1.,2.,2.0,1.,1.,2.,2./) + double precision, dimension(6) :: WB3=(/2.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw312 ' + + +!dvm$ distribute A3(WGT_BLOCK(WB1,7),BLOCK,WGT_BLOCK(WB3,6)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + 10 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(BLOCK,WGT_BLOCK(WB2,8),BLOCK) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n)+ 10) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw312 + +C ----------------------------------------------------distrw313 +c 313 DISTRIBUTE arrA3[BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] + + subroutine distrw313 + + integer, parameter :: AN1=8,AN2=8,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(7) :: + > WB1=(/2.0,1.,1.,3.0, 2., 1., 3.5/) + double precision, dimension(7) :: + > WB2=(/1.0,1.,2.,2.0,1.,1.,2./) + double precision, dimension(6) :: WB3=(/2.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw313 ' + +!dvm$ distribute A3(BLOCK, WGT_BLOCK(WB2,7),BLOCK) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(WGT_BLOCK(WB1,7),BLOCK,WGT_BLOCK(WB3,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n)) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw313 + +C ----------------------------------------------------distrw314 +c 314 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA2[*][*][*] + + subroutine distrw314 + + integer, parameter :: AN1=8,AN2=15,AN3=24,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(6) :: WB1=(/2.0,1.,1.,3.0, 2., 1./) + double precision, dimension(10) :: + > WB2=(/1.0,1.,2.,2.0,1.,1.,2.,2., 4., 6./) + double precision, dimension(8) :: + > WB3=(/2.0,2.,2.,3.0, 1., 1., 3., 2.6/) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw314 ' + +!dvm$ distribute A3(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,10),WGT_BLOCK(WB3,8)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 2 + + !dvm$ actual (A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n - A3(i,j,n) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(*,*,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) - 2) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw314 + +C ----------------------------------------------------distrw315 +c 315 DISTRIBUTE arrA3[*][*][*] +c REDISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + + subroutine distrw315 + + integer, parameter :: AN1=12,AN2=10,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(6) :: WB1=(/2.0,1.,1.,3.0, 2., 1./) + double precision,dimension(8) :: WB2=(/1.0,1.,2.,2.0,1.,1.,2.,2./) + double precision, dimension(6) :: WB3=(/2.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw315 ' + +!dvm$ distribute A3(*,*,*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB3,6),WGT_BLOCK(WB2,8),WGT_BLOCK(WB1,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n)) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw315 + +C ----------------------------------------------------distrw316 +c 316 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][WGT_BLOCK] + + subroutine distrw316 + + integer, parameter :: AN1=8,AN2=12,AN3=10,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision,dimension(7):: + > WB1=(/2.0,1.,0.,1.,3.0, 2.,0./) + double precision,dimension(8):: + > WB2=(/0.,4.,2.,3.,1.,1.,2.,0./) + double precision,dimension(8):: + > WB3=(/2.0,3.,2.,4.,0.,0.,1.,2./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw316 ' + + +!dvm$ distribute A3(WGT_BLOCK(WB1,7),WGT_BLOCK(WB2,8),WGT_BLOCK(WB3,8)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 2 + +!dvm$ actual(A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(WGT_BLOCK(WB3,6),WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 2) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw316 + +C ----------------------------------------------------distrw317 +c 317 DISTRIBUTE arrA3[WGT_BLOCK][BLOCK][WGT_BLOCK] with zero weigths +c REDISTRIBUTE [BLOCK][WGT_BLOCK][BLOCK] +c REDISTRIBUTE [WGT_BLOCK][WGT_BLOCK][BLOCK] + subroutine distrw317 + + integer, parameter :: AN1=12,AN2=10,AN3=8,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision,dimension(7):: + > WB1=(/1.,0.5,0.,0.4, 2.,0.8, 0./) + double precision,dimension(8):: + > WB2=(/0.,4.,2.,3.,1.2,1.,0., 2.4/) + double precision,dimension(10):: + > WB3=(/2.0,3.,2.,4.,0.,0.,1.,2.,0.,2./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw317 ' + + +!dvm$ distribute A3(WGT_BLOCK(WB1,7),BLOCK,WGT_BLOCK(WB3,10)) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + +!dvm$ actual(A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(BLOCK,WGT_BLOCK(WB2,8),BLOCK) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + 4 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(WGT_BLOCK(WB1,6),WGT_BLOCK(WB2,6),BLOCK) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) - 1 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 3) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw317 + +C ----------------------------------------------------distrw318 +c 318 DISTRIBUTE arrA3[WGT_BLOCK][WGT_BLOCK][*] with zero weigths +c REDISTRIBUTE [*][WGT_BLOCK][*] +c REDISTRIBUTE [WGT_BLOCK][*][WGT_BLOCK] + subroutine distrw318 + + integer, parameter :: AN1=22,AN2=12,AN3=15,NL=1000,ER=10000 + integer :: erri=ER,i,j,n,m + + double precision,dimension(5):: + > WB1=(/0.,1.5,0.7,0.,2./) + double precision,dimension(8):: + > WB2=(/2.0,4.2,0.,3.,2.2,3.,0.4, 2.4/) + double precision,dimension(7):: + > WB3=(/3.,2.,4.,0.,1.,2.,0./) + + integer, allocatable :: A3(:,:,:) + character(10), parameter :: tname='distrw318 ' + + +!dvm$ distribute A3(WGT_BLOCK(WB1,5),WGT_BLOCK(WB2,8),*) +!dvm$ dynamic A3 + + allocate (A3(AN1,AN2,AN3)) + + A3 = 6 + +!dvm$ actual(A3) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10 + j*NL/100 + n + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute +!dvm$* A3(*,WGT_BLOCK(WB2,8),*) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + 4 + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A3(WGT_BLOCK(WB2,6),*,WGT_BLOCK(WB3,6)) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + if (A3(i,j,n) /= (i*NL/10 + j*NL/100 + n) + 10) then + erri = min(erri,i*NL/10 + j*NL/100 + n) + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A3) + + end subroutine distrw318 + +C ----------------------------------------------------distrw43 +c 43 DISTRIBUTE arrA4[WGT_BLOCK][*][WGT_BLOCK][WGT_BLOCK] +c REDISTRIBUTE arrA4[BLOCK][WGT_BLOCK][BLOCK][*] + + subroutine distrw43 + + integer, parameter :: AN1=24,AN2=16,AN3=8,AN4=8,NL=1000,ER=100000 + integer :: erri=ER,i,j,n,m + + double precision, dimension(6) :: WB1=(/2.0,1.,1.,3.0, 2., 1./) + double precision,dimension(8):: WB2=(/1.0,1.,2.,2.0,1.,1.,2.,2./) + double precision, dimension(6) :: WB3=(/2.0,2.,2.,3.0, 1., 1./) + + integer, allocatable :: A4(:,:,:,:) + character(10), parameter :: tname='distrw43 ' + +!dvm$ distribute +!dvm$* A4(WGT_BLOCK(WB1,6),*,WGT_BLOCK(WB2,8),WGT_BLOCK(WB3,6)) +!dvm$ dynamic A4 + + allocate (A4(AN1,AN2,AN3,AN4)) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ redistribute A4(BLOCK,WGT_BLOCK(WB3,6),BLOCK,*) + +!dvm$ actual (erri) + +!dvm$ region +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), reduction( min( erri ) ) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + if (A4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m)) then + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual (erri) + + if (erri == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A4) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_do.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_do.fdv new file mode 100644 index 0000000..4ff3740 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_do.fdv @@ -0,0 +1,824 @@ + program DO1 + +c TESTING convert statement DO . + + print *,'===START OF F2C_DO========================' +C -------------------------------------------------- +c do with enddo + call do_enddo +c do with label (continue) + call do_continue +c do with label (last stmt) + call do_without_end +c check iterator value after DO + call do_value_iter +c check iterator value in same step (+3) + call do_with_same_step1 +c check iterator value in same step (-2) + call do_with_same_step2 +c multi do + call do_multi +c cycle stmt + call do_cycle_stmt_1 + call do_cycle_stmt_2 +c exit stmt + call do_exit_stmt +c do while with var-expr + call do_while_true +c do while const-expr + call do_while_expr + + + print *,'=== END OF F2C_DO ========================= ' + end + +C ----------------------------------------------------do1 + subroutine do_enddo + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_enddo' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + do ia = 1, i + A1(i) = A1(i) + ia + (i-5) + enddo + enddo + +!dvm$ end region + do i=1, AN1 + do ia = 1, i + B1(i) = B1(i) + ia + (i-5) + enddo + enddo + erri= ER + + +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end +C ----------------------------------------------------do12 + subroutine do_continue + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_continue' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + do 101, ia = 1, i + A1(i) = A1(i) + ia + (i-5) +101 continue + enddo + +!dvm$ end region + do i=1, AN1 + do 201, ia = 1, i + B1(i) = B1(i) + ia + (i-5) +201 continue + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + erri= ER + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end + +C ----------------------------------------------------do13 + subroutine do_without_end + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_without_end' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + do 102, ia = 1, i +102 A1(i) = A1(i) + ia + (i-5) + + enddo + +!dvm$ end region + do i=1, AN1 + do 202, ia = 1, i +202 B1(i) = B1(i) + ia + (i-5) + + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end + + +C ----------------------------------------------------do14 + subroutine do_value_iter + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_value_iter' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + do ia = 1, i*2-5 + A1(i) = A1(i) + ia + (i-5) + enddo + A1(i) = ia + + enddo + +!dvm$ end region + do i=1, AN1 + do ia = 1, i*2-5 + B1(i) = B1(i) + ia + (i-5) + enddo + B1(i) = ia + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end + +C ----------------------------------------------------do15 + subroutine do_with_same_step1 + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_with_same_step1' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + do ia = 1, i*2-5, 3 + A1(i) = A1(i) + ia + (i-5) + enddo + + enddo + +!dvm$ end region + do i=1, AN1 + do ia = 1, i*2-5, 3 + B1(i) = B1(i) + ia + (i-5) + enddo + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end +C ----------------------------------------------------do16 + subroutine do_with_same_step2 + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_with_same_step2' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + do ia = i*2-5, 1, -2 + A1(i) = A1(i) + ia + (i-5) + enddo + + enddo + +!dvm$ end region + do i=1, AN1 + do ia = i*2-5, 1, -2 + B1(i) = B1(i) + ia + (i-5) + enddo + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end +C ----------------------------------------------------do17 + subroutine do_multi + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_multi' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia,j,n) + do i=1, AN1 + n = 0 + do 107, ia = 1, A1(i) + do 107, j = ia, A1(i) +107 n = n+1 + A1(i) = n + j - 2*ia + enddo +!dvm$ end region + + do i=1, AN1 + n = 0 + do 207, ia = 1, B1(i) + do 207, j = ia, B1(i) +207 n = n+1 + B1(i) = n + j - 2*ia + enddo + + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end +C ----------------------------------------------------do18 + subroutine do_cycle_stmt_1 + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_cycle_stmt_1' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + do ia = 1, i*2-5, 2 + if(mod(A1(i),2) .eq.0) cycle + A1(i) = A1(i) + ia + (i-5) + enddo + enddo + +!dvm$ end region + do i=1, AN1 + do ia = 1, i*2-5, 2 + if(mod(B1(i),2) .eq.0) cycle + B1(i) = B1(i) + ia + (i-5) + enddo + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end +C ----------------------------------------------------do19 + subroutine do_cycle_stmt_2 + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_cycle_stmt_2' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia) + do i=1, AN1 + if(A1(i) .gt. 5) cycle + do ia = 1, i-200 + A1(i) = A1(i)+ia+(i-5) + enddo + enddo +!dvm$ end region + do i=1, AN1 + if(B1(i) .gt. 5) cycle + do ia = 1, i-200 + B1(i) = B1(i)+ia+(i-5) + enddo + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end + +C ----------------------------------------------------do20 + subroutine do_exit_stmt + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_exit_stmt' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + + + +!dvm$ parallel (i) on A1(i) +!dvm$*, private(ia,j,n) + do i=1, AN1 + n = 0 + do ia = 1, A1(i) + j = 1 + do + n = n+1 + if(j .gt. ia) then + n = n-1 + exit + endif + j = j+1 + enddo + enddo + A1(i) = n+A1(i)+2*j-3*ia + enddo +!dvm$ end region + + + do i=1, AN1 + n = 0 + do ia = 1, B1(i) + j = 1 + do + n = n+1 + if(j .gt. ia) then + n = n-1 + exit + endif + j = j+1 + enddo + enddo + B1(i) = n+B1(i)+2*j-3*ia + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end +C ----------------------------------------------------do21 + subroutine do_while_true + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_while_true' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + + +!dvm$ parallel (i) on A1(i) + do i=1, AN1 + do while(.true.) + A1(i) = A1(i) + i + if(A1(i) .gt. 2*A1(i) .or. i .gt. A1(i) / 3 - 5) exit + enddo + enddo + +!dvm$ end region + do i=1, AN1 + do while(.true.) + B1(i) = B1(i) + i + if(B1(i) .gt. 2*B1(i) .or. i .gt. B1(i) / 3 - 5) exit + enddo + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + end +C ----------------------------------------------------do22 + subroutine do_while_expr + integer, parameter :: AN1=256, ER=10000 + character*18 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i, ia +!dvm$ distribute A1(BLOCK) + tname='do_while_expr' + + + + allocate (A1(AN1)) + allocate (B1(AN1)) + erri= ER + do i=1,AN1 + B1(i) =i + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + + +!dvm$ parallel (i) on A1(i) + do i=1, AN1 + do while(A1(i)*3 -40 .lt. A1(i) + 15) + A1(i) = A1(i) + i + if(A1(i) .gt. 2*A1(i) .or. i .gt. A1(i) / 3 - 5) exit + enddo + enddo + +!dvm$ end region + do i=1, AN1 + do while(B1(i)*3 -40 .lt. B1(i) + 15) + B1(i) = B1(i) + i + if(B1(i) .gt. 2*B1(i) .or. i .gt. B1(i) / 3 - 5) exit + enddo + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*18 name + print *,name,' - complete' + end + subroutine ansno(name) + character*18 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_math.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_math.fdv new file mode 100644 index 0000000..7f98cc7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_math.fdv @@ -0,0 +1,17459 @@ + + program INTRINSICS + print *, '=== START OF F2C_MATH intrinsic test ===========' + +c TESTING abs GENERIC INTRINSIC +c integer*4 abs(integer*4) + call abs1 +c real*4 abs(real*4) + call abs2 +c real*8 abs(real*8) + call abs3 +c real*4 abs(complex*8) + call abs4 +c real*8 abs(complex*16) + call abs5 +c real*4 cabs(complex*8) + call abs6 +c real*8 dabs(real*8) + call abs7 +c integer*4 iabs(integer*4) + call abs8 +c real*8 cdabs(complex*16) + call abs14 +c real*8 zabs(complex*16) + call abs15 + +c TESTING acos GENERIC INTRINSIC +c real*4 acos(real*4) + call acos1 +c real*8 acos(real*8) + call acos2 +c real*8 dacos(real*8) + call acos3 + +c TESTING acosh GENERIC INTRINSIC +c real*4 acosh(real*4) + call acosh1 +c real*8 acosh(real*8) + call acosh2 +c real*8 dacosh(real*8) + call acosh3 + +c TESTING aimag GENERIC INTRINSIC +c real*4 aimag(complex*8) + call aimag1 +c real*8 aimag(complex*16) + call aimag2 +c real*4 imag(complex*8) + call aimag3 +c real*8 imag(complex*16) + call aimag4 +c real*8 dimag(complex*16) + call aimag5 + +c TESTING asin GENERIC INTRINSIC +c real*4 asin(real*4) + call asin1 +c real*8 asin(real*8) + call asin2 +c real*8 dasin(real*8) + call asin3 + +c TESTING asinh GENERIC INTRINSIC +c real*4 asinh(real*4) + call asinh1 +c real*8 asinh(real*8) + call asinh2 +c real*8 dasinh(real*8) + call asinh3 + +c TESTING atan GENERIC INTRINSIC +c real*4 atan(real*4) + call atan1 +c real*8 atan(real*8) + call atan2_ +c real*8 datan(real*8) + call atan3 + +c TESTING atan2 GENERIC INTRINSIC +c real*4 atan2(real*4, real*4) + call atan21 +c real*8 atan2(real*8, real*8) + call atan22 +c real*8 datan2(real*8, real*8) + call atan23 + +c TESTING atanh GENERIC INTRINSIC +c real*4 atanh(real*4) + call atanh1 +c real*8 atanh(real*8) + call atanh2 +c real*8 datanh(real*8) + call atanh3 + +c TESTING bessel_j0 GENERIC INTRINSIC +c real*4 bessel_j0(real*4) + call bessel_j01 +c real*8 bessel_j0(real*8) + call bessel_j02 + +c TESTING bessel_j1 GENERIC INTRINSIC +c real*4 bessel_j1(real*4) + call bessel_j11 +c real*8 bessel_j1(real*8) + call bessel_j12 + +c TESTING bessel_jn GENERIC INTRINSIC +c real*4 bessel_jn(integer*4, real*4) + call bessel_jn1 +c real*8 bessel_jn(integer*4, real*8) + call bessel_jn2 + +c TESTING bessel_y0 GENERIC INTRINSIC +c real*4 bessel_y0(real*4) + call bessel_y01 +c real*8 bessel_y0(real*8) + call bessel_y02 + +c TESTING bessel_y1 GENERIC INTRINSIC +c real*4 bessel_y1(real*4) + call bessel_y11 +c real*8 bessel_y1(real*8) + call bessel_y12 +c TESTING bessel_yn GENERIC INTRINSIC +c real*4 bessel_yn(integer*4, real*4) + call bessel_yn1 +c real*8 bessel_yn(integer*4, real*8) + call bessel_yn2 +c TESTING btest GENERIC INTRINSIC +c logical*1 btest(integer*1) + call btest1 +c logical*2 btest(integer*2) + call btest2 +c logical*4 btest(integer*4) + call btest3 +c logical*8 btest(integer*8) + call btest4 + +c TESTING cmplx GENERIC INTRINSIC +c complex*8 cmplx(integer*4) + call cmplx1 +c complex*8 cmplx(real*4) + call cmplx2 +c complex*8 cmplx(real*8) + call cmplx3 +c complex*8 cmplx(complex*8) + call cmplx4 +c complex*8 cmplx(complex*16) + call cmplx5 +c complex*8 cmplx(integer*4, integer*4) + call cmplx6 +c complex*8 cmplx(real*4, real*4) + call cmplx7 +c complex*8 cmplx(real*8, real*8) + call cmplx8 +c complex*8 cmplx(integer*4, integer*4, 4) + call cmplx9 +c complex*8 cmplx(real*4, real*4, 4) + call cmplx10 +c complex*8 cmplx(real*8, real*8, 4) + call cmplx11 +c complex*16 cmplx(integer*4, integer*4, 8) + call cmplx12 +c complex*16 cmplx(real*4, real*4, 8) + call cmplx13 +c complex*16 cmplx(real*8, real*8, 8) + call cmplx14 +c complex*16 dcmplx(integer*4) + call cmplx15 +c complex*16 dcmplx(real*4) + call cmplx16 +c complex*16 dcmplx(real*8) + call cmplx17 +c complex*16 dcmplx(complex*8) + call cmplx18 +c complex*16 dcmplx(complex*16) + call cmplx19 +c complex*16 dcmplx(integer*4, integer*4) + call cmplx20 +c complex*16 dcmplx(real*4, real*4) + call cmplx21 +c complex*16 dcmplx(real*8, real*8) + call cmplx22 + +c TESTING conjg GENERIC INTRINSIC +c complex*8 conjg(complex*8) + call conjg1 +c complex*16 conjg(complex*16) + call conjg2 +c complex*16 dconjg(complex*16) + call conjg3 + +c TESTING cos GENERIC INTRINSIC +c real*4 cos(real*4) + call cos1 +c real*8 cos(real*8) + call cos2 +c complex*8 cos(complex*8) + call cos3 +c complex*16 cos(complex*16) + call cos4 +c real*8 dcos(real*8) + call cos5 +c complex*8 ccos(complex*8) + call cos6 +c complex*16 cdcos(complex*16) + call cos7 +c complex*16 zcos(complex*16) + call cos8 + +c TESTING cosh GENERIC INTRINSIC +c real*4 cosh(real*4) + call cosh1 +c real*8 cosh(real*8) + call cosh2 +c real*8 dcosh(real*8) + call cosh3 + +c TESTING dble GENERIC INTRINSIC +c real*8 dble(integer*1) + call dble1 +c real*8 dble(integer*2) + call dble2 +c real*8 dble(integer*4) + call dble3 +c real*8 dble(integer*8) + call dble4 +c real*8 dble(real*4) + call dble5 +c real*8 dble(real*8) + call dble6 +c real*8 dble(complex*8) + call dble7 +c real*8 dble(complex*16) + call dble8 + +c TESTING dfloat GENERIC INTRINSIC +c real*8 dfloat(integer*1) + call dfloat1 +c real*8 dfloat(integer*2) + call dfloat2 +c real*8 dfloat(integer*4) + call dfloat3 +c real*8 dfloat(integer*8) + call dfloat4 + +c TESTING dim GENERIC INTRINSIC +c integer*1 dim(integer*1) + call dim1 +c integer*2 dim(integer*2) + call dim2 +c integer*4 dim(integer*4) + call dim3 +c integer*8 dim(integer*8) + call dim4 +c real*4 dim(real*4) + call dim5 +c real*8 dim(real*8) + call dim6 +c real*8 ddim(real*8) + call dim13 + +c TESTING dprod SPECIFIC INTRINSIC +c real*8 dprod(real*4) + call dprod1 + +c TESTING dreal SPECIFIC INTRINSIC +c real*8 dreal(complex*16) + call dreal1 + +c TESTING dshiftl SPECIFIC INTRINSIC +c integer*8 dshiftl(integer*8) + call dshiftl1 + +c TESTING dshiftr SPECIFIC INTRINSIC +c integer*8 dshiftr(integer*8) + call dshiftr1 + +c TESTING erf GENERIC INTRINSIC +c real*4 erf(real*4) + call erf1 +c real*8 erf(real*8) + call erf2 +c real*8 derf(real*8) + call erf3 + +c TESTING erfc GENERIC INTRINSIC +c real*4 erfc(real*4) + call erfc1 +c real*8 erfc(real*8) + call erfc2 +c real*8 derfc(real*8) + call erfc3 + +c TESTING erfc_scaled GENERIC INTRINSIC +c real*4 erfc_scaled(real*4) + call erfc_scaled1 +c real*8 erfc_scaled(real*8) + call erfc_scaled2 + +c TESTING exp GENERIC INTRINSIC +c real*4 exp(real*4) + call exp1 +c real*8 exp(real*8) + call exp2 +c complex*8 exp(complex*8) + call exp3 +c complex*16 exp(complex*16) + call exp4 +c real*8 dexp(real*8) + call exp5 +c complex*8 cexp(complex*8) + call exp6 +c complex*16 cdexp(complex*16) + call exp7 +c complex*16 zexp(complex*16) + call exp8 + +c TESTING gamma GENERIC INTRINSIC +c real*4 gamma(real*4) + call gamma1 +c real*8 gamma(real*8) + call gamma2 + +c TESTING hypot GENERIC INTRINSIC +c real*4 hypot(real*4) + call hypot1 +c real*8 hypot(real*8) + call hypot2 + +c TESTING iand GENERIC INTRINSIC +c integer*1 iand(integer*1) + call iand1 +c integer*2 iand(integer*2) + call iand2 +c integer*4 iand(integer*4) + call iand3 +c integer*8 iand(integer*8) + call iand4 +c integer*1 and(integer*1) + call iand5 +c integer*2 and(integer*2) + call iand6 +c integer*4 and(integer*4) + call iand7 +c integer*8 and(integer*8) + call iand8 + +c TESTING ibclr GENERIC INTRINSIC +c integer*1 ibclr(integer*1) + call ibclr1 +c integer*2 ibclr(integer*2) + call ibclr2 +c integer*4 ibclr(integer*4) + call ibclr3 +c integer*8 ibclr(integer*8) + call ibclr4 + +c TESTING ibits GENERIC INTRINSIC +c integer*1 ibits(integer*1) + call ibits1 +c integer*2 ibits(integer*2) + call ibits2 +c integer*4 ibits(integer*4) + call ibits3 +c integer*8 ibits(integer*8) + call ibits4 + +c TESTING ibset GENERIC INTRINSIC +c integer*1 ibset(integer*1) + call ibset1 +c integer*2 ibset(integer*2) + call ibset2 +c integer*4 ibset(integer*4) + call ibset3 +c integer*8 ibset(integer*8) + call ibset4 + +c TESTING ieor GENERIC INTRINSIC +c integer*1 ieor(integer*1) + call ieor1 +c integer*2 ieor(integer*2) + call ieor2 +c integer*4 ieor(integer*4) + call ieor3 +c integer*8 ieor(integer*8) + call ieor4 +c integer*1 xor(integer*1) + call ieor9 +c integer*2 xor(integer*2) + call ieor10 +c integer*4 xor(integer*4) + call ieor11 +c integer*8 xor(integer*8) + call ieor12 + +c TESTING ior GENERIC INTRINSIC +c integer*1 ior(integer*1) + call ior1 +c integer*2 ior(integer*2) + call ior2 +c integer*4 ior(integer*4) + call ior3 +c integer*8 ior(integer*8) + call ior4 +c integer*1 or(integer*1) + call ior5 +c integer*2 or(integer*2) + call ior6 +c integer*4 or(integer*4) + call ior7 +c integer*8 or(integer*8) + call ior8 + +c TESTING ishft GENERIC INTRINSIC +c integer*1 ishft(integer*1) + call ishft1 +c integer*2 ishft(integer*2) + call ishft2 +c integer*4 ishft(integer*4) + call ishft3 +c integer*8 ishft(integer*8) + call ishft4 + +c TESTING lshift GENERIC INTRINSIC +c integer*1 lshift(integer*1) + call lshift1 +c integer*2 lshift(integer*2) + call lshift2 +c integer*4 lshift(integer*4) + call lshift3 +c integer*8 lshift(integer*8) + call lshift4 + +c TESTING rshift GENERIC INTRINSIC +c integer*1 rshift(integer*1) + call rshift1 +c integer*2 rshift(integer*2) + call rshift2 +c integer*4 rshift(integer*4) + call rshift3 +c integer*8 rshift(integer*8) + call rshift4 + +c TESTING ishftc GENERIC INTRINSIC +c integer*1 ishftc(integer*1) + call ishftc1 +c integer*2 ishftc(integer*2) + call ishftc2 +c integer*4 ishftc(integer*4) + call ishftc3 +c integer*8 ishftc(integer*8) + call ishftc4 +c integer*1 ishftc(integer*1) + call ishftc5 +c integer*2 ishftc(integer*2) + call ishftc6 +c integer*4 ishftc(integer*4) + call ishftc7 +c integer*8 ishftc(integer*8) + call ishftc8 + +c TESTING log GENERIC INTRINSIC +c real*4 log(real*4) + call log1 +c real*8 log(real*8) + call log2 +c complex*8 log(complex*8) + call log3 +c complex*16 log(complex*16) + call log4 +c real*4 alog(real*4) + call log5 +c real*8 dlog(real*8) + call log6 +c complex*8 clog(complex*8) + call log7 +c complex*16 cdlog(complex*16) + call log8 +c complex*16 zlog(complex*16) + call log9 + +c TESTING log10 GENERIC INTRINSIC +c real*4 log10(real*4) + call log101 +c real*8 log10(real*8) + call log102 + +c real*4 alog10(real*4) + call log105 +c real*8 dlog10(real*8) + call log106 + +c TESTING log_gamma GENERIC INTRINSIC +c real*4 log_gamma(real*4) + call log_gamma1 +c real*8 log_gamma(real*8) + call log_gamma2 + +c TESTING max GENERIC INTRINSIC +c integer*1 max(integer*1) + call max1_ +c integer*2 max(integer*2) + call max2_ +c integer*4 max(integer*4) + call max3_ +c integer*8 max(integer*8) + call max4_ +c real*4 max(real*4) + call max5_ +c real*8 max(real*8) + call max6_ +c integer*4 max0(integer*4) + call max7_ +c real*4 amax1(real*4) + call max8_ +c real*8 dmax1(real*8) + call max9_ + +c integer*4 max1(real*4) + call max13_ + +c real*4 amax0(integer*4) + call max17_ + +c TESTING merge_bits GENERIC INTRINSIC +c integer*1 merge_bits(integer*1) + call merge_bits1 +c integer*2 merge_bits(integer*2) + call merge_bits2 +c integer*4 merge_bits(integer*4) + call merge_bits3 +c integer*8 merge_bits(integer*8) + call merge_bits4 + +c TESTING min GENERIC INTRINSIC +c integer*1 min(integer*1) + call min1_ +c integer*2 min(integer*2) + call min2_ +c integer*4 min(integer*4) + call min3_ +c integer*8 min(integer*8) + call min4_ +c real*4 min(real*4) + call min5_ +c real*8 min(real*8) + call min6_ +c integer*4 min0(integer*4) + call min7_ +c real*4 amin1(real*4) + call min8_ +c real*8 dmin1(real*8) + call min9_ +c integer*4 min1(real*4) + call min13_ +c real*4 amin0(integer*4) + call min17_ + +c TESTING mod GENERIC INTRINSIC +c integer*1 mod(integer*1) + call mod1 +c integer*2 mod(integer*2) + call mod2 +c integer*4 mod(integer*4) + call mod3 +c integer*8 mod(integer*8) + call mod4 +c real*4 amod(real*4) + call mod10 +c real*8 dmod(real*8) + call mod11 + +c TESTING modulo GENERIC INTRINSIC +c integer*1 modulo(integer*1) + call modulo1 +c integer*2 modulo(integer*2) + call modulo2 +c integer*4 modulo(integer*4) + call modulo3 +c integer*8 modulo(integer*8) + call modulo4 +c real*4 modulo(real*4) + call modulo5 +c real*8 modulo(real*8) + call modulo6 + +c TESTING not GENERIC INTRINSIC +c integer*1 not(integer*1) + call not1 +c integer*2 not(integer*2) + call not2 +c integer*4 not(integer*4) + call not3 +c integer*8 not(integer*8) + call not4 + +c TESTING popcnt GENERIC INTRINSIC +c integer*1 popcnt(integer*1) + call popcnt1 +c integer*2 popcnt(integer*2) + call popcnt2 +c integer*4 popcnt(integer*4) + call popcnt3 +c integer*8 popcnt(integer*8) + call popcnt4 + +c TESTING poppar GENERIC INTRINSIC +c integer*1 poppar(integer*1) + call poppar1 +c integer*2 poppar(integer*2) + call poppar2 +c integer*4 poppar(integer*4) + call poppar3 +c integer*8 poppar(integer*8) + call poppar4 + +c TESTING real GENERIC INTRINSIC +c real*4 real(integer*1) + call real1 +c real*4 real(integer*2) + call real2 +c real*4 real(integer*4) + call real3 +c real*4 real(integer*8) + call real4 +c real*4 real(real*4) + call real5 +c real*4 real(real*8) + call real6 +c real*4 real(complex*8) + call real7 +c real*4 real(complex*16) + call real8 +c real*4 float(integer*4) + call real10 +c real*4 sngl(real*4) + call real13 +c real*4 sngl(real*8) + call real14 + +c TESTING shifta GENERIC INTRINSIC +c integer*1 shifta(integer*1) + call shifta1 +c integer*2 shifta(integer*2) + call shifta2 +c integer*4 shifta(integer*4) + call shifta3 +c integer*8 shifta(integer*8) + call shifta4 + +c TESTING shiftl GENERIC INTRINSIC +c integer*1 shiftl(integer*1) + call shiftl1 +c integer*2 shiftl(integer*2) + call shiftl2 +c integer*4 shiftl(integer*4) + call shiftl3 +c integer*8 shiftl(integer*8) + call shiftl4 + +c TESTING shiftr GENERIC INTRINSIC +c integer*1 shiftr(integer*1) + call shiftr1 +c integer*2 shiftr(integer*2) + call shiftr2 +c integer*4 shiftr(integer*4) + call shiftr3 +c integer*8 shiftr(integer*8) + call shiftr4 + +c TESTING sign GENERIC INTRINSIC +c integer*1 sign(integer*1) + call sign1 +c integer*2 sign(integer*2) + call sign2 +c integer*4 sign(integer*4) + call sign3 +c integer*8 sign(integer*8) + call sign4 +c real*4 sign(real*4) + call sign5 +c real*8 sign(real*8) + call sign6 +c integer*4 isign(integer*4) + call sign9 +c real*8 dsign(real*8) + call sign16 + +c TESTING sin GENERIC INTRINSIC +c real*4 sin(real*4) + call sin1 +c real*8 sin(real*8) + call sin2 +c complex*8 sin(complex*8) + call sin3 +c complex*16 sin(complex*16) + call sin4 +c real*8 dsin(real*8) + call sin5 +c complex*8 csin(complex*8) + call sin6 +c complex*16 cdsin(complex*16) + call sin7 +c complex*16 zsin(complex*16) + call sin8 + +c TESTING sinh GENERIC INTRINSIC +c real*4 sinh(real*4) + call sinh1 +c real*8 sinh(real*8) + call sinh2 +c real*8 dsinh(real*8) + call sinh3 + +c TESTING sqrt GENERIC INTRINSIC +c real*4 sqrt(real*4) + call sqrt1 +c real*8 sqrt(real*8) + call sqrt2 +c complex*8 sqrt(complex*8) + call sqrt3 +c complex*16 sqrt(complex*16) + call sqrt4 +c real*8 dsqrt(real*8) + call sqrt5 +c complex*8 csqrt(complex*8) + call sqrt6 +c complex*16 cdsqrt(complex*16) + call sqrt7 +c complex*16 zsqrt(complex*16) + call sqrt8 + +c TESTING tan GENERIC INTRINSIC +c real*4 tan(real*4) + call tan1 +c real*8 tan(real*8) + call tan2 +c complex*8 tan(complex*8) + call tan3 +c complex*16 tan(complex*16) + call tan4 +c real*8 dtan(real*8) + call tan5 + +c TESTING tanh GENERIC INTRINSIC +c real*4 tanh(real*4) + call tanh1 +c real*8 tanh(real*8) + call tanh2 +c real*8 dtanh(real*8) + call tanh3 + +c TESTING trailz SPECIFIC INTRINSIC +c integer*1 trailz(integer*1) + call trailz1 +c integer*2 trailz(integer*2) + call trailz2 +c integer*4 trailz(integer*4) + call trailz3 +c integer*8 trailz(integer*8) + call trailz4 + + print *, '=== END OF F2C_MATH intrinsic test =============' + end + +C ------------------------------------------------- + + subroutine abs1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'abs_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = abs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'abs_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = abs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'abs_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = abs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N) + complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y, tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'abs_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = abs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = abs(B(i)) + if (abs(tmp - A(i))/tmp .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y, tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'abs_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = abs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = abs(B(i)) + if (abs(tmp - A(i)) / tmp .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N) + complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y, tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cabs_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cabs(B(i)) + if (abs(tmp - A(i))/tmp .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dabs_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dabs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iabs_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iabs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs14 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y, tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdabs_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdabs(B(i)) + if (abs(tmp - A(i))/tmp .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs15 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y, tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'zabs_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = zabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = zabs(B(i)) + if (abs(tmp - A(i))/tmp .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acos1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'acos_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = acos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = acos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acos2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'acos_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = acos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = acos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acos3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dacos_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dacos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dacos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acosh1 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'acosh_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = acosh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = acosh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acosh2 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'acosh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = acosh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = acosh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acosh3 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dacosh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dacosh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dacosh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine aimag1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + character*24 tname + real A(N) + complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'aimag_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = aimag(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (aimag(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine aimag2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'aimag_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = aimag(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (aimag(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine aimag3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + character*24 tname + real A(N) + complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'imag_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = imag(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (imag(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine aimag4 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'imag_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = imag(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (imag(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine aimag5 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dimag_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dimag(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dimag(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asin1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'asin_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = asin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = asin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asin2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'asin_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = asin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = asin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asin3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dasin_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dasin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dasin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asinh1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'asinh_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = asinh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = asinh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asinh2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'asinh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = asinh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = asinh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asinh3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dasinh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dasinh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dasinh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atan_float' + + + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan2_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atan_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'datan_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = datan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = datan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan21 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atan2_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W1 + S1 + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atan2(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atan2(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan22 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atan2_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W1 + S1 + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atan2(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atan2(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan23 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'datan2_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W1 + S1 + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = datan2(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = datan2(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atanh1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atanh_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atanh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atanh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine atanh2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atanh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atanh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atanh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine atanh3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'datanh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = datanh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = datanh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_j01 + integer, parameter :: N = 256, ER = N + 1, W = 20, S = -10 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_j0_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_j0(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_j0(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_j02 + integer, parameter :: N = 256, ER = N + 1, W = 20, S = -10 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_j0_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_j0(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_j0(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_j11 + integer, parameter :: N = 256, ER = N + 1, W = 20, S = -10 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_j1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_j1(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_j1(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_j12 + integer, parameter :: N = 256, ER = N + 1, W = 20, S = -10 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_j1_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_j1(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_j1(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_jn1 + integer, parameter :: N = 256, ER = N + 1, W1 = 19, S1 = 1, W2 = + &20, S2 = -10 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), C(N) + integer B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_jn_float' + erri = ER + + do i = 1, N + call random_number(tmp) + call random_number(C(i)) + B(i) = int(tmp * W1 + S1) + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_jn(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_jn(B(i), C(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_jn2 + integer, parameter :: N = 256, ER = N + 1, W1 = 19, S1 = 1, W2 = + &20, S2 = -10 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), C(N) + integer B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_jn_double' + erri = ER + + do i = 1, N + call random_number(tmp) + call random_number(C(i)) + B(i) = int(tmp * W1 + S1) + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_jn(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_jn(B(i), C(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_y01 + integer, parameter :: N = 256, ER = N + 1, W = 10, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_y0_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_y0(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_y0(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_y02 + integer, parameter :: N = 256, ER = N + 1, W = 10, S = 1 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_y0_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_y0(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_y0(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_y11 + integer, parameter :: N = 256, ER = N + 1, W = 10, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_y1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_y1(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_y1(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_y12 + integer, parameter :: N = 256, ER = N + 1, W = 10, S = 1 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_y1_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_y1(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_y1(B(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_yn1 + integer, parameter :: N = 256, ER = N + 1, W1 = 10, S1 = 0, W2 = + &19, S2 = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), C(N) + integer B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_yn_float' + erri = ER + + do i = 1, N + call random_number(tmp) + call random_number(C(i)) + B(i) = int(tmp * W1 + S1) + C(i) = C(i) * W2 + S2 + B(i) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_yn(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_yn(B(i), C(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine bessel_yn2 + integer, parameter :: N = 256, ER = N + 1, W1 = 10, S1 = 0, W2 = + &19, S2 = 1 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), C(N) + integer B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bessel_yn_double' + erri = ER + + do i = 1, N + call random_number(tmp) + call random_number(C(i)) + B(i) = int(tmp * W1 + S1) + C(i) = C(i) * W2 + S2 + B(i) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bessel_yn(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(bessel_yn(B(i), C(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine btest1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*1 A(N) + integer*1 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'btest_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = btest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (btest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine btest2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*2 A(N) + integer*2 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'btest_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = btest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (btest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine btest3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*4 A(N) + integer*4 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'btest_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = btest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (btest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine btest4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*8 A(N) + integer*8 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'btest_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = btest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (btest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + integer B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + real B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + real*8 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + integer B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_long_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + real B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_float_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + real*8 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_double_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + integer B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_long_long_4' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i), 4) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i), 4) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + real B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_float_float_4' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i), 4) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i), 4) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N) + real*8 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_double_double_4' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i), 4) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i), 4) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + integer B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_long_long_8' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i), 8) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i), 8) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + real B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_float_float_8' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i), 8) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i), 8) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx14 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + real*8 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cmplx_double_double_8' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cmplx(B(i), C(i), 8) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (cmplx(B(i), C(i), 8) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx15 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + integer B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx16 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + real B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx17 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + real*8 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx18 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx19 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx20 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + integer B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_long_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx21 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + real B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_float_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cmplx22 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N) + real*8 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcmplx_double_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W + S + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcmplx(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dcmplx(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine conjg1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'conjg_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = conjg(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (conjg(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine conjg2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'conjg_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = conjg(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (conjg(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine conjg3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + double complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dconjg_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dconjg(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dconjg(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cos_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cos_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + complex tmp + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cos_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos4 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cos_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcos_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dcos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos6 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ccos_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ccos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = ccos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos7 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdcos_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdcos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdcos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cos8 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'zcos_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = zcos(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = zcos(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cosh1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cosh_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cosh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cosh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cosh2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cosh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cosh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cosh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cosh3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcosh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcosh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dcosh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*1 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*2 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*4 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*8 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + real B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dble8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dble_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dble(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dble(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dfloat1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*1 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dfloat_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dfloat(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dfloat(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dfloat2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*2 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dfloat_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dfloat(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dfloat(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dfloat3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*4 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dfloat_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dfloat(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dfloat(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dfloat4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*8 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dfloat_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dfloat(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dfloat(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dim_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dim_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dim_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dim_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dim_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dim_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ddim_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ddim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ddim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dprod1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N) + real B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dprod_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dprod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dprod(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dreal1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dreal_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dreal(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dreal(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- +!! it does not work with D(i) == 0 && 64 with Intel 2015 + subroutine dshiftl1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dshiftl_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = 1 + int(tmp * 62) !!! HERE + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dshiftl(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dshiftl(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- +!! it does not work with D(i) == 0 && 64 with Intel 2015 + subroutine dshiftr1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dshiftr_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = 1 + int(tmp * 62) !!! HERE + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dshiftr(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dshiftr(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erf1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'erf_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = erf(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = erf(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erf2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'erf_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = erf(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = erf(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erf3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'derf_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = derf(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = derf(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erfc1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'erfc_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = erfc(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = erfc(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erfc2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'erfc_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = erfc(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = erfc(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erfc3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'derfc_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = derfc(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = derfc(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erfc_scaled1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'erfc_scaled_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = erfc_scaled(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = erfc_scaled(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine erfc_scaled2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'erfc_scaled_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = erfc_scaled(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = erfc_scaled(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp1 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'exp_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = exp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = exp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp2 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'exp_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = exp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = exp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp3 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'exp_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = exp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = exp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp4 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'exp_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = exp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = exp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp5 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dexp_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dexp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dexp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp6 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cexp_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cexp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cexp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp7 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdexp_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdexp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdexp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine exp8 + integer, parameter :: N = 256, ER = N + 1, W = 4, S = -2 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 x, y + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'zexp_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = zexp(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = zexp(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine gamma1 + integer, parameter :: N = 256, ER = N + 1, W = 3, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'gamma_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = gamma(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = gamma(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine gamma2 + integer, parameter :: N = 256, ER = N + 1, W = 3, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'gamma_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = gamma(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = gamma(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine hypot1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hypot_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hypot(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = hypot(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine hypot2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hypot_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hypot(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = hypot(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iand_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iand_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iand_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iand_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'and_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = and(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (and(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'and_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = and(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (and(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'and_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = and(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (and(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'and_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = and(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (and(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibclr_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibclr_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibclr_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibclr_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibits_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibits_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibits_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibits_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibset_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibset_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibset_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibset_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ieor_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ieor_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ieor_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ieor_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'xor_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = xor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (xor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'xor_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = xor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (xor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'xor_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = xor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (xor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'xor_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = xor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (xor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + intrinsic ior + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ior_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + intrinsic ior + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ior_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + intrinsic ior + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ior_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + intrinsic ior + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ior_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'or_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = or(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (or(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'or_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = or(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (or(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'or_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = or(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (or(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'or_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = or(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (or(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishft_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishft_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishft_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishft_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshift1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshift_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshift2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshift_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshift3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshift_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshift4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshift_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshift1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshift_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshift2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshift_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshift3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshift_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshift4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshift_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshift(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshift(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishftc_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log1 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log2 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log3 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log4 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log5 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'alog_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = alog(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = alog(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log6 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dlog_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dlog(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dlog(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log7 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'clog_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = clog(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = clog(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log8 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdlog_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdlog(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdlog(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log9 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'zlog_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = zlog(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = zlog(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log101 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log10_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log102 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log10_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log105 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'alog10_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = alog10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = alog10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log106 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dlog10_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dlog10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dlog10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log_gamma1 + integer, parameter :: N = 256, ER = N + 1, W = 3, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log_gamma_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log_gamma(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log_gamma(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log_gamma2 + integer, parameter :: N = 256, ER = N + 1, W = 3, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log_gamma_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log_gamma(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log_gamma(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max1_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max2_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max3_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max4_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max5_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max6_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max7_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max8_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'amax1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = amax1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (amax1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max9_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dmax1_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dmax1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dmax1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max13_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'max1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = max1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (max1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max17_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*4 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'amax0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = amax0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (amax0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + + +C ------------------------------------------------- + + subroutine merge_bits1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'merge_bits_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = merge_bits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (merge_bits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine merge_bits2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'merge_bits_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = merge_bits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (merge_bits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine merge_bits3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'merge_bits_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = merge_bits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (merge_bits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine merge_bits4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'merge_bits_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = merge_bits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (merge_bits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min1_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min2_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min3_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min(B(i), C(i), D(i)) .ne. A(i)) then + if (i < erri) then + erri = i + endif + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min4_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min5_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min6_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min7_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min8_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'amin1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = amin1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (amin1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min9_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dmin1_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dmin1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dmin1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min13_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'min1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = min1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (min1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min17_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*4 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'amin0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = amin0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (amin0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod1 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'mod_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = mod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (mod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod2 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'mod_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = mod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (mod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod3 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'mod_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = mod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (mod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod4 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'mod_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = mod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (mod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod10 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + real A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'amod_float' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = amod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (amod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod11 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dmod_double' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dmod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dmod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine modulo1 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'modulo_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = modulo(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (modulo(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine modulo2 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'modulo_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = modulo(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (modulo(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine modulo3 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'modulo_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = modulo(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (modulo(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine modulo4 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'modulo_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = modulo(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (modulo(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine modulo5 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real, parameter :: EPS = 1e-5 + character*24 tname + real A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'modulo_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W1 + S1 + call random_number(C(i)) + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = modulo(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(modulo(B(i), C(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine modulo6 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'modulo_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W1 + S1 + call random_number(C(i)) + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = modulo(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (abs(modulo(B(i), C(i)) - A(i)) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'not_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = not(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (not(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'not_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = not(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (not(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'not_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = not(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (not(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'not_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = not(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (not(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine popcnt1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'popcnt_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = popcnt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (popcnt(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine popcnt2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'popcnt_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = popcnt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (popcnt(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine popcnt3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'popcnt_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = popcnt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (popcnt(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine popcnt4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'popcnt_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = popcnt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (popcnt(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine poppar1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'poppar_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = poppar(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (poppar(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine poppar2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'poppar_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = poppar(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (poppar(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine poppar3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'poppar_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = poppar(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (poppar(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine poppar4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'poppar_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = poppar(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (poppar(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*1 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*2 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*4 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*8 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + real B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + double complex B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real x, y + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'real_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = real(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (real(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*4 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'float_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = float(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (float(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + real B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sngl_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sngl(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sngl(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real14 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sngl_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sngl(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sngl(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shifta1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shifta_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shifta(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shifta(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shifta2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shifta_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shifta(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shifta(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shifta3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shifta_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shifta(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shifta(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shifta4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shifta_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shifta(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shifta(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftl1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftl_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftl2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftl_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftl3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftl_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftl4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftl_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftr1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftr_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftr2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftr_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftr3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftr_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine shiftr4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'shiftr_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = shiftr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (shiftr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sign_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sign_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sign_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sign_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sign_float' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sign_double' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (sign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isign_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign16 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dsign_double' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dsign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dsign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sin_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sin_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sin_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin4 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sin_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dsin_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dsin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dsin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin6 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'csin_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = csin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = csin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin7 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdsin_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdsin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdsin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sin8 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'zsin_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = zsin(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = zsin(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sinh1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sinh_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sinh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sinh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sinh2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sinh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sinh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sinh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sinh3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dsinh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dsinh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dsinh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt1 + integer, parameter :: N = 256, ER = N + 1, W = 100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sqrt_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt2 + integer, parameter :: N = 256, ER = N + 1, W = 100, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sqrt_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sqrt_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sqrt_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt5 + integer, parameter :: N = 256, ER = N + 1, W = 100, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dsqrt_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dsqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dsqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'csqrt_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = csqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = csqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdsqrt_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdsqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdsqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sqrt8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'zsqrt_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = zsqrt(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = zsqrt(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tan1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tan_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tan2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tan_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tan3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tan_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tan4 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tan_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tan5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dtan_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dtan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dtan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tanh1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tanh_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tanh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tanh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tanh2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tanh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tanh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tanh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tanh3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dtanh_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dtanh(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dtanh(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine trailz1 + integer, parameter :: N = 256, ER = N + 1, W = 8 + character*24 tname + integer*1 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'trailz_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = 2 ** int(tmp * W) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = trailz(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (trailz(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine trailz2 + integer, parameter :: N = 256, ER = N + 1, W = 16 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'trailz_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = 2 ** int(tmp * W) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = trailz(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (trailz(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine trailz3 + integer, parameter :: N = 256, ER = N + 1, W = 32 + character*24 tname + integer*4 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'trailz_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = 2 ** int(tmp * W) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = trailz(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (trailz(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine trailz4 + integer, parameter :: N = 256, ER = N + 1, W = 64 + character*24 tname + integer*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'trailz_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = 2 ** int(tmp * W) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = trailz(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (trailz(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*24 name + print *, name, ' - complete' + end + + subroutine ansno(name) + character*24 name + print *, name, ' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_math_intel.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_math_intel.fdv new file mode 100644 index 0000000..a14a3f0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_math_intel.fdv @@ -0,0 +1,9645 @@ + + program INTRINSICS + print *, '=== START OF F2C_MATH intrinsic test ===========' + +c TESTING abs SPECIFIC INTRINSIC +c integer*1 babs(integer*1) + call abs9 +c integer*2 iiabs(integer*2) + call abs10 +c integer*2 habs(integer*2) + call abs11 +c integer*4 jiabs(integer*4) + call abs12 +c integer*8 kiabs(integer*8) + call abs13 + +c TESTING acosd GENERIC INTRINSIC +c real*4 acosd(real*4) + call acosd1 +c real*8 acosd(real*8) + call acosd2 +c real*8 dacosd(real*8) + call acosd3 + +c TESTING asind GENERIC INTRINSIC +c real*4 asind(real*4) + call asind1 +c real*8 asind(real*8) + call asind2 +c real*8 dasind(real*8) + call asind3 + +c TESTING atand GENERIC INTRINSIC +c real*4 atand(real*4) + call atand1 +c real*8 atand(real*8) + call atand2 +c real*8 datand(real*8) + call atand3 + +c TESTING atan2d GENERIC INTRINSIC +c real*4 atan2d(real*4, real*4) + call atan2d1 +c real*8 atan2d(real*8, real*8) + call atan2d2 +c real*8 datan2d(real*8, real*8) + call atan2d3 + +c TESTING btest SPECIFIC INTRINSIC +c logical*1 bbtest(integer*1) + call btest5 +c logical*2 bitest(integer*2) + call btest6 +c logical*2 htest(integer*2) + call btest7 +c logical*4 bjtest(integer*4) + call btest8 +c logical*8 bktest(integer*8) + call btest9 + +c TESTING cosd GENERIC INTRINSIC +c real*4 cosd(real*4) + call cosd1 +c real*8 cosd(real*8) + call cosd2 +c real*8 dcosd(real*8) + call cosd3 + +c TESTING cotan GENERIC INTRINSIC +c real*4 cotan(real*4) + call cotan1 +c real*8 cotan(real*8) + call cotan2 +c real*8 dcotan(real*8) + call cotan3 + +c TESTING cotand GENERIC INTRINSIC +c real*4 cotand(real*4) + call cotand1 +c real*8 cotand(real*8) + call cotand2 +c real*8 dcotand(real*8) + call cotand3 + +c TESTING dfloat SPECIFIC INTRINSIC +c real*8 dfloti(integer*2) + call dfloat5 +c real*8 dflotj(integer*4) + call dfloat6 +c real*8 dflotk(integer*8) + call dfloat7 + +c TESTING dim SPECIFIC INTRINSIC +c integer*1 bdim(integer*1) + call dim7 +c integer*2 iidim(integer*2) + call dim8 +c integer*2 hdim(integer*2) + call dim9 +c integer*4 idim(integer*4) + call dim10 +c integer*4 jidim(integer*4) + call dim11 +c integer*8 kidim(integer*8) + call dim12 + +c TESTING iand SPECIFIC INTRINSIC +c integer*1 biand(integer*1) + call iand9 +c integer*2 iiand(integer*2) + call iand10 +c integer*2 hiand(integer*2) + call iand11 +c integer*4 jiand(integer*4) + call iand12 +c integer*8 kiand(integer*8) + call iand13 + +c TESTING ibchng GENERIC INTRINSIC +c integer*1 ibchng(integer*1) + call ibchng1 +c integer*2 ibchng(integer*2) + call ibchng2 +c integer*4 ibchng(integer*4) + call ibchng3 +c integer*8 ibchng(integer*8) + call ibchng4 + +c TESTING ibclr SPECIFIC INTRINSIC +c integer*1 bbclr(integer*1) + call ibclr5 +c integer*2 iibclr(integer*2) + call ibclr6 +c integer*2 hbclr(integer*2) + call ibclr7 +c integer*4 jibclr(integer*4) + call ibclr8 +c integer*8 kibclr(integer*8) + call ibclr9 + +c TESTING ibits SPECIFIC INTRINSIC +c integer*1 bbits(integer*1) + call ibits5 +c integer*2 iibits(integer*2) + call ibits6 +c integer*2 hbits(integer*2) + call ibits7 +c integer*4 jibits(integer*4) + call ibits8 +c integer*8 kibits(integer*8) + call ibits9 + +c TESTING ibset SPECIFIC INTRINSIC +c integer*1 bbset(integer*1) + call ibset5 +c integer*2 iibset(integer*2) + call ibset6 +c integer*2 hbset(integer*2) + call ibset7 +c integer*4 jibset(integer*4) + call ibset8 +c integer*8 kibset(integer*8) + call ibset9 + +c TESTING ieor GENERIC INTRINSIC +c integer*1 ixor(integer*1) + call ieor5 +c integer*2 ixor(integer*2) + call ieor6 +c integer*4 ixor(integer*4) + call ieor7 +c integer*8 ixor(integer*8) + call ieor8 +c integer*1 bieor(integer*1) + call ieor13 +c integer*1 bixor(integer*1) + call ieor14 +c integer*2 iieor(integer*2) + call ieor15 +c integer*2 hieor(integer*2) + call ieor16 +c integer*2 iixor(integer*2) + call ieor17 +c integer*2 hixor(integer*2) + call ieor18 +c integer*4 jieor(integer*4) + call ieor19 +c integer*4 jixor(integer*4) + call ieor20 +c integer*8 kieor(integer*8) + call ieor21 + +c TESTING ilen GENERIC INTRINSIC +c integer*1 ilen(integer*1) + call ilen1 +c integer*2 ilen(integer*2) + call ilen2 +c integer*4 ilen(integer*4) + call ilen3 +c integer*8 ilen(integer*8) + call ilen4 + +c TESTING ior SPECIFIC INTRINSIC +c integer*1 bior(integer*1) + call ior9 +c integer*2 iior(integer*2) + call ior10 +c integer*2 hior(integer*2) + call ior11 +c integer*4 jior(integer*4) + call ior12 +c integer*8 kior(integer*8) + call ior13 + +c TESTING isha GENERIC INTRINSIC +c integer*1 isha(integer*1) + call isha1 +c integer*2 isha(integer*2) + call isha2 +c integer*4 isha(integer*4) + call isha3 +c integer*8 isha(integer*8) + call isha4 + +c TESTING ishc GENERIC INTRINSIC +c integer*1 ishc(integer*1) + call ishc1 +c integer*2 ishc(integer*2) + call ishc2 +c integer*4 ishc(integer*4) + call ishc3 +c integer*8 ishc(integer*8) + call ishc4 + +c TESTING ishft GENERIC INTRINSIC +c integer*1 bshft(integer*1) + call ishft5 +c integer*2 iishft(integer*2) + call ishft6 +c integer*2 hshft(integer*2) + call ishft7 +c integer*4 jishft(integer*4) + call ishft8 +c integer*8 kishft(integer*8) + call ishft9 + +c TESTING lshft GENERIC INTRINSIC +c integer*1 lshft(integer*1) + call lshft1 +c integer*2 lshft(integer*2) + call lshft2 +c integer*4 lshft(integer*4) + call lshft3 +c integer*8 lshft(integer*8) + call lshft4 + +c TESTING rshft GENERIC INTRINSIC +c integer*1 rshft(integer*1) + call rshft1 +c integer*2 rshft(integer*2) + call rshft2 +c integer*4 rshft(integer*4) + call rshft3 +c integer*8 rshft(integer*8) + call rshft4 + +c TESTING ishftc SPECIFIC INTRINSIC +c integer*1 bshftc(integer*1) + call ishftc9 +c integer*1 bshftc(integer*1) + call ishftc10 +c integer*2 iishftc(integer*2) + call ishftc11 +c integer*2 iishftc(integer*2) + call ishftc12 +c integer*2 hshftc(integer*2) + call ishftc13 +c integer*2 hshftc(integer*2) + call ishftc14 +c integer*4 jishftc(integer*4) + call ishftc15 +c integer*4 jishftc(integer*4) + call ishftc16 +c integer*8 kishftc(integer*8) + call ishftc17 +c integer*8 kishftc(integer*8) + call ishftc18 + +c TESTING ishl GENERIC INTRINSIC +c integer*1 ishl(integer*1) + call ishl1 +c integer*2 ishl(integer*2) + call ishl2 +c integer*4 ishl(integer*4) + call ishl3 +c integer*8 ishl(integer*8) + call ishl4 + +c TESTING log10 GENERIC INTRINSIC +c complex*8 log10(complex*8) + call log103 +c complex*16 log10(complex*16) + call log104 +c complex*8 clog10(complex*8) + call log107 +c complex*16 cdlog10(complex*16) + call log108 + +c TESTING max SPECIFIC INTRINSIC +c integer*2 imax0(integer*2) + call max10_ +c integer*4 jmax0(integer*4) + call max11_ +c integer*8 kmax0(integer*8) + call max12_ +c integer*2 imax1(real*4) + call max14_ +c integer*4 jmax1(real*4) + call max15_ +c integer*8 kmax1(real*4) + call max16_ +c real*4 aimax0(integer*2) + call max18_ +c real*4 ajmax0(integer*4) + call max19_ +c real*4 akmax0(integer*8) + call max20_ + +c TESTING min SPECIFIC INTRINSIC +c integer*2 imin0(integer*2) + call min10_ +c integer*4 jmin0(integer*4) + call min11_ +c integer*8 kmin0(integer*8) + call min12_ + +c integer*2 imin1(real*4) + call min14_ +c integer*4 jmin1(real*4) + call min15_ +c integer*8 kmin1(real*4) + call min16_ +c real*4 aimin0(integer*2) + + call min18_ +c real*4 ajmin0(integer*4) + call min19_ +c real*4 akmin0(integer*8) + call min20_ + +c TESTING mod SPECIFIC INTRINSIC +c integer*1 bmod(integer*1) + call mod5 +c integer*2 imod(integer*2) + call mod6 +c integer*2 hmod(integer*2) + call mod7 +c integer*4 jmod(integer*4) + call mod8 +c integer*8 kmod(integer*8) + call mod9 + +c TESTING not SPECIFIC INTRINSIC +c integer*1 bnot(integer*1) + call not5 +c integer*2 inot(integer*2) + call not6 +c integer*2 hnot(integer*2) + call not7 +c integer*4 jnot(integer*4) + call not8 +c integer*8 knot(integer*8) + call not9 + +c TESTING isign SPECIFIC INTRINSIC +c integer*1 isign(integer*1) + call sign7 +c integer*2 isign(integer*2) + call sign8 +c integer*8 isign(integer*8) + call sign10 +c integer*1 bsign(integer*1) + call sign11 +c integer*2 iisign(integer*2) + call sign12 +c integer*2 hsign(integer*2) + call sign13 +c integer*4 jisign(integer*4) + call sign14 +c integer*8 kisign(integer*8) + call sign15 + +c TESTING float SPECIFIC INTRINSIC +c real*4 floati(integer*2) + call real9 +c real*4 floatj(integer*4) + call real11 +c real*4 floatk(integer*8) + call real12 + + +c TESTING tan SPECIFIC INTRINSIC +c complex*8 ctan(complex*8) + call tan6 +c complex*16 cdtan(complex*16) + call tan7 +c complex*16 ztan(complex*16) + call tan8 + +c TESTING sind SPECIFIC INTRINSIC +c real*4 sind(real*4) + call sind1 +c real*8 sind(real*8) + call sind2 +c real*8 dsind(real*8) + call sind3 + +c TESTING tand GENERIC INTRINSIC +c real*4 tand(real*4) + call tand1 +c real*8 tand(real*8) + call tand2 +c real*8 dtand(real*8) + call tand3 + + + print *, '=== END OF F2C_MATH intrinsic test =============' + end + +C ------------------------------------------------- + + subroutine abs9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'babs_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = babs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (babs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iiabs_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iiabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iiabs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'habs_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = habs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (habs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jiabs_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jiabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jiabs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine abs13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kiabs_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kiabs(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kiabs(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acosd1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'acosd_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = acosd(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = acosd(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acosd2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'acosd_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = acosd(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = acosd(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine acosd3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dacosd_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dacosd(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dacosd(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asind1 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'asind_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = asind(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = asind(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asind2 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'asind_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = asind(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = asind(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine asind3 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dasind_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dasind(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dasind(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end +C ------------------------------------------------- + + subroutine atand1 + integer, parameter :: N = 256, ER = N + 1, W = 100, S = 0 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atand_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atand2 + integer, parameter :: N = 256, ER = N + 1, W = 100, S = 0 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atand_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine atand3 + integer, parameter :: N = 256, ER = N + 1, W = 100, S = 0 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'datand_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = datand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = datand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine atan2d1 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atan2d_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W1 + S1 + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atan2d(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atan2d(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan2d2 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'atan2d_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W1 + S1 + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = atan2d(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = atan2d(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine atan2d3 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'datan2d_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + call random_number(C(i)) + B(i) = B(i) * W1 + S1 + C(i) = C(i) * W2 + S2 + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = datan2d(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = datan2d(B(i), C(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine btest5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*1 A(N) + integer*1 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bbtest_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bbtest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bbtest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine btest6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*2 A(N) + integer*2 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bitest_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bitest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bitest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine btest7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*2 A(N) + integer*2 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'htest_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = htest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (htest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine btest8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*4 A(N) + integer*4 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bjtest_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bjtest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bjtest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine btest9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + logical*8 A(N) + integer*8 B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bktest_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bktest(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bktest(B(i), C(i)) .neqv. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine cosd1 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cosd_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cosd(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cosd(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cosd2 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cosd_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cosd(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cosd(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cosd3 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcosd_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcosd(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dcosd(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cotan1 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cotan_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cotan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cotan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cotan2 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cotan_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cotan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cotan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cotan3 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcotan_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcotan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dcotan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cotand1 + integer, parameter :: N = 256, ER = N + 1, W = 120, S = 30 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cotand_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cotand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cotand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cotand2 + integer, parameter :: N = 256, ER = N + 1, W = 120, S = 30 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cotand_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cotand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cotand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine cotand3 + integer, parameter :: N = 256, ER = N + 1, W = 120, S = 30 + real*8, parameter :: EPS = 1d-12 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dcotand_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dcotand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dcotand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dfloat5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*2 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dfloti_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dfloti(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dfloti(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dfloat6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*4 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dflotj_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dflotj(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dflotj(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dfloat7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real*8 A(N) + integer*8 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dflotk_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dflotk(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (dflotk(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bdim_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bdim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bdim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iidim_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iidim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iidim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hdim_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hdim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hdim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'idim_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = idim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (idim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jidim_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jidim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jidim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine dim12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kidim_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kidim(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kidim(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'biand_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = biand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (biand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iiand_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iiand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iiand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hiand_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hiand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hiand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jiand_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jiand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jiand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine iand13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kiand_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kiand(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kiand(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibchng1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibchng_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibchng(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibchng(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine ibchng2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibchng_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibchng(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibchng(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine ibchng3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibchng_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibchng(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibchng(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine ibchng4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ibchng_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ibchng(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ibchng(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + end + +C ------------------------------------------------- + + subroutine ibclr5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bbclr_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bbclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bbclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iibclr_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iibclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iibclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hbclr_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hbclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hbclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jibclr_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jibclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jibclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibclr9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kibclr_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kibclr(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kibclr(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bbits_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bbits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bbits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iibits_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iibits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iibits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hbits_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hbits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hbits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jibits_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jibits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jibits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibits9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kibits_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * (bit_size(D(i)) + 1)) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1 - D(i))) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kibits(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kibits(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bbset_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bbset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bbset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iibset_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iibset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iibset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hbset_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hbset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hbset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jibset_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jibset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jibset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ibset9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kibset_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kibset(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kibset(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ixor_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ixor_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ixor_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ixor_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bieor_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor14 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bixor_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor15 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iieor_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor16 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hieor_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor17 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iixor_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor18 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hixor_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor19 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jieor_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor20 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jixor_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jixor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jixor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ieor21 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kieor_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kieor(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kieor(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ilen1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ilen_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ilen(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ilen(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ilen2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ilen_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ilen(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ilen(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ilen3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ilen_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ilen(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ilen(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ilen4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ilen_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ilen(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ilen(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bior_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iior_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hior_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jior_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ior13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kior_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kior(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kior(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine isha1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isha_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isha(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isha(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine isha2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isha_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isha(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isha(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine isha3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isha_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isha(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isha(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine isha4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isha_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isha(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isha(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishc1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishc_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishc2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishc_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishc3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishc_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishc4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishc_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bshft_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iishft_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hshft_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jishft_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishft9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kishft_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshft1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshft_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshft2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshft_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshft3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshft_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine lshft4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'lshft_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = lshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (lshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshft1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshft_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshft2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshft_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshft3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshft_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine rshft4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'rshft_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = rshft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (rshft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bshftc_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bshftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bshftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bshftc_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bshftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bshftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iishftc_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iishftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iishftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iishftc_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iishftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iishftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hshftc_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hshftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hshftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc14 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hshftc_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hshftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hshftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc15 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jishftc_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (2 * bit_size(C(i)) + 1) - bit_size(C(i))) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jishft(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jishft(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc16 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jishftc_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jishftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jishftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc17 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kishftc_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kishftc(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kishftc(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishftc18 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kishftc_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * bit_size(D(i)) + 1) + call random_number(tmp) + C(i) = int(tmp * D(i)) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kishftc(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kishftc(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishl1 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishl_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishl2 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishl_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishl3 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishl_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine ishl4 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ishl_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * (bit_size(C(i)) + 1)) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ishl(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ishl(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log103 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log10_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log104 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'log10_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = log10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = log10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log107 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'clog10_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = clog10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = clog10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine log108 + integer, parameter :: N = 256, ER = N + 1, W = 99, S = 1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdlog10_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdlog10(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdlog10(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max10_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'imax0_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = imax0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (imax0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max11_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jmax0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jmax0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jmax0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max12_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kmax0_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kmax0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kmax0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max14_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'imax1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = imax1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (imax1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max15_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jmax1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jmax1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jmax1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max16_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kmax1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kmax1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kmax1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end +C ------------------------------------------------- + + subroutine max18_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*2 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'aimax0_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = aimax0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (aimax0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max19_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*4 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ajmax0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ajmax0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ajmax0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine max20_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*8 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'akmax0_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = akmax0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (akmax0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min10_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'imin0_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = imin0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (imin0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min11_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jmin0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jmin0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jmin0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min12_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kmin0_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kmin0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kmin0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end +C ------------------------------------------------- + + subroutine min14_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'imin1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = imin1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (imin1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min15_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jmin1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jmin1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jmin1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min16_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N) + real B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kmin1_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + call random_number(C(i)) + C(i) = C(i) * W + S + call random_number(D(i)) + D(i) = D(i) * W + S + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kmin1(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kmin1(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min18_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*2 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'aimin0_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = aimin0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (aimin0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min19_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*4 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ajmin0_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ajmin0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (ajmin0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine min20_ + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*8 B(N), C(N), D(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'akmin0_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + call random_number(tmp) + D(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C, D) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = akmin0(B(i), C(i), D(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (akmin0(B(i), C(i), D(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod5 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bmod_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bmod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bmod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod6 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'imod_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = imod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (imod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod7 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hmod_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hmod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hmod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod8 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jmod_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jmod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jmod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine mod9 + integer, parameter :: N = 256, ER = N + 1, W1 = 200, S1 = -100, W2 + & = 99, S2 = 1 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kmod_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W1 + S1) + call random_number(tmp) + C(i) = int(tmp * W2 + S2) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kmod(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kmod(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not5 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bnot_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bnot(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bnot(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not6 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'inot_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = inot(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (inot(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hnot_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hnot(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hnot(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jnot_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jnot(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jnot(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine not9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'knot_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = knot(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (knot(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign7 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isign_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign8 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isign_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign10 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'isign_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = isign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (isign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end +C ------------------------------------------------- + + subroutine sign11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*1 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'bsign_char' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = bsign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (bsign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'iisign_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = iisign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (iisign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign13 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*2 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'hsign_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = hsign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (hsign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign14 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*4 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'jisign_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = jisign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (jisign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sign15 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + integer*8 A(N), B(N), C(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'kisign_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + call random_number(tmp) + C(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B, C) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = kisign(B(i), C(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (kisign(B(i), C(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real9 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*2 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'floati_short' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = floati(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (floati(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real11 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*4 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'floatj_long' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = floatj(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (floatj(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine real12 + integer, parameter :: N = 256, ER = N + 1, W = 200, S = -100 + character*24 tname + real A(N) + integer*8 B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'floatk_longlong' + erri = ER + + do i = 1, N + call random_number(tmp) + B(i) = int(tmp * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = floatk(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)) + do i = 1, N + if (floatk(B(i)) .ne. A(i)) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + + +C ------------------------------------------------- + + subroutine tan6 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real, parameter :: EPS = 1e-6 + character*24 tname + complex A(N), B(N) + real x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ctan_complexf' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = cmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ctan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = ctan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tan7 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'cdtan_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = cdtan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = cdtan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tan8 + integer, parameter :: N = 256, ER = N + 1, W = 2, S = -1 + real*8, parameter :: EPS = 1d-15 + character*24 tname + double complex A(N), B(N) + real*8 x, y + integer erri, i, asize, clock + integer, allocatable :: seed(:) + double complex tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'ztan_complexd' + erri = ER + + do i = 1, N + call random_number(x) + call random_number(y) + B(i) = dcmplx(x * W + S, y * W + S) + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = ztan(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = ztan(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + + +C ------------------------------------------------- + + subroutine sind1 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sind_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sind(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sind(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sind2 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'sind_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = sind(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = sind(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine sind3 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dsind_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dsind(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dsind(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tand1 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real, parameter :: EPS = 1e-6 + character*24 tname + real A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tand_float' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tand2 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'tand_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = tand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = tand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------- + + subroutine tand3 + integer, parameter :: N = 256, ER = N + 1, W = 720, S = -360 + real*8, parameter :: EPS = 1d-11 + character*24 tname + real*8 A(N), B(N) + integer erri, i, asize, clock + integer, allocatable :: seed(:) + real*8 tmp + +!dvm$ distribute A(BLOCK) + + call random_seed(size = asize) + allocate(seed(asize)) + call system_clock(count = clock) + seed = clock + 37 * (/(i - 1, i = 1, asize)/) + call random_seed(put = seed) + deallocate(seed) + + tname = 'dtand_double' + erri = ER + + do i = 1, N + call random_number(B(i)) + B(i) = B(i) * W + S + enddo + +!dvm$ actual(B) +!dvm$ region +!dvm$ parallel (i) on A(i) + do i = 1, N + A(i) = dtand(B(i)) + enddo +!dvm$ end region +!dvm$ get_actual(A) + +!dvm$ parallel (i) on A(i), reduction(min(erri)), private(tmp) + do i = 1, N + tmp = dtand(B(i)) + if (abs(tmp - A(i))/abs(tmp) .gt. EPS) then + erri = min(erri, i) + endif + enddo + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + + +C ------------------------------------------------- + + subroutine ansyes(name) + character*24 name + print *, name, ' - complete' + end + + subroutine ansno(name) + character*24 name + print *, name, ' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_select.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_select.fdv new file mode 100644 index 0000000..17a81a0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/f2c_select.fdv @@ -0,0 +1,500 @@ + program SELECT_SIMPLE + +c TESTING convert statement SELECT . + + print *,'===START OF F2C_SELECT ========================' +C -------------------------------------------------- +c normal select + call select_with_default +c only default node select + call select_only_default +c select without default node + call select_without_default +c select with interval + call select_interval +c select with multi interval + call select_multi_interval +c select with multi select + call select_multi_select + print *,'=== END OF F2C_SELECT ========================= ' + end + +C ----------------------------------------------------select11 + subroutine select_with_default + integer, parameter :: AN1=8, ER=10000 + character*22 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='select_with_default' + allocate (A1(AN1)) + allocate (B1(AN1)) + + do i=1,AN1 + B1(i) =i + enddo +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1, AN1 + ia = A1(i) + select case( MOD( A1(i), 4 ) ) + case(0) + ia = ia + 4 + case(1) + ia = ia+3 + case(2) + ia = ia+2 + case default + ia = ia+1 + end select + A1(i) = ia*2+3 + enddo +!dvm$ end region + + do i=1, AN1 + ia = B1(i) + select case( MOD( B1(i), 4 ) ) + case(0) + ia = ia + 4 + case(1) + ia = ia+3 + case(2) + ia = ia+2 + case default + ia = ia+1 + end select + B1(i) = ia*2+3 + enddo + + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + erri= ER + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end +C ----------------------------------------------------select12 + subroutine select_only_default + integer, parameter :: AN1=8, ER=10000 + character*22 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='select_only_default' + allocate (A1(AN1)) + allocate (B1(AN1)) + + do i=1,AN1 + B1(i) =i + enddo +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1, AN1 + ia = A1(i) + select case( MOD( A1(i), 4) ) + case default + ia = ia*A1(i)-15 + end select + A1(i) = ia + enddo +!dvm$ end region + + do i=1, AN1 + ia = B1(i) + select case( MOD( B1(i), 4) ) + case default + ia = ia*B1(i)-15 + end select + B1(i) = ia + enddo + + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + erri= ER + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end + +C ----------------------------------------------------select13 + subroutine select_without_default + integer, parameter :: AN1=8, ER=10000 + character*22 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='select_without_default' + allocate (A1(AN1)) + allocate (B1(AN1)) + + do i=1,AN1 + B1(i) =i + enddo +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1, AN1 + ia = A1(i) + select case( MOD( A1(i), 4 ) ) + case(0) + ia = ia + 4 + case(1) + ia = ia*2+3 + case(2) + ia = ia*3-7 + end select + A1(i) = ia + enddo +!dvm$ end region + + do i=1, AN1 + ia = B1(i) + select case( MOD( B1(i), 4 ) ) + case(0) + ia = ia + 4 + case(1) + ia = ia*2+3 + case(2) + ia = ia*3-7 + end select + B1(i) = ia + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + erri= ER + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end + + +C ----------------------------------------------------select14 + subroutine select_interval + integer, parameter :: AN1=8, ER=10000 + character*22 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='select_interval' + allocate (A1(AN1)) + allocate (B1(AN1)) + + do i=1,AN1 + B1(i) =i + enddo +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1, AN1 + ia = A1(i) + select case( MOD( A1(i), 20 ) ) + case(:7) + ia = ia + 4 + case(9:13) + ia = ia*2+3 + case(16:) + ia = ia*3-7 + case default + ia = A1(i)*1/8 +ia*A1(i)-ia + end select + A1(i) = ia + enddo +!dvm$ end region + + do i=1, AN1 + ia = B1(i) + select case( MOD( B1(i), 20 ) ) + case(:7) + ia = ia + 4 + case(9:13) + ia = ia*2+3 + case(16:) + ia = ia*3-7 + case default + ia = B1(i)*1/8 +ia*B1(i)-ia + end select + B1(i) = ia + enddo + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + erri= ER + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end + +C ----------------------------------------------------select15 + subroutine select_multi_interval + integer, parameter :: AN1=8, ER=10000 + character*22 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='select_multi_interval' + allocate (A1(AN1)) + allocate (B1(AN1)) + + do i=1,AN1 + B1(i) =i + enddo +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1, AN1 + ia = A1(i) + select case( MOD( A1(i), 30 ) ) + case(:4) + ia = ia + 4 + case(9:13, 20:24, 5) + ia = ia*2+3 + case(7, 17:19, 26: ) + ia = ia*3-7 + case default + ia = A1(i)*1/8 +ia*A1(i)-ia + end select + A1(i) = ia + enddo +!dvm$ end region + + do i=1, AN1 + ia = B1(i) + select case( MOD( B1(i), 30 ) ) + case(:4) + ia = ia + 4 + case(9:13, 20:24, 5) + ia = ia*2+3 + case(7, 17:19, 26: ) + ia = ia*3-7 + case default + ia = B1(i)*1/8 +ia*B1(i)-ia + end select + B1(i) = ia + enddo + + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + erri= ER + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end +C ----------------------------------------------------select16 + subroutine select_multi_select + integer, parameter :: AN1=8, ER=10000 + character*22 tname + integer, allocatable :: A1(:) + integer, allocatable :: B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='select_multi_interval' + allocate (A1(AN1)) + allocate (B1(AN1)) + + do i=1,AN1 + B1(i) =i + enddo +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1, AN1 + ia = A1(i) + select case( MOD( A1(i), 30 ) ) + case(:4) + ia = ia + 4 + case(9:13, 20:24, 5) + ia = ia*2+3 + select case(ia + min(A1(i) +7, A1(i)*A1(i)*1/4-19 )) + case(:10) + ia = max(ia, 19) + 7 + case default + ia = ia/2 -9 + case(17) + ia = ia+1 + case(20:) + ia = A1(i)-7 + end select + case(7, 17:19, 26: ) + ia = ia*3-7 + case default + ia = A1(i)*1/8 +ia*A1(i)-ia + end select + A1(i) = ia + enddo +!dvm$ end region + + do i=1, AN1 + ia = B1(i) + select case( MOD( B1(i), 30 ) ) + case(:4) + ia = ia + 4 + case(9:13, 20:24, 5) + ia = ia*2+3 + select case(ia + min(B1(i) +7, A1(i)*B1(i)*1/4-19 )) + case(:10) + ia = max(ia, 19) + 7 + case default + ia = ia/2 -9 + case(17) + ia = ia+1 + case(20:) + ia = B1(i)-7 + end select + case(7, 17:19, 26: ) + ia = ia*3-7 + case default + ia = B1(i)*1/8 +ia*B1(i)-ia + end select + B1(i) = ia + enddo + + erri= ER +!dvm$ get_actual(A1) +!dvm$ parallel (i) on A1(i), reduction( min( erri ) ) + do i=1,AN1 + if ( abs(A1(i) - B1(i) ) .lt. 0.001 ) then + else + erri = min(erri,i) + endif + enddo + + + erri= ER + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + deallocate (B1) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*22 name + print *,name,' - complete' + end + subroutine ansno(name) + character*22 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/settings b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/settings new file mode 100644 index 0000000..a80f859 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F2C/settings @@ -0,0 +1 @@ +DIMENSION_COUNT=0 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/copy11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/copy11.fdv new file mode 100644 index 0000000..1adfeb3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/copy11.fdv @@ -0,0 +1,65 @@ + PROGRAM COPY11 + PARAMETER (ERR=100, L=10, ITMAX=1) + INTEGER A(L),X(L), C(L),B(L),D(L) + INTEGER ERRI,i +CDVM$ DISTRIBUTE (BLOCK) :: A +CDVM$ ALIGN C(I) WITH A(I) +CDVM$ ALIGN D(I) WITH A(I) + +CDVM$ ASYNCID GR + CHARACTER*7 tname + PRINT *, '======== START OF COPY11 ========' + tname='COPY11' + ERRI= ERR + do I=1,L + X(I)=I + enddo + B(1)=X(1)*ITMAX + do I=2,L + B(I)=B(I-1)+X(I) + B(I)=ITMAX*B(I) + enddo + +CDVM$ ASYNCHRONOUS GR + D(:)=B(:) +CDVM$ END ASYNCHRONOUS + +CDVM$ PARALLEL ( I) ON A( I) + DO I = 1, L + A( I) = I + ENDDO + + C(1)=A(1) + + DO IT = 1, ITMAX +CDVM$ PARALLEL (I) ON A( I), ACROSS(C(1:1)) + DO I = 2, L + C(I) = C(I-1) + A(I) + ENDDO + ENDDO + +CDVM$ ASYNCWAIT GR + +CDVM$ PARALLEL (I) ON C(I), reduction (min(ERRI)) + do i=1,L + if (D(i) .ne. C(i)) then + ERRI = min (I,ERRI) + endif + enddo + + if (ERRI .eq.ERR) then + call ansyes(tname) + else + call ansno(tname) + endif + print *,'=== END OF COPY11 ======================' + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/copy21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/copy21.fdv new file mode 100644 index 0000000..08f64e9 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/copy21.fdv @@ -0,0 +1,49 @@ + program copy21 + parameter (ERR=10000, L=10) + integer A(L,L),X(L,L), C(L,L),B(L,L),D(L,L) + integer:: ERRI=ERR +!DVM$ DISTRIBUTE (BLOCK,BLOCK) :: A +!DVM$ ALIGN C(I,J) WITH A(I,J) +!DVM$ ALIGN D(I,J) WITH A(I,J) + + character*6:: tname ='copy21' + print *,'======== START OF copy21 ==================' + + + do J=1,L + do I=1,L + X(I,J)=I+J + enddo + enddo + B = 0 + C(:,:)=B(:,:) + D(1:L,1) = X(1:L,1) + C(1:L,1) = D(1:L,1) + + +!DVM$ PARALLEL (J,I) ON C(I,J), REDUCTION (min(ERRI)) + do J=1,L + do I=1,L + if (J.eq.1 .and. X(I,1) .ne. C(I,1)) then + ERRI = min (I,ERRI) + else if(J.ne.1 .and. C(I,J) .ne. 0) then + ERRI = min (I,ERRI) + endif + enddo + enddo + if (ERRI .eq.ERR) then + call ansyes(tname) + else + call ansno(tname) + endif + print *,'======== END OF copy21 ======================' + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/module21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/module21.fdv new file mode 100644 index 0000000..d292a68 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/module21.fdv @@ -0,0 +1,114 @@ + MODULE FOR_JAC + PARAMETER (K=8, ITMAX=20) + REAL AA(K,K), EPS, MAXEPS, BB(K,K) +CDVM$ DISTRIBUTE (BLOCK, BLOCK) :: AA +CDVM$ ALIGN BB(I,J) WITH AA(I,J) + END MODULE + + MODULE MOD1 + USE FOR_JAC + END MODULE + + PROGRAM MODULE21 + USE MOD1,A=>AA,B=>BB !FOR_JAC + +CDVM$ REDUCTION_GROUP REPS + REAL A1(K,K), EPS1, B1(K,K) +CDVM$ DISTRIBUTE (BLOCK, BLOCK) :: A1 +CDVM$ ALIGN B1(I,J) WITH A1(I,J) + + PRINT *, '======== START OF MODULE21 ========' +CDVM$ SHADOW_GROUP SA (A) +C creation of descriptor for operations with imported/exported +C elements of array A + MAXEPS = 0.5E - 7 + +CDVM$ PARALLEL ( J, I) ON A( I, J) + DO J = 1, K + DO I = 1, K + A( I, J) = 0. + IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.K .OR. J.EQ.K) THEN + B(I, J) = 0. + ELSE + B(I, J) = ( 1. + I + J ) + ENDIF + ENDDO + ENDDO + DO IT = 1, ITMAX + EPS = 0. +CDVM$ PARALLEL ( J, I) ON A( I, J), SHADOW_START SA, +CDVM$* REDUCTION(REPS:MAX(EPS)) +C the loops iteration order is changed: at first +C exported (boundary) elements of A are calculated and sent +C then internal elements of array A are calculated + DO J = 2, K-1 + DO I = 2, K-1 + EPS = MAX ( EPS, ABS( B( I, J) - A( I, J))) + A( I, J) = B( I, J) + ENDDO + ENDDO + +CDVM$ REDUCTION_START REPS +CDVM$ PARALLEL ( J, I) ON B( I, J), SHADOW_WAIT SA + DO J = 2, K-1 + DO I = 2, K-1 + B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J ) + + * A( I, J+1 ))/4 + ENDDO + ENDDO +CDVM$ REDUCTION_WAIT REPS + IF (EPS .LT. MAXEPS) GO TO 3 + ENDDO + + 3 CONTINUE +CDVM$ PARALLEL ( J, I) ON A( I, J) +C nest of parallel loops for initialization of arrays + DO J = 1, K + DO I = 1, K + A1( I, J) = 0. + IF(I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.K .OR. J.EQ.K) THEN + B1(I, J) = 0. + ELSE + B1(I, J) = ( 1. + I + J ) + ENDIF + ENDDO + ENDDO + DO IT = 1, ITMAX + EPS1 = 0. +CDVM$ PARALLEL ( J, I) ON A1( I, J), +CDVM$* REDUCTION (MAX(EPS1)) + DO J = 2, K-1 + DO I = 2, K-1 + EPS1 = MAX (EPS1, ABS(B1( I, J) - A1(I, J))) + A1(I, J) = B1( I, J) + ENDDO + ENDDO + +CDVM$ PARALLEL ( J, I) ON B1 (I, J), SHADOW_RENEW(A1) + DO J = 2, K-1 + DO I = 2, K-1 + B1(I, J) = (A1 (I-1, J) + A1 (I, J-1) + A1 (I+1, J) + + * A1( I, J+1 ))/4 + ENDDO + ENDDO + IF (EPS1 .LT. MAXEPS ) GO TO 4 + ENDDO + + 4 IF (EPS .EQ. EPS1) THEN + call ansyes('module21') + ELSE + call ansno('module21') + ENDIF + PRINT *, '=== END OF MODULE21 ==================' + + END + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/settings b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/settings new file mode 100644 index 0000000..3ef2d72 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/settings @@ -0,0 +1 @@ +DVM_ONLY=1 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/type21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/type21.fdv new file mode 100644 index 0000000..f8d9a45 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/F95/type21.fdv @@ -0,0 +1,89 @@ + program type21 + integer(4),parameter:: n=4,m=4,l=4,err=100 + real ,dimension (n,m,l):: a + integer::k,p,q,err1,err2,err3 + type OBJECT + character (15) name + integer st(n) + integer bl(n,m) + integer matr(n,m) + end type OBJECT + + integer, dimension(n,m) :: a1, b, c + integer, dimension(n) :: qq + +CDVM$ distribute (BLOCK, *):: a1 +CDVM$ align qq(i) with a1( i, *) +CDVM$ align (i,j) with a1(i,j):: c,b + type(OBJECT) :: GR,OTD +CDVM$ ASYNCID Y + + print *,'====== START OF TYPE21 ==========' +! Testing of different variants of deffinitions a + do k=1,n + do p=1,m + do q=1,l + a(k,p,q)=10+k+p+q + end do + end do + end do + a=1; a(1:n,1:m,1:l)=10+n+m+l!!; print*,a + a=1; forall(k=1:n,p=1:m,q=1:l) a(k,p,q) = 10+k+p+q; + do k=1,n + do p=1,m + a1(k,p)=k + end do + end do + c=0 + +CDVM$ ASYNCHRONOUS Y + qq(:)= a1(:,2) + b(:,:) = a1(:,:) + c(1:2,:) = a1(3:4,:) +CDVM$ END ASYNCHRONOUS + GR%st=(/1,2,3,4/) + + do k=1,n + do p=1,m + GR%matr(k,p)=k + end do + end do + + GR%bl=reshape((/3,4,0,0,3,4,0,0,3,4,0,0,3,4,0,0/),(/4,4/)) + +CDVM$ ASYNCWAIT Y + err1=err;err2=err;err3=err +CDVM$ parallel(i) on qq(i),reduction (min(err1)) + do i=1,n + if (qq(i) .ne. GR%st(i)) then + err1 = min (i,err1) + endif + enddo + +CDVM$ parallel(i,j) on a1(i,j), reduction (min(err2)) + do i=1,n + do j=1,m + if (a1(i,j) .ne. GR%matr(i,j)) then + err2 = min (i,err2) + endif + enddo + enddo + +CDVM$ parallel(i,j) on c(i,j), reduction (min(err3)) + do i=1,n + do j=1,m + if (c(i,j) .ne.GR%bl(i,j)) then + err3 = min (i,err3) + endif + enddo + enddo + + if ((err1 .ne. err).OR.(err2 .ne.err).OR.(err3.ne.err)) then + print *,'type21 - ***error ' + else + print *,'type21 - complete' + endif + print *,'=== END OF TYPE21 =======================' + + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrderived1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrderived1.fdv new file mode 100644 index 0000000..ba2ae4b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrderived1.fdv @@ -0,0 +1,236 @@ + program DISTRDERIVED1 +! Testing DISTRIBUTE and REDISTRIBUTE directives +! INDIRECT, DERIVED distributions (format with range) + print *,'=== START OF distrderived1 ========================' + call distrderived11 + 1 print *,'=== END OF distrderived1 ========================= ' + + end + subroutine distrderived11 + parameter (L=10, ER=100000) + integer:: x_t, y_t, z_t, cur, erri = ER + integer, allocatable :: A(:), B(:), AS(:), BS(:) + integer, allocatable :: ibstart(:), ibend(:), ib(:) + integer, allocatable :: indir_x(:), indir_y(:), indir_z(:) + integer MAP(L*L*L) + character*14:: tname="distrderived11" +!DVM$ TEMPLATE E(L*L*L) +!DVM$ TEMPLATE :: E2(:) +!DVM$ DISTRIBUTE :: E +!DVM$ DISTRIBUTE :: E2 +!DVM$ ALIGN :: A,B +!DVM$ ALIGN :: indir_x, indir_y,indir_z, ibstart, ibend +!DVM$ ALIGN :: ib + + allocate(AS(L*L*L),BS(L*L*L)) + call distrderived11_s(AS,BS) + call fillMap(map,L,1) + allocate(A(L*L*L),B(L*L*L), ibstart(L*L*L), ibend(L*L*L)) + allocate(indir_x(L*L*L), indir_y(L*L*L), indir_z(L*L*L)) +!DVM$ REDISTRIBUTE E(INDIRECT(map)) +!DVM$ REALIGN (I) WITH E(I) :: A,B,indir_x, indir_y,indir_z +!DVM$ REALIGN (I) WITH E(I) :: ibstart, ibend + cur = 1 + do i = 1,L*L*L + x_t = (i-1) / (L*L) + y_t = mod((i-1) / L, L) + z_t = mod(i-1, L) + indir_x(i) = x_t + indir_y(i) = y_t + indir_z(i) = z_t + ibstart(i) = cur + if (x_t.gt.0) cur = cur + 1 + if (x_t.lt.L-1) cur = cur + 1 + if (y_t.gt.0) cur = cur + 1 + if (y_t.lt.L-1) cur = cur + 1 + if (z_t.gt.0) cur = cur + 1 + if (z_t.lt.L-1) cur = cur + 1 + ibend(i) = cur - 1 + enddo + allocate(ib(cur-1)) +!DVM$ TEMPLATE_CREATE(E2(cur-1)) +!DVM$ REDISTRIBUTE E2(DERIVED((ibstart(i):ibend(i)) with E(@i))) +!DVM$ REALIGN (I) WITH E2(I) :: ib + + cur = 1 + do i = 1,L*L*L + x_t = (i-1) / (L*L) + y_t = mod((i-1) / L, L) + z_t = mod(i-1, L) + if (x_t.gt.0) then + ib(cur) = i - (L*L) + cur = cur + 1 + endif + if (x_t.lt.L-1) then + ib(cur) = i+(L*L) + cur = cur + 1 + endif + if (y_t.gt.0) then + ib(cur) = i-L + cur = cur + 1 + endif + if (y_t.lt.L-1) then + ib(cur) = i+L + cur = cur + 1 + endif + if (z_t.gt.0) then + ib(cur) = i-1 + cur = cur + 1 + endif + if (z_t.lt.L-1) then + ib(cur) = i+1 + cur = cur + 1 + endif + enddo + +!DVM$ LOCALIZE(ibstart => ib(:)) +!DVM$ LOCALIZE(ibend => ib(:)) +!DVM$ SHADOW_ADD(E((ib(ibstart(i):ibend(i))) with E(@i)) = "nei1") +!DVM$& include_to A +!DVM$ LOCALIZE(ib => A(:)) +!DVM$ REGION +!DVM$ PARALLEL (i) ON B(i) + do i = 1, L*L*L + if (indir_x(i) == 0 .or. indir_x(i) == L-1 .or. + & indir_y(i) == 0 .or. indir_y(i) == L-1 .or. + & indir_z(i) == 0 .or. indir_z(i) == L-1) then + A(i) = 0 + else + A(i) = 4 + indir_x(i) + indir_y(i) + indir_z(i) + endif + enddo +!DVM$ PARALLEL (i) ON B(i), SHADOW_RENEW(A) + do i = 1, L*L*L + if (indir_x(i) /= 0 .and. indir_x(i) /= L-1 .and. + & indir_y(i) /= 0 .and. indir_y(i) /= L-1 .and. + & indir_z(i) /= 0 .and. indir_z(i) /= L-1) then + B(i) = (A(ib(ibstart(i))) + A(ib(ibstart(i)+1)) + & + A(ib(ibstart(i)+2)) + A(ib(ibstart(i)+3)) + & + A(ib(ibstart(i)+4)) + A(ib(ibstart(i)+5)))/ 6.0 + endif + enddo +!DVM$ PARALLEL (i) ON B(i), REDUCTION(min(erri)) + do i = 1, L*L*L + if (indir_x(i) /= 0 .and. indir_x(i) /= L-1 .and. + & indir_y(i) /= 0 .and. indir_y(i) /= L-1 .and. + & indir_z(i) /= 0 .and. indir_z(i) /= L-1) then + if(B(i) .ne. BS(i)) erri = min(erri, ABS(B(i)-BS(i))) + endif + enddo +!DVM$ END REGION +!DVM$ GET_ACTUAL(erri) + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(ibstart,ibend) + deallocate(ib) + deallocate(A,B,indir_x,indir_y,indir_z) + end +!------------------------------------------------------------- + subroutine fillMap(map,L,axis) + integer numproc + integer i,L,axis + integer map(L*L*L) + PROCESSORS_SIZE(axis) = 1 + numproc = PROCESSORS_SIZE(axis) + do i = 1,L*L*L + map(i) = ((i-1) * numproc) / (L*L*L) + enddo + end +!--------------------------------------------------------------- + subroutine distrderived11_s(A,B) + parameter (L=10) + integer x_t, y_t, z_t, cur + integer:: A(L*L*L), B(L*L*L) + integer, allocatable :: ibstart(:), ibend(:), ib(:) + integer, allocatable :: indir_x(:), indir_y(:),indir_z(:) + allocate(ibstart(L*L*L), ibend(L*L*L)) + allocate(indir_x(L*L*L), indir_y(L*L*L), indir_z(L*L*L)) + cur = 1 + do i = 1,L*L*L + x_t = (i-1) / (L*L) + y_t = mod((i-1) / L, L) + z_t = mod(i-1, L) + indir_x(i) = x_t + indir_y(i) = y_t + indir_z(i) = z_t + ibstart(i) = cur + if (x_t.gt.0) cur = cur + 1 + if (x_t.lt.L-1) cur = cur + 1 + if (y_t.gt.0) cur = cur + 1 + if (y_t.lt.L-1) cur = cur + 1 + if (z_t.gt.0) cur = cur + 1 + if (z_t.lt.L-1) cur = cur + 1 + ibend(i) = cur - 1 + enddo + allocate(ib(cur-1)) + cur = 1 + do i = 1,L*L*L + x_t = (i-1) / (L*L) + y_t = mod((i-1) / L, L) + z_t = mod(i-1, L) + if (x_t.gt.0) then + ib(cur) = i - (L*L) + cur = cur + 1 + endif + if (x_t.lt.L-1) then + ib(cur) = i+(L*L) + cur = cur + 1 + endif + if (y_t.gt.0) then + ib(cur) = i-L + cur = cur + 1 + endif + if (y_t.lt.L-1) then + ib(cur) = i+L + cur = cur + 1 + endif + if (z_t.gt.0) then + ib(cur) = i-1 + cur = cur + 1 + endif + if (z_t.lt.L-1) then + ib(cur) = i+1 + cur = cur + 1 + endif + enddo + + do i = 1, L*L*L + if (indir_x(i) == 0 .or. indir_x(i) == L-1 .or. + & indir_y(i) == 0 .or. indir_y(i) == L-1 .or. + & indir_z(i) == 0 .or. indir_z(i) == L-1) then + A(i) = 0 + else + A(i) = 4 + indir_x(i) + indir_y(i) + indir_z(i) + endif + enddo + + do i = 1, L*L*L + if (indir_x(i) /= 0 .and. indir_x(i) /= L-1 .and. + & indir_y(i) /= 0 .and. indir_y(i) /= L-1 .and. + & indir_z(i) /= 0 .and. indir_z(i) /= L-1) then + + B(i) = (A(ib(ibstart(i))) + A(ib(ibstart(i)+1)) + & + A(ib(ibstart(i)+2)) + A(ib(ibstart(i)+3)) + & + A(ib(ibstart(i)+4)) + A(ib(ibstart(i)+5)))/ 6.0 + endif + enddo + deallocate(ibstart,ibend) + deallocate(ib) + deallocate(indir_x,indir_y,indir_z) + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*14 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end + + + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrindirect1.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrindirect1.f90 new file mode 100644 index 0000000..8ba8992 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrindirect1.f90 @@ -0,0 +1,235 @@ + program DISTRINDIRECT1 +! Testing DISTRIBUTE and REDISTRIBUTE directives +! INDIRECT distribution + print *,'=== START OF distrindirect1 ========================' + call distrindirect11 + print *,'=== END OF distrindirect1 ========================= ' + end + + subroutine distrindirect11 + parameter (L=10, ER=100000) + integer:: x_t, y_t, z_t, erri = ER + integer A(L*L*L), B(L*L*L), AS(L*L*L), BS(L*L*L) + integer,dimension(:),allocatable:: ib1,ib2,ib3,ib4,ib5,ib6 + integer,dimension(L*L*L):: indir_x, indir_y,indir_z + integer MAP(L*L*L) + character*15:: tname="distrindirect11" + +!DVM$ DISTRIBUTE MAP (BLOCK) +!DVM$ TEMPLATE E(L*L*L) +!DVM$ DISTRIBUTE :: E +!DVM$ ALIGN :: A,B +!DVM$ ALIGN :: indir_x, indir_y,indir_z +!DVM$ ALIGN :: ib1,ib2,ib3,ib4,ib5,ib6 + + call distrindirect11_s(AS,BS) + call fillMap(MAP,L) + allocate( ib1(L*L*L),ib2(L*L*L),ib3(L*L*L) & + & ,ib4(L*L*L),ib5(L*L*L),ib6(L*L*L) ) +!DVM$ REDISTRIBUTE E(INDIRECT(MAP)) +!DVM$ REALIGN (I) WITH E(I) :: A,B +!DVM$ REALIGN (I) WITH E(I) :: indir_x, indir_y,indir_z +!DVM$ REALIGN (I) WITH E(I) :: ib1,ib2,ib3,ib4,ib5,ib6 + do i = 1,L*L*L + + x_t = (i-1) / (L*L) + y_t = mod((i-1) / L, L) + z_t = mod(i-1 , L) + + indir_x(i) = x_t + indir_y(i) = y_t + indir_z(i) = z_t + + if (x_t.gt.0) then + ib1(i) = i - (L*L) + else + ib1(i) = -1 + endif + if ((x_t+1).lt.L) then + ib2(i) = i+(L*L) + else + ib2(i) = -1 + endif + if (y_t.gt.0) then + ib3(i) = i-L + else + ib3(i) = -1 + endif + if ((y_t+1).lt.L) then + ib4(i) = i+L + else + ib4(i) = -1 + endif + if (z_t.gt.0) then + ib5(i) = i-1 + else + ib5(i) = -1 + endif + if ((z_t+1).lt.L) then + ib6(i) = i+1 + else + ib6(i) = -1 + endif + enddo + +!DVM$ SHADOW_ADD (E((ib1(i)) with E(@i)) = "nei1") include_to A +!DVM$ SHADOW_ADD (E((ib2(i)) with E(@i)) = "nei2") include_to A +!DVM$ SHADOW_ADD (E((ib3(i)) with E(@i)) = "nei3") include_to A +!DVM$ SHADOW_ADD (E((ib4(i)) with E(@i)) = "nei4") include_to A +!DVM$ SHADOW_ADD (E((ib5(i)) with E(@i)) = "nei5") include_to A +!DVM$ SHADOW_ADD (E((ib6(i)) with E(@i)) = "nei6") include_to A + +!DVM$ LOCALIZE(ib1 => A(:)) +!DVM$ LOCALIZE(ib2 => A(:)) +!DVM$ LOCALIZE(ib3 => A(:)) +!DVM$ LOCALIZE(ib4 => A(:)) +!DVM$ LOCALIZE(ib5 => A(:)) +!DVM$ LOCALIZE(ib6 => A(:)) + +!DVM$ REGION +!DVM$ PARALLEL (i) ON B(i) + do i = 1, L*L*L + A(i) = 0 + if (indir_x(i) == 0 .or. indir_x(i) == L-1 .or. & + & indir_y(i) == 0 .or. indir_y(i) == L-1 .or. & + & indir_z(i) == 0 .or. indir_z(i) == L-1) then + + B(i) = 0 + else + B(i) = 4 + indir_x(i) + indir_y(i) + indir_z(i) + endif + enddo +!DVM$ PARALLEL (i) ON B(i), SHADOW_RENEW (A) + do i = 1, L*L*L + if (indir_x(i) /= 0 .and. indir_x(i) /= L-1 .and. & + & indir_y(i) /= 0 .and. indir_y(i) /= L-1 .and. & + & indir_z(i) /= 0 .and. indir_z(i) /= L-1) then + B(i) = (A(ib1(i)) + A(ib2(i)) + A(ib3(i)) + & + & A(ib4(i)) + A(ib5(i)) + A(ib6(i))) / 6.0 + endif + enddo +!DVM$ PARALLEL (i) ON B(i), REDUCTION(min(erri)) + do i = 1, L*L*L + if (indir_x(i) /= 0 .and. indir_x(i) /= L-1 .and. & + & indir_y(i) /= 0 .and. indir_y(i) /= L-1 .and. & + & indir_z(i) /= 0 .and. indir_z(i) /= L-1) then + if(B(i) .ne. BS(i)) erri = min(erri, ABS(B(i)-BS(i))) + endif + enddo + +!DVM$ END REGION + +!DVM$ GET_ACTUAL(erri) + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate(ib1,ib2,ib3,ib4,ib5,ib6) + end subroutine + +!--------------------------------------------------------------- + subroutine fillMap(MAP,L) + integer numproc + integer i,L + real:: x=1 + integer MAP(L*L*L) + intrinsic INT + NUMBER_OF_PROCESSORS() = 1 +!DVM$ INHERIT MAP + numproc = NUMBER_OF_PROCESSORS() +!DVM$ PARALLEL (i) ON MAP(i) + do i=1,L*L*L + call RANDOM_NUMBER(x) + MAP(i) = MOD(INT(x*10), numproc) + enddo + end subroutine + +!--------------------------------------------------------------- + subroutine distrindirect11_s (A,B) + parameter (L=10) + integer:: x_t, y_t, z_t + integer A(L*L*L), B(L*L*L) + integer,dimension(:),allocatable:: ib1,ib2,ib3,ib4,ib5,ib6 + integer,dimension(L*L*L):: indir_x, indir_y,indir_z + + allocate( ib1(L*L*L),ib2(L*L*L),ib3(L*L*L) & + & ,ib4(L*L*L),ib5(L*L*L),ib6(L*L*L) ) + do i = 1,L*L*L + + x_t = (i-1) / (L*L) + y_t = mod((i-1) / L, L) + z_t = mod(i-1 , L) + + indir_x(i) = x_t + indir_y(i) = y_t + indir_z(i) = z_t + + if (x_t.gt.0) then + ib1(i) = i - (L*L) + else + ib1(i) = -1 + endif + if ((x_t+1).lt.L) then + ib2(i) = i+(L*L) + else + ib2(i) = -1 + endif + if (y_t.gt.0) then + ib3(i) = i-L + else + ib3(i) = -1 + endif + if ((y_t+1).lt.L) then + ib4(i) = i+L + else + ib4(i) = -1 + endif + if (z_t.gt.0) then + ib5(i) = i-1 + else + ib5(i) = -1 + endif + if ((z_t+1).lt.L) then + ib6(i) = i+1 + else + ib6(i) = -1 + endif + enddo + + do i = 1, L*L*L + A(i) = 0 + if (indir_x(i) == 0 .or. indir_x(i) == L-1 .or. & + & indir_y(i) == 0 .or. indir_y(i) == L-1 .or. & + & indir_z(i) == 0 .or. indir_z(i) == L-1) then + + B(i) = 0 + else + B(i) = 4 + indir_x(i) + indir_y(i) + indir_z(i) + endif + enddo + + do i = 1, L*L*L + if (indir_x(i) /= 0 .and. indir_x(i) /= L-1 .and. & + & indir_y(i) /= 0 .and. indir_y(i) /= L-1 .and. & + & indir_z(i) /= 0 .and. indir_z(i) /= L-1) then + B(i) = (A(ib1(i)) + A(ib2(i)) + A(ib3(i)) + & + & A(ib4(i)) + A(ib5(i)) + A(ib6(i))) / 6.0 + endif + enddo + deallocate(ib1,ib2,ib3,ib4,ib5,ib6) + end subroutine + +!--------------------------------------------------------------- + subroutine ansyes(name) + character*14 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end + + + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrindirect3.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrindirect3.f90 new file mode 100644 index 0000000..317b66b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INDIRECT_DERIVED/distrindirect3.f90 @@ -0,0 +1,262 @@ + program DISTRINDIRECT3 +! Testing DISTRIBUTE and REDISTRIBUTE directives +! INDIRECT distribution + print *,'=== START OF distrindirect3 ========================' + call distrindirect31 + print *,'=== END OF distrindirect3 ========================= ' + end + + subroutine distrindirect31 + parameter (L=10, ER=100000) + integer:: A(L,L,L), B(L,L,L),AS(L,L,L), BS(L,L,L) + integer,dimension(:,:,:),allocatable:: ib1, ib2, ib3, ib4, ib5, ib6 + integer,dimension(L,L,L):: indir_x, indir_y, indir_z + integer MAP1(L), MAP2(L), MAP3(L) + integer:: erri=ER + character*15:: tname="distrindirect31" +!DVM$ TEMPLATE E(L,L,L) +!DVM$ DISTRIBUTE :: E +!DVM$ ALIGN :: A,B +!DVM$ ALIGN :: indir_x, indir_y,indir_z +!DVM$ ALIGN :: ib1,ib2,ib3,ib4,ib5,ib6 + + call distrindirect31_s (AS, BS) + call fillMap(MAP1,L,1) + call fillMap(MAP2,L,2) + call fillMap(MAP3,L,3) + allocate( ib1(L,L,L), ib2(L,L,L), ib3(L,L,L), & + & ib4(L,L,L), ib5(L,L,L), ib6(L,L,L) ) + +!DVM$ REDISTRIBUTE E(INDIRECT(MAP1),INDIRECT(MAP2),INDIRECT(MAP3)) +!DVM$ REALIGN (I,J,K) WITH E(I,J,K) :: A,B +!DVM$ REALIGN (I,J,K) WITH E(I,J,K) :: indir_x, indir_y,indir_z +!DVM$ REALIGN (I,J,K) WITH E(I,J,K) :: ib1,ib2,ib3,ib4,ib5,ib6 + do i = 1,L + do j = 1,L + do k = 1,L + + indir_x(i,j,k) = i + indir_y(i,j,k) = j + indir_z(i,j,k) = k + + if (i.gt.1) then + ib1(i,j,k) = i - 1 + else + ib1(i,j,k) = 0 + endif + if (i.lt.L) then + ib2(i,j,k) = i + 1 + else + ib2(i,j,k) = 0 + endif + if (j.gt.1) then + ib3(i,j,k) = j - 1 + else + ib3(i,j,k) = 0 + endif + if (j.lt.L) then + ib4(i,j,k) = j + 1 + else + ib4(i,j,k) = 0 + endif + if (k.gt.1) then + ib5(i,j,k) = k - 1 + else + ib5(i,j,k) = 0 + endif + if (k.lt.L) then + ib6(i,j,k) = k + 1 + else + ib6(i,j,k) = 0 + endif + enddo + enddo + enddo + +!DVM$ SHADOW_ADD (E((ib1(i,j,k)) with E(@i,@j,@k),*,*) = "nei1") include_to A +!DVM$ SHADOW_ADD (E((ib2(i,j,k)) with E(@i,@j,@k),*,*) = "nei2") include_to A +!DVM$ SHADOW_ADD (E(*,(ib3(i,j,k)) with E(@i,@j,@k),*) = "nei3") include_to A +!DVM$ SHADOW_ADD (E(*,(ib4(i,j,k)) with E(@i,@j,@k),*) = "nei4") include_to A +!DVM$ SHADOW_ADD (E(*,*,(ib5(i,j,k)) with E(@i,@j,@k)) = "nei5") include_to A +!DVM$ SHADOW_ADD (E(*,*,(ib6(i,j,k)) with E(@i,@j,@k)) = "nei6") include_to A + +!DVM$ LOCALIZE(ib1 => A(:,*,*)) +!DVM$ LOCALIZE(ib2 => A(:,*,*)) +!DVM$ LOCALIZE(ib3 => A(*,:,*)) +!DVM$ LOCALIZE(ib4 => A(*,:,*)) +!DVM$ LOCALIZE(ib5 => A(*,*,:)) +!DVM$ LOCALIZE(ib6 => A(*,*,:)) + +!DVM$ REGION + +!DVM$ PARALLEL (k,j,i) ON B(i,j,k) + do k = 1,L + do j = 1,L + do i = 1,L + + A(i,j,k) = 0 + + if (indir_x(i,j,k) == 1 .or. indir_x(i,j,k) == L .or. & + & indir_y(i,j,k) == 1 .or. indir_y(i,j,k) == L .or. & + & indir_z(i,j,k) == 1 .or. indir_z(i,j,k) == L) then + B(i,j,k) = 0 + else + B(i,j,k) = 1 + indir_x(i,j,k) + indir_y(i,j,k) + indir_z(i,j,k) + endif + + enddo + enddo + enddo + +!DVM$ PARALLEL (k,j,i) ON B(i,j,k), SHADOW_RENEW (A) + do k = 2,L-1 + do j = 2,L-1 + do i = 2,L-1 + if (indir_x(i,j,k) /= 1 .and. indir_x(i,j,k) /= L .and. & + & indir_y(i,j,k) /= 1 .and. indir_y(i,j,k) /= L .and. & + & indir_z(i,j,k) /= 1 .and. indir_z(i,j,k) /= L) then + + B(i,j,k) = (A(ib1(i,j,k),j,k) + A(ib2(i,j,k),j,k) + & + & A(i,ib3(i,j,k),k) + A(i,ib4(i,j,k),k) + A(i,j,ib5(i,j,k)) + & + & A(i,j,ib6(i,j,k))) / 6.0 + endif + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,i) ON B(i,j,k), REDUCTION(min(erri)) + do k = 2,L-1 + do j = 2,L-1 + do i = 2,L-1 + if (indir_x(i,j,k) /= 1 .and. indir_x(i,j,k) /= L .and. & + & indir_y(i,j,k) /= 1 .and. indir_y(i,j,k) /= L .and. & + & indir_z(i,j,k) /= 1 .and. indir_z(i,j,k) /= L) then + + if(B(i,j,k) .ne. BS(i,j,k)) erri = min(erri, ABS(B(i,j,k)-BS(i,j,k))) + endif + enddo + enddo + enddo + +!DVM$ END REGION +!DVM$ GET_ACTUAL(erri) + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (ib1,ib2,ib3,ib4,ib5,ib6) + end subroutine + +!--------------------------------------------------------------- + subroutine fillMap(MAP,L,dim) + integer numproc + integer i,L,dim + real x + integer MAP(L) + PROCESSORS_SIZE(i) = 1 + numproc = PROCESSORS_SIZE(dim) ! dvmh_get_num_procs(1) + do i=1,L + call RANDOM_NUMBER(x) + MAP(i) = MOD(INT(x*10), numproc) !rand() + enddo + end subroutine +!--------------------------------------------------------------- + subroutine distrindirect31_s (A,B) + parameter (L=10) + integer:: A(L,L,L), B(L,L,L) + integer,dimension(:,:,:),allocatable:: ib1, ib2, ib3, ib4, ib5, ib6 + integer,dimension(L,L,L):: indir_x, indir_y, indir_z + allocate( ib1(L,L,L), ib2(L,L,L), ib3(L,L,L), & + & ib4(L,L,L), ib5(L,L,L), ib6(L,L,L) ) + + do i = 1,L + do j = 1,L + do k = 1,L + + indir_x(i,j,k) = i + indir_y(i,j,k) = j + indir_z(i,j,k) = k + + if (i.gt.1) then + ib1(i,j,k) = i - 1 + else + ib1(i,j,k) = 0 + endif + if (i.lt.L) then + ib2(i,j,k) = i + 1 + else + ib2(i,j,k) = 0 + endif + if (j.gt.1) then + ib3(i,j,k) = j - 1 + else + ib3(i,j,k) = 0 + endif + if (j.lt.L) then + ib4(i,j,k) = j + 1 + else + ib4(i,j,k) = 0 + endif + if (k.gt.1) then + ib5(i,j,k) = k - 1 + else + ib5(i,j,k) = 0 + endif + if (k.lt.L) then + ib6(i,j,k) = k + 1 + else + ib6(i,j,k) = 0 + endif + enddo + enddo + enddo + + do k = 1,L + do j = 1,L + do i = 1,L + + A(i,j,k) = 0 + + if (indir_x(i,j,k) == 1 .or. indir_x(i,j,k) == L .or. & + & indir_y(i,j,k) == 1 .or. indir_y(i,j,k) == L .or. & + & indir_z(i,j,k) == 1 .or. indir_z(i,j,k) == L) then + B(i,j,k) = 0 + else + B(i,j,k) = 1 + indir_x(i,j,k) + indir_y(i,j,k) + indir_z(i,j,k) + endif + + enddo + enddo + enddo + + do k = 2,L-1 + do j = 2,L-1 + do i = 2,L-1 + if (indir_x(i,j,k) /= 1 .and. indir_x(i,j,k) /= L .and. & + & indir_y(i,j,k) /= 1 .and. indir_y(i,j,k) /= L .and. & + & indir_z(i,j,k) /= 1 .and. indir_z(i,j,k) /= L) then + + B(i,j,k) = (A(ib1(i,j,k),j,k) + A(ib2(i,j,k),j,k) + & + & A(i,ib3(i,j,k),k) + A(i,ib4(i,j,k),k) + A(i,j,ib5(i,j,k)) + & + & A(i,j,ib6(i,j,k))) / 6.0 + endif + enddo + enddo + enddo + + deallocate (ib1,ib2,ib3,ib4,ib5,ib6) + end subroutine + + + +!--------------------------------------------------------------- + subroutine ansyes(name) + character*14 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal31.fdv new file mode 100644 index 0000000..9a6b38e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal31.fdv @@ -0,0 +1,1088 @@ + program INOUTLOCAL31 + +c TESTING OF INOULOCAL CLAUSE'. + + print *,'===START OF INOUTLOCAL31========================' +C -------------------------------------------------- + call inoutlocal3101 + call inoutlocal3102 + call inoutlocal3103 + call inoutlocal3104 + call inoutlocal3105 + call inoutlocal3106 + call inoutlocal3107 + call inoutlocal3108 + call inoutlocal3109 + call inoutlocal3110 + call inoutlocal3111 + call inoutlocal3112 + call inoutlocal3113 + call inoutlocal3114 + call inoutlocal3115 + call inoutlocal3116 + +C -------------------------------------------------- +C + print *,'=== END OF inoutlocal31 ========================= ' + end +C ---------------------------------------------IN3101 + subroutine INOUTLOCAL3101 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3101' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +! dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + end +c------------------------------------------------IN3102 + subroutine INOUTLOCAL3102 + integer, parameter :: N = 16,M=8,K=8,NL=1100 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3102' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region OUT(B(2:N-1,2:M-1,2:K-1)),IN(NL),LOCAL(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3103 + subroutine INOUTLOCAL3103 + integer, parameter :: N = 16,M=8,K=8,NL=1200 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3103' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +! dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region OUT(B(2:N-1,2:M-1,2:K-1)),IN(NL) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3104 + subroutine INOUTLOCAL3104 + integer, parameter :: N = 16,M=8,K=8,NL=1300 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3104' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$*LOCAL(B(1,1,1) +!dvm$*,B(N,M,K),B(1,M,K),B(N,1,K),B(N,M,1), +!dvm$*B(1,1,K),B(N,1,1),B(1,M,1)) +!dvm$*,OUT(B(2:N-1,2:M-1,3:K-1),B(2:N-1,2:M-1,2)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3105 + subroutine INOUTLOCAL3105 + integer, parameter :: N = 16,M=8,K=8,NL=1600 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3105' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3106 + subroutine INOUTLOCAL3106 + integer, parameter :: N = 16,M=8,K=8,NL=1700 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3106' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3107 + subroutine INOUTLOCAL3107 + integer, parameter :: N = 16,M=8,K=8,NL=1800 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3107' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN(A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3108 + subroutine INOUTLOCAL3108 + integer, parameter :: N = 16,M=8,K=8,NL=1900 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3108' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region INLOCAL(A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3109 + subroutine INOUTLOCAL3109 + integer, parameter :: N = 16,M=8,K=8,NL=2000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3109' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region INOUT (A(2:N-1,2:M-1,2:K-1),B(2:N-1,2:M-1,2:K-1)) +! dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3110 + subroutine INOUTLOCAL3110 + integer, parameter :: N = 16,M=8,K=8,NL=2100 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3110' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),IN(A) +!dvm$*,IN(A(2,2,2)),IN(A(2,M-1,K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)),OUT(B(2,M-1,3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3111 + subroutine INOUTLOCAL3111 + integer, parameter :: N = 16,M=8,K=8,NL=2200 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3111' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3112 + subroutine INOUTLOCAL3112 + integer, parameter :: N = 16,M=8,K=8,NL=2300 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3112' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +! dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3113 + subroutine INOUTLOCAL3113 + integer, parameter :: N = 16,M=8,K=8,NL=2400 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3113' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3), +!dvm$*B(2,2:M-2,2:K-1),B(2,2:M-2,2:K-1), +!dvm$*B(2:N-1,2:M-2,2:K-1),B(2:N-1,2:M-1,4:K-1), +!dvm$*B(2:N-1,2:M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3114 + subroutine INOUTLOCAL3114 + integer, parameter :: N = 16,M=8,K=8,NL=2500 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3114' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +Cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3), +!dvm$*B(2,2:M-2,2:K-1),B(2,2:M-2,2:K-1), +!dvm$*B(2:N-1,2:M-2,2:K-1),B(2:N-1,2:M-1,4:K-1), +!dvm$*B(2:N-1,2:M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3115 + subroutine INOUTLOCAL3115 + integer, parameter :: N = 16,M=8,K=8,NL=2600 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3115' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ get_actual(B) + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3116 + subroutine INOUTLOCAL3116 + integer, parameter :: N = 16,M=8,K=8,NL=2700 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3116' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +Cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:2,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,2 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1) +!dvm$*, B(2:2,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:2,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-1 + do j=2,2 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1) +!dvm$*,B(2:N-1,2:2,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=3,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + + + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal32.fdv new file mode 100644 index 0000000..7355522 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal32.fdv @@ -0,0 +1,1088 @@ + program INOUTLOCAL32 + +c TESTING OF INOULOCAL CLAUSE'. + + print *,'===START OF INOUTLOCAL32========================' +C -------------------------------------------------- + call inoutlocal3201 + call inoutlocal3202 + call inoutlocal3203 + call inoutlocal3204 + call inoutlocal3205 + call inoutlocal3206 + call inoutlocal3207 + call inoutlocal3208 + call inoutlocal3209 + call inoutlocal3210 + call inoutlocal3211 + call inoutlocal3212 + call inoutlocal3213 + call inoutlocal3214 + call inoutlocal3215 + call inoutlocal3216 + +C -------------------------------------------------- +C + print *,'=== END OF INOUTLOCAL32 ========================= ' + end +C ---------------------------------------------IN3201 + subroutine INOUTLOCAL3201 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3201' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +! dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + end +c------------------------------------------------IN3202 + subroutine INOUTLOCAL3202 + integer, parameter :: N = 16,M=8,K=8,NL=1100 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3202' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region OUT(B(2:N-1,2:M-1,2:K-1)),IN(NL),LOCAL(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3203 + subroutine INOUTLOCAL3203 + integer, parameter :: N = 16,M=8,K=8,NL=1200 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3203' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +! dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region OUT(B(2:N-1,2:M-1,2:K-1)),IN(NL) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3204 + subroutine INOUTLOCAL3204 + integer, parameter :: N = 16,M=8,K=8,NL=1300 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3204' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$*LOCAL(B(1,1,1) +!dvm$*,B(N,M,K),B(1,M,K),B(N,1,K),B(N,M,1), +!dvm$*B(1,1,K),B(N,1,1),B(1,M,1)) +!dvm$*,OUT(B(2:N-1,2:M-1,3:K-1),B(2:N-1,2:M-1,2)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3205 + subroutine INOUTLOCAL3205 + integer, parameter :: N = 16,M=8,K=8,NL=1600 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3205' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3206 + subroutine INOUTLOCAL3206 + integer, parameter :: N = 16,M=8,K=8,NL=1700 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3206' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3207 + subroutine INOUTLOCAL3207 + integer, parameter :: N = 16,M=8,K=8,NL=1800 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3207' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN(A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3208 + subroutine INOUTLOCAL3208 + integer, parameter :: N = 16,M=8,K=8,NL=1900 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3208' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region INLOCAL(A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3209 + subroutine INOUTLOCAL3209 + integer, parameter :: N = 16,M=8,K=8,NL=2000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3209' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region INOUT (A(2:N-1,2:M-1,2:K-1),B(2:N-1,2:M-1,2:K-1)) +! dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3210 + subroutine INOUTLOCAL3210 + integer, parameter :: N = 16,M=8,K=8,NL=2100 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3210' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),IN(A) +!dvm$*,IN(A(2,2,2)),IN(A(2,M-1,K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)),OUT(B(2,M-1,3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3211 + subroutine INOUTLOCAL3211 + integer, parameter :: N = 16,M=8,K=8,NL=2200 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3211' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3212 + subroutine INOUTLOCAL3212 + integer, parameter :: N = 16,M=8,K=8,NL=2300 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3212' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +! dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3213 + subroutine INOUTLOCAL3213 + integer, parameter :: N = 16,M=8,K=8,NL=2400 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3213' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3), +!dvm$*B(2,2:M-2,2:K-1),B(2,2:M-2,2:K-1), +!dvm$*B(2:N-1,2:M-2,2:K-1),B(2:N-1,2:M-1,4:K-1), +!dvm$*B(2:N-1,2:M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3214 + subroutine INOUTLOCAL3214 + integer, parameter :: N = 16,M=8,K=8,NL=2500 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3214' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +Cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3), +!dvm$*B(2,2:M-2,2:K-1),B(2,2:M-2,2:K-1), +!dvm$*B(2:N-1,2:M-2,2:K-1),B(2:N-1,2:M-1,4:K-1), +!dvm$*B(2:N-1,2:M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3215 + subroutine INOUTLOCAL3215 + integer, parameter :: N = 16,M=8,K=8,NL=2600 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3215' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ get_actual(B) + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3216 + subroutine INOUTLOCAL3216 + integer, parameter :: N = 16,M=8,K=8,NL=2700 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3216' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +Cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:2,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,2 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1) +!dvm$*, B(2:2,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:2,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-1 + do j=2,2 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1) +!dvm$*,B(2:N-1,2:2,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=3,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + + + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal33.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal33.fdv new file mode 100644 index 0000000..554708f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/INOUTLOCAL/inoutlocal33.fdv @@ -0,0 +1,1088 @@ + program INOUTLOCAL33 + +c TESTING OF INOULOCAL CLAUSE'. + + print *,'===START OF INOUTLOCAL33========================' +C -------------------------------------------------- + call inoutlocal3301 + call inoutlocal3302 + call inoutlocal3303 + call inoutlocal3304 + call inoutlocal3305 + call inoutlocal3306 + call inoutlocal3307 + call inoutlocal3308 + call inoutlocal3309 + call inoutlocal3310 + call inoutlocal3311 + call inoutlocal3312 + call inoutlocal3313 + call inoutlocal3314 + call inoutlocal3315 + call inoutlocal3316 + +C -------------------------------------------------- +C + print *,'=== END OF INOUTLOCAL33 ========================= ' + end +C ---------------------------------------------IN3301 + subroutine INOUTLOCAL3301 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3301' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +! dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + end +c------------------------------------------------IN3302 + subroutine INOUTLOCAL3302 + integer, parameter :: N = 16,M=8,K=8,NL=1100 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3302' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region OUT(B(2:N-1,2:M-1,2:K-1)),IN(NL),LOCAL(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3303 + subroutine INOUTLOCAL3303 + integer, parameter :: N = 16,M=8,K=8,NL=1200 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3303' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +! dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region OUT(B(2:N-1,2:M-1,2:K-1)),IN(NL) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3304 + subroutine INOUTLOCAL3304 + integer, parameter :: N = 16,M=8,K=8,NL=1300 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3304' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$*LOCAL(B(1,1,1) +!dvm$*,B(N,M,K),B(1,M,K),B(N,1,K),B(N,M,1), +!dvm$*B(1,1,K),B(N,1,1),B(1,M,1)) +!dvm$*,OUT(B(2:N-1,2:M-1,3:K-1),B(2:N-1,2:M-1,2)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3305 + subroutine INOUTLOCAL3305 + integer, parameter :: N = 16,M=8,K=8,NL=1600 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3305' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3306 + subroutine INOUTLOCAL3306 + integer, parameter :: N = 16,M=8,K=8,NL=1700 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3306' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3307 + subroutine INOUTLOCAL3307 + integer, parameter :: N = 16,M=8,K=8,NL=1800 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3307' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN(A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3308 + subroutine INOUTLOCAL3308 + integer, parameter :: N = 16,M=8,K=8,NL=1900 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3308' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region INLOCAL(A(2:N-1,2:M-1,2:K-1)),OUT (B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3309 + subroutine INOUTLOCAL3309 + integer, parameter :: N = 16,M=8,K=8,NL=2000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3309' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region INOUT (A(2:N-1,2:M-1,2:K-1),B(2:N-1,2:M-1,2:K-1)) +! dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3310 + subroutine INOUTLOCAL3310 + integer, parameter :: N = 16,M=8,K=8,NL=2100 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3310' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)),IN(A) +!dvm$*,IN(A(2,2,2)),IN(A(2,M-1,K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)),OUT(B(2,M-1,3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3311 + subroutine INOUTLOCAL3311 + integer, parameter :: N = 16,M=8,K=8,NL=2200 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3311' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3312 + subroutine INOUTLOCAL3312 + integer, parameter :: N = 16,M=8,K=8,NL=2300 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3312' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +! dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------IN3313 + subroutine INOUTLOCAL3313 + integer, parameter :: N = 16,M=8,K=8,NL=2400 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3313' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3), +!dvm$*B(2,2:M-2,2:K-1),B(2,2:M-2,2:K-1), +!dvm$*B(2:N-1,2:M-2,2:K-1),B(2:N-1,2:M-1,4:K-1), +!dvm$*B(2:N-1,2:M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ get_actual(B) +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3314 + subroutine INOUTLOCAL3314 + integer, parameter :: N = 16,M=8,K=8,NL=2500 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3314' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +Cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(3:N-1,2:M-2,4:K-1)),OUT(B(2,M-1,2:3), +!dvm$*B(2,2:M-2,2:K-1),B(2,2:M-2,2:K-1), +!dvm$*B(2:N-1,2:M-2,2:K-1),B(2:N-1,2:M-1,4:K-1), +!dvm$*B(2:N-1,2:M-1,2:3)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------IN3315 + subroutine INOUTLOCAL3315 + integer, parameter :: N = 16,M=8,K=8,NL=2600 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3315' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ get_actual(B) + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------IN3316 + subroutine INOUTLOCAL3316 + integer, parameter :: N = 16,M=8,K=8,NL=2700 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*6 tname + +!dvm$ distribute B(*,*,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='IN3316' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ actual(nloopi,nloopj,nloopii) +Cdvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:2,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,2 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1) +!dvm$*, B(2:2,2:M-1,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:2,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-1 + do j=2,2 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +!dvm$ region IN (A(2:N-1,2:M-1,2:K-1) +!dvm$*,B(2:N-1,2:2,2:K-1)) +!dvm$*,OUT(B(2:N-1,2:M-1,2:K-1)) +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=3,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo +cdvm$ end region +cdvm$ region +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + if (B(i,j,ii).ne.c(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +cdvm$ end region + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + + + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel1.fdv new file mode 100644 index 0000000..f4570c9 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel1.fdv @@ -0,0 +1,305 @@ + program PARALLEL1 + +c TESTING parallel CLAUSE . + + print *,'===START OF parallel1========================' +C -------------------------------------------------- +c 11 arrA1[BLOCK] PARALLEL ON arrA[i+4] normal + call parallel11 +C -------------------------------------------------- +c 12 arrA1[BLOCK] PARALLEL ON arrA[-i+8] reverse +c call parallel12 +C -------------------------------------------------- +c 13 arrA1[BLOCK] PARALLEL ON arrA[2*i+8] stretch + call parallel13 +C -------------------------------------------------- +c 131 arrA1[BLOCK] PARALLEL ON arrA[2*i+1] small array + call parallel13 +C -------------------------------------------------- +c 14 arrA1[BLOCK] PARALLEL ON arrA[] + call parallel14 +C -------------------------------------------------- +c 15 arrA1[BLOCK] PARALLEL ON arrA[2] + call parallel15 +C -------------------------------------------------- + print *,'=== END OF parallel1 ========================= ' + end + +C ----------------------------------------------------parallel11 +c 11 arrA1[BLOCK] PARALLEL ON arrA[i+4] normal + subroutine parallel11 + integer, parameter :: AN1=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA1[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=4 + character*9 tname + integer, allocatable :: A1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='paral11' + allocate (A1(AN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(k1i * i + li), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1,((AN1-li)/k1i) + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + + end +C ----------------------------------------------------parallel12 +c 12 arrA1[BLOCK] PARALLEL ON arrA[-i+8] reverse + subroutine parallel12 + integer, parameter :: AN1=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA1[k1i * i + li] + integer, parameter :: k1i=-1,k2i=0,li=9 + character*9 tname + integer, allocatable :: A1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='paral12' + allocate (A1(AN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(k1i * i + li), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1,AN1 + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + + end +C ----------------------------------------------------parallel13 +c 13 arrA1[BLOCK] PARALLEL ON arrA[2*i+8] stretch + subroutine parallel13 + integer, parameter :: AN1=20,NL=1000,ER=10000 +c parameters for PARALLEL arrA1[k1i * i + li] + integer, parameter :: k1i=2,k2i=0,li=8 + character*9 tname + integer, allocatable :: A1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='paral13' + allocate (A1(AN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(k1i * i + li), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1,((AN1-li)/k1i) + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + + end +C ----------------------------------------------------parallel131 +c 131 arrA1[BLOCK] PARALLEL ON arrA[2*i+1] small array + subroutine parallel131 + integer, parameter :: AN1=5,NL=1000,ER=10000 +c parameters for PARALLEL arrA1[k1i * i + li] + integer, parameter :: k1i=2,k2i=0,li=1 + character*9 tname + integer, allocatable :: A1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='paral131' + allocate (A1(AN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(k1i * i + li), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1,((AN1-li)/k1i) + ia=k1i * i + li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + + end +C ----------------------------------------------------parallel14 +c 14 arrA1[BLOCK] PARALLEL ON arrA[] + subroutine parallel14 + integer, parameter :: AN1=20,BN1=10,NL=1000,ER=10000 +c parameters for PARALLEL arrA1[*] + integer, parameter :: k1i=0,k2i=0,li=0 + character*9 tname + integer, allocatable :: A1(:),B1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) +!dvm$ distribute B1(*) + + tname='paral14' + allocate (A1(AN1),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1,B1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +!dvm$ parallel (i) on A1(*), reduction( min( erri ) ) + do i=1,BN1 + if (B1(i) .eq.(i)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1,B1) + + end +C ----------------------------------------------------parallel15 +c 15 arrA1[BLOCK] PARALLEL ON arrA[2] + subroutine parallel15 + integer, parameter :: AN1=20,NL=1000,ER=10000 +c parameters for PARALLEL arrA1[li] + integer, parameter :: k1i=0,k2i=0,li=2 + character*9 tname + integer, allocatable :: A1(:) + integer erri,i + +!dvm$ distribute A1(BLOCK) + + tname='paral15' + allocate (A1(AN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A1) +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) =i + enddo + +!dvm$ parallel (i) on A1(li), reduction( min( erri ) ) +!dvm$*, private(ia) + do i=1,AN1 + ia=li + if (A1(ia) .eq.(ia)) then + else + erri = min(erri,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A1) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel2.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel2.fdv new file mode 100644 index 0000000..7371ea0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel2.fdv @@ -0,0 +1,227 @@ + program PARALLEL2 + +c TESTING parallel CLAUSE . + + print *, '====START OF parallel2=============' +C -------------------------------------------------- +c 21 PARALLEL ON arrA[i][2*j] stretching along j + call parallel21 +C -------------------------------------------------- +c 22 PARALLEL ON arrA[i+4][j] shift along i + call parallel22 +C -------------------------------------------------- +c 23 PARALLEL ON arrA[-i+8][j] reverse on i +c call parallel23 +C -------------------------------------------------- +c 24 PARALLEL ON arrA[i+4][j+4] shift along i and j + call parallel24 +C -------------------------------------------------- + print *, '==== END OF parallel2 =============' + end + +C ----------------------------------------------------parallel21 +c 21 PARALLEL ON arrA[i][2*j] stretching along j + subroutine parallel21 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=0,k1j=0,k2j=2,lj=0 + character*9 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,BLOCK) + + tname='paral21' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction (min (erri)) +!dvm$*, private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel22 +c 22 PARALLEL ON arrA[i+4][j] shift along i + subroutine parallel22 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=0 + character*9 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,BLOCK) + + tname='paral22' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri )) +!dvm$*, private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel23 +c 23 PARALLEL ON arrA[-i+8][j] reverse on i + subroutine parallel23 + integer, parameter :: AN1=7,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=-1,k2i=0,li=8,k1j=0,k2j=1,lj=0 + character*9 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,BLOCK) + + tname='paral23' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri ) ) +!dvm$*, private(ia,ja) + do i=1,AN1 + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel24 +c 24 PARALLEL ON arrA[i+4][j+4] shift along i and j + subroutine parallel24 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=4 + character*9 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,BLOCK) + + tname='paral24' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri ) ) +!dvm$*, private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel3.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel3.fdv new file mode 100644 index 0000000..a98de5e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel3.fdv @@ -0,0 +1,456 @@ + program PARALLEL3 + +c TESTING parallel CLAUSE . + + print *,'===START OF parallel3========================' +C ------------------------------------------------- +c 31 PARALLEL ON arrA[i][2* j][k] stretching + call paral31 +C ------------------------------------------------- +c 32 PARALLEL ON arrA[i+2][ j][k] shift + call paral32 +C ------------------------------------------------- +c 33 PARALLEL ON arrA[i][ j][-k+8] reverse +c call paral33 +C ------------------------------------------------- +c 34 PARALLEL ON arrA[i][ j][2] +c compression !! + call paral34 +C ------------------------------------------------- +c 35 PARALLEL ON arrA[][ j][ k] +c replication + call paral35 +C ------------------------------------------------- +c 36 PARALLEL ON arrA[1][i][3] +c compression and replication + call paral36 +C ------------------------------------------------- + print *,'=== END OF parallel3 ========================' +C + end + +C ----------------------------------------------------paral31 +c 31 arrA4[BLOCK][BLOCK] [BLOCK] +c PARALLEL ON arrA[i][2* j][k] stretching + + subroutine paral31 + integer, parameter :: AN1=6,AN2=6,AN3=4 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) + + tname='paral31' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$*reduction (min (erri)) +!dvm$*, private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs = 0 + + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral32 +c 32 PARALLEL ON arrA[i+2][ j][k] shift + + subroutine paral32 + integer, parameter :: AN1=5,AN2=5,AN3=5 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) + + tname='paral32' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) +!dvm$*, private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs = 0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral33 +c 33 PARALLEL ON arrA[i][ j][-k+8] reverse + + subroutine paral33 + integer, parameter :: AN1=5,AN2=5,AN3=5 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,ln=6 + character*9 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) + + tname='paral33' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) +!dvm$*, private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3)) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs = 0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral34 +c 34 PARALLEL ON arrA[i][ j][2] + + subroutine paral34 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=3,BN2=3,BN3=3 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=2 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,*) WITH A3(k1i*i+li,k2j*j+lj,ln) + + tname='paral34' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j) on A3(k1i*i+li,k2j*j+lj,ln), +!dvm$* reduction (min (erri)), private(n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs = 0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------paral35 +c 35 PARALLEL ON arrA[][ j][ k] + + subroutine paral35 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=6,BN2=6,BN3=6 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[*][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(*,j,n) WITH A3(*,k2j*j+lj,k3n*n+ln) + + tname='paral35' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ region out(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A3,B3) + + do i=1,BN1 +!dvm$ parallel (j,n) on A3(*,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo + + s=0 + cs = 0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------paral36 +c 36 PARALLEL ON arrA[1][i][3] + + subroutine paral36 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=3,BN2=3,BN3=3 + integer, parameter :: PN=2,NL=10000,ER=100000 + +c parameters for PARALLEL ON arrA[li][k2j*j+lj][ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=1 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=3 + character*9 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(li,k2j*j+lj,ln) + + tname='paral36' + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(li,k2j*j+lj,ln), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs = 0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel4.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel4.fdv new file mode 100644 index 0000000..8c8db72 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/parallel4.fdv @@ -0,0 +1,500 @@ + program PARALLEL4 + +c TESTING parallel CLAUSE . + + print *,'===START OF parallel4======================' +C ------------------------------------------------- +c 41 PARALLEL ON arrA[i][2* j][k][3*l] stretching + call paral41 +C ------------------------------------------------- +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + call paral42 +C ------------------------------------------------- +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse +c call paral43 +C ------------------------------------------------- +c 44 PARALLEL ON arrA[i][ j][2][ l] +c compression !! + call paral44 +C ------------------------------------------------- +c 45 PARALLEL ON arrA[i][ j][ ][ k] +c replication + call paral45 +C ------------------------------------------------- +c 46 PARALLEL ON arrA[i][ j][ ][3] +c compression and replication + call paral46 +C ------------------------------------------------- +C + print *,'=== END OF parallel4 ====================== ' + end + +C ----------------------------------------------------paral41 +c 41 arrA4[BLOCK][BLOCK] [BLOCK] [BLOCK] +c PARALLEL ON arrA[i][2* j][k][3*l] stretching + + subroutine paral41 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=3,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='paral41' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* ,private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral42 +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + + subroutine paral42 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=3 + character*9 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='paral42' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* ,private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral43 +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse + + subroutine paral43 + integer, parameter :: AN1=6,AN2=6,AN3=7,AN4=7 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,k4n=0,ln=8 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=-1,lm=8 + character*9 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='paral42' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* ,private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral44 +c 44 PARALLEL ON arrA[i][ j][2][ l] + + subroutine paral44 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=2 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm) + + tname='paral44' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral45 +c 45 PARALLEL ON arrA[i][ j][ ][ k] + + subroutine paral45 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm) + + tname='paral45' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral46 +c 46 PARALLEL ON arrA[i][ j][ ][3] + + subroutine paral46 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][*][lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=0,lm=3 + character*9 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,lm) + + tname='paral46' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus12.fdv new file mode 100644 index 0000000..882a882 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus12.fdv @@ -0,0 +1,439 @@ + program PARALLELPLUS2 + +c TESTING parallel CLAUSE . +c arrA2[*][ BLOCK] +c or arrA2[ BLOCK][*] + + print *,'===START OF paralplus12======================' +C -------------------------------------------------- +c 21 PARALLEL ON arrA[i][2*j] stretching along j + call parallel21 +C -------------------------------------------------- +c 22 PARALLEL ON arrA[i+4][j] shift along i + call parallel22 +C -------------------------------------------------- +c 23 PARALLEL ON arrA[-i+8][j] reverse on i +c call parallel23 +C -------------------------------------------------- +c 24 PARALLEL ON arrA[i+4][j+4] shift along i and j + call parallel24 +C -------------------------------------------------- +c 25 PARALLEL ON arrA[i][2*j] stretching along j + call parallel21 +C -------------------------------------------------- +c 26 PARALLEL ON arrA[i+4][j] shift along i + call parallel22 +C -------------------------------------------------- +c 27 PARALLEL ON arrA[-i+8][j] reverse on i +c call parallel23 +C -------------------------------------------------- +c 28 PARALLEL ON arrA[i+4][j+4] shift along i and j + call parallel24 +C -------------------------------------------------- + print *,'=== END OF paralplus12======================== ' + end + +C ----------------------------------------------------parallel21 +c 21 PARALLEL ON arrA[i][2*j] stretching along j + subroutine parallel21 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=0,k1j=0,k2j=2,lj=0 + + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(*,BLOCK) + + tname='paral+1221' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction (min (erri)) +!dvm$* ,private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel22 +c 22 PARALLEL ON arrA[i+4][j] shift along i + subroutine parallel22 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=0 + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(*,BLOCK) + + tname='paral+1222' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri )) +!dvm$* ,private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel23 +c 23 PARALLEL ON arrA[-i+8][j] reverse on i + subroutine parallel23 + integer, parameter :: AN1=7,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=-1,k2i=0,li=8,k1j=0,k2j=1,lj=0 + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(*,BLOCK) + + tname='paral+1223' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri ) ) +!dvm$* ,private(ia,ja) + do i=1,AN1 + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel24 +c 24 PARALLEL ON arrA[i+4][j+4] shift along i and j + subroutine parallel24 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=4 + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(*,BLOCK) + + tname='paral+1224' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri ) ) +!dvm$* ,private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel25 +c 25 PARALLEL ON arrA[i][2*j] stretching along j + subroutine parallel25 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=0,k1j=0,k2j=2,lj=0 + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,*) + + tname='paral+1225' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction (min (erri)) +!dvm$* ,private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel26 +c 26 PARALLEL ON arrA[i+4][j] shift along i + subroutine parallel26 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=0 + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,*) + + tname='paral+1226' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri )) +!dvm$* ,private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel27 +c 27 PARALLEL ON arrA[-i+8][j] reverse on i + subroutine parallel27 + integer, parameter :: AN1=7,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=-1,k2i=0,li=8,k1j=0,k2j=1,lj=0 + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,*) + + tname='paral+1227' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri ) ) +!dvm$* ,private(ia,ja) + do i=1,AN1 + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + + end +C ----------------------------------------------------parallel28 +c 28 PARALLEL ON arrA[i+4][j+4] shift along i and j + subroutine parallel28 + integer, parameter :: AN1=8,AN2=8,NL=1000,ER=10000 +c parameters for PARALLEL arrA2[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=4 + character*11 tname + integer, allocatable :: A2(:,:) + integer erri,i,j,n,m,ia,ja,na,ma + +!dvm$ distribute A2(BLOCK,*) + + tname='paral+1228' + allocate (A2(AN1,AN2)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A2) +!dvm$ parallel (i,j) on A2(i,j) + do i=1,AN1 + do j=1,AN2 + A2(i,j) =i*NL+j + enddo + enddo + +!dvm$ parallel (i,j) on A2(k1i*i+li,k2j*j+lj), reduction( min( erri ) ) +!dvm$* ,private(ia,ja) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + ia=k1i * i + li + ja=k2j * j + lj + if (A2(ia,ja) .eq.(ia*NL+ja)) then + else + erri = min(erri,ia*NL+ja) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A2) + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*11 name + print *,name,' - complete' + end + subroutine ansno(name) + character*11 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus14.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus14.fdv new file mode 100644 index 0000000..3b9dc2b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus14.fdv @@ -0,0 +1,503 @@ + program PARALLEL14 + +c TESTING parallel CLAUSE . +c arrA4[BLOCK][*][*][*] or arrA4[*][*][*][BLOCK] etc. + + print *,'===START OF paralplus14====================' +C ------------------------------------------------- +c 41 PARALLEL ON arrA[i][2* j][k][3*l] stretching + call paral41 +C ------------------------------------------------- +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + call paral42 +C ------------------------------------------------- +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse +c call paral43 +C ------------------------------------------------- +c 44 PARALLEL ON arrA[i][ j][2][ l] +c compression !! + call paral44 +C ------------------------------------------------- +c 45 PARALLEL ON arrA[i][ j][ ][ k] +c replication + call paral45 +C ------------------------------------------------- +c 46 PARALLEL ON arrA[i][ j][ ][3] +c compression and replication + call paral46 +C ------------------------------------------------- +C + print *,'=== END OF paralplus14======================' + end + +C ----------------------------------------------------paral41 +c 41 arrA4[*][*] [BLOCK] [*] +c PARALLEL ON arrA[i][2* j][k][3*l] stretching + + subroutine paral41 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=3,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,BLOCK,*,*) + + tname='paral+1441' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* ,private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral42 +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + + subroutine paral42 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=3 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,BLOCK,*,*) + + tname='paral+1442' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* ,private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral43 +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse + + subroutine paral43 + integer, parameter :: AN1=6,AN2=6,AN3=7,AN4=7 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,k4n=0,ln=8 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=-1,lm=8 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,BLOCK,*,*) + + tname='paral+1442' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER +c call strparal42 + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* ,private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral44 +c 44 PARALLEL ON arrA[i][ j][2][ l] + + subroutine paral44 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=2 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,*,*,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm) + + tname='paral+1444' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral45 +c 45 PARALLEL ON arrA[i][ j][ ][ k] + + subroutine paral45 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,*,BLOCK,*) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm) + + tname='paral+1445' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral46 +c 46 PARALLEL ON arrA[i][ j][ ][3] + + subroutine paral46 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: PN=2,NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][*][lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=0,lm=3 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,*,BLOCK,*) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,lm) + + tname='paral+1446' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*11 name + print *,name,' - complete' + end + subroutine ansno(name) + character*11 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus23.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus23.fdv new file mode 100644 index 0000000..90aa08d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus23.fdv @@ -0,0 +1,892 @@ + program PARALLELPLUS23 +c TESTING parallel CLAUSE . +c arrA3[*][ BLOCK][BLOCK] +c or arrA3[ BLOCK][*][BLOCK] + + print *, '===START OF paralplus23=================' +C ------------------------------------------------- +c 31 PARALLEL ON arrA[i][2* j][k] stretching + call paral31 +C ------------------------------------------------- +c 32 PARALLEL ON arrA[i+2][ j][k] shift + call paral32 +C ------------------------------------------------- +c 33 PARALLEL ON arrA[i][ j][-k+8] reverse +c call paral33 +C ------------------------------------------------- +c 34 PARALLEL ON arrA[i][ j][2] +c compression !! + call paral34 +C ------------------------------------------------- +c 35 PARALLEL ON arrA[][ j][ k] +c replication + call paral35 +C ------------------------------------------------- +c 36 PARALLEL ON arrA[1][i][3] +c compression and replication + call paral36 +C ------------------------------------------------- +c 37 PARALLEL ON arrA[i][2* j][k] stretching + call paral37 +C ------------------------------------------------- +c 38 PARALLEL ON arrA[i+2][ j][k] shift + call paral38 +C ------------------------------------------------- +c 39 PARALLEL ON arrA[i][ j][-k+8] reverse +c call paral39 +C ------------------------------------------------- +c 310 PARALLEL ON arrA[i][ j][2] +c compression !! + call paral310 +C ------------------------------------------------- +c 311 PARALLEL ON arrA[][ j][ k] +c replication + call paral311 +C ------------------------------------------------- +c 312 PARALLEL ON arrA[1][i][3] +c compression and replication + call paral312 +C ------------------------------------------------- + print *, '=== END OF paralplus23=================' +C + end + +C ----------------------------------------------------paral31 +c 31 arrA4[*][BLOCK] [BLOCK] +c PARALLEL ON arrA[i][2* j][k] stretching + + subroutine paral31 + integer, parameter :: AN1=6,AN2=6,AN3=4 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*11 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue +!dvm$ distribute A3(*,BLOCK,BLOCK) + + tname='paral+2331' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral32 +c 32 PARALLEL ON arrA[i+2][ j][k] shift + + subroutine paral32 + integer, parameter :: AN1=5,AN2=5,AN3=5 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*11 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(*,BLOCK,BLOCK) + + tname='paral+2332' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral33 +c 33 PARALLEL ON arrA[i][ j][-k+8] reverse + + subroutine paral33 + integer, parameter :: AN1=5,AN2=5,AN3=5 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,ln=6 + character*11 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(*,BLOCK,BLOCK) + + tname='paral+2333' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral34 +c 34 PARALLEL ON arrA[i][ j][2] + + subroutine paral34 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=3,BN2=3,BN3=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=2 + character*11 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(*,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,ln) + + tname='paral+2334' + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,ln), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------paral35 +c 35 PARALLEL ON arrA[][ j][ k] + + subroutine paral35 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=6,BN2=6,BN3=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[*][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*11 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(*,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(*,k2j*j+lj,k3n*n+ln) + + tname='paral+2335' + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(*,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------paral36 +c 36 PARALLEL ON arrA[1][i][3] + + subroutine paral36 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=3,BN2=3,BN3=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[li][k2j*j+lj][ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=1 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=3 + character*11 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(*,BLOCK,BLOCK) +!dvm$ ALIGN B3(*,j,*) WITH A3(li,k2j*j+lj,ln) + + tname='paral+2336' + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region out(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A3,B3) + + do i=1,BN1 + do n=1,BN3 +!dvm$ parallel (j) on A3(li,k2j*j+lj,ln), +!dvm$* reduction (min (erri)) + do j=1,BN2 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,B3 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------paral37 +c 37 arrA4[BLOCK][BLOCK] [BLOCK] +c PARALLEL ON arrA[i][2* j][k] stretching + + subroutine paral37 + integer, parameter :: AN1=6,AN2=6,AN3=4 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*11 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,*,BLOCK) + + tname='paral+2337' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* private (ia,ja,na), reduction (min (erri)) + + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral38 +c 38 PARALLEL ON arrA[i+2][ j][k] shift + + subroutine paral38 + integer, parameter :: AN1=5,AN2=5,AN3=5 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*11 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,*,BLOCK) + + tname='paral+2338' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral39 +c 39 PARALLEL ON arrA[i][ j][-k+8] reverse + + subroutine paral39 + integer, parameter :: AN1=5,AN2=5,AN3=5 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,ln=6 + character*11 tname + integer, allocatable :: A3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,*,BLOCK) + + tname='paral+2339' + allocate (A3(AN1,AN2,AN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + if (A3(ia,ja,na).eq.(ia*NL/10+ja*NL/100+na*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A3 + endif + deallocate (A3) + + end + +C ----------------------------------------------------paral310 +c 310 PARALLEL ON arrA[i][ j][2] + + subroutine paral310 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=3,BN2=3,BN3=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln] + integer, parameter :: k1i=1,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=2 + character*11 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,*,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,ln) + + tname='paral+23310' + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(k1i*i+li,k2j*j+lj,ln), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------paral311 +c 311 PARALLEL ON arrA[][ j][ k] + + subroutine paral311 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=6,BN2=6,BN3=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[*][k2j*j+lj][k3n*n+ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,ln=0 + character*11 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,*,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(*,k2j*j+lj,k3n*n+ln) + + tname='paral+23311' + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(*,k2j*j+lj,k3n*n+ln), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ----------------------------------------------------paral312 +c 312 PARALLEL ON arrA[1][i][3] + + subroutine paral312 + integer, parameter :: AN1=6,AN2=6,AN3=6,BN1=3,BN2=3,BN3=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[li][k2j*j+lj][ln] + integer, parameter :: k1i=0,k2i=0,k3i=0,li=1 + integer, parameter :: k1j=0,k2j=1,k3j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,ln=3 + character*11 tname + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A3(BLOCK,*,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(li,k2j*j+lj,ln) + + tname='paral+23312' + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) =i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(li,k2j*j+lj,ln), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + if (B3(i,j,n).eq.(i*NL/10+j*NL/100+n*NL/1000)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B3,A3) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*11 name + print *,name,' - complete' + end + subroutine ansno(name) + character*11 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus24.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus24.fdv new file mode 100644 index 0000000..37e51ca --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus24.fdv @@ -0,0 +1,502 @@ + program PARALLELPLUS24 + +c TESTING parallel CLAUSE . +c arrA4[BLOCK][*][*][BLOCK] or arrA4[*][BLOCK][*][BLOCK] etc. + + print *, '====START OF paralplus24=====================' +C ------------------------------------------------- +c 41 PARALLEL ON arrA[i][2* j][k][3*l] stretching + call paral41 +C ------------------------------------------------- +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + call paral42 +C ------------------------------------------------- +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse +c call paral43 +C ------------------------------------------------- +c 44 PARALLEL ON arrA[i][ j][2][ l] +c compression !! + call paral44 +C ------------------------------------------------- +c 45 PARALLEL ON arrA[i][ j][ ][ k] +c replication + call paral45 +C ------------------------------------------------- +c 46 PARALLEL ON arrA[i][ j][ ][3] +c compression and replication + call paral46 +C ------------------------------------------------- + print *, '==== END OF paralplus24=====================' +C + end + +C ----------------------------------------------------paral41 +c 41 arrA4[*][*] [BLOCK] [BLOCK] +c PARALLEL ON arrA[i][2* j][k][3*l] stretching + + subroutine paral41 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=3,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,*,BLOCK,BLOCK) + + tname='paral+2441' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral42 +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + + subroutine paral42 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=3 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,BLOCK,*,BLOCK) + + tname='paral+2442' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral43 +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse + + subroutine paral43 + integer, parameter :: AN1=6,AN2=6,AN3=7,AN4=7 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,k4n=0,ln=8 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=-1,lm=8 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,*,*) + + tname='paral+2442' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral44 +c 44 PARALLEL ON arrA[i][ j][2][ l] + + subroutine paral44 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=2 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,*,*,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm) + + tname='paral+2444' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral45 +c 45 PARALLEL ON arrA[i][ j][ ][ k] + + subroutine paral45 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,BLOCK,BLOCK,*) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm) + + tname='paral+2445' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral46 +c 46 PARALLEL ON arrA[i][ j][ ][3] + + subroutine paral46 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][*][lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=0,lm=3 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,*,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,lm) + + tname='paral+2446' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*11 name + print *,name,' - complete' + end + subroutine ansno(name) + character*11 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus34.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus34.fdv new file mode 100644 index 0000000..333410d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL/paralplus34.fdv @@ -0,0 +1,501 @@ + program PARALLELPLUS34 + +c TESTING parallel CLAUSE . +c arrA4[BLOCK][*][ BLOCK][BLOCK] or arrA4[*][BLOCK][ BLOCK][BLOCK] etc. + + print *, '====START OF paralplus34=====================' +C ------------------------------------------------- +c 41 PARALLEL ON arrA[i][2* j][k][3*l] stretching + call paral41 +C ------------------------------------------------- +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + call paral42 +C ------------------------------------------------- +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse +c call paral43 +C ------------------------------------------------- +c 44 PARALLEL ON arrA[i][ j][2][ l] +c compression !! + call paral44 +C ------------------------------------------------- +c 45 PARALLEL ON arrA[i][ j][ ][ k] +c replication + call paral45 +C ------------------------------------------------- +c 46 PARALLEL ON arrA[i][ j][ ][3] +c compression and replication + call paral46 +C ------------------------------------------------- + print *, '==== END OF paralplus34=====================' +C + end + +C ----------------------------------------------------paral41 +c 41 arrA4[BLOCK][*] [BLOCK] [BLOCK] +c PARALLEL ON arrA[i][2* j][k][3*l] stretching + + subroutine paral41 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=2,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=3,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,*,BLOCK,BLOCK) + + tname='paral+3441' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral42 +c 42 PARALLEL ON arrA[i+2][ j][k][ l+3] shift + + subroutine paral42 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=3 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,BLOCK,BLOCK,BLOCK) + + tname='paral+3442' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral43 +c 43 PARALLEL ON arrA[i][ j][-k+8][- l+8] reverse + + subroutine paral43 + integer, parameter :: AN1=6,AN2=6,AN3=7,AN4=7 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=-1,k4n=0,ln=8 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=-1,lm=8 + character*11 tname + integer, allocatable :: A4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,*,BLOCK) + + tname='paral+3442' + allocate (A4(AN1,AN2,AN3,AN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4) +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm), +!dvm$* reduction (min (erri)) +!dvm$* , private(ia,ja,na,ma) + do i=1,((AN1-li)/k1i) + do j=1,((AN2-lj)/k2j) + do n=1,((AN3-ln)/k3n) + do m=1,((AN4-lm)/k4m) + ia=k1i * i + li + ja=k2j * j + lj + na=k3n * n + ln + ma=k4m * m + lm + if (A4(ia,ja,na,ma).eq. + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) + write (*,*) erri +c print *,A4 + endif + deallocate (A4) + + end + +C ----------------------------------------------------paral44 +c 44 PARALLEL ON arrA[i][ j][2][ l] + + subroutine paral44 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][ln][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=2 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,*,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm) + + tname='paral+3444' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,ln,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral45 +c 45 PARALLEL ON arrA[i][ j][ ][ k] + + subroutine paral45 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][][k4m*m+lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=0 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,*) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm) + + tname='paral+3445' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,k4m*m+lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ----------------------------------------------------paral46 +c 46 PARALLEL ON arrA[i][ j][ ][3] + + subroutine paral46 + integer, parameter :: AN1=6,AN2=6,AN3=6,AN4=6 + integer, parameter :: BN1=3,BN2=3,BN3=3,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for PARALLEL ON arrA[k1i*i+li][k2j*j+lj][*][lm] + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=0 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=0,lm=3 + character*11 tname + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,Avalue,Bvalue + +!dvm$ distribute A4(*,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,*,lm) + + tname='paral+3446' + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region local(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) =i*NL/10+j*NL/100+n*NL/1000+m + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(k1i*i+li,k2j*j+lj,*,lm), +!dvm$* reduction (min (erri)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + if (B4(i,j,n,m).eq.(i*NL/10+j*NL/100+n*NL/1000+m)) + * then + else + erri = min(erri,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + s=0 + cs=0 + if ((erri .eq.ER) .and. + * (s .eq. cs)) then + call ansyes(tname) + else + call ansno(tname) +c write (*,*) erri +c print *,A4 + endif + deallocate (B4,A4) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character*11 name + print *,name,' - complete' + end + subroutine ansno(name) + character*11 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn1.fdv new file mode 100644 index 0000000..03cf886 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn1.fdv @@ -0,0 +1,261 @@ + program PARALLELNoOn1 + +c TESTING parallel CLAUSE . + + print *,'===START OF parallelNoOn1========================' +C -------------------------------------------------- +c 11 PARALLEL , REDUCTION + call parallelNoOn11 +C -------------------------------------------------- +c 12 PARALLEL, PRIVATE, REDUCTION + call parallelNoOn12 +C -------------------------------------------------- +c 13 PARALLEL, ACROSS , TIE, REDUCTION + call parallelNoOn13 +C -------------------------------------------------- +c 14 PARALLEL, ACROSS, TIE, REDUCTION + call parallelNoOn14 +C -------------------------------------------------- + print *,'=== END OF parallelNoOn1 ========================= ' + end + +C ---------------------------------------------parallelNoOn11 + subroutine parallelNoOn11 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn11' + integer, allocatable :: A(:),B(:),AS(:),BS(:) + integer:: erri=ER + + allocate (B(N),A(N),BS(N),AS(N)) + + + do i=1,N + if(i == N .or. i==1) then + AS(i) = 0 + else + AS(i) = 1+i + endif + enddo + + do i=2,N-1 + BS(i) = AS(i-1)+AS(i+1) + enddo + +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (i) + do i=1,N + if(i == N .or. i==1) then + A(i) = 0 + else + A(i) = 1+i + endif + + enddo + +!dvm$ parallel (i) + do i=2,N-1 + B(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i), reduction( min( erri ) ) + do i=2,N-1 + if(B(i) .ne. BS(i)) erri = min(erri, ABS(B(i)-BS(i))) + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ---------------------------------------------parallelNoOn12 + subroutine parallelNoOn12 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn12' + integer, allocatable :: A(:),B(:),AS(:),BS(:) + integer:: erri=ER + + allocate (B(N),A(N),BS(N),AS(N)) + + + do i=1,N + if(i == N .or. i==1) then + AS(i) = 0 + else + AS(i) = 1+i + endif + enddo + + do i=2,N-1 + BS(i) = AS(i-1)+AS(i+1) + enddo + +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (i) + do i=1,N + if(i == N .or. i==1) then + A(i) = 0 + else + A(i) = 1+i + endif + + enddo + +!dvm$ parallel (i), private(IA1,IA2) + do i=2,N-1 + IA1 = A(i-1) + IA2 = A(i+1) + B(i) = IA1+IA2 + enddo + +!dvm$ parallel (i), reduction( min( erri ) ) + do i=2,N-1 + if(B(i) .ne. BS(i)) erri = min(erri, ABS(B(i)-BS(i))) + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + + +C ---------------------------------------------parallelNoOn13 + subroutine parallelNoOn13 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn13' + integer, allocatable :: A(:),AS(:) + integer:: erri=ER + + allocate (A(N),AS(N)) + + + do i=1,N + if(i == N .or. i==1) then + AS(i) = 0 + else + AS(i) = 1+i + endif + enddo + + do i=2,N-1 + AS(i) = AS(i-1)+AS(i+1) + enddo + +!dvm$ actual(erri) +!dvm$ region local(A) +!dvm$ parallel (i) + do i=1,N + if(i == N .or. i==1) then + A(i) = 0 + else + A(i) = 1+i + endif + + enddo + +!dvm$ parallel (i), across(A(1:1)), tie(A(i)) + do i=2,N-1 + A(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i), reduction( min( erri ) ) + do i=2,N-1 + if(A(i) .ne. AS(i)) erri = min(erri, ABS(A(i)-AS(i))) + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,AS) + + end + +C ---------------------------------------------parallelNoOn14 + subroutine parallelNoOn14 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn14' + integer, allocatable :: A(:),B(:),AS(:),BS(:) + integer:: erri=ER + + allocate (B(N),A(N),BS(N),AS(N)) + + + do i=1,N + if(i == N .or. i==1) then + AS(i) = 0 + BS(i) = 0 + else + AS(i) = 1+i + BS(i) = i + endif + enddo + + do i=3,N-1 + AS(i) = AS(i-1)+AS(i+1) + BS(i) = BS(i-2) + enddo + +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (i) + do i=1,N + if(i == N .or. i==1) then + A(i) = 0 + B(i) = 0 + else + A(i) = 1+i + B(i) = i + endif + + enddo + +!dvm$ parallel (i), across(A(1:1),B(2:0)), tie(A(i),B(i)) + do i=3,N-1 + A(i) = A(i-1)+A(i+1) + B(i) = B(i-2) + enddo + +!dvm$ parallel (i), reduction( min( erri ) ) + do i=2,N-1 + if(A(i) .ne. AS(i)) erri = min(erri, ABS(A(i)-AS(i))) + if(B(i) .ne. BS(i)) erri = min(erri, ABS(B(i)-BS(i))) + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*14 name + print *,name,' - complete' + end + subroutine ansno(name) + character*14 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn12.fdv new file mode 100644 index 0000000..3d0e659 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn12.fdv @@ -0,0 +1,305 @@ + program PARALLELNoOn2 + +c TESTING parallel CLAUSE . + + print *,'===START OF parallelNoOn2========================' +C -------------------------------------------------- +c 11 PARALLEL , REDUCTION + call parallelNoOn21 +C -------------------------------------------------- +c 12 PARALLEL, PRIVATE, REDUCTION + call parallelNoOn22 +C -------------------------------------------------- +c 13 PARALLEL, ACROSS , TIE, REDUCTION + call parallelNoOn23 +C -------------------------------------------------- +c 14 PARALLEL, ACROSS, TIE, REDUCTION + call parallelNoOn24 +C -------------------------------------------------- + print *,'=== END OF parallelNoOn2 ========================= ' + end + +C ---------------------------------------------parallelNoOn21 + subroutine parallelNoOn21 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn21' + integer, allocatable :: A(:,:),B(:,:),AS(:,:),BS(:,:) + integer:: erri=ER + + allocate (B(N,N),A(N,N),BS(N,N),AS(N,N)) + + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1) then + AS(i,j) = 0 + else + AS(i,j) = i+j + endif + enddo + enddo + + do j=2,N-1 + do i=2,N-1 + BS(i,j) = AS(i-1,j)+AS(i+1,j)+AS(i,j+1)+AS(i,j-1) + enddo + enddo + +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (j,i) + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1) then + A(i,j) = 0 + else + A(i,j) = i+j + endif + enddo + enddo + +!dvm$ parallel (j,i) + do j=2,N-1 + do i=2,N-1 + B(i,j) = A(i-1,j)+A(i+1,j)+A(i,j+1)+A(i,j-1) + enddo + enddo + +!dvm$ parallel (j,i), reduction( min( erri ) ) + do j=2,N-1 + do i=2,N-1 + if(B(i,j) .ne. BS(i,j)) erri = min(erri, ABS(B(i,j)-BS(i,j))) + enddo + enddo + +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ---------------------------------------------parallelNoOn22 + subroutine parallelNoOn22 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn22' + integer, allocatable :: A(:,:),B(:,:),AS(:,:),BS(:,:) + integer:: erri=ER + + allocate (B(N,N),A(N,N),BS(N,N),AS(N,N)) + + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1) then + AS(i,j) = 0 + else + AS(i,j) = i+j + endif + enddo + enddo + + do j=2,N-1 + do i=2,N-1 + BS(i,j) = AS(i-1,j)+AS(i+1,j)+AS(i,j+1)+AS(i,j-1) + enddo + enddo + +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (j,i), private(ij) + do j=1,N + do i=1,N + ij = i+j + if(i == N .or. i==1 .or. j==N .or. j==1) then + A(i,j) = 0 + else + A(i,j) = ij + endif + + enddo + enddo + +!dvm$ parallel (j,i), private(iai,iaj) + do j=2,N-1 + do i=2,N-1 + iai = A(i-1,j)+A(i+1,j) + iaj = A(i,j+1)+A(i,j-1) + B(i,j) = iai+iaj + enddo + enddo + +!dvm$ parallel (j,i), reduction( min( erri ) ) + do j=2,N-1 + do i=2,N-1 + if(B(i,j) .ne. BS(i,j)) erri = min(erri, ABS(B(i,j)-BS(i,j))) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ---------------------------------------------parallelNoOn23 + subroutine parallelNoOn23 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn23' + integer, allocatable :: A(:,:),B(:,:),AS(:,:),BS(:,:) + integer:: erri=ER + + allocate (B(N,N),A(N,N),BS(N,N),AS(N,N)) + + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1) then + AS(i,j) = 0 + BS(i,j) = 0 + else + AS(i,j) = i+j + BS(i,j) = i+j+2 + endif + enddo + enddo + + do j=2,N-1 + do i=2,N-2 + AS(i,j) = AS(i-1,j)+AS(i+1,j)+AS(i,j+1)+AS(i,j-1) + BS(i,j) = BS(i-1,j)+BS(i+2,j)+AS(i,j) + enddo + enddo + +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (j,i) + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1) then + A(i,j) = 0 + B(i,j) = 0 + else + A(i,j) = i+j + B(i,j) = i+j+2 + endif + + enddo + enddo + +!dvm$ parallel (j,i), across(A(1:1,1:1),B(1:2,0:0)),tie(A(i,j),B(i,j)) + do j=2,N-1 + do i=2,N-2 + A(i,j) = A(i-1,j)+A(i+1,j)+A(i,j+1)+A(i,j-1) + B(i,j) = B(i-1,j)+B(i+2,j)+A(i,j) + enddo + enddo + +!dvm$ parallel (j,i), reduction( min( erri ) ) + do j=1,N + do i=1,N + if(A(i,j) .ne. AS(i,j)) erri = min(erri, ABS(A(i,j)-AS(i,j))) + if(B(i,j) .ne. BS(i,j)) erri = min(erri, ABS(B(i,j)-BS(i,j))) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ---------------------------------------------parallelNoOn24 + subroutine parallelNoOn24 + integer, parameter :: N = 100, ER=10000 + character*14:: tname='parallelNoOn24' + integer, allocatable :: A(:,:),B(:,:),AS(:,:),BS(:,:) + integer:: erri=ER + + allocate (B(N,N),A(N,N),BS(N,N),AS(N,N)) + + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1) then + AS(i,j) = 0 + BS(i,j) = 0 + else + AS(i,j) = i+j + BS(i,j) = i+j+2 + endif + enddo + enddo + + do j=2,N-1 + do i=2,N-1 + AS(i,j) = AS(i-1,j)+AS(i+1,j)+AS(i,j+1)+AS(i,j-1) + BS(i+1,j) = BS(i-1,j)+BS(i+1,j)+AS(i,j) + enddo + enddo + +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (j,i) + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1) then + A(i,j) = 0 + B(i,j) = 0 + else + A(i,j) = i+j + B(i,j) = i+j+2 + endif + + enddo + enddo + +!dvm$ parallel (j,i),across(A(1:1,1:1),B(2:0,0:0)),tie(A(i,j),B(i+1,j)) + do j=2,N-1 + do i=2,N-1 + A(i,j) = A(i-1,j)+A(i+1,j)+A(i,j+1)+A(i,j-1) + B(i+1,j) = B(i-1,j)+B(i+1,j)+A(i,j) + enddo + enddo + +!dvm$ parallel (j,i), reduction( min( erri ) ) + do j=1,N + do i=1,N + if(A(i,j) .ne. AS(i,j)) erri = min(erri, ABS(A(i,j)-AS(i,j))) + if(B(i,j) .ne. BS(i,j)) erri = min(erri, ABS(B(i,j)-BS(i,j))) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*14 name + print *,name,' - complete' + end + subroutine ansno(name) + character*14 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn13.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn13.fdv new file mode 100644 index 0000000..3e24af7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/parallelNoOn13.fdv @@ -0,0 +1,346 @@ + program PARALLELNoOn3 + +c TESTING parallel CLAUSE . + + print *,'===START OF parallelNoOn3========================' +C -------------------------------------------------- +c 11 PARALLEL , REDUCTION + call parallelNoOn31 +C -------------------------------------------------- +c 12 PARALLEL, PRIVATE, REDUCTION + call parallelNoOn32 +C -------------------------------------------------- +c 13 PARALLEL, ACROSS , TIE, REDUCTION + call parallelNoOn33 +C -------------------------------------------------- +c 14 PARALLEL, ACROSS, TIE, REDUCTION + call parallelNoOn34 +C -------------------------------------------------- + print *,'=== END OF parallelNoOn3 ========================= ' + end + +C ---------------------------------------------parallelNoOn31 + subroutine parallelNoOn31 + integer, parameter :: N = 10, ER=10000 + character*14:: tname='parallelNoOn31' + integer, allocatable :: A(:,:,:),B(:,:,:),AS(:,:,:),BS(:,:,:) + integer:: erri=ER + + allocate (B(N,N,N),A(N,N,N),BS(N,N,N),AS(N,N,N)) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + AS(i,j,k) = 0 + BS(i,j,k) = 0 + else + AS(i,j,k) = i+j+k + endif + enddo + enddo + enddo + do k=2,N-1 + do j=2,N-1 + do i=2,N-1 + BS(i,j,k) = AS(i-1,j,k)+AS(i+1,j,k)+AS(i,j+1,k)+AS(i,j-1,k) + & + AS(i,j,k-1) + AS(i,j,k+1) + enddo + enddo + enddo +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (k,j,i) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + A(i,j,k) = 0 + B(i,j,k) = 0 + else + A(i,j,k) = i+j+k + endif + enddo + enddo + enddo +!dvm$ parallel (k,j,i) + do k=2,N-1 + do j=2,N-1 + do i=2,N-1 + B(i,j,k) = A(i-1,j,k)+A(i+1,j,k)+A(i,j+1,k)+A(i,j-1,k) + & + A(i,j,k-1) + A(i,j,k+1) + enddo + enddo + enddo +!dvm$ parallel (k,j,i), reduction( min( erri ) ) + do k=1,N + do j=1,N + do i=1,N + if(B(i,j,k) .ne. BS(i,j,k)) + & erri = min(erri, ABS(B(i,j,k)-BS(i,j,k))) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ---------------------------------------------parallelNoOn32 + subroutine parallelNoOn32 + integer, parameter :: N = 10, ER=10000 + character*14:: tname='parallelNoOn32' + integer, allocatable :: A(:,:,:),B(:,:,:),AS(:,:,:),BS(:,:,:) + integer:: erri=ER + + allocate (B(N,N,N),A(N,N,N),BS(N,N,N),AS(N,N,N)) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + AS(i,j,k) = 0 + BS(i,j,k) = 0 + else + AS(i,j,k) = i+j+k + endif + enddo + enddo + enddo + do k=2,N-1 + do j=2,N-1 + do i=2,N-1 + BS(i,j,k) = AS(i-1,j,k)+AS(i+1,j,k)+AS(i,j+1,k)+AS(i,j-1,k) + & + AS(i,j,k-1) + AS(i,j,k+1) + enddo + enddo + enddo +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (k,j,i), private(i0) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + i0 = 0 + A(i,j,k) = i0 + B(i,j,k) = i0 + else + A(i,j,k) = i+j+k + endif + enddo + enddo + enddo +!dvm$ parallel (k,j,i),private(ia1,ja1,ka1) + do k=2,N-1 + do j=2,N-1 + do i=2,N-1 + ia1 = A(i-1,j,k) + ja1 = A(i,j-1,k) + ka1 = A(i,j,k-1) + B(i,j,k) = ia1+A(i+1,j,k)+A(i,j+1,k)+ ja1 + & + ka1 + A(i,j,k+1) + enddo + enddo + enddo +!dvm$ parallel (k,j,i), reduction( min( erri ) ) + do k=1,N + do j=1,N + do i=1,N + if(B(i,j,k) .ne. BS(i,j,k)) + & erri = min(erri, ABS(B(i,j,k)-BS(i,j,k))) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ---------------------------------------------parallelNoOn33 + subroutine parallelNoOn33 + integer, parameter :: N = 10, ER=10000 + character*14:: tname='parallelNoOn33' + integer, allocatable :: A(:,:,:),B(:,:,:),AS(:,:,:),BS(:,:,:) + integer:: erri=ER + + allocate (B(N,N,N),A(N,N,N),BS(N,N,N),AS(N,N,N)) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + AS(i,j,k) = 0 + BS(i,j,k) = 0 + else + AS(i,j,k) = i+j+k + BS(i,j,k) = i+j+k+1 + endif + enddo + enddo + enddo + do k=2,N-2 + do j=2,N-1 + do i=2,N-1 + AS(i,j,k) = AS(i-1,j,k)+AS(i+1,j,k)+AS(i,j+1,k)+AS(i,j-1,k) + & + AS(i,j,k-1) + AS(i,j,k+1) + BS(i,j,k) = BS(i,j,k) + BS(i-1,j,k) + BS(i,j,k+2) + enddo + enddo + enddo +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (k,j,i) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + A(i,j,k) = 0 + B(i,j,k) = 0 + else + A(i,j,k) = i+j+k + B(i,j,k) = i+j+k+1 + endif + enddo + enddo + enddo +!dvm$ parallel (k,j,i), tie(A(i,j,k),B(i,j,k)), +!dvm$& across(A(1:1,1:1,1:1),B(1:0,0:0,0:2)) + do k=2,N-2 + do j=2,N-1 + do i=2,N-1 + + A(i,j,k) = A(i-1,j,k)+A(i+1,j,k)+A(i,j+1,k)+A(i,j-1,k) + & + A(i,j,k-1) + A(i,j,k+1) + B(i,j,k) = B(i,j,k) + B(i-1,j,k) + B(i,j,k+2) + enddo + enddo + enddo +!dvm$ parallel (k,j,i), reduction( min( erri ) ) + do k=1,N + do j=1,N + do i=1,N + if(A(i,j,k) .ne. AS(i,j,k)) + & erri = min(erri, ABS(A(i,j,k)-AS(i,j,k))) + if(B(i,j,k) .ne. BS(i,j,k)) + & erri = min(erri, ABS(B(i,j,k)-BS(i,j,k))) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end +C ---------------------------------------------parallelNoOn34 + subroutine parallelNoOn34 + integer, parameter :: N = 10, ER=10000 + character*14:: tname='parallelNoOn34' + integer, allocatable :: A(:,:,:),B(:,:,:),AS(:,:,:),BS(:,:,:) + integer:: erri=ER + + allocate (B(N,N,N),A(N,N,N),BS(N,N,N),AS(N,N,N)) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + AS(i,j,k) = 0 + BS(i,j,k) = 0 + else + AS(i,j,k) = i+j+k + BS(i,j,k) = i+j+k+1 + endif + enddo + enddo + enddo + do k=2,N-1 + do j=2,N-1 + do i=2,N-1 + AS(i,j,k) = AS(i-1,j,k)+AS(i+1,j,k)+AS(i,j+1,k)+AS(i,j-1,k) + & + AS(i,j,k-1) + AS(i,j,k+1) + BS(i+1,j,k-1) = BS(i+1,j,k) + BS(i-1,j,k-1) + BS(i+1,j,k+1) + enddo + enddo + enddo +!dvm$ actual(erri) +!dvm$ region local(A,B) +!dvm$ parallel (k,j,i) + do k=1,N + do j=1,N + do i=1,N + if(i == N .or. i==1 .or. j==N .or. j==1 .or.k==N .or.k==1) then + A(i,j,k) = 0 + B(i,j,k) = 0 + else + A(i,j,k) = i+j+k + B(i,j,k) = i+j+k+1 + endif + enddo + enddo + enddo +!dvm$ parallel (k,j,i), tie(A(i,j,k),B(i+1,j,k-1)), +!dvm$& across(A(1:1,1:1,1:1),B(2:0,0:0,0:2)) + do k=2,N-1 + do j=2,N-1 + do i=2,N-1 + + A(i,j,k) = A(i-1,j,k)+A(i+1,j,k)+A(i,j+1,k)+A(i,j-1,k) + & + A(i,j,k-1) + A(i,j,k+1) + B(i+1,j,k-1) = B(i+1,j,k) + B(i-1,j,k-1) + B(i+1,j,k+1) + enddo + enddo + enddo +!dvm$ parallel (k,j,i), reduction( min( erri ) ) + do k=1,N + do j=1,N + do i=1,N + if(A(i,j,k) .ne. AS(i,j,k)) + & erri = min(erri, ABS(A(i,j,k)-AS(i,j,k))) + if(B(i,j,k) .ne. BS(i,j,k)) + & erri = min(erri, ABS(B(i,j,k)-BS(i,j,k))) + enddo + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erri) + + if (erri .eq. ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,AS,BS) + + end + +C ------------------------------------------------- + + subroutine ansyes(name) + character*14 name + print *,name,' - complete' + end + subroutine ansno(name) + character*14 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/settings b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/settings new file mode 100644 index 0000000..fd6919c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PARALLEL_NO_ON/settings @@ -0,0 +1 @@ +ALLOW_MULTIDEV=0 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf11.fdv new file mode 100644 index 0000000..d6e257d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf11.fdv @@ -0,0 +1,293 @@ + program PRF11 + +c TESTING OF THE PREFETCH DIRECTIVE . + + print *,'===START OF PRF11========================' +C -------------------------------------------------- + call prf1101 + call prf1102 + call prf1103 +C -------------------------------------------------- + +C + print *,'=== END OF PRF11 ========================= ' + end +C ---------------------------------------------PRF1101 + subroutine PRF1101 + integer, parameter :: N = 16,NL=1000,NIT=3 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop, ib1,ib2,ib3,ib4,ib5,ib6,ib7,ib8,ib9 + character*7 tname + +cdvm$ distribute B(BLOCK) + +cdvm$ align (I) with B(I) ::A,D +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF1101' + allocate (B(N),A(N),C(N),D(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + B(i)=NL+i + D(i)=NL+i + enddo + + it=0 + do it=1,NIT + +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1)) + ib1=A(1) + +cdvm$ remote_access (GR2:A(N/2)) + ib2=A(N/2) +cdvm$ remote_access (GR3:A(N)) + ib3=A(N) + +cdvm$ remote_access (GR1:B(2)) + ib4=B(2) + +cdvm$ remote_access (GR2:B(N/2-1)) + ib5=B(N/2-1) +cdvm$ remote_access (GR3:B(N-1)) + ib6=B(N-1) +cdvm$ remote_access (GR1:D(3)) + ib7=D(3) + +cdvm$ remote_access (GR2:D(N/2-2)) + ib8=D(N/2-2) +cdvm$ remote_access (GR3:D(N-2)) + ib9=D(N-2) + + + if ((ib1 .eq.C(1)).and.(ib2.eq.C(N/2)).and.(ib3.eq.C(N)) + * .and.(ib4 .eq.C(2)) .and.(ib5 .eq.C(N/2-1)) + * .and.(ib6 .eq.C(N-1)) + * .and.(ib7 .eq.C(3)).and.(ib8 .eq.C(N/2-2)) + * .and.(ib9 .eq.C(N-2))) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + end +C ---------------------------------------------PRF1102 + subroutine PRF1102 + integer, parameter :: N = 16,NL=1000,NIT=3 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop + character*7 tname + +cdvm$ distribute B(BLOCK) + +cdvm$ align (I) with B(I) ::A +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF1102' + allocate (B(N),A(N),C(N),D(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + + it=0 + do it=1,NIT + + +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:)) + + do i=1,N + D(i)=A(i) + isumc1=isumc1+C(i) + isuma1=isuma1+D(i) + enddo + isumc2=0 + isuma2=0 + + + kk=2 + kk1=3 +cdvm$ remote_access (GR2:A(:)) + do i=1,N/kk-kk1 + D(i)=A(kk*i+kk1) + isumc2=isumc2+C(kk*i+kk1) + isuma2=isuma2+D(i) + enddo + + + if ((isumc1 .eq.isuma1) .and.(isumc2 .eq.isuma2)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + enddo + deallocate (A,B,C,D) + + end +C ---------------------------------------------PRF1103 + subroutine PRF1103 + integer, parameter :: N = 16,NL=1000,NIT=3 + integer, allocatable :: A(:),B(:),C(:),A1(:) + integer nloop + character*7 tname + +cdvm$ distribute B(BLOCK) + +cdvm$ align (I) with B(I) ::A,A1 +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF1103' + allocate (B(N),A(N),C(N),A1(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + A1(i) = NL+i + enddo + + it=0 + do it=1,NIT + +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + nloop1=NL + +*dvm$ parallel (i) on B(i),remote_access(GR1:A(1)) + do i=1,N + B(i) = A(1) + enddo +*dvm$ parallel (i) on A(i), reduction( min( nloop1 ) ) + do i=1,N + if (B(i).ne.C(1)) nloop1=min(nloop1,i) + enddo + + nloop2=NL + +*dvm$ parallel (i) on B(i),remote_access(GR1:A(N)) + do i=1,N + B(i) = A(N) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop2 ) ) + do i=1,N + + if (B(i).ne.C(N)) nloop2=min(nloop2,i) + enddo + nloop3=NL + +*dvm$ parallel (i) on B(i),remote_access(GR2:A(N/2)) + do i=1,N + B(i) = A(N/2) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop3 ) ) + do i=1,N + if (B(i).ne.C(N/2)) nloop3=min(nloop3,i) + enddo + + nloop4=NL + +*dvm$ parallel (i) on B(i),remote_access(GR2:A) + do i=1,N + B(i) = A(i) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop4 ) ) + do i=1,N + if (B(i).ne.C(i)) nloop4=min(nloop4,i) + enddo + nloop5=NL + +*dvm$ parallel (i) on B(i),remote_access(GR3:A1(i)) + do i=1,N + B(i) = A1(i) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(i)) nloop=min(nloop,i) + enddo + + nloop6=NL + kk=2 + kk1=3 +*dvm$ parallel (i) on B(i),remote_access(GR3:A(kk*i+kk1)) + do i=1,N/kk-kk1 + B(i) = A(kk*i+kk1) + enddo + +*dvm$ parallel (i) on B(i), reduction( min( nloop6 ) ) + do i=1,N/kk-kk1 + if (B(i).ne.C(kk*i+kk1)) nloop6=min(nloop6,i) + enddo + + + if ((nloop1 .eq.NL) .and.(nloop2 .eq.NL).and.(nloop2 .eq.NL) + * .and.(nloop3 .eq.NL).and.(nloop4 .eq.NL).and.(nloop5 .eq.NL) + * .and.(nloop6 .eq.NL) ) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf12.fdv new file mode 100644 index 0000000..ee5f7b3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf12.fdv @@ -0,0 +1,285 @@ + program PRF12 + +c TESTING OF THE PREFETCH DIRECTIVE . + + print *,'===START OF PRF11========================' +C -------------------------------------------------- + call prf1201 + call prf1202 + call prf1203 +C -------------------------------------------------- + +C + print *,'=== END OF PRF12 ========================= ' + end +C ---------------------------------------------PRF1201 + subroutine PRF1201 + integer, parameter :: N = 16,NL=1000,NIT=3 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop + character*7 tname + +cdvm$ distribute B(*) + +cdvm$ align (I) with B(I) ::A,D +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF1201' + allocate (B(N),A(N),C(N),D(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + B(i)=NL+i + D(i)=NL+i + enddo + it=0 + do it=1,NIT + +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1)) + ib1=A(1) + +cdvm$ remote_access (GR2:A(N/2)) + ib2=A(N/2) + +cdvm$ remote_access (GR3:A(N)) + ib3=A(N) + +cdvm$ remote_access (GR1:B(2)) + ib4=B(2) + +cdvm$ remote_access (GR2:B(N/2-1)) + ib5=B(N/2-1) + +cdvm$ remote_access (GR3:B(N-1)) + ib6=B(N-1) + +cdvm$ remote_access (GR1:D(3)) + ib7=D(3) + +cdvm$ remote_access (GR2:D(N/2-2)) + ib8=D(N/2-2) + +cdvm$ remote_access (GR3:D(N-2)) + ib9=D(N-2) + + if ((ib1 .eq.C(1)).and.(ib2.eq.C(N/2)).and.(ib3.eq.C(N)) + * .and.(ib4 .eq.C(2)) .and.(ib5 .eq.C(N/2-1)) + * .and.(ib6 .eq.C(N-1)) + * .and.(ib7 .eq.C(3)).and.(ib8 .eq.C(N/2-2)) + * .and.(ib9 .eq.C(N-2))) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + enddo + deallocate (A,B,C,D) + end +C ---------------------------------------------PRF1202 + subroutine PRF1202 + integer, parameter :: N = 16,NL=1000,NIT=3 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop + character*7 tname + +cdvm$ distribute B(*) + +cdvm$ align (I) with B(I) ::A +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF1202' + allocate (B(N),A(N),C(N),D(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + it=0 + do it=1,NIT + +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:)) + do i=1,N + D(i)=A(i) + isumc1=isumc1+C(i) + isuma1=isuma1+D(i) + enddo + + isumc2=0 + isuma2=0 + + kk=2 + kk1=3 +cdvm$ remote_access (GR2:A(:)) + do i=1,N/kk-kk1 + D(i)=A(kk*i+kk1) + isumc2=isumc2+C(kk*i+kk1) + isuma2=isuma2+D(i) + enddo + if ((isumc1 .eq.isuma1) .and.(isumc2 .eq.isuma2)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + end +C ---------------------------------------------PRF1203 + subroutine PRF1203 + integer, parameter :: N = 16,NL=1000,NIT=3 + integer, allocatable :: A(:),B(:),C(:),A1(:) + integer nloop + character*7 tname + +cdvm$ distribute B(*) + +cdvm$ align (I) with B(I) ::A,A1 +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF1203' + allocate (B(N),A(N),C(N),A1(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + A1(i) = NL+i + enddo + + it=0 + do it=1,NIT + +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + nloop1=NL + +*dvm$ parallel (i) on B(i),remote_access(GR1:A(1)) + do i=1,N + B(i) = A(1) + enddo +*dvm$ parallel (i) on A(i), reduction( min( nloop1 ) ) + do i=1,N + if (B(i).ne.C(1)) nloop1=min(nloop1,i) + enddo + + nloop2=NL + +*dvm$ parallel (i) on B(i),remote_access(GR1:A(N)) + do i=1,N + B(i) = A(N) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop2 ) ) + do i=1,N + if (B(i).ne.C(N)) nloop2=min(nloop2,i) + enddo + nloop3=NL + +*dvm$ parallel (i) on B(i),remote_access(GR2:A(N/2)) + do i=1,N + B(i) = A(N/2) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop3 ) ) + do i=1,N + if (B(i).ne.C(N/2)) nloop3=min(nloop3,i) + enddo + + nloop4=NL + +*dvm$ parallel (i) on B(i),remote_access(GR2:A) + do i=1,N + B(i) = A(i) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop4 ) ) + do i=1,N + if (B(i).ne.C(i)) nloop4=min(nloop4,i) + enddo + nloop5=NL + +*dvm$ parallel (i) on B(i),remote_access(GR3:A1(i)) + do i=1,N + B(i) = A1(i) + enddo +*dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(i)) nloop=min(nloop,i) + enddo + + nloop6=NL + kk=2 + kk1=3 +*dvm$ parallel (i) on B(i),remote_access(GR3:A(kk*i+kk1)) + do i=1,N/kk-kk1 + B(i) = A(kk*i+kk1) + enddo + +*dvm$ parallel (i) on B(i), reduction( min( nloop6 ) ) + do i=1,N/kk-kk1 + if (B(i).ne.C(kk*i+kk1)) nloop6=min(nloop6,i) + enddo + + if ((nloop1 .eq.NL) .and.(nloop2 .eq.NL).and.(nloop2 .eq.NL) + * .and.(nloop3 .eq.NL).and.(nloop4 .eq.NL).and.(nloop5 .eq.NL) + * .and.(nloop6 .eq.NL) ) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf21.fdv new file mode 100644 index 0000000..ac15437 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf21.fdv @@ -0,0 +1,452 @@ + program PRF21 + +c TESTING OF THE PREFETCH DIRECTIVE. + + print *,'===START OF PRF21========================' +C -------------------------------------------------- + call prf2101 + call prf2102 + call prf2103 +C + print *,'=== END OF PRF21 ========================= ' + end +C ---------------------------------------------------------PRF2101 + subroutine PRF2101 + integer, parameter :: N = 4,M=4,NL=1000,NIT=3 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer, allocatable :: A1(:,:),A2(:,:),A3(:,:) + integer nloopi,nloopj + character*7 tname + +cdvm$ distribute B(BLOCK,BLOCK) +cdvm$ align(:,:) with B(:,:) :: A,A1,A2,A3 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF2101' + allocate (B(N,M),A(N,M)) + allocate (C(N,M),D(N,M)) + allocate (A1(N,M),A2(N,M),A3(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1,1)) + ib1=A(1,1) +cdvm$ remote_access (GR1:A(N,M)) + ib2=A(N,M) +cdvm$ remote_access (GR2:A(1,M)) + ib3=A(1,M) +cdvm$ remote_access (GR3:A(N,1)) + ib4=A(N,1) + if ((ib1 .eq.C(1,1)).and.(ib2.eq.C(N,M)).and.(ib3.eq.C(1,M)).and. + * (ib4 .eq. C(N,1)) ) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + enddo + deallocate (A,B,C,D) + deallocate (A1,A2,A3) + end +C ---------------------------------------------------------PRF2102 + subroutine PRF2102 + integer, parameter :: N = 4,M=4,NL=1000,NIT=3 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer, allocatable :: A1(:,:),A2(:,:),A3(:,:) + integer nloopi,nloopj + character*7 tname + +cdvm$ distribute B(BLOCK,BLOCK) +cdvm$ align(:,:) with B(:,:) :: A,A1,A2,A3 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF2102' + allocate (B(N,M),A(N,M),C(N,M),D(N,M)) + allocate (A1(N,M),A2(N,M),A3(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + A1(i,j) =NL+i+j + A2(i,j) =NL+i+j + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 +cdvm$ remote_access (GR1:A(:,:)) + do i=1,N + do j=i,M + D(i,j)=A(i,j) + isumc1=isumc1+C(i,j) + isuma1=isuma1+D(i,j) + enddo + enddo + + isumc2=0 + isuma2=0 + +cdvm$ remote_access (GR1:A(:,1)) + do i=1,N + D(i,1)=A(i,1) + isumc2=isumc2+C(i,1) + isuma2=isuma2+D(i,1) + enddo + + isumc3=0 + isuma3=0 + +cdvm$ remote_access (GR2:A(1,:)) + do j=1,M + D(1,j)=A(1,j) + isumc3=isumc3+C(1,j) + isuma3=isuma3+D(1,j) + enddo + + isumc4=0 + isuma4=0 + +cdvm$ remote_access (GR2:A(:,M)) + do i=1,N + D(i,M)=A(i,M) + isumc4=isumc4+C(i,M) + isuma4=isuma4+D(i,M) + enddo + + isumc5=0 + isuma5=0 + +cdvm$ remote_access (GR2:A1(N,:)) + do j=1,M + D(N,j)=A1(N,j) + isumc5=isumc5+C(N,j) + isuma5=isuma5+D(N,j) + enddo + + isumc6=0 + isuma6=0 + +cdvm$ remote_access (GR3:A1(:,:)) + do i=1,N + do j=i,M + D(i,j)=A1(i,j) + isumc6=isumc6+C(i,j) + isuma6=isuma6+D(i,j) + enddo + enddo + + isumc7=0 + isuma7=0 + + ki=2 + ki1=3 + kj=2 + kj1=3 + +cdvm$ remote_access (GR3:A2(:,:)) + do i=1,N/ki-ki1 + do j=i,M/kj-kj1 + D(i,j)=A2(ki*i+ki1,kj*j+kj1) + isumc7=isumc7+C(ki*i+ki1,kj*j+kj1 ) + isuma7=isuma7+D(i,j) + enddo + enddo + if ((isumc1.eq.isuma1).and.(isumc2 .eq.isuma2).and. + * (isumc3.eq.isuma3) + * .and.(isumc4 .eq.isuma4).and.(isumc5 .eq.isuma5).and. + * (isumc6 .eq.isuma6).and.(isumc7 .eq.isuma7)) then + call ansyes(tname) + else + call ansno(tname) + endif +c print *,isumc1,isuma1,isumc2,isuma2 + + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + enddo + deallocate (A,B,C,D) + deallocate (A1,A2,A3) + end +C ---------------------------------------------------------PRF2103 + subroutine PRF2103 + integer, parameter :: N = 4,M=4,NL=1000,NIT=3 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer, allocatable :: A1(:,:),A2(:,:),A3(:,:) + integer nloopi,nloopj + character*7 tname + +cdvm$ distribute B(BLOCK,BLOCK) +cdvm$ align(:,:) with B(:,:) :: A,A1,A2,A3 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF2103' + allocate (B(N,M),A(N,M),C(N,M),D(N,M)) + allocate (A1(N,M),A2(N,M),A3(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + A1(i,j) = NL+i+j + enddo + enddo + + do it=1,NIT + +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + nloopi1=NL + nloopj1=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR1:A(1,1)) + do i=1,N + do j=1,M + B(i,j) = A(1,1) + enddo + enddo +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi1),min(nloopj1)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,1)) then + nloopi1=min(nloopi1,i) + nloopj1=min(nloopj1,j) + endif + enddo + enddo + + nloopi2=NL + nloopj2=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR1:A(N,M)) + do i=1,N + do j=1,M + B(i,j) = A(N,M) + enddo + enddo +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi2),min(nloopj2)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,M)) then + nloopi2=min(nloopi2,i) + nloopj2=min(nloopj2,j) + endif + enddo + enddo + + nloopi3=NL + nloopj3=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR2:A(1,M)) + do i=1,N + do j=1,M + B(i,j) = A(1,M) + + enddo + enddo +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi3),min(nloopj3)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,M)) then + nloopi3=min(nloopi3,i) + nloopj3=min(nloopj3,j) + endif + enddo + enddo + + nloopi4=NL + nloopj4=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR2:A(N,1)) + do i=1,N + do j=1,M + B(i,j) = A(N,1) + enddo + enddo +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi4),min(nloopj4)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,1)) then + nloopi4=min(nloopi4,i) + nloopj4=min(nloopj4,j) + endif + enddo + enddo + + nloopi5=NL + nloopj5=NL + +*dvm$ parallel (i,J) on A(i,j),remote_access(GR3:A) +c *dvm$ parallel (i,J) on B(i,j),remote_access(A(:,:)) + do i=1,N + do j=1,M + B(i,j) = A(i,j) + + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi5),min(nloopj5)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,j)) then + nloopi5=min(nloopi5,i) + nloopj5=min(nloopj5,j) + endif + enddo + enddo + + nloopi6=NL + nloopj6=NL + +*dvm$ parallel (i) on B(i,1),remote_access(GR3:A1(:,1)) + do i=1,N + B(i,1) = A1(i,1) + enddo + +*dvm$ parallel (i) on B(i,1), reduction( min( nloopi6),min(nloopj6)) + do i=1,N + if (B(i,1).ne.C(i,1)) then + nloopi6=min(nloopi6,i) + nloopj6=j + endif + enddo + + nloopi7=NL + nloopj7=NL + +*dvm$ parallel (i,J) on A(i,j),remote_access(GR3:A1(1,:)) + do i=1,N + do j=1,M + B(i,j) = A1(1,j) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi7),min(nloopj7)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,j)) then + nloopi7=min(nloopi7,i) + nloopj7=min(nloopj7,j) + endif + enddo + enddo + + nloopi8=NL + nloopj8=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR3:A1(:,M)) + do i=1,N + do j=1,M + B(i,j) = A1(i,M) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi8),min(nloopj8)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,M)) then + nloopi8=min(nloopi8,i) + nloopj8=min(nloopj8,j) + endif + enddo + enddo + + nloopi9=NL + nloopj9=NL + +*dvm$ parallel (i,J) on A(i,j),remote_access(GR3:A1(N,:)) + do i=1,N + do j=1,M + B(i,j) = A1(N,j) + enddo + enddo + +*dvm$ parallel (i,j) on A(i,j), reduction( min( nloopi9),min(nloopj9)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,j)) then + nloopi9=min(nloopi9,i) + nloopj9=min(nloopj9,j) + endif + enddo + enddo + if ((nloopi1 .eq.NL).and.(nloopj1 .eq.NL) .and. + * (nloopi2 .eq.NL).and.(nloopj2 .eq.NL) .and. + * (nloopi3 .eq.NL).and.(nloopj3 .eq.NL) .and. + * (nloopi4 .eq.NL).and.(nloopj4 .eq.NL) .and. + * (nloopi5 .eq.NL).and.(nloopj5 .eq.NL) .and. + * (nloopi6 .eq.NL).and.(nloopj6 .eq.NL) .and. + * (nloopi7 .eq.NL).and.(nloopj7 .eq.NL) .and. + * (nloopi8 .eq.NL).and.(nloopj8 .eq.NL) .and. + * (nloopi9 .eq.NL).and.(nloopj9 .eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + deallocate (A1,A2,A3) + end + +C --------------------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf22.fdv new file mode 100644 index 0000000..4d19ada --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf22.fdv @@ -0,0 +1,460 @@ + program PRF22 + +c TESTING OF THE PREFETCH DIRECTIVE. + + print *,'===START OF PRF22========================' +C -------------------------------------------------- + call prf2201 + call prf2202 + call prf2203 +C + print *,'=== END OF PRF22 ========================= ' + end +C ---------------------------------------------------------PRF2201 + subroutine PRF2201 + integer, parameter :: N = 4,M=4,NL=1000,NIT=3 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer,allocatable :: A1(:,:),A2(:,:),A3(:,:) + integer nloopi,nloopj + character*7 tname + +cdvm$ distribute B(BLOCK,*) +cdvm$ align(:,:) with B(:,:) :: A,A1,A2,A3 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF2201' + allocate (B(N,M),A(N,M),C(N,M),D(N,M)) + allocate (A1(N,M),A2(N,M),A3(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1,1)) + ib1=A(1,1) + +cdvm$ remote_access (GR1:A(N,M)) + ib2=A(N,M) + +cdvm$ remote_access (GR2:A(1,M)) + ib3=A(1,M) + +cdvm$ remote_access (GR3:A(N,1)) + ib4=A(N,1) + + if ((ib1 .eq.C(1,1)).and.(ib2.eq.C(N,M)).and.(ib3.eq.C(1,M)).and. + * (ib4 .eq. C(N,1)) ) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + enddo + deallocate (A,B,C,D) + deallocate (A1,A2,A3) + + end +C ---------------------------------------------------------PRF2202 + subroutine PRF2202 + integer, parameter :: N = 4,M=4,NL=1000,NIT=3 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer,allocatable :: A1(:,:),A2(:,:),A3(:,:) + integer nloopi,nloopj + character*7 tname + +cdvm$ distribute B(*,BLOCK) +cdvm$ align(:,:) with B(:,:) :: A,A1,A2,A3 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF2202' + allocate (B(N,M),A(N,M),C(N,M),D(N,M)) + allocate (A1(N,M),A2(N,M),A3(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + A1(i,j) =NL+i+j + A2(i,j) =NL+i+j + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:,:)) + do i=1,N + do j=i,M + D(i,j)=A(i,j) + isumc1=isumc1+C(i,j) + isuma1=isuma1+D(i,j) + enddo + enddo + + isumc2=0 + isuma2=0 + +cdvm$ remote_access (GR1:A(:,1)) + do i=1,N + D(i,1)=A(i,1) + isumc2=isumc2+C(i,1) + isuma2=isuma2+D(i,1) + enddo + + isumc3=0 + isuma3=0 + +cdvm$ remote_access (GR2:A(1,:)) + do j=1,M + D(1,j)=A(1,j) + isumc3=isumc3+C(1,j) + isuma3=isuma3+D(1,j) + enddo + + isumc4=0 + isuma4=0 + +cdvm$ remote_access (GR2:A(:,M)) + do i=1,N + D(i,M)=A(i,M) + isumc4=isumc4+C(i,M) + isuma4=isuma4+D(i,M) + enddo + + isumc5=0 + isuma5=0 +cdvm$ remote_access (GR2:A1(N,:)) + do j=1,M + D(N,j)=A1(N,j) + isumc5=isumc5+C(N,j) + isuma5=isuma5+D(N,j) + enddo + + isumc6=0 + isuma6=0 + +cdvm$ remote_access (GR3:A1(:,:)) + do i=1,N + do j=i,M + D(i,j)=A1(i,j) + isumc6=isumc6+C(i,j) + isuma6=isuma6+D(i,j) + enddo + enddo + + isumc7=0 + isuma7=0 + + ki=2 + ki1=3 + kj=2 + kj1=3 + +cdvm$ remote_access (GR3:A2(:,:)) + do i=1,N/ki-ki1 + do j=i,M/kj-kj1 + D(i,j)=A2(ki*i+ki1,kj*j+kj1) + isumc7=isumc7+C(ki*i+ki1,kj*j+kj1 ) + isuma7=isuma7+D(i,j) + enddo + enddo + + if ((isumc1.eq.isuma1).and.(isumc2 .eq.isuma2).and. + * (isumc3.eq.isuma3) + * .and.(isumc4 .eq.isuma4).and.(isumc5 .eq.isuma5).and. + * (isumc6 .eq.isuma6).and.(isumc7 .eq.isuma7)) then + call ansyes(tname) + else + call ansno(tname) + endif +c print *,isumc1,isuma1,isumc2,isuma2 + + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + deallocate (A1,A2,A3) + + end +C ---------------------------------------------------------PRF2203 + subroutine PRF2203 + integer, parameter :: N = 4,M=4,NL=1000,NIT=3 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer,allocatable :: A1(:,:),A2(:,:),A3(:,:) + integer nloopi,nloopj + character*7 tname + +cdvm$ distribute B(BLOCK,*) +cdvm$ align(:,:) with B(:,:) :: A,A1,A2,A3 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF2203' + allocate (B(N,M),A(N,M),C(N,M),D(N,M)) + allocate (A1(N,M),A2(N,M),A3(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + A1(i,j) = NL+i+j + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + nloopi1=NL + nloopj1=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR1:A(1,1)) + do i=1,N + do j=1,M + B(i,j) = A(1,1) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi1),min(nloopj1)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,1)) then + nloopi1=min(nloopi1,i) + nloopj1=min(nloopj1,j) + endif + enddo + enddo + + nloopi2=NL + nloopj2=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR1:A(N,M)) + do i=1,N + do j=1,M + B(i,j) = A(N,M) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi2),min(nloopj2)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,M)) then + nloopi2=min(nloopi2,i) + nloopj2=min(nloopj2,j) + endif + enddo + enddo + + nloopi3=NL + nloopj3=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR2:A(1,M)) + do i=1,N + do j=1,M + B(i,j) = A(1,M) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi3),min(nloopj3)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,M)) then + nloopi3=min(nloopi3,i) + nloopj3=min(nloopj3,j) + endif + enddo + enddo + + nloopi4=NL + nloopj4=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR2:A(N,1)) + do i=1,N + do j=1,M + B(i,j) = A(N,1) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi4),min(nloopj4)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,1)) then + nloopi4=min(nloopi4,i) + nloopj4=min(nloopj4,j) + endif + enddo + enddo + + nloopi5=NL + nloopj5=NL + +*dvm$ parallel (i,J) on A(i,j),remote_access(GR3:A) +c *dvm$ parallel (i,J) on B(i,j),remote_access(A(:,:)) + do i=1,N + do j=1,M + B(i,j) = A(i,j) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi5),min(nloopj5)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,j)) then + nloopi5=min(nloopi5,i) + nloopj5=min(nloopj5,j) + endif + enddo + enddo + + nloopi6=NL + nloopj6=NL + +*dvm$ parallel (i) on B(i,1),remote_access(GR3:A1(:,1)) + do i=1,N + B(i,1) = A1(i,1) + enddo + +*dvm$ parallel (i) on B(i,1), reduction( min( nloopi6),min(nloopj6)) + do i=1,N + if (B(i,1).ne.C(i,1)) then + nloopi6=min(nloopi6,i) + nloopj6=min(nloopj6,j) + endif + enddo + + nloopi7=NL + nloopj7=NL + +*dvm$ parallel (i,J) on A(i,j),remote_access(GR3:A1(1,:)) + do i=1,N + do j=1,M + B(i,j) = A1(1,j) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi7),min(nloopj7)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,j)) then + nloopi7=min(nloopi7,i) + nloopj7=min(nloopj7,j) + endif + enddo + enddo + + nloopi8=NL + nloopj8=NL + +*dvm$ parallel (i,J) on B(i,j),remote_access(GR3:A1(:,M)) + do i=1,N + do j=1,M + B(i,j) = A1(i,M) + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi8),min(nloopj8)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,M)) then + nloopi8=min(nloopi8,i) + nloopj8=min(nloopj8,j) + endif + enddo + enddo + + nloopi9=NL + nloopj9=NL + +*dvm$ parallel (i,J) on A(i,j),remote_access(GR3:A1(N,:)) + do i=1,N + do j=1,M + B(i,j) = A1(N,j) + enddo + enddo + +*dvm$ parallel (i,j) on A(i,j), reduction( min( nloopi9),min(nloopj9)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,j)) then + nloopi9=min(nloopi9,i) + nloopj9=min(nloopj9,j) + endif + enddo + enddo + if ((nloopi1 .eq.NL).and.(nloopj1 .eq.NL) .and. + * (nloopi2 .eq.NL).and.(nloopj2 .eq.NL) .and. + * (nloopi3 .eq.NL).and.(nloopj3 .eq.NL) .and. + * (nloopi4 .eq.NL).and.(nloopj4 .eq.NL) .and. + * (nloopi5 .eq.NL).and.(nloopj5 .eq.NL) .and. + * (nloopi6 .eq.NL).and.(nloopj6 .eq.NL) .and. + * (nloopi7 .eq.NL).and.(nloopj7 .eq.NL) .and. + * (nloopi8 .eq.NL).and.(nloopj8 .eq.NL) .and. + * (nloopi9 .eq.NL).and.(nloopj9 .eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + deallocate (A1,A2,A3) + + end + +C --------------------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do 10 i=1,N + do 10 j=1,M + 10 AR(i,j) = NL+i+j + + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf23.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf23.f90 new file mode 100644 index 0000000..eaef382 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf23.f90 @@ -0,0 +1,268 @@ +program prf23 + !TESTING OF THE PREFETCH DIRECTIVE. + + print *, '===START OF PRF23========================' + + call prf2301 + call prf2302 + call prf2303 + + print *, '===END OF PRF23==========================' +end + +subroutine prf2301 + integer, parameter :: N = 4, M = 4, NL = 1000, NIT = 3 + integer, allocatable :: A( :, : ), B( :, : ), C( :, : ), D( :, : ) + character * 7 :: tname = 'PRF2301' + + !dvm$ distribute B( block, block ) + !dvm$ align ( :, : ) with B( :, : ) :: A, D + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate( B( N, M ), A( N, M ), C( N, M ), D( N, M ) ) + call serial2( C, N, M, NL ) + + !dvm$ parallel ( i, j ) on A( i, j ) + do i = 1, N + do j = 1, M + A( i, j ) = NL + i + j + B( i, j ) = NL + i + j + D( i, j ) = NL + i + j + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + !dvm$ remote_access( GR1:A( N / 2, M / 2 ) ) + ib1 = A( N / 2, M / 2 ) + + !dvm$ remote_access( GR1:B( N / 2, M ) ) + ib2 = B( N / 2, M ) + + !dvm$ remote_access( GR2:D( N, M / 2 ) ) + ib3 = D( N, M / 2 ) + + !dvm$ remote_access( GR3:D( N / 2, 1 ) ) + ib4 = D( N / 2, 1 ) + + if ( ( ib1 .eq. C( N / 2, M / 2 ) ) .and. ( ib2 .eq. C( N / 2, M ) ) .and. & + ( ib3 .eq. C( N, M / 2 ) ) .and. ( ib4 .eq. C( N / 2, 1 ) ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + if ( it .eq. 2 ) cycle + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D ) +end + +subroutine prf2302 + integer, parameter :: N = 4, M = 4, NL = 1000, NIT = 3 + integer, allocatable :: A( :, : ), B( :, : ), C( :, : ), D( :, : ) + integer, allocatable :: A1( :, : ) + character * 7 :: tname = 'prf2302' + + !dvm$ distribute B( block, block ) + !dvm$ align( :, : ) with B( :, : ) :: A, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate( B( N, M ), A( N, M ), C( N, M ), D( N, M ), A1( N, M ) ) + call serial2( C, N, M, NL ) + + !dvm$ parallel ( i, j ) on A( i, j ) + do i = 1, N + do j = 1, M + A( i, j ) = NL + i + j + A1( i, j ) = NL + i + j + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + isumc1 = 0 + isuma1 = 0 + !dvm$ remote_access ( GR1:A( :, M / 2 ) ) + do i = 1, N + D( i, M / 2 ) = A( i, M / 2 ) + isumc1 = isumc1 + C( i, M / 2 ) + isuma1 = isuma1 + D( i, M / 2 ) + enddo + + isumc2 = 0 + isuma2 = 0 + !dvm$ remote_access ( GR2:A( N / 2, : ) ) + do j = 1, M + D( N / 2, j ) = A( N / 2, j ) + isumc2 = isumc2 + C( N / 2, j ) + isuma2 = isuma2 + D( N / 2, j ) + enddo + + isumc3 = 0 + isuma3 = 0 + ki = 2 + ki1 = 3 + !dvm$ remote_access ( GR3:A1( :, M / 2 ) ) + do i = 1, N / ki - ki1 + D( i, M / 2 ) = A1( ki * i + ki1, M / 2 ) + isumc3 = isumc3 + C( ki * i + ki1, M / 2 ) + isuma3 = isuma3 + D( i, M / 2 ) + enddo + + isumc4 = 0 + isuma4 = 0 + kj = 2 + kj1 = 3 + !dvm$ remote_access ( GR3:A1( N / 2, : ) ) + do j = 1, M/kj-kj1 + D( N / 2, j ) = A1( N / 2, kj * j + kj1 ) + isumc7 = isumc7 + C( N / 2, kj * j + kj1 ) + isuma7 = isuma7 + D( N / 2, j ) + enddo + + if ( ( isumc1 .eq. isuma1 ) .and. ( isumc2 .eq. isuma2 ) .and. ( isumc3 .eq. isuma3 ) .and. & + ( isumc4 .eq. isuma4 ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D, A1 ) +end + +subroutine prf2303 + integer, parameter :: N = 4, M = 4, NL = 1000, NIT = 3 + integer, allocatable :: A( :, : ), B( :, : ), C( :, : ), A1( :, : ) + character * 7 :: tname ='PRF2303' + + !dvm$ distribute B( block, block ) + !dvm$ align( :, : ) with B( :, : ) :: A, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( B( N, M ), A( N, M ), C( N, M ), A1( N, M ) ) + call serial2( C, N, M, NL ) + + !dvm$ parallel ( i, j ) on A( i, j ) + do i = 1, N + do j = 1, M + A( i, j ) = NL + i + j + A1( i, j ) = NL + i + j + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + + nloopi1 = NL + nloopj1 = NL + !dvm$ parallel ( i, J ) on B( i, j ), remote_access( GR1:A( N / 2, M / 2 ) ) + do i = 1, N + do j = 1, M + B( i, j ) = A( N / 2, M / 2 ) + enddo + enddo + !dvm$ parallel ( i, j ) on B( i, j ), reduction( min( nloopi1 ), min( nloopj1 ) ) + do i = 1, N + do j = 1, M + if ( B( i, j ).ne.C( N / 2, M / 2 ) ) then + nloopi1 = min( nloopi1, i ) + nloopj1 = min( nloopj1, j ) + endif + enddo + enddo + + nloopi2 = NL + nloopj2 = NL + !dvm$ parallel ( i, J ) on B( i, j ), remote_access( GR2:A1( :, M / 2 ) ) + do i = 1, N + do j = 1, M + B( i, j ) = A1( i, M / 2 ) + enddo + enddo + !dvm$ parallel ( i, j ) on B( i, j ), reduction( min( nloopi2 ), min( nloopj2 ) ) + do i = 1, N + do j = 1, M + if ( B( i, j ).ne.C( i, M / 2 ) ) then + nloopi2 = min( nloopi2, i ) + nloopj2 = min( nloopj2, j ) + endif + enddo + enddo + + nloopi3 = NL + nloopj3 = NL + !dvm$ parallel ( i, j ) on A( i, j ), remote_access( GR2:A1( N / 2, : ) ) + do i = 1, N + do j = 1, M + B( i, j ) = A1( N / 2, j ) + enddo + enddo + !dvm$ parallel ( i, j ) on A( i, j ), reduction( min( nloopi3 ), min( nloopj3 ) ) + do i = 1, N + do j = 1, M + if ( B( i, j ).ne.C( N / 2, j ) ) then + nloopi3 = min( nloopi3, i ) + nloopj3 = min( nloopj3, j ) + endif + enddo + enddo + + if ( ( nloopi1 .eq. NL ) .and. ( nloopj1 .eq. NL ) .and. & + ( nloopi2 .eq. NL ) .and. ( nloopj2 .eq. NL ) .and. & + ( nloopi3 .eq. NL ) .and. ( nloopj3 .eq. NL ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + !dvm$ reset GR1 + !dvm$ reset GR2 + enddo + + deallocate( A, B, C, A1 ) +end + +subroutine serial2( AR, N, M, NL ) + integer AR( N, M ) + integer NL + do i = 1, N + do j = 1, M + AR( i, j ) = NL + i + j + enddo + enddo +end + +subroutine ansyes( name ) + character * 7 name + print *, name, ' - complete' +end + +subroutine ansno( name ) + character * 7 name + print *, name, ' - ***error' +end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf24.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf24.f90 new file mode 100644 index 0000000..722dcf3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf24.f90 @@ -0,0 +1,268 @@ +program prf24 + !TESTING OF THE PREFETCH DIRECTIVE. + + print *, '===START OF PRF24========================' + + call prf2401 + call prf2402 + call prf2403 + + print *, '===END OF PRF24==========================' +end + +subroutine prf2401 + integer, parameter :: N = 4, M = 4, NL = 1000, NIT = 3 + integer, allocatable :: A( :, : ), B( :, : ), C( :, : ), D( :, : ) + character * 7 :: tname = 'PRF2401' + + !dvm$ distribute B( block, * ) + !dvm$ align ( :, : ) with B( :, : ) :: A, D + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate( B( N, M ), A( N, M ), C( N, M ), D( N, M ) ) + call serial2( C, N, M, NL ) + + !dvm$ parallel ( i, j ) on A( i, j ) + do i = 1, N + do j = 1, M + A( i, j ) = NL + i + j + B( i, j ) = NL + i + j + D( i, j ) = NL + i + j + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + !dvm$ remote_access( GR1:A( N / 2, M / 2 ) ) + ib1 = A( N / 2, M / 2 ) + + !dvm$ remote_access( GR1:B( N / 2, M ) ) + ib2 = B( N / 2, M ) + + !dvm$ remote_access( GR2:D( N, M / 2 ) ) + ib3 = D( N, M / 2 ) + + !dvm$ remote_access( GR3:D( N / 2, 1 ) ) + ib4 = D( N / 2, 1 ) + + if ( ( ib1 .eq. C( N / 2, M / 2 ) ) .and. ( ib2 .eq. C( N / 2, M ) ) .and. & + ( ib3 .eq. C( N, M / 2 ) ) .and. ( ib4 .eq. C( N / 2, 1 ) ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + if ( it .eq. 2 ) cycle + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D ) +end + +subroutine prf2402 + integer, parameter :: N = 4, M = 4, NL = 1000, NIT = 3 + integer, allocatable :: A( :, : ), B( :, : ), C( :, : ), D( :, : ) + integer, allocatable :: A1( :, : ) + character * 7 :: tname = 'PRF2402' + + !dvm$ distribute B( *, block ) + !dvm$ align( :, : ) with B( :, : ) :: A, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate( B( N, M ), A( N, M ), C( N, M ), D( N, M ), A1( N, M ) ) + call serial2( C, N, M, NL ) + + !dvm$ parallel ( i, j ) on A( i, j ) + do i = 1, N + do j = 1, M + A( i, j ) = NL + i + j + A1( i, j ) = NL + i + j + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + isumc1 = 0 + isuma1 = 0 + !dvm$ remote_access ( GR1:A( :, M / 2 ) ) + do i = 1, N + D( i, M / 2 ) = A( i, M / 2 ) + isumc1 = isumc1 + C( i, M / 2 ) + isuma1 = isuma1 + D( i, M / 2 ) + enddo + + isumc2 = 0 + isuma2 = 0 + !dvm$ remote_access ( GR2:A( N / 2, : ) ) + do j = 1, M + D( N / 2, j ) = A( N / 2, j ) + isumc2 = isumc2 + C( N / 2, j ) + isuma2 = isuma2 + D( N / 2, j ) + enddo + + isumc3 = 0 + isuma3 = 0 + ki = 2 + ki1 = 3 + !dvm$ remote_access ( GR3:A1( :, M / 2 ) ) + do i = 1, N / ki - ki1 + D( i, M / 2 ) = A1( ki * i + ki1, M / 2 ) + isumc3 = isumc3 + C( ki * i + ki1, M / 2 ) + isuma3 = isuma3 + D( i, M / 2 ) + enddo + + isumc4 = 0 + isuma4 = 0 + kj = 2 + kj1 = 3 + !dvm$ remote_access ( GR3:A1( N / 2, : ) ) + do j = 1, M/kj-kj1 + D( N / 2, j ) = A1( N / 2, kj * j + kj1 ) + isumc7 = isumc7 + C( N / 2, kj * j + kj1 ) + isuma7 = isuma7 + D( N / 2, j ) + enddo + + if ( ( isumc1 .eq. isuma1 ) .and. ( isumc2 .eq. isuma2 ) .and. ( isumc3 .eq. isuma3 ) .and. & + ( isumc4 .eq. isuma4 ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D, A1 ) +end + +subroutine prf2403 + integer, parameter :: N = 4, M = 4, NL = 1000, NIT = 3 + integer, allocatable :: A( :, : ), B( :, : ), C( :, : ), A1( :, : ) + character * 7 :: tname ='PRF2403' + + !dvm$ distribute B( block, * ) + !dvm$ align( :, : ) with B( :, : ) :: A, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( B( N, M ), A( N, M ), C( N, M ), A1( N, M ) ) + call serial2( C, N, M, NL ) + + !dvm$ parallel ( i, j ) on A( i, j ) + do i = 1, N + do j = 1, M + A( i, j ) = NL + i + j + A1( i, j ) = NL + i + j + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + + nloopi1 = NL + nloopj1 = NL + !dvm$ parallel ( i, j ) on B( i, j ), remote_access( GR1:A( N / 2, M / 2 ) ) + do i = 1, N + do j = 1, M + B( i, j ) = A( N / 2, M / 2 ) + enddo + enddo + !dvm$ parallel ( i, j ) on B( i, j ), reduction( min( nloopi1 ), min( nloopj1 ) ) + do i = 1, N + do j = 1, M + if ( B( i, j ) .ne. C( N / 2, M / 2 ) ) then + nloopi1 = min( nloopi1, i ) + nloopj1 = min( nloopj1, j ) + endif + enddo + enddo + + nloopi2 = NL + nloopj2 = NL + !dvm$ parallel ( i, j ) on B( i, j ), remote_access( GR2:A1( :, M / 2 ) ) + do i = 1, N + do j = 1, M + B( i, j ) = A1( i, M / 2 ) + enddo + enddo + !dvm$ parallel ( i, j ) on B( i, j ), reduction( min( nloopi2 ), min( nloopj2 ) ) + do i = 1, N + do j = 1, M + if ( B( i, j ) .ne. C( i, M / 2 ) ) then + nloopi2 = min( nloopi2, i ) + nloopj2 = min( nloopj2, j ) + endif + enddo + enddo + + nloopi3 = NL + nloopj3 = NL + !dvm$ parallel ( i, j ) on A( i, j ), remote_access( GR2:A1( N / 2, : ) ) + do i = 1, N + do j = 1, M + B( i, j ) = A1( N / 2, j ) + enddo + enddo + !dvm$ parallel ( i, j ) on A( i, j ), reduction( min( nloopi3 ), min( nloopj3 ) ) + do i = 1, N + do j = 1, M + if ( B( i, j ) .ne. C( N / 2, j ) ) then + nloopi3 = min( nloopi3, i ) + nloopj3 = min( nloopj3, j ) + endif + enddo + enddo + + if ( ( nloopi1 .eq. NL ) .and. ( nloopj1 .eq. NL ) .and. & + ( nloopi2 .eq. NL ) .and. ( nloopj2 .eq. NL ) .and. & + ( nloopi3 .eq. NL ) .and. ( nloopj3 .eq. NL ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + !dvm$ reset GR1 + !dvm$ reset GR2 + enddo + + deallocate( A, B, C, A1 ) +end + +subroutine serial2( AR, N, M, NL ) + integer AR( N, M ) + integer NL + do i = 1, N + do j = 1, M + AR( i, j ) = NL + i + j + enddo + enddo +end + +subroutine ansyes( name ) + character * 7 name + print *, name, ' - complete' +end + +subroutine ansno( name ) + character * 7 name + print *, name, ' - ***error' +end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf31.fdv new file mode 100644 index 0000000..c234a8f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf31.fdv @@ -0,0 +1,457 @@ + program PRF31 + +c TESTING OF THE PREFETCH DIRECTIVE. + + print *,'===START OF PRF31========================' +C -------------------------------------------------- + call prf3101 + call prf3102 + call prf3103 +C + print *,'=== END OF PRF31 ========================= ' + end +C ---------------------------------------------------------PRF3101 + subroutine PRF3101 + integer, parameter :: N = 16,M=8,K=8,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),A1(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +cdvm$ distribute B(BLOCK,BLOCK,BLOCK) +cdvm$ align(:,:,:) with B(:,:,:) :: A,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF3101' + allocate (B(N,M,K),A(N,M,K),C(N,M,K),A1(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1,1,1)) + ib1=A(1,1,1) + +cdvm$ remote_access (GR1:A(N,M,K)) + ib2=A(N,M,K) + +cdvm$ remote_access (GR2:A(1,M,K)) + ib3=A(1,M,K) + +cdvm$ remote_access (GR3:A(N,1,K)) + ib4=A(N,1,K) + +cdvm$ remote_access (GR3:A(N,M,1)) + ib5=A(N,M,1) + + if ((ib1 .eq.C(1,1,1)) .and.(ib2 .eq.C(N,M,K)) .and. + * (ib3 .eq.C(1,M,K)) .and.(ib4 .eq.C(N,1,K)) .and. + * (ib5 .eq.C(N,M,1))) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + end + +C ------------------------------------------------------PRF3102 + subroutine PRF3102 + integer, parameter :: N = 16,M=8,K=8,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK) +cdvm$ align(:,:,:) with A(:,:,:) :: B + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF3102' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:,:,:)) + do i=1,N + do j=i,M + do ii=1,K + D(i,j,ii)=A(i,j,ii) + isumc1=isumc1+C(i,j,ii) + isuma1=isuma1+D(i,j,ii) + enddo + enddo + enddo + + isumc2=0 + isuma2=0 + +cdvm$ remote_access (GR1:A(1,:,:)) + do j=1,M + do ii=1,K + D(1,j,ii)=A(1,j,ii) + isumc2=isumc2+C(1,j,ii) + isuma2=isuma2+D(1,j,ii) + enddo + enddo + + isumc3=0 + isuma3=0 + +cdvm$ remote_access (GR1:A(:,M,:)) + do i=1,N + do ii=1,K + D(i,M,ii)=A(i,M,ii) + isumc3=isumc3+C(i,M,ii) + isuma3=isuma3+D(i,M,ii) + enddo + enddo + + isumc4=0 + isuma4=0 + +cdvm$ remote_access (GR2:A(:,:,K)) + do i=1,N + do j=1,M + D(i,j,K)=A(i,j,K) + isumc4=isumc4+C(i,j,K) + isuma4=isuma4+D(i,j,K) + enddo + enddo + + ki=2 + ki1=3 + kj=2 + kj1=3 + kii=2 + kii1=3 + + isumc5=0 + isuma5=0 +cdvm$ remote_access (GR3:A(:,:,:)) + do i=1,N/ki-ki1 + do j=1,M/kj-kj1 + do ii=1,K/kii-kii1 + D(i,j,ii)=A(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isumc5=isumc5+C(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isuma5=isuma5+D(i,j,ii) + enddo + enddo + enddo + if ((isumc1 .eq.isuma1).and.(isumc2 .eq.isuma2).and. + * (isumc3 .eq.isuma3).and.(isumc4 .eq.isuma4).and. + * (isumc5 .eq.isuma5)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + + end +C ------------------------------------------------------PRF3103 + subroutine PRF3103 + integer, parameter :: N = 16,M=8,K=8,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),A1(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK) +cdvm$ align(:,:,:) with A(:,:,:) :: B ,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF3102' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),A1(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + A1(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + nloopi1=NL + nloopj1=NL + nloopii1=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR1:A(1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,1,1) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi1),min(nloopj1),min(nloopii1)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,1,1)) then + nloopi1=min(nloopi1,i) + nloopj1=min(nloopj1,j) + nloopii1=min(nloopii1,ii) + endif + enddo + enddo + enddo + + nloopi2=NL + nloopj2=NL + nloopii2=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR1:A(N,M,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(N,M,K) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$*reduction( min( nloopi2),min(nloopj2),min(nloopii2)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(N,M,K)) then + nloopi2=min(nloopi2,i) + nloopj2=min(nloopj2,j) + nloopii2=min(nloopii2,ii) + endif + enddo + enddo + enddo + + nloopi3=NL + nloopj3=NL + nloopii3=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR2:A) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi3),min(nloopj3),min(nloopii3)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,ii)) then + nloopi3=min(nloopi3,i) + nloopj3=min(nloopj3,j) + nloopii3=min(nloopii3,ii) + endif + enddo + enddo + enddo + + nloopi4=NL + nloopj4=NL + nloopii4=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR2:A(1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,1,1) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi4),min(nloopj4),min(nloopii4)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,1,1)) then + nloopi4=min(nloopi4,i) + nloopj4=min(nloopj4,j) + nloopii4=min(nloopii4,ii) + endif + enddo + enddo + enddo + + nloopi5=NL + nloopj5=NL + nloopii5=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii),remote_access(GR3:A(1,:,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,j,ii) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$*reduction( min( nloopi5),min(nloopj5),min(nloopii5)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,j,ii)) then + nloopi5=min(nloopi5,i) + nloopj5=min(nloopj5,j) + nloopii5=min(nloopii5,ii) + endif + enddo + enddo + enddo + + nloopi6=NL + nloopj6=NL + nloopii6=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR3:A1(:,M,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A1(i,M,ii) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi6),min(nloopj6),min(nloopii6)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,M,ii)) then + nloopi6=min(nloopi6,i) + nloopj6=min(nloopj6,j) + nloopii6=min(nloopii6,ii) + endif + enddo + enddo + enddo + + nloopi7=NL + nloopj7=NL + nloopii7=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*remote_access(GR3:A1(:,:,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A1(i,j,K) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction( min( nloopi7),min(nloopj7),min(nloopii7)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,K)) then + nloopi7=min(nloopi7,i) + nloopj7=min(nloopj7,j) + nloopii7=min(nloopii7,ii) + endif + enddo + enddo + enddo + if ((nloopi1 .eq.NL).and.(nloopi2 .eq.NL).and. + * (nloopi3 .eq.NL).and. (nloopi4 .eq.NL).and. + * (nloopi5 .eq.NL).and.(nloopi6 .eq.NL).and. + * (nloopi7 .eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + enddo + deallocate (A,B,C,A1) + end + + + +C --------------------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do 10 i=1,N + do 10 j=1,M + do 10 ii=1,K + 10 AR(i,j,ii) = NL+i+j+ii + + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf32.fdv new file mode 100644 index 0000000..ab289e8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf32.fdv @@ -0,0 +1,457 @@ + program PRF32 + +c TESTING OF THE PREFETCH DIRECTIVE. + + print *,'===START OF PRF32========================' +C -------------------------------------------------- + call prf3201 + call prf3202 + call prf3203 +C + print *,'=== END OF PRF32 ========================= ' + end +C ---------------------------------------------------------PRF3201 + subroutine PRF3201 + integer, parameter :: N = 16,M=8,K=8,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),A1(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +cdvm$ distribute B(BLOCK,BLOCK,*) +cdvm$ align(:,:,:) with B(:,:,:) :: A,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF3201' + allocate (B(N,M,K),A(N,M,K),C(N,M,K),A1(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1,1,1)) + ib1=A(1,1,1) + +cdvm$ remote_access (GR1:A(N,M,K)) + ib2=A(N,M,K) + +cdvm$ remote_access (GR2:A(1,M,K)) + ib3=A(1,M,K) + +cdvm$ remote_access (GR3:A(N,1,K)) + ib4=A(N,1,K) + +cdvm$ remote_access (GR3:A(N,M,1)) + ib5=A(N,M,1) + + if ((ib1 .eq.C(1,1,1)) .and.(ib2 .eq.C(N,M,K)) .and. + * (ib3 .eq.C(1,M,K)) .and.(ib4 .eq.C(N,1,K)) .and. + * (ib5 .eq.C(N,M,1))) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + end + +C ------------------------------------------------------PRF3202 + subroutine PRF3202 + integer, parameter :: N = 16,M=8,K=8,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +cdvm$ distribute A(BLOCK,*,BLOCK) +cdvm$ align(:,:,:) with A(:,:,:) :: B + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF3202' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:,:,:)) + do i=1,N + do j=i,M + do ii=1,K + D(i,j,ii)=A(i,j,ii) + isumc1=isumc1+C(i,j,ii) + isuma1=isuma1+D(i,j,ii) + enddo + enddo + enddo + + isumc2=0 + isuma2=0 + +cdvm$ remote_access (GR1:A(1,:,:)) + do j=1,M + do ii=1,K + D(1,j,ii)=A(1,j,ii) + isumc2=isumc2+C(1,j,ii) + isuma2=isuma2+D(1,j,ii) + enddo + enddo + + isumc3=0 + isuma3=0 + +cdvm$ remote_access (GR1:A(:,M,:)) + do i=1,N + do ii=1,K + D(i,M,ii)=A(i,M,ii) + isumc3=isumc3+C(i,M,ii) + isuma3=isuma3+D(i,M,ii) + enddo + enddo + + isumc4=0 + isuma4=0 + +cdvm$ remote_access (GR2:A(:,:,K)) + do i=1,N + do j=1,M + D(i,j,K)=A(i,j,K) + isumc4=isumc4+C(i,j,K) + isuma4=isuma4+D(i,j,K) + enddo + enddo + + ki=2 + ki1=3 + kj=2 + kj1=3 + kii=2 + kii1=3 + + isumc5=0 + isuma5=0 +cdvm$ remote_access (GR3:A(:,:,:)) + do i=1,N/ki-ki1 + do j=1,M/kj-kj1 + do ii=1,K/kii-kii1 + D(i,j,ii)=A(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isumc5=isumc5+C(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isuma5=isuma5+D(i,j,ii) + enddo + enddo + enddo + if ((isumc1 .eq.isuma1).and.(isumc2 .eq.isuma2).and. + * (isumc3 .eq.isuma3).and.(isumc4 .eq.isuma4).and. + * (isumc5 .eq.isuma5)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + + end +C ------------------------------------------------------PRF3203 + subroutine PRF3203 + integer, parameter :: N = 16,M=8,K=8,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),A1(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +cdvm$ distribute A(*,BLOCK,BLOCK) +cdvm$ align(:,:,:) with A(:,:,:) :: B ,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF3202' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),A1(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + A1(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + nloopi1=NL + nloopj1=NL + nloopii1=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR1:A(1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,1,1) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi1),min(nloopj1),min(nloopii1)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,1,1)) then + nloopi1=min(nloopi1,i) + nloopj1=min(nloopj1,j) + nloopii1=min(nloopii1,ii) + endif + enddo + enddo + enddo + + nloopi2=NL + nloopj2=NL + nloopii2=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR1:A(N,M,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(N,M,K) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$*reduction( min( nloopi2),min(nloopj2),min(nloopii2)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(N,M,K)) then + nloopi2=min(nloopi2,i) + nloopj2=min(nloopj2,j) + nloopii2=min(nloopii2,ii) + endif + enddo + enddo + enddo + + nloopi3=NL + nloopj3=NL + nloopii3=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR2:A) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi3),min(nloopj3),min(nloopii3)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,ii)) then + nloopi3=min(nloopi3,i) + nloopj3=min(nloopj3,j) + nloopii3=min(nloopii3,ii) + endif + enddo + enddo + enddo + + nloopi4=NL + nloopj4=NL + nloopii4=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR2:A(1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,1,1) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi4),min(nloopj4),min(nloopii4)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,1,1)) then + nloopi4=min(nloopi4,i) + nloopj4=min(nloopj4,j) + nloopii4=min(nloopii4,ii) + endif + enddo + enddo + enddo + + nloopi5=NL + nloopj5=NL + nloopii5=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii),remote_access(GR3:A(1,:,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,j,ii) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$*reduction( min( nloopi5),min(nloopj5),min(nloopii5)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,j,ii)) then + nloopi5=min(nloopi5,i) + nloopj5=min(nloopj5,j) + nloopii5=min(nloopii5,ii) + endif + enddo + enddo + enddo + + nloopi6=NL + nloopj6=NL + nloopii6=NL + +*dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(GR3:A1(:,M,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A1(i,M,ii) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii), +*dvm$* reduction( min( nloopi6),min(nloopj6),min(nloopii6)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,M,ii)) then + nloopi6=min(nloopi6,i) + nloopj6=min(nloopj6,j) + nloopii6=min(nloopii6,ii) + endif + enddo + enddo + enddo + + nloopi7=NL + nloopj7=NL + nloopii7=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*remote_access(GR3:A1(:,:,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A1(i,j,K) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction( min( nloopi7),min(nloopj7),min(nloopii7)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,K)) then + nloopi7=min(nloopi7,i) + nloopj7=min(nloopj7,j) + nloopii7=min(nloopii7,ii) + endif + enddo + enddo + enddo + if ((nloopi1 .eq.NL).and.(nloopi2 .eq.NL).and. + * (nloopi3 .eq.NL).and. (nloopi4 .eq.NL).and. + * (nloopi5 .eq.NL).and.(nloopi6 .eq.NL).and. + * (nloopi7 .eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + enddo + deallocate (A,B,C,A1) + end + + + +C --------------------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do 10 i=1,N + do 10 j=1,M + do 10 ii=1,K + 10 AR(i,j,ii) = NL+i+j+ii + + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf33.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf33.f90 new file mode 100644 index 0000000..85e3c90 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf33.f90 @@ -0,0 +1,326 @@ +program prf33 + !TESTING OF THE PREFETCH DIRECTIVE. + + print *, '===START OF PRF33========================' + + call prf3301 + call prf3302 + call prf3303 + + print *, '===END OF PRF33==========================' +end + +subroutine prf3301 + integer, parameter :: N = 16, M = 8, K = 8, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, : ), B( :, :, : ), C( :, :, : ) + character * 7 :: tname = 'PRF3301' + + !dvm$ distribute B( block, block, block ) + !dvm$ align( :, :, : ) with B( :, :, : ) :: A + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( B( N, M, K ), A( N, M, K ), C( N, M, K ) ) + call serial3( C, N, M, K, NL ) + + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ) + do i = 1, N + do j = 1, M + do ii = 1, K + A( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + !dvm$ remote_access ( GR1:A( N / 2, M / 2, K / 2 ) ) + ib1 = A( N / 2, M / 2, K / 2 ) + + !dvm$ remote_access ( GR1:A( N / 2, M, K ) ) + ib2 = A( N / 2, M, K ) + + !dvm$ remote_access ( GR2:A( N, M / 2, K ) ) + ib3 = A( N, M / 2, K ) + + !dvm$ remote_access ( GR2:A( N, M, K / 2 ) ) + ib4 = A( N, M, K / 2 ) + + !dvm$ remote_access ( GR3:A( N / 2, M, 1 ) ) + ib5 = A( N / 2, M, 1 ) + + if ( ( ib1 .eq. C( N / 2, M / 2, K / 2 ) ) .and. ( ib2 .eq. C( N / 2, M, K ) ) .and. & + ( ib3 .eq. C( N, M / 2, K ) ) .and. ( ib4 .eq. C( N, M, K / 2 ) ) .and. & + ( ib5 .eq. C( N / 2, M, 1 ) ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C ) +end + +subroutine prf3302 + integer, parameter :: N = 16, M = 8, K = 8, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, : ), B( :, :, : ), C( :, :, : ), D( :, :, : ) + character * 7 :: tname = 'PRF3302' + + !dvm$ distribute A( block, block, block ) + !dvm$ align( :, :, : ) with A( :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K ), B( N, M, K ), C( N, M, K ), D( N, M, K ) ) + call serial3( C, N, M, K, NL ) + + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ) + do i = 1, N + do j = 1, M + do ii = 1, K + A( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + isumc1 = 0 + isuma1 = 0 + !dvm$ remote_access ( GR1:A( N / 2, :, : ) ) + do j = 1, M + do ii = 1, K + D( N / 2, j, ii ) = A( N / 2, j, ii ) + isumc1 = isumc1 + C( N / 2, j, ii ) + isuma1 = isuma1 + D( N / 2, j, ii ) + enddo + enddo + + isumc2 = 0 + isuma2 = 0 + !dvm$ remote_access ( GR1:A( :, M / 2, : ) ) + do i = 1, N + do ii = 1, K + D( i, M / 2, ii ) = A( i, M / 2, ii ) + isumc2 = isumc2 + C( i, M / 2, ii ) + isuma2 = isuma2 + D( i, M / 2, ii ) + enddo + enddo + + isumc3 = 0 + isuma3 = 0 + !dvm$ remote_access ( GR2:A( :, :, K / 2 ) ) + do i = 1, N + do j = 1, M + D( i, j, K / 2 ) = A( i, j, K / 2 ) + isumc3 = isumc3 + C( i, j, K / 2 ) + isuma3 = isuma3 + D( i, j, K / 2 ) + enddo + enddo + + isumc4 = 0 + isuma4 = 0 + kj = 2 + kj1 = 3 + kii = 2 + kii1 = 3 + !dvm$ remote_access ( GR3:A( N / 2, :, : ) ) + do j = 1, M / kj-kj1 + do ii = 1, K / kii-kii1 + D( N / 2, j, ii ) = A( N / 2, kj * j + kj1, kii * ii + kii1 ) + isumc4 = isumc4 + C( N / 2, kj * j + kj1, kii * ii + kii1 ) + isuma4 = isuma4 + D( N / 2, j, ii ) + enddo + enddo + + if ( ( isumc1 .eq. isuma1 ) .and. ( isumc2 .eq. isuma2 ) .and. & + ( isumc3 .eq. isuma3 ) .and. ( isumc4 .eq. isuma4 ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D ) +end + +subroutine prf3303 + integer, parameter :: N = 16, M = 8, K = 8, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, : ), B( :, :, : ), C( :, :, : ), A1( :, :, : ) + character * 7 :: tname = 'PRF3303' + + !dvm$ distribute A( block, block, block ) + !dvm$ align( :, :, : ) with A( :, :, : ) :: B, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K ), B( N, M, K ), C( N, M, K ), A1( N, M, K ) ) + call serial3( C, N, M, K, NL ) + + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ) + do i = 1, N + do j = 1, M + do ii = 1, K + A( i, j, ii ) = NL + i + j + ii + A1( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + + nloopi1 = NL + nloopj1 = NL + nloopii1 = NL + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), remote_access( GR1:A( N / 2, M / 2, K / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A( N / 2, M / 2, K / 2 ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), reduction( min( nloopi1 ), min( nloopj1 ), min( nloopii1 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( N / 2, M / 2, K / 2 ) ) then + nloopi1 = min( nloopi1, i ) + nloopj1 = min( nloopj1, j ) + nloopii1 = min( nloopii1, ii ) + endif + enddo + enddo + enddo + + nloopi2 = NL + nloopj2 = NL + nloopii2 = NL + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ), remote_access( GR1:A( N / 2, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A( N / 2, j, ii ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), reduction( min( nloopi2 ), min( nloopj2 ), min( nloopii2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( N / 2, j, ii ) ) then + nloopi2 = min( nloopi2, i ) + nloopj2 = min( nloopj2, j ) + nloopii2 = min( nloopii2, ii ) + endif + enddo + enddo + enddo + + nloopi3 = NL + nloopj3 = NL + nloopii3 = NL + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), remote_access( GR2:A1( :, M / 2, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A1( i, M / 2, ii ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), reduction( min( nloopi3 ), min( nloopj3 ), min( nloopii3 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( i, M / 2, ii ) ) then + nloopi3 = min( nloopi3, i ) + nloopj3 = min( nloopj3, j ) + nloopii3 = min( nloopii3, ii ) + endif + enddo + enddo + enddo + + nloopi4 = NL + nloopj4 = NL + nloopii4 = NL + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ), remote_access( GR2:A1( :, :, K / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A1( i, j, K / 2 ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ), reduction( min( nloopi4 ), min( nloopj4 ), min( nloopii4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( i, j, K / 2 ) ) then + nloopi4 = min( nloopi4, i ) + nloopj4 = min( nloopj4, j ) + nloopii4 = min( nloopii4, ii ) + endif + enddo + enddo + enddo + + if ( ( nloopi1 .eq. NL ) .and. ( nloopi2 .eq. NL ) .and. & + ( nloopi3 .eq. NL ) .and. ( nloopi4 .eq. NL ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + enddo + deallocate( A, B, C, A1 ) +end + +subroutine serial3( AR, N, M, K, NL ) + integer AR( N, M, K ) + integer NL + do i = 1, N + do j = 1, M + do ii = 1, K + AR( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo +end + +subroutine ansyes( name ) + character * 7 name + print *, name, ' - complete' +end + +subroutine ansno( name ) + character * 7 name + print *, name, ' - ***error' +end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf34.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf34.f90 new file mode 100644 index 0000000..76f70e2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf34.f90 @@ -0,0 +1,326 @@ +program prf34 + !TESTING OF THE PREFETCH DIRECTIVE. + + print *, '===START OF PRF34========================' + + call prf3401 + call prf3402 + call prf3403 + + print *, '===END OF PRF34==========================' +end + +subroutine prf3401 + integer, parameter :: N = 16, M = 8, K = 8, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, : ), B( :, :, : ), C( :, :, : ) + character * 7 :: tname = 'PRF3401' + + !dvm$ distribute B( block, block, * ) + !dvm$ align( :, :, : ) with B( :, :, : ) :: A + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( B( N, M, K ), A( N, M, K ), C( N, M, K ) ) + call serial3( C, N, M, K, NL ) + + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ) + do i = 1, N + do j = 1, M + do ii = 1, K + A( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + !dvm$ remote_access ( GR1:A( N / 2, M / 2, K / 2 ) ) + ib1 = A( N / 2, M / 2, K / 2 ) + + !dvm$ remote_access ( GR1:A( N / 2, M, K ) ) + ib2 = A( N / 2, M, K ) + + !dvm$ remote_access ( GR2:A( N, M / 2, K ) ) + ib3 = A( N, M / 2, K ) + + !dvm$ remote_access ( GR2:A( N, M, K / 2 ) ) + ib4 = A( N, M, K / 2 ) + + !dvm$ remote_access ( GR3:A( N / 2, M, 1 ) ) + ib5 = A( N / 2, M, 1 ) + + if ( ( ib1 .eq. C( N / 2, M / 2, K / 2 ) ) .and. ( ib2 .eq. C( N / 2, M, K ) ) .and. & + ( ib3 .eq. C( N, M / 2, K ) ) .and. ( ib4 .eq. C( N, M, K / 2 ) ) .and. & + ( ib5 .eq. C( N / 2, M, 1 ) ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C ) +end + +subroutine prf3402 + integer, parameter :: N = 16, M = 8, K = 8, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, : ), B( :, :, : ), C( :, :, : ), D( :, :, : ) + character * 7 :: tname = 'PRF3402' + + !dvm$ distribute A( block, *, block ) + !dvm$ align( :, :, : ) with A( :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K ), B( N, M, K ), C( N, M, K ), D( N, M, K ) ) + call serial3( C, N, M, K, NL ) + + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ) + do i = 1, N + do j = 1, M + do ii = 1, K + A( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + isumc1 = 0 + isuma1 = 0 + !dvm$ remote_access ( GR1:A( N / 2, :, : ) ) + do j = 1, M + do ii = 1, K + D( N / 2, j, ii ) = A( N / 2, j, ii ) + isumc1 = isumc1 + C( N / 2, j, ii ) + isuma1 = isuma1 + D( N / 2, j, ii ) + enddo + enddo + + isumc2 = 0 + isuma2 = 0 + !dvm$ remote_access ( GR1:A( :, M / 2, : ) ) + do i = 1, N + do ii = 1, K + D( i, M / 2, ii ) = A( i, M / 2, ii ) + isumc2 = isumc2 + C( i, M / 2, ii ) + isuma2 = isuma2 + D( i, M / 2, ii ) + enddo + enddo + + isumc3 = 0 + isuma3 = 0 + !dvm$ remote_access ( GR2:A( :, :, K / 2 ) ) + do i = 1, N + do j = 1, M + D( i, j, K / 2 ) = A( i, j, K / 2 ) + isumc3 = isumc3 + C( i, j, K / 2 ) + isuma3 = isuma3 + D( i, j, K / 2 ) + enddo + enddo + + isumc4 = 0 + isuma4 = 0 + kj = 2 + kj1 = 3 + kii = 2 + kii1 = 3 + !dvm$ remote_access ( GR3:A( N / 2, :, : ) ) + do j = 1, M / kj-kj1 + do ii = 1, K / kii-kii1 + D( N / 2, j, ii ) = A( N / 2, kj * j + kj1, kii * ii + kii1 ) + isumc4 = isumc4 + C( N / 2, kj * j + kj1, kii * ii + kii1 ) + isuma4 = isuma4 + D( N / 2, j, ii ) + enddo + enddo + + if ( ( isumc1 .eq. isuma1 ) .and. ( isumc2 .eq. isuma2 ) .and. & + ( isumc3 .eq. isuma3 ) .and. ( isumc4 .eq. isuma4 ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D ) +end + +subroutine prf3403 + integer, parameter :: N = 16, M = 8, K = 8, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, : ), B( :, :, : ), C( :, :, : ), A1( :, :, : ) + character * 7 :: tname = 'PRF3403' + + !dvm$ distribute A( *, block, block ) + !dvm$ align( :, :, : ) with A( :, :, : ) :: B, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K ), B( N, M, K ), C( N, M, K ), A1( N, M, K ) ) + call serial3( C, N, M, K, NL ) + + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ) + do i = 1, N + do j = 1, M + do ii = 1, K + A( i, j, ii ) = NL + i + j + ii + A1( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + + nloopi1 = NL + nloopj1 = NL + nloopii1 = NL + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), remote_access( GR1:A( N / 2, M / 2, K / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A( N / 2, M / 2, K / 2 ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), reduction( min( nloopi1 ), min( nloopj1 ), min( nloopii1 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( N / 2, M / 2, K / 2 ) ) then + nloopi1 = min( nloopi1, i ) + nloopj1 = min( nloopj1, j ) + nloopii1 = min( nloopii1, ii ) + endif + enddo + enddo + enddo + + nloopi2 = NL + nloopj2 = NL + nloopii2 = NL + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ), remote_access( GR1:A( N / 2, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A( N / 2, j, ii ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), reduction( min( nloopi2 ), min( nloopj2 ), min( nloopii2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( N / 2, j, ii ) ) then + nloopi2 = min( nloopi2, i ) + nloopj2 = min( nloopj2, j ) + nloopii2 = min( nloopii2, ii ) + endif + enddo + enddo + enddo + + nloopi3 = NL + nloopj3 = NL + nloopii3 = NL + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), remote_access( GR2:A1( :, M / 2, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A1( i, M / 2, ii ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on B( i, j, ii ), reduction( min( nloopi3 ), min( nloopj3 ), min( nloopii3 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( i, M / 2, ii ) ) then + nloopi3 = min( nloopi3, i ) + nloopj3 = min( nloopj3, j ) + nloopii3 = min( nloopii3, ii ) + endif + enddo + enddo + enddo + + nloopi4 = NL + nloopj4 = NL + nloopii4 = NL + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ), remote_access( GR2:A1( :, :, K / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + B( i, j, ii ) = A1( i, j, K / 2 ) + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii ) on A( i, j, ii ), reduction( min( nloopi4 ), min( nloopj4 ), min( nloopii4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + if ( B( i, j, ii ) .ne. C( i, j, K / 2 ) ) then + nloopi4 = min( nloopi4, i ) + nloopj4 = min( nloopj4, j ) + nloopii4 = min( nloopii4, ii ) + endif + enddo + enddo + enddo + + if ( ( nloopi1 .eq. NL ) .and. ( nloopi2 .eq. NL ) .and. & + ( nloopi3 .eq. NL ) .and. ( nloopi4 .eq. NL ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + enddo + deallocate( A, B, C, A1 ) +end + +subroutine serial3( AR, N, M, K, NL ) + integer AR( N, M, K ) + integer NL + do i = 1, N + do j = 1, M + do ii = 1, K + AR( i, j, ii ) = NL + i + j + ii + enddo + enddo + enddo +end + +subroutine ansyes( name ) + character * 7 name + print *, name, ' - complete' +end + +subroutine ansno( name ) + character * 7 name + print *, name, ' - ***error' +end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf41.fdv new file mode 100644 index 0000000..24fb9cd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf41.fdv @@ -0,0 +1,525 @@ + program PRF41 + +c TESTING OF THE PREFETCH DIRECTIVE. + + print *,'===START OF PRF41========================' +C -------------------------------------------------- + call prf4101 + call prf4102 + call prf4103 +C + print *,'=== END OF PRF41 ========================= ' + end +C ---------------------------------------------------------PRF4101 + subroutine PRF4101 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),A1(:,:,:,:) + character*7 tname + +cdvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ align(:,:,:,:) with B(:,:,:,:) :: A,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4101' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L),A1(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + A1(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1,1,1,1)) + ib1=A(1,1,1,1) + +cdvm$ remote_access (GR1:A(N,M,K,L)) + ib2=A(N,M,K,L) + +cdvm$ remote_access (GR2:A(1,M,K,L)) + ib3=A(1,M,K,L) + +cdvm$ remote_access (GR3:A(N,1,K,L)) + ib4=A(N,1,K,L) + +cdvm$ remote_access (GR3:A(N,M,1,L)) + ib5=A(N,M,1,L) + +cdvm$ remote_access (GR3:A1(N,M,K,1)) + ib6=A1(N,M,K,1) + + if ((ib1 .eq.C(1,1,1,1)) .and.(ib2 .eq.C(N,M,K,L)) .and. + * (ib3 .eq.C(1,M,K,L)) .and.(ib4 .eq.C(N,1,K,L)) .and. + * (ib5 .eq.C(N,M,1,L)).and.(ib6 .eq.C(N,M,K,1))) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + + end + +C ------------------------------------------------------PRF4102 + subroutine PRF4102 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),D(:,:,:,:) + character*7 tname + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ align(:,:,:,:) with A(:,:,:,:) :: B + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4102' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:,:,:,:)) + do i=1,N + do j=i,M + do ii=1,K + do jj=1,L + D(i,j,ii,jj)=A(i,j,ii,jj) + isumc1=isumc1+C(i,j,ii,jj) + isuma1=isuma1+D(i,j,ii,jj) + enddo + enddo + enddo + enddo + + isumc2=0 + isuma2=0 + +cdvm$ remote_access (GR1:A(1,:,:,:)) + do j=1,M + do ii=1,K + do jj=1,L + D(1,j,ii,jj)=A(1,j,ii,jj) + isumc2=isumc2+C(1,j,ii,jj) + isuma2=isuma2+D(1,j,ii,jj) + enddo + enddo + enddo + + isumc3=0 + isuma3=0 + +cdvm$ remote_access (GR2:A(:,M,:,:)) + do i=1,N + do ii=1,K + do jj=1,L + D(i,M,ii,jj)=A(i,M,ii,jj) + isumc3=isumc3+C(i,M,ii,jj) + isuma3=isuma3+D(i,M,ii,jj) + enddo + enddo + enddo + + isumc4=0 + isuma4=0 + +cdvm$ remote_access (GR3:A(:,:,K,:)) + do i=1,N + do j=1,M + do jj=1,L + D(i,j,K,jj)=A(i,j,K,jj) + isumc4=isumc4+C(i,j,K,jj) + isuma4=isuma4+D(i,j,K,jj) + enddo + enddo + enddo + + isumc5=0 + isuma5=0 + +cdvm$ remote_access (GR3:A(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + D(i,j,ii,L)=A(i,j,ii,L) + isumc5=isumc5+C(i,j,ii,L) + isuma5=isuma5+D(i,j,ii,L) + enddo + enddo + enddo + + if ((isumc1 .eq.isuma1).and.(isumc2 .eq.isuma2).and. + * (isumc3 .eq.isuma3).and.(isumc4 .eq.isuma4).and. + * (isumc5 .eq.isuma5)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + + end + +C ------------------------------------------------------PRF4103 + subroutine PRF4103 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),A1(:,:,:,:) + character*7 tname + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ align(:,:,:,:) with A(:,:,:,:) :: B,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4103' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),A1(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + A1(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + + nloopi1=NL + nloopj1=NL + nloopii1=NL + nloopjj1=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR1:A(1,1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,1,1,1) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi1),min(nloopj1),min(nloopii1), +*dvm$* min(nloopjj1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,1,1,1)) then + nloopi1=min(nloopi1,i) + nloopj1=min(nloopj1,j) + nloopii1=min(nloopii1,ii) + nloopjj1=min(nloopjj1,jj) + endif + enddo + enddo + enddo + enddo + + nloopi2=NL + nloopj2=NL + nloopii2=NL + nloopjj2=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(GR1:A(N,M,K,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(N,M,K,L) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi2),min(nloopj2),min(nloopii2),min(nloopjj2)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(N,M,K,L)) then + nloopi2=min(nloopi2,i) + nloopj2=min(nloopj2,j) + nloopii2=min(nloopii2,ii) + nloopjj2=min(nloopjj2,jj) + endif + enddo + enddo + enddo + enddo + + nloopi3=NL + nloopj3=NL + nloopii3=NL + nloopjj3=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(GR2:A) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi3),min(nloopj3),min(nloopii3), +*dvm$* min(nloopjj3)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi3=min(nloopi3,i) + nloopj3=min(nloopj3,j) + nloopii3=min(nloopii3,ii) + nloopjj3=min(nloopjj3,jj) + endif + enddo + enddo + enddo + enddo + + nloopi4=NL + nloopj4=NL + nloopii4=NL + nloopjj4=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),remote_access(GR2:A(1,:,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,j,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi4),min(nloopj4),min(nloopii4), +*dvm$*min(nlooopjj4)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,j,ii,jj)) then + nloopi4=min(nloopi4,i) + nloopj4=min(nloopj4,j) + nloopii4=min(nloopii4,ii) + nloopjj4=min(nloopjj4,jj) + endif + enddo + enddo + enddo + enddo + + nloopi5=NL + nloopj5=NL + nloopii5=NL + nloopjj5=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A(:,M,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,M,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi5),min(nloopj5),min(nloopii5), +*dvm$* min(nloopjj5)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,M,ii,jj)) then + nloopi5=min(nloopi5,i) + nloopj5=min(nloopj5,j) + nloopii5=min(nloopii5,ii) + nloopjj5=min(nloopjj5,jj) + endif + enddo + enddo + enddo + enddo + + nloopi6=NL + nloopj6=NL + nloopii6=NL + nloopjj6=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A1(:,:,K,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A1(i,j,K,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi6),min(nloopj6),min(nloopii6),min(nloopjj6)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,K,jj)) then + nloopi6=min(nloopi6,i) + nloopj6=min(nloopj6,j) + nloopii6=min(nloopii6,ii) + nloopjj6=min(nloopjj6,jj) + endif + enddo + enddo + enddo + enddo + + nloopi7=NL + nloopj7=NL + nloopii7=NL + nloopjj7=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A1(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A1(i,j,ii,L) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi7),min(nloopj7),min(nloopii7),min(nloopjj7)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,L)) then + nloopi7=min(nloopi7,i) + nloopj7=min(nloopj7,j) + nloopii7=min(nloopii7,ii) + nloopjj7=min(nloopjj7,jj) + endif + enddo + enddo + enddo + enddo + + if ((nloopi1 .eq.NL).and.(nloopi2 .eq.NL).and. + * (nloopi3 .eq.NL).and. (nloopi4 .eq.NL).and. + * (nloopi5 .eq.NL).and.(nloopi6 .eq.NL).and. + * (nloopi7 .eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + + end + +C --------------------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf42.fdv new file mode 100644 index 0000000..745109f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf42.fdv @@ -0,0 +1,525 @@ + program PRF42 + +c TESTING OF THE PREFETCH DIRECTIVE. + + print *,'===START OF PRF42========================' +C -------------------------------------------------- + call prf4201 + call prf4202 + call prf4203 +C + print *,'=== END OF PRF42 ========================= ' + end +C ---------------------------------------------------------PRF4201 + subroutine PRF4201 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),A1(:,:,:,:) + character*7 tname + +cdvm$ distribute B(*,*,*,*) +cdvm$ align(:,:,:,:) with B(:,:,:,:) :: A,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4201' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L),A1(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + A1(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1,1,1,1)) + ib1=A(1,1,1,1) + +cdvm$ remote_access (GR1:A(N,M,K,L)) + ib2=A(N,M,K,L) + +cdvm$ remote_access (GR2:A(1,M,K,L)) + ib3=A(1,M,K,L) + +cdvm$ remote_access (GR3:A(N,1,K,L)) + ib4=A(N,1,K,L) + +cdvm$ remote_access (GR3:A(N,M,1,L)) + ib5=A(N,M,1,L) + +cdvm$ remote_access (GR3:A1(N,M,K,1)) + ib6=A1(N,M,K,1) + + if ((ib1 .eq.C(1,1,1,1)) .and.(ib2 .eq.C(N,M,K,L)) .and. + * (ib3 .eq.C(1,M,K,L)) .and.(ib4 .eq.C(N,1,K,L)) .and. + * (ib5 .eq.C(N,M,1,L)).and.(ib6 .eq.C(N,M,K,1))) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + + end + +C ------------------------------------------------------PRF4202 + subroutine PRF4202 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),D(:,:,:,:) + character*7 tname + +cdvm$ distribute A(*,*,*,*) +cdvm$ align(:,:,:,:) with A(:,:,:,:) :: B + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4202' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:,:,:,:)) + do i=1,N + do j=i,M + do ii=1,K + do jj=1,L + D(i,j,ii,jj)=A(i,j,ii,jj) + isumc1=isumc1+C(i,j,ii,jj) + isuma1=isuma1+D(i,j,ii,jj) + enddo + enddo + enddo + enddo + + isumc2=0 + isuma2=0 + +cdvm$ remote_access (GR1:A(1,:,:,:)) + do j=1,M + do ii=1,K + do jj=1,L + D(1,j,ii,jj)=A(1,j,ii,jj) + isumc2=isumc2+C(1,j,ii,jj) + isuma2=isuma2+D(1,j,ii,jj) + enddo + enddo + enddo + + isumc3=0 + isuma3=0 + +cdvm$ remote_access (GR2:A(:,M,:,:)) + do i=1,N + do ii=1,K + do jj=1,L + D(i,M,ii,jj)=A(i,M,ii,jj) + isumc3=isumc3+C(i,M,ii,jj) + isuma3=isuma3+D(i,M,ii,jj) + enddo + enddo + enddo + + isumc4=0 + isuma4=0 + +cdvm$ remote_access (GR3:A(:,:,K,:)) + do i=1,N + do j=1,M + do jj=1,L + D(i,j,K,jj)=A(i,j,K,jj) + isumc4=isumc4+C(i,j,K,jj) + isuma4=isuma4+D(i,j,K,jj) + enddo + enddo + enddo + + isumc5=0 + isuma5=0 + +cdvm$ remote_access (GR3:A(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + D(i,j,ii,L)=A(i,j,ii,L) + isumc5=isumc5+C(i,j,ii,L) + isuma5=isuma5+D(i,j,ii,L) + enddo + enddo + enddo + + if ((isumc1 .eq.isuma1).and.(isumc2 .eq.isuma2).and. + * (isumc3 .eq.isuma3).and.(isumc4 .eq.isuma4).and. + * (isumc5 .eq.isuma5)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + + end + +C ------------------------------------------------------PRF4203 + subroutine PRF4203 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),A1(:,:,:,:) + character*7 tname + +cdvm$ distribute A(*,*,*,*) +cdvm$ align(:,:,:,:) with A(:,:,:,:) :: B,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4203' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),A1(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + A1(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + + nloopi1=NL + nloopj1=NL + nloopii1=NL + nloopjj1=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR1:A(1,1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,1,1,1) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi1),min(nloopj1),min(nloopii1), +*dvm$* min(nloopjj1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,1,1,1)) then + nloopi1=min(nloopi1,i) + nloopj1=min(nloopj1,j) + nloopii1=min(nloopii1,ii) + nloopjj1=min(nloopjj1,jj) + endif + enddo + enddo + enddo + enddo + + nloopi2=NL + nloopj2=NL + nloopii2=NL + nloopjj2=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(GR1:A(N,M,K,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(N,M,K,L) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi2),min(nloopj2),min(nloopii2),min(nloopjj2)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(N,M,K,L)) then + nloopi2=min(nloopi2,i) + nloopj2=min(nloopj2,j) + nloopii2=min(nloopii2,ii) + nloopjj2=min(nloopjj2,jj) + endif + enddo + enddo + enddo + enddo + + nloopi3=NL + nloopj3=NL + nloopii3=NL + nloopjj3=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(GR2:A) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi3),min(nloopj3),min(nloopii3), +*dvm$* min(nloopjj3)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi3=min(nloopi3,i) + nloopj3=min(nloopj3,j) + nloopii3=min(nloopii3,ii) + nloopjj3=min(nloopjj3,jj) + endif + enddo + enddo + enddo + enddo + + nloopi4=NL + nloopj4=NL + nloopii4=NL + nloopjj4=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),remote_access(GR2:A(1,:,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,j,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi4),min(nloopj4),min(nloopii4), +*dvm$*min(nlooopjj4)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,j,ii,jj)) then + nloopi4=min(nloopi4,i) + nloopj4=min(nloopj4,j) + nloopii4=min(nloopii4,ii) + nloopjj4=min(nloopjj4,jj) + endif + enddo + enddo + enddo + enddo + + nloopi5=NL + nloopj5=NL + nloopii5=NL + nloopjj5=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A(:,M,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,M,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi5),min(nloopj5),min(nloopii5), +*dvm$* min(nloopjj5)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,M,ii,jj)) then + nloopi5=min(nloopi5,i) + nloopj5=min(nloopj5,j) + nloopii5=min(nloopii5,ii) + nloopjj5=min(nloopjj5,jj) + endif + enddo + enddo + enddo + enddo + + nloopi6=NL + nloopj6=NL + nloopii6=NL + nloopjj6=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A1(:,:,K,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A1(i,j,K,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi6),min(nloopj6),min(nloopii6),min(nloopjj6)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,K,jj)) then + nloopi6=min(nloopi6,i) + nloopj6=min(nloopj6,j) + nloopii6=min(nloopii6,ii) + nloopjj6=min(nloopjj6,jj) + endif + enddo + enddo + enddo + enddo + + nloopi7=NL + nloopj7=NL + nloopii7=NL + nloopjj7=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A1(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A1(i,j,ii,L) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi7),min(nloopj7),min(nloopii7),min(nloopjj7)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,L)) then + nloopi7=min(nloopi7,i) + nloopj7=min(nloopj7,j) + nloopii7=min(nloopii7,ii) + nloopjj7=min(nloopjj7,jj) + endif + enddo + enddo + enddo + enddo + + if ((nloopi1 .eq.NL).and.(nloopi2 .eq.NL).and. + * (nloopi3 .eq.NL).and. (nloopi4 .eq.NL).and. + * (nloopi5 .eq.NL).and.(nloopi6 .eq.NL).and. + * (nloopi7 .eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + + end + +C --------------------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf43.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf43.fdv new file mode 100644 index 0000000..ffe30d1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf43.fdv @@ -0,0 +1,525 @@ + program PRF43 + +c TESTING OF THE PREFETCH DIRECTIVE. + + print *,'===START OF PRF43========================' +C -------------------------------------------------- + call prf4301 + call prf4302 + call prf4303 +C + print *,'=== END OF PRF43 ========================= ' + end +C ---------------------------------------------------------PRF4301 + subroutine PRF4301 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),A1(:,:,:,:) + character*7 tname + +cdvm$ distribute B(BLOCK,BLOCK,BLOCK,*) +cdvm$ align(:,:,:,:) with B(:,:,:,:) :: A,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4301' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L),A1(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + A1(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + +cdvm$ remote_access (GR1:A(1,1,1,1)) + ib1=A(1,1,1,1) + +cdvm$ remote_access (GR1:A(N,M,K,L)) + ib2=A(N,M,K,L) + +cdvm$ remote_access (GR2:A(1,M,K,L)) + ib3=A(1,M,K,L) + +cdvm$ remote_access (GR3:A(N,1,K,L)) + ib4=A(N,1,K,L) + +cdvm$ remote_access (GR3:A(N,M,1,L)) + ib5=A(N,M,1,L) + +cdvm$ remote_access (GR3:A1(N,M,K,1)) + ib6=A1(N,M,K,1) + + if ((ib1 .eq.C(1,1,1,1)) .and.(ib2 .eq.C(N,M,K,L)) .and. + * (ib3 .eq.C(1,M,K,L)) .and.(ib4 .eq.C(N,1,K,L)) .and. + * (ib5 .eq.C(N,M,1,L)).and.(ib6 .eq.C(N,M,K,1))) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + + end + +C ------------------------------------------------------PRF4302 + subroutine PRF4302 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),D(:,:,:,:) + character*7 tname + +cdvm$ distribute A(BLOCK,BLOCK,*,BLOCK) +cdvm$ align(:,:,:,:) with A(:,:,:,:) :: B + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4302' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + isumc1=0 + isuma1=0 + +cdvm$ remote_access (GR1:A(:,:,:,:)) + do i=1,N + do j=i,M + do ii=1,K + do jj=1,L + D(i,j,ii,jj)=A(i,j,ii,jj) + isumc1=isumc1+C(i,j,ii,jj) + isuma1=isuma1+D(i,j,ii,jj) + enddo + enddo + enddo + enddo + + isumc2=0 + isuma2=0 + +cdvm$ remote_access (GR1:A(1,:,:,:)) + do j=1,M + do ii=1,K + do jj=1,L + D(1,j,ii,jj)=A(1,j,ii,jj) + isumc2=isumc2+C(1,j,ii,jj) + isuma2=isuma2+D(1,j,ii,jj) + enddo + enddo + enddo + + isumc3=0 + isuma3=0 + +cdvm$ remote_access (GR2:A(:,M,:,:)) + do i=1,N + do ii=1,K + do jj=1,L + D(i,M,ii,jj)=A(i,M,ii,jj) + isumc3=isumc3+C(i,M,ii,jj) + isuma3=isuma3+D(i,M,ii,jj) + enddo + enddo + enddo + + isumc4=0 + isuma4=0 + +cdvm$ remote_access (GR3:A(:,:,K,:)) + do i=1,N + do j=1,M + do jj=1,L + D(i,j,K,jj)=A(i,j,K,jj) + isumc4=isumc4+C(i,j,K,jj) + isuma4=isuma4+D(i,j,K,jj) + enddo + enddo + enddo + + isumc5=0 + isuma5=0 + +cdvm$ remote_access (GR3:A(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + D(i,j,ii,L)=A(i,j,ii,L) + isumc5=isumc5+C(i,j,ii,L) + isuma5=isuma5+D(i,j,ii,L) + enddo + enddo + enddo + + if ((isumc1 .eq.isuma1).and.(isumc2 .eq.isuma2).and. + * (isumc3 .eq.isuma3).and.(isumc4 .eq.isuma4).and. + * (isumc5 .eq.isuma5)) then + call ansyes(tname) + else + call ansno(tname) + endif + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,D) + + end + +C ------------------------------------------------------PRF4303 + subroutine PRF4303 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000,NIT=3 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:) + integer, allocatable :: C(:,:,:,:),A1(:,:,:,:) + character*7 tname + +cdvm$ distribute A(BLOCK,*,BLOCK,BLOCK) +cdvm$ align(:,:,:,:) with A(:,:,:,:) :: B,A1 + +cdvm$ remote_group GR1 +cdvm$ remote_group GR2 +cdvm$ remote_group GR3 + + tname='PRF4303' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),A1(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + A1(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + + do it=1,NIT +cdvm$ prefetch GR1 +cdvm$ prefetch GR2 +cdvm$ prefetch GR3 + + + nloopi1=NL + nloopj1=NL + nloopii1=NL + nloopjj1=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR1:A(1,1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,1,1,1) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi1),min(nloopj1),min(nloopii1), +*dvm$* min(nloopjj1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,1,1,1)) then + nloopi1=min(nloopi1,i) + nloopj1=min(nloopj1,j) + nloopii1=min(nloopii1,ii) + nloopjj1=min(nloopjj1,jj) + endif + enddo + enddo + enddo + enddo + + nloopi2=NL + nloopj2=NL + nloopii2=NL + nloopjj2=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(GR1:A(N,M,K,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(N,M,K,L) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi2),min(nloopj2),min(nloopii2),min(nloopjj2)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(N,M,K,L)) then + nloopi2=min(nloopi2,i) + nloopj2=min(nloopj2,j) + nloopii2=min(nloopii2,ii) + nloopjj2=min(nloopjj2,jj) + endif + enddo + enddo + enddo + enddo + + nloopi3=NL + nloopj3=NL + nloopii3=NL + nloopjj3=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(GR2:A) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi3),min(nloopj3),min(nloopii3), +*dvm$* min(nloopjj3)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi3=min(nloopi3,i) + nloopj3=min(nloopj3,j) + nloopii3=min(nloopii3,ii) + nloopjj3=min(nloopjj3,jj) + endif + enddo + enddo + enddo + enddo + + nloopi4=NL + nloopj4=NL + nloopii4=NL + nloopjj4=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),remote_access(GR2:A(1,:,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,j,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi4),min(nloopj4),min(nloopii4), +*dvm$*min(nlooopjj4)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,j,ii,jj)) then + nloopi4=min(nloopi4,i) + nloopj4=min(nloopj4,j) + nloopii4=min(nloopii4,ii) + nloopjj4=min(nloopjj4,jj) + endif + enddo + enddo + enddo + enddo + + nloopi5=NL + nloopj5=NL + nloopii5=NL + nloopjj5=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A(:,M,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,M,ii,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$* reduction( min( nloopi5),min(nloopj5),min(nloopii5), +*dvm$* min(nloopjj5)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,M,ii,jj)) then + nloopi5=min(nloopi5,i) + nloopj5=min(nloopj5,j) + nloopii5=min(nloopii5,ii) + nloopjj5=min(nloopjj5,jj) + endif + enddo + enddo + enddo + enddo + + nloopi6=NL + nloopj6=NL + nloopii6=NL + nloopjj6=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A1(:,:,K,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A1(i,j,K,jj) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi6),min(nloopj6),min(nloopii6),min(nloopjj6)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,K,jj)) then + nloopi6=min(nloopi6,i) + nloopj6=min(nloopj6,j) + nloopii6=min(nloopii6,ii) + nloopjj6=min(nloopjj6,jj) + endif + enddo + enddo + enddo + enddo + + nloopi7=NL + nloopj7=NL + nloopii7=NL + nloopjj7=NL + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*remote_access(GR3:A1(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A1(i,j,ii,L) + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +*dvm$*reduction( min( nloopi7),min(nloopj7),min(nloopii7),min(nloopjj7)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,L)) then + nloopi7=min(nloopi7,i) + nloopj7=min(nloopj7,j) + nloopii7=min(nloopii7,ii) + nloopjj7=min(nloopjj7,jj) + endif + enddo + enddo + enddo + enddo + + if ((nloopi1 .eq.NL).and.(nloopi2 .eq.NL).and. + * (nloopi3 .eq.NL).and. (nloopi4 .eq.NL).and. + * (nloopi5 .eq.NL).and.(nloopi6 .eq.NL).and. + * (nloopi7 .eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + if (it .eq. 2) cycle +cdvm$ reset GR1 +cdvm$ reset GR2 +cdvm$ reset GR3 + + enddo + deallocate (A,B,C,A1) + + end + +C --------------------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf44.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf44.f90 new file mode 100644 index 0000000..aff877b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf44.f90 @@ -0,0 +1,401 @@ +program prf44 + !TESTING OF THE PREFETCH DIRECTIVE. + + print *, '===START OF PRF44========================' + + call prf4401 + call prf4402 + call prf4403 + + print *, '===END OF PRF44==========================' +end + +subroutine prf4401 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ) + integer, allocatable :: C( :, :, :, : ), A1( :, :, :, : ) + character * 7 :: tname = 'PRF4401' + + !dvm$ distribute B( block, block, block, block ) + !dvm$ align( :, :, :, : ) with B( :, :, :, : ) :: A, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( B( N, M, K, L ), A( N, M, K, L ), C( N, M, K, L ), A1( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + A1( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + !dvm$ remote_access ( GR1:A( N / 2, M / 2, K / 2, L / 2 ) ) + ib1 = A( N / 2, M / 2, K / 2, L / 2 ) + + !dvm$ remote_access ( GR1:A( N / 2, M, K, L ) ) + ib2 = A( N / 2, M, K, L ) + + !dvm$ remote_access ( GR2:A( N, M / 2, K, L ) ) + ib3 = A( N, M / 2, K, L ) + + !dvm$ remote_access ( GR2:A( N, M, K / 2, L ) ) + ib4 = A( N, M, K / 2, L ) + + !dvm$ remote_access ( GR3:A( N, M, K, L / 2 ) ) + ib5 = A( N, M, K, L / 2 ) + + !dvm$ remote_access ( GR3:A1( 1, M, K, L / 2 ) ) + ib6 = A1( 1, M, K, L / 2 ) + + if ( ( ib1 .eq. C( N / 2, M / 2, K / 2, L / 2 ) ) .and. ( ib2 .eq. C( N / 2, M, K, L ) ) .and. & + ( ib3 .eq. C( N, M / 2, K, L ) ) .and. ( ib4 .eq. C( N, M, K / 2, L ) ) .and. & + ( ib5 .eq. C( N, M, K, L / 2 ) ) .and. ( ib6 .eq. C( 1, M, K, L / 2 ) ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate ( A, B, C, A1 ) +end + +subroutine prf4402 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ) + integer, allocatable :: C( :, :, :, : ), D( :, :, :, : ) + character * 7 :: tname = 'PRF4402' + + !dvm$ distribute A( block, block, block, block ) + !dvm$ align( :, :, :, : ) with A( :, :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K, L ), B( N, M, K, L ), C( N, M, K, L ), D( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + isumc1 = 0 + isuma1 = 0 + !dvm$ remote_access ( GR1:A( N / 2, :, :, : ) ) + do j = 1, M + do ii = 1, K + do jj = 1, L + D( N / 2, j, ii, jj ) = A( N / 2, j, ii, jj ) + isumc1 = isumc1 + C( N / 2, j, ii, jj ) + isuma1 = isuma1 + D( N / 2, j, ii, jj ) + enddo + enddo + enddo + + isumc2 = 0 + isuma2 = 0 + !dvm$ remote_access ( GR2:A( :, M / 2, :, : ) ) + do i = 1, N + do ii = 1, K + do jj = 1, L + D( i, M / 2, ii, jj ) = A( i, M / 2, ii, jj ) + isumc2 = isumc2 + C( i, M / 2, ii, jj ) + isuma2 = isuma2 + D( i, M / 2, ii, jj ) + enddo + enddo + enddo + + isumc3 = 0 + isuma3 = 0 + !dvm$ remote_access ( GR3:A( :, :, K / 2, : ) ) + do i = 1, N + do j = 1, M + do jj = 1, L + D( i, j, K / 2, jj ) = A( i, j, K / 2, jj ) + isumc3 = isumc3 + C( i, j, K / 2, jj ) + isuma3 = isuma3 + D( i, j, K / 2, jj ) + enddo + enddo + enddo + + isumc4 = 0 + isuma4 = 0 + !dvm$ remote_access ( GR3:A( :, :, :, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + D( i, j, ii, L / 2 ) = A( i, j, ii, L / 2 ) + isumc4 = isumc4 + C( i, j, ii, L / 2 ) + isuma4 = isuma4 + D( i, j, ii, L / 2 ) + enddo + enddo + enddo + + if ( ( isumc1 .eq. isuma1 ) .and. ( isumc2 .eq. isuma2 ) .and. & + ( isumc3 .eq. isuma3 ) .and. ( isumc4 .eq. isuma4 ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D ) +end + +subroutine prf4403 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ), C( :, :, :, : ) + character * 7 :: tname = 'PRF4403' + + !dvm$ distribute A( block, block, block, block ) + !dvm$ align( :, :, :, : ) with A( :, :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K, L ), B( N, M, K, L ), C( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + nloopi1 = NL + nloopj1 = NL + nloopii1 = NL + nloopjj1 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR1:A( N / 2, M / 2, K / 2, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( N / 2, M / 2, K / 2, L / 2 ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi1 ), min( nloopj1 ), min( nloopii1 ), min( nloopjj1 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( N / 2, M / 2, K / 2, L / 2 ) ) then + nloopi1 = min( nloopi1, i ) + nloopj1 = min( nloopj1, j ) + nloopii1 = min( nloopii1, ii ) + nloopjj1 = min( nloopjj1, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi2 = NL + nloopj2 = NL + nloopii2 = NL + nloopjj2 = NL + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ), remote_access( GR2:A( N / 2, :, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( N / 2, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi2 ), min( nloopj2 ), min( nloopii2 ), min( nlooopjj4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( N / 2, j, ii, jj ) ) then + nloopi2 = min( nloopi2, i ) + nloopj2 = min( nloopj2, j ) + nloopii2 = min( nloopii2, ii ) + nloopjj2 = min( nloopjj2, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi3 = NL + nloopj3 = NL + nloopii3 = NL + nloopjj3 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR2:A( :, M / 2, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, M / 2, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi3 ), min( nloopj3 ), min( nloopii3 ), min( nloopjj3 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, M / 2, ii, jj ) ) then + nloopi3 = min( nloopi3, i ) + nloopj3 = min( nloopj3, j ) + nloopii3 = min( nloopii3, ii ) + nloopjj3 = min( nloopjj3, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi4 = NL + nloopj4 = NL + nloopii4 = NL + nloopjj4 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR3:A( :, :, K / 2, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, j, K / 2, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi4 ), min( nloopj4 ), min( nloopii4 ), min( nloopjj4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, j, K / 2, jj ) ) then + nloopi4 = min( nloopi4, i ) + nloopj4 = min( nloopj4, j ) + nloopii4 = min( nloopii4, ii ) + nloopjj4 = min( nloopjj4, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi5 = NL + nloopj5 = NL + nloopii5 = NL + nloopjj5 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR3:A( :, :, :, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, j, ii, L / 2 ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi5 ), min( nloopj5 ), min( nloopii5 ), min( nloopjj5 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, j, ii, L / 2 ) ) then + nloopi5 = min( nloopi5, i ) + nloopj5 = min( nloopj5, j ) + nloopii5 = min( nloopii5, ii ) + nloopjj5 = min( nloopjj5, jj ) + endif + enddo + enddo + enddo + enddo + + if ( ( nloopi1 .eq. NL ) .and. ( nloopi2 .eq. NL ) .and. & + ( nloopi3 .eq. NL ) .and. ( nloopi4 .eq. NL ) .and. & + ( nloopi5 .eq. NL ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C ) +end + +subroutine serial4( AR, N, M, K, L, NL ) + integer AR( N, M, K, L ) + integer NL + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + AR( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo +end + +subroutine ansyes( name ) + character * 7 name + print *, name, ' - complete' +end + +subroutine ansno( name ) + character * 7 name + print *, name, ' - ***error' +end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf45.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf45.f90 new file mode 100644 index 0000000..bbbba57 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf45.f90 @@ -0,0 +1,401 @@ +program prf45 + !TESTING OF THE PREFETCH DIRECTIVE. + + print *, '===START OF PRF45========================' + + call prf4501 + call prf4502 + call prf4503 + + print *, '===END OF PRF45==========================' +end + +subroutine prf4501 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ) + integer, allocatable :: C( :, :, :, : ), A1( :, :, :, : ) + character * 7 :: tname = 'PRF4501' + + !dvm$ distribute B( *, *, *, * ) + !dvm$ align( :, :, :, : ) with B( :, :, :, : ) :: A, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( B( N, M, K, L ), A( N, M, K, L ), C( N, M, K, L ), A1( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + A1( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + !dvm$ remote_access ( GR1:A( N / 2, M / 2, K / 2, L / 2 ) ) + ib1 = A( N / 2, M / 2, K / 2, L / 2 ) + + !dvm$ remote_access ( GR1:A( N / 2, M, K, L ) ) + ib2 = A( N / 2, M, K, L ) + + !dvm$ remote_access ( GR2:A( N, M / 2, K, L ) ) + ib3 = A( N, M / 2, K, L ) + + !dvm$ remote_access ( GR2:A( N, M, K / 2, L ) ) + ib4 = A( N, M, K / 2, L ) + + !dvm$ remote_access ( GR3:A( N, M, K, L / 2 ) ) + ib5 = A( N, M, K, L / 2 ) + + !dvm$ remote_access ( GR3:A1( 1, M, K, L / 2 ) ) + ib6 = A1( 1, M, K, L / 2 ) + + if ( ( ib1 .eq. C( N / 2, M / 2, K / 2, L / 2 ) ) .and. ( ib2 .eq. C( N / 2, M, K, L ) ) .and. & + ( ib3 .eq. C( N, M / 2, K, L ) ) .and. ( ib4 .eq. C( N, M, K / 2, L ) ) .and. & + ( ib5 .eq. C( N, M, K, L / 2 ) ) .and. ( ib6 .eq. C( 1, M, K, L / 2 ) ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate ( A, B, C, A1 ) +end + +subroutine prf4502 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ) + integer, allocatable :: C( :, :, :, : ), D( :, :, :, : ) + character * 7 :: tname = 'PRF4502' + + !dvm$ distribute A( *, *, *, * ) + !dvm$ align( :, :, :, : ) with A( :, :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K, L ), B( N, M, K, L ), C( N, M, K, L ), D( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + isumc1 = 0 + isuma1 = 0 + !dvm$ remote_access ( GR1:A( N / 2, :, :, : ) ) + do j = 1, M + do ii = 1, K + do jj = 1, L + D( N / 2, j, ii, jj ) = A( N / 2, j, ii, jj ) + isumc1 = isumc1 + C( N / 2, j, ii, jj ) + isuma1 = isuma1 + D( N / 2, j, ii, jj ) + enddo + enddo + enddo + + isumc2 = 0 + isuma2 = 0 + !dvm$ remote_access ( GR2:A( :, M / 2, :, : ) ) + do i = 1, N + do ii = 1, K + do jj = 1, L + D( i, M / 2, ii, jj ) = A( i, M / 2, ii, jj ) + isumc2 = isumc2 + C( i, M / 2, ii, jj ) + isuma2 = isuma2 + D( i, M / 2, ii, jj ) + enddo + enddo + enddo + + isumc3 = 0 + isuma3 = 0 + !dvm$ remote_access ( GR3:A( :, :, K / 2, : ) ) + do i = 1, N + do j = 1, M + do jj = 1, L + D( i, j, K / 2, jj ) = A( i, j, K / 2, jj ) + isumc3 = isumc3 + C( i, j, K / 2, jj ) + isuma3 = isuma3 + D( i, j, K / 2, jj ) + enddo + enddo + enddo + + isumc4 = 0 + isuma4 = 0 + !dvm$ remote_access ( GR3:A( :, :, :, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + D( i, j, ii, L / 2 ) = A( i, j, ii, L / 2 ) + isumc4 = isumc4 + C( i, j, ii, L / 2 ) + isuma4 = isuma4 + D( i, j, ii, L / 2 ) + enddo + enddo + enddo + + if ( ( isumc1 .eq. isuma1 ) .and. ( isumc2 .eq. isuma2 ) .and. & + ( isumc3 .eq. isuma3 ) .and. ( isumc4 .eq. isuma4 ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D ) +end + +subroutine prf4503 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ), C( :, :, :, : ) + character * 7 :: tname = 'PRF4503' + + !dvm$ distribute A( *, *, *, * ) + !dvm$ align( :, :, :, : ) with A( :, :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K, L ), B( N, M, K, L ), C( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + nloopi1 = NL + nloopj1 = NL + nloopii1 = NL + nloopjj1 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR1:A( N / 2, M / 2, K / 2, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( N / 2, M / 2, K / 2, L / 2 ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi1 ), min( nloopj1 ), min( nloopii1 ), min( nloopjj1 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( N / 2, M / 2, K / 2, L / 2 ) ) then + nloopi1 = min( nloopi1, i ) + nloopj1 = min( nloopj1, j ) + nloopii1 = min( nloopii1, ii ) + nloopjj1 = min( nloopjj1, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi2 = NL + nloopj2 = NL + nloopii2 = NL + nloopjj2 = NL + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ), remote_access( GR2:A( N / 2, :, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( N / 2, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi2 ), min( nloopj2 ), min( nloopii2 ), min( nlooopjj4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( N / 2, j, ii, jj ) ) then + nloopi2 = min( nloopi2, i ) + nloopj2 = min( nloopj2, j ) + nloopii2 = min( nloopii2, ii ) + nloopjj2 = min( nloopjj2, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi3 = NL + nloopj3 = NL + nloopii3 = NL + nloopjj3 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR2:A( :, M / 2, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, M / 2, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi3 ), min( nloopj3 ), min( nloopii3 ), min( nloopjj3 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, M / 2, ii, jj ) ) then + nloopi3 = min( nloopi3, i ) + nloopj3 = min( nloopj3, j ) + nloopii3 = min( nloopii3, ii ) + nloopjj3 = min( nloopjj3, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi4 = NL + nloopj4 = NL + nloopii4 = NL + nloopjj4 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR3:A( :, :, K / 2, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, j, K / 2, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi4 ), min( nloopj4 ), min( nloopii4 ), min( nloopjj4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, j, K / 2, jj ) ) then + nloopi4 = min( nloopi4, i ) + nloopj4 = min( nloopj4, j ) + nloopii4 = min( nloopii4, ii ) + nloopjj4 = min( nloopjj4, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi5 = NL + nloopj5 = NL + nloopii5 = NL + nloopjj5 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR3:A( :, :, :, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, j, ii, L / 2 ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi5 ), min( nloopj5 ), min( nloopii5 ), min( nloopjj5 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, j, ii, L / 2 ) ) then + nloopi5 = min( nloopi5, i ) + nloopj5 = min( nloopj5, j ) + nloopii5 = min( nloopii5, ii ) + nloopjj5 = min( nloopjj5, jj ) + endif + enddo + enddo + enddo + enddo + + if ( ( nloopi1 .eq. NL ) .and. ( nloopi2 .eq. NL ) .and. & + ( nloopi3 .eq. NL ) .and. ( nloopi4 .eq. NL ) .and. & + ( nloopi5 .eq. NL ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C ) +end + +subroutine serial4( AR, N, M, K, L, NL ) + integer AR( N, M, K, L ) + integer NL + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + AR( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo +end + +subroutine ansyes( name ) + character * 7 name + print *, name, ' - complete' +end + +subroutine ansno( name ) + character * 7 name + print *, name, ' - ***error' +end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf46.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf46.f90 new file mode 100644 index 0000000..9520b00 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/prf46.f90 @@ -0,0 +1,401 @@ +program prf46 + !TESTING OF THE PREFETCH DIRECTIVE. + + print *, '===START OF PRF46========================' + + call prf4601 + call prf4602 + call prf4603 + + print *, '===END OF PRF46==========================' +end + +subroutine prf4601 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ) + integer, allocatable :: C( :, :, :, : ), A1( :, :, :, : ) + character * 7 :: tname = 'PRF4601' + + !dvm$ distribute B( block, block, block, * ) + !dvm$ align( :, :, :, : ) with B( :, :, :, : ) :: A, A1 + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( B( N, M, K, L ), A( N, M, K, L ), C( N, M, K, L ), A1( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + A1( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + !dvm$ remote_access ( GR1:A( N / 2, M / 2, K / 2, L / 2 ) ) + ib1 = A( N / 2, M / 2, K / 2, L / 2 ) + + !dvm$ remote_access ( GR1:A( N / 2, M, K, L ) ) + ib2 = A( N / 2, M, K, L ) + + !dvm$ remote_access ( GR2:A( N, M / 2, K, L ) ) + ib3 = A( N, M / 2, K, L ) + + !dvm$ remote_access ( GR2:A( N, M, K / 2, L ) ) + ib4 = A( N, M, K / 2, L ) + + !dvm$ remote_access ( GR3:A( N, M, K, L / 2 ) ) + ib5 = A( N, M, K, L / 2 ) + + !dvm$ remote_access ( GR3:A1( 1, M, K, L / 2 ) ) + ib6 = A1( 1, M, K, L / 2 ) + + if ( ( ib1 .eq. C( N / 2, M / 2, K / 2, L / 2 ) ) .and. ( ib2 .eq. C( N / 2, M, K, L ) ) .and. & + ( ib3 .eq. C( N, M / 2, K, L ) ) .and. ( ib4 .eq. C( N, M, K / 2, L ) ) .and. & + ( ib5 .eq. C( N, M, K, L / 2 ) ) .and. ( ib6 .eq. C( 1, M, K, L / 2 ) ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate ( A, B, C, A1 ) +end + +subroutine prf4602 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ) + integer, allocatable :: C( :, :, :, : ), D( :, :, :, : ) + character * 7 :: tname = 'PRF4602' + + !dvm$ distribute A( block, block, *, block ) + !dvm$ align( :, :, :, : ) with A( :, :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K, L ), B( N, M, K, L ), C( N, M, K, L ), D( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + isumc1 = 0 + isuma1 = 0 + !dvm$ remote_access ( GR1:A( N / 2, :, :, : ) ) + do j = 1, M + do ii = 1, K + do jj = 1, L + D( N / 2, j, ii, jj ) = A( N / 2, j, ii, jj ) + isumc1 = isumc1 + C( N / 2, j, ii, jj ) + isuma1 = isuma1 + D( N / 2, j, ii, jj ) + enddo + enddo + enddo + + isumc2 = 0 + isuma2 = 0 + !dvm$ remote_access ( GR2:A( :, M / 2, :, : ) ) + do i = 1, N + do ii = 1, K + do jj = 1, L + D( i, M / 2, ii, jj ) = A( i, M / 2, ii, jj ) + isumc2 = isumc2 + C( i, M / 2, ii, jj ) + isuma2 = isuma2 + D( i, M / 2, ii, jj ) + enddo + enddo + enddo + + isumc3 = 0 + isuma3 = 0 + !dvm$ remote_access ( GR3:A( :, :, K / 2, : ) ) + do i = 1, N + do j = 1, M + do jj = 1, L + D( i, j, K / 2, jj ) = A( i, j, K / 2, jj ) + isumc3 = isumc3 + C( i, j, K / 2, jj ) + isuma3 = isuma3 + D( i, j, K / 2, jj ) + enddo + enddo + enddo + + isumc4 = 0 + isuma4 = 0 + !dvm$ remote_access ( GR3:A( :, :, :, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + D( i, j, ii, L / 2 ) = A( i, j, ii, L / 2 ) + isumc4 = isumc4 + C( i, j, ii, L / 2 ) + isuma4 = isuma4 + D( i, j, ii, L / 2 ) + enddo + enddo + enddo + + if ( ( isumc1 .eq. isuma1 ) .and. ( isumc2 .eq. isuma2 ) .and. & + ( isumc3 .eq. isuma3 ) .and. ( isumc4 .eq. isuma4 ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C, D ) +end + +subroutine prf4603 + integer, parameter :: N = 16, M = 8, K = 8, L = 16, NL = 1000, NIT = 3 + integer, allocatable :: A( :, :, :, : ), B( :, :, :, : ), C( :, :, :, : ) + character * 7 :: tname = 'PRF4603' + + !dvm$ distribute A( block, *, block, block ) + !dvm$ align( :, :, :, : ) with A( :, :, :, : ) :: B + + !dvm$ remote_group GR1 + !dvm$ remote_group GR2 + !dvm$ remote_group GR3 + + allocate ( A( N, M, K, L ), B( N, M, K, L ), C( N, M, K, L ) ) + call serial4( C, N, M, K, L, NL ) + + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + A( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo + + do it = 1, NIT + !dvm$ prefetch GR1 + !dvm$ prefetch GR2 + !dvm$ prefetch GR3 + + nloopi1 = NL + nloopj1 = NL + nloopii1 = NL + nloopjj1 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR1:A( N / 2, M / 2, K / 2, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( N / 2, M / 2, K / 2, L / 2 ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi1 ), min( nloopj1 ), min( nloopii1 ), min( nloopjj1 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( N / 2, M / 2, K / 2, L / 2 ) ) then + nloopi1 = min( nloopi1, i ) + nloopj1 = min( nloopj1, j ) + nloopii1 = min( nloopii1, ii ) + nloopjj1 = min( nloopjj1, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi2 = NL + nloopj2 = NL + nloopii2 = NL + nloopjj2 = NL + !dvm$ parallel ( i, j, ii, jj ) on A( i, j, ii, jj ), remote_access( GR2:A( N / 2, :, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( N / 2, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi2 ), min( nloopj2 ), min( nloopii2 ), min( nlooopjj4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( N / 2, j, ii, jj ) ) then + nloopi2 = min( nloopi2, i ) + nloopj2 = min( nloopj2, j ) + nloopii2 = min( nloopii2, ii ) + nloopjj2 = min( nloopjj2, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi3 = NL + nloopj3 = NL + nloopii3 = NL + nloopjj3 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR2:A( :, M / 2, :, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, M / 2, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi3 ), min( nloopj3 ), min( nloopii3 ), min( nloopjj3 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, M / 2, ii, jj ) ) then + nloopi3 = min( nloopi3, i ) + nloopj3 = min( nloopj3, j ) + nloopii3 = min( nloopii3, ii ) + nloopjj3 = min( nloopjj3, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi4 = NL + nloopj4 = NL + nloopii4 = NL + nloopjj4 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR3:A( :, :, K / 2, : ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, j, K / 2, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi4 ), min( nloopj4 ), min( nloopii4 ), min( nloopjj4 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, j, K / 2, jj ) ) then + nloopi4 = min( nloopi4, i ) + nloopj4 = min( nloopj4, j ) + nloopii4 = min( nloopii4, ii ) + nloopjj4 = min( nloopjj4, jj ) + endif + enddo + enddo + enddo + enddo + + nloopi5 = NL + nloopj5 = NL + nloopii5 = NL + nloopjj5 = NL + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), remote_access( GR3:A( :, :, :, L / 2 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + B( i, j, ii, jj ) = A( i, j, ii, L / 2 ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( i, j, ii, jj ) on B( i, j, ii, jj ), reduction( min( nloopi5 ), min( nloopj5 ), min( nloopii5 ), min( nloopjj5 ) ) + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + if ( B( i, j, ii, jj ) .ne. C( i, j, ii, L / 2 ) ) then + nloopi5 = min( nloopi5, i ) + nloopj5 = min( nloopj5, j ) + nloopii5 = min( nloopii5, ii ) + nloopjj5 = min( nloopjj5, jj ) + endif + enddo + enddo + enddo + enddo + + if ( ( nloopi1 .eq. NL ) .and. ( nloopi2 .eq. NL ) .and. & + ( nloopi3 .eq. NL ) .and. ( nloopi4 .eq. NL ) .and. & + ( nloopi5 .eq. NL ) ) then + call ansyes( tname ) + else + call ansno( tname ) + endif + + if ( it .eq. 2 ) cycle + + !dvm$ reset GR1 + !dvm$ reset GR2 + !dvm$ reset GR3 + enddo + deallocate( A, B, C ) +end + +subroutine serial4( AR, N, M, K, L, NL ) + integer AR( N, M, K, L ) + integer NL + do i = 1, N + do j = 1, M + do ii = 1, K + do jj = 1, L + AR( i, j, ii, jj ) = NL + i + j + ii + jj + enddo + enddo + enddo + enddo +end + +subroutine ansyes( name ) + character * 7 name + print *, name, ' - complete' +end + +subroutine ansno( name ) + character * 7 name + print *, name, ' - ***error' +end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/settings b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/settings new file mode 100644 index 0000000..3ef2d72 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/PREFETCH/settings @@ -0,0 +1 @@ +DVM_ONLY=1 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign11.fdv new file mode 100644 index 0000000..d455fdd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign11.fdv @@ -0,0 +1,559 @@ + program REALIGN11 + +c Testing REALIGN directive + + print *,'===START OF realign11========================' +C -------------------------------------------------- +C 111 ALIGN arrB(i) WITH arrA(i) REALIGN arrB(i) WITH arrA(2*i+8) + call realign111 +C -------------------------------------------------- +C 112 ALIGN arrB(i) WITH arrA(i+4) REALIGN arrB(i) WITH arrA(i+8) + call realign112 +C -------------------------------------------------- +C 112r ALIGN arrB(i) WITH arrA(i+4) REALIGN arrB(i) WITH arrA(-i+8) +c call realign112r +C -------------------------------------------------- +C 113 ALIGN arrB(i) WITH arrA(3*i-2) REALIGN arrB(i) WITH arrA(2*i+1) + call realign113 +C -------------------------------------------------- +C 113r ALIGN arrB(i) WITH arrA(-i+8) REALIGN arrB(i) WITH arrA(3*i-2) +c call realign113r +C -------------------------------------------------- +C 114 ALIGN arrB(i) WITH arrA(2*i+8) REALIGN arrB(i) WITH arrA(i) + call realign114 +C -------------------------------------------------- +C 115 ALIGN arrB(*) WITH arrA(*) REALIGN arrB(i) WITH arrA(i+4) + call realign115 +C -------------------------------------------------- +C 116 ALIGN arrB(i) WITH arrA(4*i-3) REALIGN arrB(i) WITH arrA(*) + call realign116 +C -------------------------------------------------- +C + print *,'=== END OF realign11 ========================= ' + end + +C ----------------------------------------------------realign111 + +C 111 ALIGN arrB(i) WITH arrA(i) REALIGN arrB(i) WITH arrA(2*i+8) + subroutine realign111 + integer, parameter :: AN1=25,BN1=8,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=1,li=0 +c parameters for REALIGN + integer, parameter :: kr1i=2,lri=8 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign111' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + +!dvm$ region out(A1,B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) = 0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo +!dvm$ end region + +!dvm$ REALIGN B1(i) WITH A1(kr1i * i + lri) + +!dvm$ actual(erria, errib) + +!dvm$ region inlocal(A1,B1) +!dvm$ parallel (i) on B1(i), private(ia), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + if (B1(i) /= i) then + errib = min(errib,i) + endif + ia=kr1i * i + lri + if (A1(ia) /= ia) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B1,A1) + + end subroutine realign111 +C ----------------------------------------------------realign112 + +C 112 ALIGN arrB(i) WITH arrA(i+4) REALIGN arrB(i) WITH arrA(i+8) + subroutine realign112 + integer, parameter :: AN1=16,BN1=4,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=1,li=4 +c parameters for REALIGN + integer, parameter :: kr1i=1,lri=8 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign112' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + + B1 = 1 + +!dvm$ actual (B1) + +!dvm$ region inout (B1), out(A1) +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i * 2 + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = B1(ib) + ib + endif + enddo +!dvm$ end region + +!dvm$ REALIGN B1(i) WITH A1(kr1i * i + lri) + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i) on B1(i), private(ia), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + if (B1(i) /= i+1) then + errib = min(errib,i) + endif + ia=kr1i * i + lri + if (A1(ia) /= ia*2) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B1,A1) + + end subroutine realign112 +C ----------------------------------------------------realign112r +C 112r ALIGN arrB(i) WITH arrA(i+4) REALIGN arrB(i) WITH arrA(-i+8) + subroutine realign112r + integer, parameter :: AN1=16,BN1=4,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=1,li=4 +c parameters for REALIGN + integer, parameter :: kr1i=-1,lri=8 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign112r' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + + B1 = 1 + +!dvm$ actual (B1) + +!dvm$ region inout (B1), out(A1) +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i * 2 + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = B1(ib) + ib + endif + enddo +!dvm$ end region + +!dvm$ REALIGN B1(i) WITH A1(kr1i * i + lri) + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i) on B1(i), private(ia), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + if (B1(i) /= i+1) then + errib = min(errib,i) + endif + ia=kr1i * i + lri + if (A1(ia) /= ia*2) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B1,A1) + + end subroutine realign112r +C ----------------------------------------------------realign113 +C 113 ALIGN arrB(i) WITH arrA(3*i-2) REALIGN arrB(i) WITH arrA(2*i+1) + subroutine realign113 + integer, parameter :: AN1=30,BN1=6,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=3,li=-2 +c parameters for REALIGN + integer, parameter :: kr1i=2,lri=1 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign113' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + +!dvm$ region +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) = 5 + enddo + +!dvm$ end region + +!dvm$ region in(B1), out(A1,B1) +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + 3 + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = B1(ib) + ib + endif + enddo +!dvm$ end region + +!dvm$ REALIGN B1(i) WITH A1(kr1i * i + lri) + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i) on B1(i), private(ia), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + if (B1(i) /= (i+5)) then + errib = min(errib,i) + endif + ia=kr1i * i + lri + if (A1(ia) /= (ia+3)) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end subroutine realign113 +C ----------------------------------------------------realign113r +C 113r ALIGN arrB(i) WITH arrA(-i+8) REALIGN arrB(i) WITH arrA(3*i-2) + subroutine realign113r + integer, parameter :: AN1=30,BN1=6,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=-1,li=8 +c parameters for REALIGN + integer, parameter :: kr1i=3,lri=-2 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign113r' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + +!dvm$ region +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) = 5 + enddo + +!dvm$ end region + +!dvm$ region in(B1), out(A1,B1) +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + 3 + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = B1(ib) + ib + endif + enddo +!dvm$ end region + +!dvm$ REALIGN B1(i) WITH A1(kr1i * i + lri) + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i) on B1(i), private(ia), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + if (B1(i) /= (i+5)) then + errib = min(errib,i) + endif + ia=kr1i * i + lri + if (A1(ia) /= (ia+3)) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B1,A1) + + end subroutine realign113r +C ----------------------------------------------------realign114 +C 114 ALIGN arrB(i) WITH arrA(2*i+8) REALIGN arrB(i) WITH arrA(i) + subroutine realign114 + integer, parameter :: AN1=24,BN1=8,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=2,li=8 +c parameters for REALIGN + integer, parameter :: kr1i=1,lri=0 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign114' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + +!dvm$ region out(A1, B1) +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) = 0 + enddo + +!dvm$ parallel (i) on A1(i), private(ib) + do i=1,AN1 + A1(i) = i + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + B1(ib) = ib + endif + enddo +!dvm$ end region + +!dvm$ REALIGN B1(i) WITH A1(kr1i * i + lri) + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i) on B1(i), reduction(min(erria),min(errib)), +!dvm$* private(ia) + do i=1,BN1 + if (B1(i) /= (i)) then + errib = min(errib,i) + endif + ia=kr1i * i + lri + if (A1(ia) /= (ia)) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B1,A1) + + end subroutine realign114 +C ----------------------------------------------------realign115 +C 115 ALIGN arrB(*) WITH arrA(*) REALIGN arrB(i) WITH arrA(i+4) + subroutine realign115 + integer, parameter :: AN1=24,BN1=8,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=0,li=0 +c parameters for REALIGN + integer, parameter :: kr1i=1,lri=4 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign115' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(*) WITH A1(*) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + + do i=1,BN1 + B1(i) = i+4 + enddo + +!dvm$ region +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = (i+1) ** 2 + enddo +!dvm$ end region + +!dvm$ REALIGN B1(i) WITH A1(kr1i * i + lri) + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i) on B1(i), +!dvm$* private(ia), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + if (B1(i) /= (i+4)) then + errib = min(errib,i) + endif + ia=kr1i * i + lri + if (A1(ia) /= (ia+1)**2) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B1,A1) + + end subroutine realign115 +C ----------------------------------------------------realign116 +C 116 ALIGN arrB(i) WITH arrA(4*i-3) REALIGN arrB(i) WITH arrA(*) + subroutine realign116 + integer, parameter :: AN1=36,BN1=8,NL=1000,ER=10000 + integer :: erria = ER, errib = ER +c parameters for ALIGN + integer, parameter :: k1i=4,li=-3 +c parameters for REALIGN + integer, parameter :: kr1i=0,lri=0 + integer, allocatable :: A1(:),B1(:) + character(*), parameter :: tname = 'realign116' + +!dvm$ distribute A1(BLOCK) +!dvm$ ALIGN B1(i) WITH A1(k1i * i + li) +!dvm$ DYNAMIC B1 + + allocate (A1(AN1),B1(BN1)) + +!dvm$ region +!dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) = i+6 + enddo + +!dvm$ parallel (i) on A1(i) + do i=1,AN1 + A1(i) = (i+1) ** 3 + enddo +!dvm$ end region + +!dvm$ REALIGN B1(*) WITH A1(*) + +!dvm$ actual(erria, errib) + +!dvm$ region +!dvm$ parallel (i) on B1(i), reduction(min(errib)) + do i=1,BN1 + if (B1(i) /= (i+6)) then + errib = min(errib,i) + endif + enddo +!dvm$ parallel (i) on A1(i),reduction(min(erria)) + do i=1,AN1 + if (A1(i) /= ((i+1)**3)) then + erria = min(erria,i) + endif + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B1,A1) + + end subroutine realign116 +C ------------------------------------------------- + + + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign22.fdv new file mode 100644 index 0000000..5db0f1f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign22.fdv @@ -0,0 +1,483 @@ + program REALIGN22 + +c Testing REALIGN directive + + print *,'===START OF realign22====================' +C ------------------------------------------------- +c 221 ALIGN arrB[i][j] WITH arrA[i][j] REALIGN arrB[i][j] WITH arrA[3*i-2][2*j+1] + call realign221 +C ------------------------------------------------- +c 222 ALIGN arrB[i][j] WITH arrA[j+1][i] REALIGN arrB[i][j] WITH arrA[i+4][j] + call realign222 +C ------------------------------------------------- +c 223 ALIGN arrB[i][*] WITH arrA[*][i] REALIGN arrB[i][j] WITH arrA[i+4][j+4] + call realign223 +C ------------------------------------------------- +c 224 ALIGN arrB[*][*] WITH arrA[*][1] REALIGN arrB[i][j] WITH arrA[i+4][j+4] shift along i and j + call realign224 +C ------------------------------------------------- +c 225 ALIGN arrB[i][j] WITH arrA[i][j] REALIGN arrB[*][*] WITH arrA[*][2] + call realign225 +C ------------------------------------------------- +c 226 ALIGN arrB[i][j] WITH arrA[i][j] REALIGN arrB[i][j] WITH arrA[2*j+1][3*i-2] + call realign226 +C ------------------------------------------------- +C + print *,'=== END OF realign22 ====================' +C + end +C ----------------------------------------------------realign221 +c 221 ALIGN arrB[i][j] WITH arrA[i][j] REALIGN arrB[i][j] WITH arrA[3*i-2][2*j+1] + subroutine realign221 + integer, parameter :: AN1=10,AN2=10,BN1=4,BN2=4,NL=1000,ER=10000 + integer :: erria=ER, errib=ER + integer :: i,j,ia,ja,ib,jb +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=0,k1j=0,k2j=1,lj=0 +c parameters for REALIGN arrB[i][j] WITH arrA[kr1i * i + lri][kr2j * j + lrj] + integer, parameter :: kr1i=3,kr2i=0,lri=-2,kr1j=0,kr2j=2,lrj=1 + integer, allocatable :: A2(:,:),B2(:,:) + character(10) :: tname = 'realign221' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) +!dvm$ DYNAMIC B2 + + allocate (A2(AN1,AN2),B2(BN1,BN2)) + +!dvm$ region +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) = 0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B2(i,j) WITH A2(kr1i * i + lri,kr2j * j + lrj) + +!dvm$ actual(erria,errib) +!dvm$ region in(A2,B2), out(A2,B2) +!dvm$ parallel (i,j) on B2(i,j), private(ia,ja), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) /= (i*NL+j)) then + errib = min(errib,i*NL/10+j) + endif + ia=kr1i * i + lri + ja=kr2j * j + lrj + if (A2(ia,ja) /= (ia*NL+ja)) then + erria = min(erria,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B2,A2) + + end + +C ----------------------------------------------------realign222 +c 222 ALIGN arrB[i][j] WITH arrA[j+1][i] REALIGN arrB[i][j] WITH arrA[i+4][j] + subroutine realign222 + integer, parameter :: AN1=8,AN2=8,BN1=4,BN2=4,NL=1000,ER=10000 + integer :: erria=ER, errib=ER + integer :: i,j,ia,ja,ib,jb +c parameters for ALIGN arrB[i][j] WITH arrA[k2i * j + li][k1j * i + lj] + integer, parameter :: k1i=0,k2i=1,li=1,k1j=1,k2j=0,lj=0 +c parameters for REALIGN arrB[i][j] WITH arrA[kr1i * i + lri][kr2j * j + lrj] + integer, parameter :: kr1i=1,kr2i=0,lri=0,kr1j=0,kr2j=1,lrj=0 + integer, allocatable :: A2(:,:),B2(:,:) + character(10) :: tname = 'realign222' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k2i * j + li,k1j * i + lj) +!dvm$ DYNAMIC B2 + + allocate (A2(AN1,AN2),B2(BN1,BN2)) + +!dvm$ region +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) = 1 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = (i*NL+j)*2 + if (((i-li) .eq.(((i-li)/k2i) * k2i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((i-li)/k2i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((i-li)/k2i) .le. BN2) .and. + * (((j-lj)/k1j) .le. BN1)) then + ib = (j-lj)/k1j + jb = (i-li)/k2i + B2(ib,jb) = B2(ib,jb) + ib*NL+jb + endif + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B2(i,j) WITH A2(kr1i * i + lri,kr2j * j + lrj) + +!dvm$ actual(erria,errib) +!dvm$ region +!dvm$ parallel (i,j) on B2(i,j), +!dvm$* reduction(min(erria),min(errib)), +!dvm$* private(ia,ja) + + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) /= (i*NL+j+1)) then + errib = min(errib,i*NL/10+j) + endif + ia=kr1i * i + lri + ja=kr2j * j + lrj + if (A2(ia,ja) /= (ia*NL+ja)*2) then + erria = min(erria,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erria,eriib) + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B2,A2) + + end + +C ----------------------------------------------------realign223 +c 223 ALIGN arrB[i][*] WITH arrA[*][i] REALIGN arrB[i][j] WITH arrA[i+4][j+4] + subroutine realign223 + integer, parameter :: AN1=10,AN2=10,BN1=4,BN2=4,NL=1000,ER=10000 + integer :: erria=ER, errib=ER + integer :: i,j,ia,ja,ib,jb +c parameters for ALIGN arrB[i][*] WITH arrA[*][k1j*i + lj] + integer, parameter :: k1i=0,k2i=0,li=0,k1j=1,k2j=0,lj=0 +c parameters for REALIGN arrB[i][j] WITH arrA[kr1i * i + lri][kr2j * j + lrj] + integer, parameter :: kr1i=1,kr2i=0,lri=4,kr1j=0,kr2j=1,lrj=4 + integer, allocatable :: A2(:,:),B2(:,:) + character(10) :: tname = 'realign223' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,*) WITH A2(*,k1j * i + lj) +!dvm$ DYNAMIC B2 + + allocate (A2(AN1,AN2),B2(BN1,BN2)) + + B2 = 0 + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb,k) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + do k=1,BN2 + if ( + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((j-lj)/k1j) .le. BN1) + * ) then + ib = ((j-lj)/k1j) + jb = k +! B2(ib,jb) = B2(ib,jb) + ib*NL+jb + B2(ib,jb) = ib*NL+jb+5 + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B2(i,j) WITH A2(kr1i * i + lri,kr2j * j + lrj) + +!dvm$ actual(erria,errib) +!dvm$ region in(A2,B2), local(A2,B2) +!dvm$ parallel (i,j) on B2(i,j), private(ia,ja), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) /= (i*NL+j+5)) then + errib = min(errib,i*NL/10+j) + endif + ia=kr1i * i + lri + ja=kr2j * j + lrj + if (A2(ia,ja) /= (ia*NL+ja)) then + erria = min(erria,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) +! print *,erria, errib + endif + + deallocate (B2,A2) + + end + +C ----------------------------------------------------realign224 +c 224 ALIGN arrB[*][*] WITH arrA[*][1] REALIGN arrB[i][j] WITH arrA[i+4][j+4] + subroutine realign224 + integer, parameter :: AN1=10,AN2=10,BN1=4,BN2=4,NL=1000,ER=10000 + integer :: erria=ER, errib=ER + integer :: i,j,ia,ja,ib,jb +c parameters for ALIGN arrB[*][*] WITH arrA[*][lj] + integer, parameter :: k1i=0,k2i=0,li=0,k1j=0,k2j=0,lj=1 +c parameters for REALIGN arrB[i][j] WITH arrA[kr1i * i + lri][kr2j * j + lrj] + integer, parameter :: kr1i=1,kr2i=0,lri=4,kr1j=0,kr2j=1,lrj=4 + integer, allocatable :: A2(:,:),B2(:,:) + character(10) :: tname = 'realign224' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(*,*) WITH A2(*,lj) +!dvm$ DYNAMIC B2 + + allocate (A2(AN1,AN2),B2(BN1,BN2)) + + B2 = 0 + +!dvm$ region +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb,k,n) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j+3 + if (j == (lj)) then + do k=1,BN1 + do n=1,BN2 + ib = k + jb = n +! B2(ib,jb) = B2(ib,jb) + (ib*NL+jb)*2 + B2(ib,jb) = (ib*NL+jb)*2 + enddo + enddo + endif + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B2(i,j) WITH A2(kr1i * i + lri,kr2j * j + lrj) + +!dvm$ actual(erria,errib) +!dvm$ region +!dvm$ parallel (i,j) on B2(i,j), private(ia,ja), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) /= (i*NL+j)*2) then + errib = min(errib,i*NL/10+j) + endif + ia=kr1i * i + lri + ja=kr2j * j + lrj + if (A2(ia,ja) /= (ia*NL+ja+3)) then + erria = min(erria,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) +! print *,erria, errib + endif + + deallocate (B2,A2) + + end + +C ----------------------------------------------------realign225 +c 225 ALIGN arrB[i][j] WITH arrA[i][j] REALIGN arrB[*][*] WITH arrA[*][2] + subroutine realign225 + integer, parameter :: AN1=10,AN2=10,BN1=4,BN2=4,NL=1000,ER=10000 + integer :: erria=ER, errib=ER + integer :: i,j,ia,ja,ib,jb +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=0,k1j=0,k2j=1,lj=0 +c parameters for REALIGN arrB[*][*] WITH arrA[*][lrj] + integer, parameter :: kr1i=0,kr2i=0,lri=0,kr1j=0,kr2j=0,lrj=2 + integer, allocatable :: A2(:,:),B2(:,:) + character(10) :: tname = 'realign225' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) +!dvm$ DYNAMIC B2 + + allocate (A2(AN1,AN2),B2(BN1,BN2)) + +!dvm$ region +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) = 0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = i*NL+j + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B2(*,*) WITH A2(*,lrj) + +!dvm$ actual(errib) +!dvm$ region +!dvm$ parallel (i,j) on B2(i,j), reduction( min( errib ) ) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) /= (i*NL+j)) then + errib = min(errib,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(errib) + if (errib == ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B2,A2) + + end +C ----------------------------------------------------realign226 +c 226 ALIGN arrB[i][j] WITH arrA[i][j] REALIGN arrB[i][j] WITH arrA[2*j+1][3*i-2] + subroutine realign226 + integer, parameter :: AN1=16,AN2=18,BN1=6,BN2=4,NL=1000,ER=10000 + integer :: erria=ER, errib=ER + integer :: i,j,ia,ja,ib,jb +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,li=0,k2j=1,lj=0 +c parameters for REALIGN arrB[i][j] WITH arrA[kr1i * i + lri][kr2j * j + lrj] + integer, parameter :: kr1i=3,lri=-2,kr2j=2,lrj=1 + integer, allocatable :: A2(:,:),B2(:,:) + character(10) :: tname = 'realign226' + +!dvm$ distribute A2(BLOCK,BLOCK) +!dvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) +!dvm$ DYNAMIC B2 + + allocate (A2(AN1,AN2),B2(BN1,BN2)) + +!dvm$ region +!dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) = 0 + enddo + enddo + +!dvm$ parallel (i,j) on A2(i,j), private(ib,jb) + do i=1,AN1 + do j=1,AN2 + A2(i,j) = (i*NL+j) * 3 + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + B2(ib,jb) = ib*NL+jb + endif + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B2(i,j) WITH A2(kr2j * j + lrj,kr1i * i + lri) + +!dvm$ actual(erria,errib) +!dvm$ region inlocal(A2,B2) +!dvm$ parallel (i,j) on B2(i,j), private(ia,ja), +!dvm$* reduction(min(erria),min(errib)) + do i=1,BN1 + do j=1,BN2 + if (B2(i,j) /= (i*NL+j)) then + errib = min(errib,i*NL/10+j) + endif + ia=kr2j * j + lrj + ja=kr1i * i + lri + if (A2(ia,ja) /= (ia*NL+ja)*3) then + erria = min(erria,i*NL/10+j) + endif + enddo + enddo +!dvm$ end region + +!dvm$ get_actual(erria,errib) + if ((erria == ER) .and. (errib == ER)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B2,A2) + + end + +C --------------------------------------------------- + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign33.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign33.fdv new file mode 100644 index 0000000..95cd2bd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign33.fdv @@ -0,0 +1,697 @@ + program REALIGN33 + +! Testing ALIGN and REALIGN directives + + print *,'===START OF realign33========================' + +! -------------------------------------------------- +! 331 ALIGN arrB3(i,j,n) WITH arrA3(i,j,n) +! REALIGN arrB3(i,j,n) WITH arrA3(i+1,j+2,n+3) + + call realign331 +! -------------------------------------------------- +! 332 ALIGN arrB3(i,j,n) WITH arrA3(i,j,n) +! REALIGN arrB3(i,j,n) WITH arrA3(2*i,3*j,5*n) + + call realign332 +! -------------------------------------------------- +! 333 ALIGN arrB3(i,j,n) WITH arrA3(i+2,j+4,n+3) +! REALIGN arrB3(i,j,n) WITH arrA3(2*i-1,2*n,j+1) + + call realign333 +! -------------------------------------------------- +! 334 ALIGN arrB3(i,j,n) WITH arrA3(n+1,3*i+1,j+2) +! REALIGN arrB3(i,j,n) WITH arrA3(2*j,i+1,2*n+1) + + call realign334 +! -------------------------------------------------- +! 335 ALIGN arrB3(*,*,*) WITH arrA3(*,*,*) +! REALIGN arrB3(i,j,n) WITH arrA3(i,j,n) + + call realign335 +! -------------------------------------------------- +! 336 ALIGN arrB3(i,j,n) WITH arrA3(i,j+1,2*n+1) +! REALIGN arrB3(*,j,n) WITH arrA3(j+1,n,1) + + call realign336 +! ------------------------------------------------- +! + print *,'=== END OF realign33 ========================= ' + + end + +! ----------------------------------------------------realign331 +! 331 ALIGN arrB3(i,j,n) WITH arrA3(i,j,n) +! REALIGN arrB3(i,j,n) WITH arrA3(i+1,j+2,n+3) + + subroutine realign331 + integer, parameter :: AN1=10,AN2=10,AN3=10,BN1=9,BN2=8,BN3=6 + integer, parameter :: NL=10000,ER=100000 +! parameters for ALIGN + integer, parameter :: k1i=1, li=0 + integer, parameter :: k2j=1, lj=0 + integer, parameter :: k3n=1, ln=0 +! parameters for REALIGN + integer, parameter :: kr1i=1, lri=1 + integer, parameter :: kr2j=1, lrj=2 + integer, parameter :: kr3n=1, lrn=3 + + integer :: erria = ER, errib = ER + integer s,cs,i,j,n,ia,ja,na,ib,jb,nb + + integer, allocatable :: A3(:,:,:),B3(:,:,:) + character(*), parameter :: tname ='realign331' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,k3n*n+ln) +!dvm$ DYNAMIC B3 + + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + +!dvm$ region out(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) = 0 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n)=i*NL/10+j*NL/100+n*NL/1000 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) * k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + B3(ib,jb,nb)=ib*NL/10+jb*NL/100+nb*NL/1000 + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B3(i,j,n) WITH A3(kr1i*i+lri,kr2j*j+lrj,kr3n*n+lrn) + + s=0 + +!dvm$ actual(erria, errib, s) +!dvm$ region inlocal(A3,B3) +!dvm$ parallel (i,j,n) on B3(i,j,n), +!dvm$*reduction(min(erria),min(errib),sum(s)),private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n) /= (i*NL/10+j*NL/100+n*NL/1000)) then + errib = min(errib,i*NL/10 + j*NL/100 + n*NL/1000) + endif + ia=kr1i * i + lri + ja=kr2j * j + lrj + na=kr3n * n + lrn + if (A3(ia,ja,na) /= (ia*NL/10+ja*NL/100+na*NL/1000)) + * then + erria = min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + if ((erria == ER) .and. (errib == ER) + * .and. (s == cs)) then + call ansyes(tname) + else + call ansno(tname) +! write (*,*) erria,errib,s,cs + endif + + deallocate (B3,A3) + + end subroutine realign331 + +! ----------------------------------------------------realign332 +! 332 ALIGN arrB3(i,j,n) WITH arrA3(i,j,n) +! REALIGN arrB3(i,j,n) WITH arrA3(2*i,3*j,5*n) + + subroutine realign332 + integer, parameter :: AN1=12,AN2=16,AN3=25,BN1=4,BN2=3,BN3=5 + integer, parameter :: NL=10000,ER=100000 +! parameters for ALIGN + integer, parameter :: k1i=1, li=0 + integer, parameter :: k2j=1, lj=0 + integer, parameter :: k3n=1, ln=0 +! parameters for REALIGN + integer, parameter :: kr1i=2, lri=0 + integer, parameter :: kr2j=3, lrj=0 + integer, parameter :: kr3n=5, lrn=0 + + integer :: erria = ER, errib = ER + integer s,cs,i,j,n,ia,ja,na,ib,jb,nb + + integer, allocatable :: A3(:,:,:),B3(:,:,:) + character(*), parameter :: tname ='realign332' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,k3n*n+ln) +!dvm$ DYNAMIC B3 + + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + + A3 = 0 + B3 = 0 + +!dvm$ region inout(A3,B3) +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n)=i*NL/10+j*NL/100+n*NL/1000 + 10 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + B3(ib,jb,nb)=ib*NL/10+jb*NL/100+nb*NL/1000 + 5 + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B3(i,j,n) WITH A3(kr1i*i+lri, kr2j*j+lrj, kr3n*n+lrn) + + s=0 + +!dvm$ actual(erria, errib, s) +!dvm$ region inlocal(A3),inlocal(B3) +!dvm$ parallel (i,j,n) on B3(i,j,n), +!dvm$*reduction(min(erria),min(errib),sum(s)),private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n) /= (i*NL/10+j*NL/100+n*NL/1000) + 5) then + errib = min(errib,i*NL/10 + j*NL/100 + n*NL/1000) + endif + ia=kr1i * i + lri + ja=kr2j * j + lrj + na=kr3n * n + lrn + if (A3(ia,ja,na) /= (ia*NL/10+ja*NL/100+na*NL/1000)+10) + * then + erria = min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + 5 + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + if ((erria == ER) .and. (errib == ER) + * .and. (s == cs)) then + call ansyes(tname) + else + call ansno(tname) +! write (*,*) erria,errib,s,cs +! print *,B3 + endif + + deallocate (B3,A3) + + end subroutine realign332 + +! --------------------------------------------------realign333 +! 333 ALIGN arrB3(i,j,n) WITH arrA3(i+2,j+4,n+3) +! REALIGN arrB3(i,j,n) WITH arrA3(2*i-1,2*n,j+1) + + subroutine realign333 + integer, parameter :: AN1=12,AN2=16,AN3=25,BN1=4,BN2=3,BN3=5 + integer, parameter :: NL=10000,ER=100000 +! parameters for ALIGN + integer, parameter :: k1i=1, li=2 + integer, parameter :: k2j=1, lj=4 + integer, parameter :: k3n=1, ln=3 +! parameters for REALIGN + integer, parameter :: kr1i=2, lri=-1 + integer, parameter :: kr2j=1, lrj=1 + integer, parameter :: kr3n=2, lrn=0 + + integer :: erria = ER, errib = ER + integer s,cs,i,j,n,ia,ja,na,ib,jb,nb + + integer A3(AN1,AN2,AN3) + integer, allocatable :: B3(:,:,:) + character(*), parameter :: tname ='realign333' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,k3n*n+ln) +!dvm$ DYNAMIC B3 + + allocate (B3(BN1,BN2,BN3)) + + A3 = 1 + B3 = 2 + +!dvm$ region inout(A3),inout(B3) +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n)+ i*NL/10+j*NL/100+n*NL/1000 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + B3(ib,jb,nb) = B3(ib,jb,nb) + + * ib*NL/10+jb*NL/100+nb*NL/1000 + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B3(i,j,n) WITH A3(kr1i*i+lri, kr3n*n+lrn, kr2j*j+lrj) + + s=0 + +!dvm$ actual(erria, errib, s) +!dvm$ region +!dvm$ parallel (i,j,n) on B3(i,j,n), private(ia,ja,na), +!dvm$*reduction(min(erria),min(errib),sum(s)) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n) /= (i*NL/10+j*NL/100+n*NL/1000) + 2) then + errib = min(errib,i*NL/10 + j*NL/100 + n*NL/1000) + endif + ia=kr1i * i + lri + ja=kr3n * n + lrn + na=kr2j * j + lrj + if (A3(ia,ja,na) /= (ia*NL/10+ja*NL/100+na*NL/1000)+1) + * then + erria = min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + 2 + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + if ((erria == ER) .and. (errib == ER) + * .and. (s == cs)) then + call ansyes(tname) + else + call ansno(tname) +! write (*,*) erria,errib,s,cs +! print *,B3 + endif + + deallocate (B3) + + end subroutine realign333 + +! ----------------------------------------------------realign334 +! 334 ALIGN arrB3(i,j,n) WITH arrA3(n+1,3*i+1,j+2) +! REALIGN arrB3(i,j,n) WITH arrA3(2*j,i+1,2*n+1) + + subroutine realign334 + integer, parameter :: AN1=15,AN2=28,AN3=20,BN1=4,BN2=6,BN3=6 + integer, parameter :: NL=10000,ER=100000 +! parameters for ALIGN + integer, parameter :: k1i=3, li=1 + integer, parameter :: k2j=1, lj=2 + integer, parameter :: k3n=1, ln=1 +! parameters for REALIGN + integer, parameter :: kr1i=1, lri=1 + integer, parameter :: kr2j=2, lrj=0 + integer, parameter :: kr3n=2, lrn=1 + + integer :: erria = ER, errib = ER + integer s,cs,i,j,n,ia,ja,na,ib,jb,nb + + integer A3(AN1,AN2,AN3),B3(BN1,BN2,BN3) + character(*), parameter :: tname ='realign334' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k3n*n+ln,k1i*i+li,k2j*j+lj) +!dvm$ DYNAMIC B3 + + A3 = 0 + B3 = 0 + +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10+j*NL/100+n*NL/1000 + if ( + * ((i-ln) .eq.(((i-ln)/k3n) * k3n)) .and. + * ((j-li) .eq.(((j-li)/k1i) * k1i)) .and. + * ((n-lj) .eq.(((n-lj)/k2j) * k2j)) .and. + * (((i-ln)/k3n) .gt. 0) .and. + * (((j-li)/k1i) .gt. 0) .and. + * (((n-lj)/k2j) .gt. 0) .and. + * (((i-ln)/k3n) .le. BN3) .and. + * (((j-li)/k1i) .le. BN1) .and. + * (((n-lj)/k2j) .le. BN2) + * ) then + ib = (j-li)/k1i + jb = (n-lj)/k2j + nb = (i-ln)/k3n + B3(ib,jb,nb) = B3(ib,jb,nb) + + * ib*NL/10+jb*NL/100+nb*NL/1000 + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B3(i,j,n) WITH A3(kr2j*j+lrj, kr1i*i+lri, kr3n*n+lrn) + + s=0 + +!dvm$ actual(erria, errib, s) +!dvm$ region +!dvm$ parallel (i,j,n) on B3(i,j,n), +!dvm$*reduction(min(erria),min(errib),sum(s)), +!dvm$*private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n) /= (i*NL/10+j*NL/100+n*NL/1000)) then + errib = min(errib,i*NL/10 + j*NL/100 + n*NL/1000) + endif + ia=kr2j * j + lrj + ja=kr1i * i + lri + na=kr3n * n + lrn + if (A3(ia,ja,na) /= (ia*NL/10+ja*NL/100+na*NL/1000)) then + erria = min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000) +! print *, ia, ja, na + endif + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + if ((erria == ER) .and. (errib == ER) + * .and. (s == cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end subroutine realign334 + +! ----------------------------------------------------realign335 +! 335 ALIGN arrB3(*,*,*) WITH arrA3(*,*,*) +! REALIGN arrB3(i,j,n) WITH arrA3(i,j,n) + + subroutine realign335 + integer, parameter :: AN1=10,AN2=10,AN3=10,BN1=4,BN2=8,BN3=4 + integer, parameter :: NL=10000,ER=100000 +! parameters for ALIGN + integer, parameter :: k1i=0, li=0 + integer, parameter :: k2j=0, lj=0 + integer, parameter :: k3n=0, ln=0 +! parameters for REALIGN + integer, parameter :: kr1i=1, lri=0 + integer, parameter :: kr2j=1, lrj=0 + integer, parameter :: kr3n=1, lrn=0 + + integer :: erria = ER, errib = ER + integer s,cs,i,j,n,ia,ja,na,ib,jb,nb + + integer, allocatable :: A3(:,:,:),B3(:,:,:) + character(*), parameter :: tname = 'realign335' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(*,*,*) WITH A3(*,*,*) +!dvm$ DYNAMIC B3 + + allocate (A3(AN1,AN2,AN3), B3(BN1,BN2,BN3)) + + A3 = 0 + B3 = 6 + +!dvm$ actual (A3,B3) +!dvm$ region +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = A3(i,j,n) + i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ parallel (i,j,n) on B3(i,j,n), private(ib,jb,nb) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + B3(i,j,n) = B3(i,j,n) + i*NL/10+j*NL/100+n*NL/1000 + enddo + enddo + enddo + +!dvm$ end region + +!dvm$ REALIGN B3(i,j,n) WITH A3(kr1i*i+lri, kr2j*j+lrj, kr3n*n+lrn) + + s=0 + +!dvm$ actual(erria, errib, s) +!dvm$ region inlocal(A3) +!dvm$ parallel (i,j,n) on B3(i,j,n), +!dvm$* reduction(min(erria),min(errib),sum(s)),private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n) /= (i*NL/10+j*NL/100+n*NL/1000)+ 6) then + errib = min(errib,i*NL/10 + j*NL/100 + n*NL/1000) + endif + ia=kr1i * i + lri + ja=kr2j * j + lrj + na=kr3n * n + lrn + if (A3(ia,ja,na) /= (ia*NL/10+ja*NL/100+na*NL/1000)) then + erria = min(erria,ia*NL/10 + ja*NL/100 + na*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100 + n*NL/1000 + 6 + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + if ((erria == ER) .and. (errib == ER) + * .and. (s == cs)) then + call ansyes(tname) + else + call ansno(tname) +! write (*,*) erria,errib,s,cs +! print *,B3 + endif + + deallocate (B3,A3) + + end subroutine realign335 + +! ----------------------------------------------------realign336 +! 336 ALIGN arrB3(i,j,n) WITH arrA3(i,j+1,2*n+1) +! REALIGN arrB3(*,j,n) WITH arrA3(j+1,n,1) + + subroutine realign336 + integer, parameter :: AN1=8,AN2=8,AN3=8 + integer, parameter :: BN1=3,BN2=4,BN3=3 + integer, parameter :: NL=10000,ER=100000 +! parameters for ALIGN + integer, parameter :: k1i=1,li=0 + integer, parameter :: k2j=1,lj=1 + integer, parameter :: k3n=2,ln=1 +! parameters for REALIGN + integer, parameter :: kr1i=0,lri=1 + integer, parameter :: kr2j=1,lrj=1 + integer, parameter :: kr3n=1,lrn=0 + integer, allocatable :: A3(:,:,:),B3(:,:,:) + integer :: s,cs,erria = ER, errib = ER, + > i,j,n,m,ia,ja,na,ib,jb,nb + character(10) :: tname='realign336' + +!dvm$ distribute A3(BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B3(i,j,n) WITH A3(k1i*i+li,k2j*j+lj,k3n*n+ln) +!dvm$ DYNAMIC B3 + + allocate (A3(AN1,AN2,AN3),B3(BN1,BN2,BN3)) + + B3 = 0 + +!dvm actual (B3) +!dvm$ region inout(B3), inout(A3) +!dvm$ parallel (i,j,n) on A3(i,j,n), private(ib,jb,nb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + A3(i,j,n) = i*NL/10+j*NL/100+n*NL/1000 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + B3(ib,jb,nb)=ib*NL/10+jb*NL/100+nb*NL/1000 + endif + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B3(*,j,n) WITH A3(kr2j*j+lrj,kr3n*n+lrn,lri) + + s=0 + +!dvm$ actual(erria, errib, s) +!dvm$ region +!dvm$ parallel (i,j,n) on B3(i,j,n), +!dvm$* reduction(min(erria), min(errib), sum(s)) +!dvm$*,private(ia,ja,na) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + s = s + B3(i,j,n) + if (B3(i,j,n) /= (i*NL/10+j*NL/100+n*NL/1000))then + errib = min(errib,i*NL/10 + j*NL/100+ n*NL/1000) + endif + ia=kr2j*j+lrj + ja=kr3n*n+lrn + na=lri + if (A3(ia,ja,na)/= + * (ia*NL/10+ja*NL/100+na*NL/1000))then + erria = min(erria,i*NL/10 + j*NL/100+ n*NL/1000) + endif + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000 + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + + + if ((erria == ER) .and. (errib == ER) .and. + * (s == cs)) then + call ansyes(tname) + else + call ansno(tname) +! print *, erria, errib + endif + + deallocate (B3,A3) + + end + +! ---------------------------------------------------- + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign44.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign44.fdv new file mode 100644 index 0000000..e55a9bd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REALIGN/realign44.fdv @@ -0,0 +1,557 @@ + program REALIGN44 + +c Testing REALIGN directive + + print *,'===START OF realign44====================' +C -------------------------------------------------- +c 441 ALIGN arrB[i][j][n][m] WITH arrA[i][j][n][m] +c REALIGN arrB[][j][k][] WITH arrA[j][k][1][3] + call realign441 +C ------------------------------------------------- +c 442 ALIGN arrB[][j][n][i] WITH arrA[i][j][ ][n] +c REALIGN arrB[i][j][ ][m] WITH arrA[i][j][2][m] + call realign442 +C -------------------------------------------------- +c 443 ALIGN arrB[i][j][n][m] WITH arrA[i][2*j][3*n][4*m] +c REALIGN arrB[i][j][n][m] WITH arrA[i+1][j+2][n+3][m+4] + call realign443 +C ------------------------------------------------- +c 444 ALIGN arrB[i][j][n][m] WITH arrA[m][i+1][j][2*n] +c REALIGN arrB[i][j][n][m] WITH arrA[i+2][3*j-2][2*n-2][m+1] + call realign444 +C ------------------------------------------------- +C + print *,'=== END OF realign44 ====================' + + end + +C ----------------------------------------------------realign441 +c 441 ALIGN arrB[i][j][n][m] WITH arrA[i][j][n][m] +c REALIGN arrB[][j][n][] WITH arrA[j][n][1][3] + + subroutine realign441 + integer, parameter :: AN1=6,AN2=8,AN3=5,AN4=7 + integer, parameter :: BN1=2,BN2=5,BN3=4,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,li=0 + integer, parameter :: k2j=1,lj=0 + integer, parameter :: k3n=1,ln=0 + integer, parameter :: k4m=1,lm=0 +c parameters for REALIGN arrB[*][j][n][*] WITH arrA[kr2j*j+lrj][kr3n*n+lrn][lri][lrm] + integer, parameter :: kr1i=0,lri=1 + integer, parameter :: kr2j=1,lrj=0 + integer, parameter :: kr3n=1,lrn=0 + integer, parameter :: kr4m=0,lrm=3 + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer :: s=0,cs,erria=ER, errib=ER, + > i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + + character(10) :: tname='realign441' + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) +!dvm$ DYNAMIC B4 + + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + +!dvm$ region out(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) = 0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb, nb, mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) * k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) * k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + mb = (m-lm)/k4m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B4(*,j,n,*) WITH A4(kr2j*j+lrj,kr3n*n+lrn,lri,lrm) + +!dvm$ actual(erria, errib, s) + +!dvm$ region + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), +!dvm$* reduction(min(erria),min(errib),sum(s)), +!dvm$* private(ia,ja, na, ma) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m)/= (i*NL/10+j*NL/100+n*NL/1000+m))then + errib = min(errib,i*NL/10+j*NL/100+n*NL/1000+m) + endif + ia=kr2j*j+lrj + ja=kr3n*n+lrn + na=lri + ma=lrm + if (A4(ia,ja,na,ma) /= + * (ia*NL/10+ja*NL/100+na*NL/1000+ma))then + erria = min(erria,ia*NL/10+ja*NL/100+na*NL/1000+ma) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + + if ((erria == ER) .and. (errib == ER) .and. + * (s == cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B4,A4) + + end + +C ----------------------------------------------------realign442 +c 442 ALIGN arrB[*][j][n][i] WITH arrA[i][j][*][n] +c REALIGN arrB[i][j][*][m] WITH arrA[i][j][2][m] + + subroutine realign442 + integer, parameter :: AN1=5,AN2=5,AN3=5,AN4=5 + integer, parameter :: BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[*][j][n][i] WITH arrA4(k1i*i+li,k2j*j+lj,*,k3m*n+lm) + integer, parameter :: k1i=1, li=0 + integer, parameter :: k2j=1, lj=0 + integer, parameter :: k3n=0, ln=0 + integer, parameter :: k3m=1, lm=0 +c parameters for REALIGN arrB[i][j][*][m] WITH arrA(kr1i*i+lri,kr2j*j+lrj,lrn,kr4m*m+lrm) + integer, parameter :: kr1i=1, lri=0 + integer, parameter :: kr2j=1, lrj=0 + integer, parameter :: kr3n=0, lrn=2 + integer, parameter :: kr4m=1, lrm=0 + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer :: s=0,cs,erria=ER, errib=ER, + > i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + character(10) :: tname='realign442' + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(*,j,n,i) WITH A4(k1i*i+li,k2j*j+lj,*,k3m*n+lm) +!dvm$ DYNAMIC B4 + + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + +!dvm$ region inout(A4, B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) = 0 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb, nb, mb,k) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m + do k = 1,BN1 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((m-lm) .eq.(((m-lm)/k3m) *k3m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((m-lm)/k3m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN4) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((m-lm)/k3m) .le. BN3) + * ) then + mb = (i-li)/k1i + jb = (j-lj)/k2j + ib = k + nb = (m-lm)/k3m + B4(ib,jb,nb,mb)=ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B4(i,j,*,m) WITH A4(kr1i*i+lri,kr2j*j+lrj,lrn,kr4m*m+lrm) + +!dvm$ actual(erria, errib, s) + +!dvm$ region + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), +!dvm$* reduction(min(erria),min(errib),sum(s)), +!dvm$* private(ia,ja,na,ma) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m)) then + errib = min(errib,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + ia=kr1i*i+lri + ja=kr2j*j+lrj + na=lrn + ma=kr4m*m+lrm + if (A4(ia,ja,na,ma) /= + * (ia*NL/10+ja*NL/100+na*NL/1000+ma)) then + erria = min(erria,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + enddo + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + + if ((erria == ER) .and. (errib == ER) .and. + * (s == cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B4,A4) + + end + +C ----------------------------------------------------realign443 +c 443 ALIGN arrB[i][j][n][m] WITH arrA[i][2*j][3*n][4*m] +c REALIGN arrB[i][j][n][m] WITH arrA[i+1][j+2][n+3][m+4] + + subroutine realign443 + integer, parameter :: AN1=10,AN2=8,AN3=15,AN4=12 + integer, parameter :: BN1=4,BN2=3,BN3=5,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA[k1i*i+li][k2j*j+lj][k3n*n+ln][k4m*m+lm] + integer, parameter :: k1i=1,li=0 + integer, parameter :: k2j=2,lj=0 + integer, parameter :: k3n=3,ln=0 + integer, parameter :: k4m=4,lm=0 +c parameters for REALIGN arrB[i][j][n][m] WITH arrA[kr1i*i+lri][kr2j*j+lrj][kr3n*n+lrn][kr4m*m+lrm] + integer, parameter :: kr1i=1,lri=1 + integer, parameter :: kr2j=1,lrj=2 + integer, parameter :: kr3n=1,lrn=3 + integer, parameter :: kr4m=1,lrm=4 + + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer :: s=0,cs,erria=ER, errib=ER, + > i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + + character(10) :: tname='realign443' + + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) +!dvm$ DYNAMIC B4 + + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + +!dvm$ region out(A4,B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) = 5 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib,jb, nb, mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = i*NL/10+j*NL/100+n*NL/1000+m+1 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) * k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) * k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + mb = (m-lm)/k4m + B4(ib,jb,nb,mb)=B4(ib,jb,nb,mb)+ + * ib*NL/10+jb*NL/100+nb*NL/1000+mb + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B4(i,j,n,m) +!dvm$* WITH A4(kr1i*i+lri,kr2j*j+lrj,kr3n*n+lrn,kr4m*m+lrm) + +!dvm$ actual(erria, errib, s) + +!dvm$ region + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), +!dvm$* reduction(min(erria),min(errib),sum(s)), +!dvm$* private(ia,ja, na, ma) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m)/= (i*NL/10+j*NL/100+n*NL/1000+m+5)) + * then + errib = min(errib,i*NL/10+j*NL/100+n*NL/1000+m) + endif + ia=kr1i*i+lri + ja=kr2j*j+lrj + na=kr3n*n+lrn + ma=kr4m*m+lrm + if (A4(ia,ja,na,ma) /= + * (ia*NL/10+ja*NL/100+na*NL/1000+ma+1)) then + erria = min(erria,i*NL/10+j*NL/100+n*NL/1000+m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000 + m + 5 + enddo + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + + if ((erria == ER) .and. (errib == ER) .and. + * (s == cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B4,A4) + + end + +C ----------------------------------------------------realign444 +c 444 ALIGN arrB[i][j][n][m] WITH arrA[m][i+1][j][2*n] +c REALIGN arrB[i][j][n][m] WITH arrA[i+2][3*j-2][2*n-2][m+1] + + subroutine realign444 + integer, parameter :: AN1=12,AN2=15,AN3=16,AN4=10 + integer, parameter :: BN1=4,BN2=4,BN3=5,BN4=3 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA4(k4m*m+lm,k1i*i+li,k2j*j+lj,k3n*n+ln) + integer, parameter :: k1i=1, li=1 + integer, parameter :: k2j=1, lj=0 + integer, parameter :: k3n=2, ln=0 + integer, parameter :: k4m=1, lm=0 +c parameters for REALIGN arrB[i][j][n][m] WITH arrA(kr1i*i+lri,kr2j*j+lrj,k3n*n+lrn,kr4m*m+lrm) + integer, parameter :: kr1i=1, lri=2 + integer, parameter :: kr2j=3, lrj=-2 + integer, parameter :: kr3n=2, lrn=-1 + integer, parameter :: kr4m=1, lrm=1 + + integer, allocatable :: A4(:,:,:,:),B4(:,:,:,:) + integer :: s=0,cs,erria=ER, errib=ER, + > i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb + character(10) :: tname='realign444' + +!dvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ ALIGN B4(i,j,n,m) WITH A4(k4m*m+lm,k1i*i+li,k2j*j+lj,k3n*n+ln) +!dvm$ DYNAMIC B4 + + allocate (A4(AN1,AN2,AN3,AN4),B4(BN1,BN2,BN3,BN4)) + +!dvm$ region inout(A4, B4) +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + B4(i,j,n,m) = 4 + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,n,m) on A4(i,j,n,m), private(ib, jb, nb, mb) + do i=1,AN1 + do j=1,AN2 + do n=1,AN3 + do m=1,AN4 + A4(i,j,n,m) = 10+i*NL/10+j*NL/100+n*NL/1000+m + if ( + * ((i-lm) == (((i-lm)/k4m) * k4m)) .and. + * ((j-li) == (((j-li)/k1i) * k1i)) .and. + * ((n-lj) == (((n-lj)/k2j) * k2j)) .and. + * ((m-ln) == (((m-ln)/k3n) * k3n)) .and. + * (((i-lm)/k4m) > 0) .and. + * (((j-li)/k1i) > 0) .and. + * (((n-lj)/k2j) > 0) .and. + * (((m-ln)/k3n) > 0) .and. + * (((i-lm)/k4m) <= BN4) .and. + * (((j-li)/k1i) <= BN1) .and. + * (((n-lj)/k2j) <= BN2) .and. + * (((m-ln)/k3n) <= BN3) + * ) then + ib = (j-li)/k1i + jb = (n-lj)/k2j + nb = (m-ln)/k3n + mb = (i-lm)/k4m + B4(ib,jb,nb,mb) = B4(ib,jb,nb,mb) + + * ib*NL/10+jb*NL/100+nb*NL/1000+mb; + endif + enddo + enddo + enddo + enddo +!dvm$ end region + +!dvm$ REALIGN B4(i,j,n,m) +!dvm$* WITH A4(kr1i*i+lri,kr2j*j+lrj,kr3n*n+lrn,kr4m*m+lrm) + +!dvm$ actual(erria, errib, s) + +!dvm$ region + +!dvm$ parallel (i,j,n,m) on B4(i,j,n,m), +!dvm$* reduction(min(erria),min(errib),sum(s)), +!dvm$* private(ia,ja,na,ma) + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + s = s + B4(i,j,n,m) + if (B4(i,j,n,m) /= (i*NL/10+j*NL/100+n*NL/1000+m+4))then + errib = min(errib,i*NL/10 + j*NL/100+ n*NL/1000 + m) + endif + ia=kr1i*i+lri; + ja=kr2j*j+lrj; + na=kr3n*n+lrn; + ma=kr4m*m+lrm; + if (A4(ia,ja,na,ma) /= + * (ia*NL/10+ja*NL/100+na*NL/1000+ma+10))then + erria = min(erria,i*NL/10 + j*NL/100+ n*NL/1000+ m) + endif + enddo + enddo + enddo + enddo +!dvm$ end region + + cs = 0 + do i=1,BN1 + do j=1,BN2 + do n=1,BN3 + do m=1,BN4 + cs = cs + i*NL/10 + j*NL/100+ n*NL/1000+ m + 4 + enddo + enddo + enddo + enddo + +!dvm$ get_actual(erria, errib, s) + + if ((erria == ER) .and. (errib == ER) .and. + * (s == cs)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (B4,A4) + + end + +C ------------------------------------------------- + subroutine ansyes(name) + character(*) name + print *,name,' - complete' + end + subroutine ansno(name) + character(*) name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red11.fdv new file mode 100644 index 0000000..edb8b90 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red11.fdv @@ -0,0 +1,929 @@ + program RED11 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM.PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N). + + print *,'===START OF RED11========================' +C -------------------------------------------------- + call red1101 +C -------------------------------------------------- + call red1102 +C -------------------------------------------------- + call red1103 +C ------------------------------------------------- + call red1104 +C ------------------------------------------------- + call red1105 +C ------------------------------------------------- + call red1106 +C -------------------------------------------------- + call red1107 +C -------------------------------------------------- + call red1108 +C -------------------------------------------------- + call red1109 +C ------------------------------------------------- + call red1110 +C ------------------------------------------------- + call red1111 +C ------------------------------------------------- + call red1112 +C ------------------------------------------------- + call red1113 +C -------------------------------------------------- + call red1114 +C -------------------------------------------------- + call red1115 +C ------------------------------------------------- + call red1116 +C ------------------------------------------------- + +C +C + print *,'=== END OF RED11 ========================= ' + end + +C ----------------------------------------------------RED1101 + subroutine RED1101 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer isum1,isumt1 + +!dvm$ distribute A(BLOCK) + + tname='RED1101' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1(C,NN,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( sum( isumt1 ) ) + do i=1,N + isumt1 = isumt1+A(i) + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1102 + subroutine RED1102 + integer, parameter :: N = 16 ,NL=1002 + character*7 tname + integer, allocatable :: A(:),C(:) + integer iprod1,iprodt1 + +!dvm$ distribute A(BLOCK) + + tname='RED1102' + allocate (A(N),C(N)) + NNL=NL + NN=N + call serprod1(C,NN,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( product( iprodt1 ) ) + do i=1,N + iprodt1 = iprodt1*A(i) + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED1103 + subroutine RED1103 + integer, parameter :: N = 16,NL=1003 + character*7 tname + integer, allocatable :: A(:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK) + + tname='RED1103' + allocate (A(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + ni=N/2 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + +!dvm$ actual(imaxt1,A) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( max( imaxt1 ) ) + do i=2,N + if (A(i).GT.imaxt1) imaxt1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A) + + end + +C ----------------------------------------------------RED1104 + subroutine RED1104 + integer, parameter :: N = 16,NL=1004 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK) + + tname='RED1104' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( min( imint1 ) ) + do i=2,N + if (A(i).LT.imint1) imint1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED1105 + subroutine RED1105 + integer, parameter :: N = 16 + real, parameter :: NL=1005 + character*7 tname + real, allocatable :: A(:),C(:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(BLOCK) + + tname='RED1105' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + ni=N/2 + A(ni)=N+1.+NL + imax1=N+1.+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( max( imaxt1 ) ) + do i=2,N + if (A(i).GT.imaxt1) imaxt1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED1106 + subroutine RED1106 + integer, parameter :: N = 8 ,NL=1. + character*7 tname + real, allocatable :: A(:),C(:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(BLOCK) + + tname='RED1106' + allocate (A(N),C(N)) + NNL=NL + NN=N + call serprodr1(C,NN,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( product( iprodt1 ) ) + do i=1,N + iprodt1 = iprodt1*A(i) + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1107 + subroutine RED1107 + integer, parameter :: N = 16 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(BLOCK) + + tname='RED1107' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i+1) + do i=1,N-1,2 + A(i+1)=.false. + enddo + +!dvm$ remote_access (A(1)) + landt1 = A(1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( AND( landt1 ) ) + do i=2,N + landt1 = landt1 .and.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1108 + subroutine RED1108 + integer, parameter :: N = 16 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK) + + tname='RED1108' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i) + do i=2,N,2 + A(i)=.false. + enddo + +!dvm$ remote_access (A(1)) + lort1 = A(1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i) on A(i),reduction( OR( lort1 ) ) + do i=2,N + lort1 = lort1 .or.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1109 + subroutine RED1109 + integer, parameter :: N = 16 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,lor1,lort1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(BLOCK) + + tname='RED1109' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i) + do i=2,N,2 + A(i)=.false. + enddo + +!dvm$ remote_access (A(1)) + leqvt1 = A(1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( EQV( leqvt1 ) ) + do i=2,N + leqvt1 = leqvt1 .eqv.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1110 + subroutine RED1110 + integer, parameter :: N = 8 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(BLOCK) + + tname='RED1110' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i) + do i=2,N,2 + A(i)=.false. + enddo + +!dvm$ remote_access (A(1)) + lneqvt1 = A(1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( NEQV( lneqvt1 ) ) + do i=2,N + lneqvt1 = lneqvt1 .neqv.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED1111 + subroutine RED1111 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK) + + tname='RED1111' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + ni=N/2+2 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + it1=0 + +!dvm$ actual(imaxt1,it1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( maxloc( imaxt1,it1,1 ) ) + do i=2,N + if (A(i).GT.imaxt1)then + imaxt1=A(i) + it1=i + endif + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,it1) + + if ((imax1 .eq.imaxt1) .and. (it1.eq.ni)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED1112 + subroutine RED1112 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin,imint1 + +!dvm$ distribute A(BLOCK) + + tname='RED1112' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) +!dvm$ remote_access (A(1)) + imint1=A(1) + it1=0 + +!dvm$ actual(imint1,it1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( minloc( imint1,it1,1 ) ) + do i=2,N + if (A(i).LT.imint1)then + imint1=A(i) + it1=i + endif + enddo +!dvm$ end region +!dvm$ get_actual(imint1,it1) + + if ((imin1 .eq.imint1) .and. (it1.eq.ni)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED1113 + subroutine RED1113 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer isum1,isumt1 + integer imax1,imaxt1 ,ni,imin1,imint1 + +!dvm$ distribute A(BLOCK) + + tname='RED1113' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1m(C,NN,NNL,isum1) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + isumt1 = 0 + +!dvm$ actual(imint1,imaxt1,isumt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxt1) imaxt1=A(i) + if (A(i).LT.imint1) imint1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(imint1,imaxt1,isumt1) + +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED1114 + subroutine RED1114 + integer, parameter :: N = 16 ,NL=1 + character*7 tname + integer, allocatable :: A(:),C(:) + integer iprod1,iprodt1 + logical, allocatable :: B(:),CL(:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK) +!dvm$ align B(I) with A(I) + + tname='RED1114' + allocate (A(N),C(N)) + allocate (B(N),CL(N)) + NNL=NL + NN=N + call serprod1(C,NN,NNL,iprod1) + call serlog1(CL,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on B(i) + do i=1,N,2 + B(i) = .true. + enddo + +!dvm$ parallel (i) on B(i+1) + do i=1,N-1,2 + B(i+1)=.false. + enddo + +!dvm$ remote_access (B(1)) + landt1 = B(1) + iprodt1 = 1 + + +!dvm$ actual(iprodt1,landt1) +!dvm$ region local(A) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( product( iprodt1 ), +!dvm$* and(landt1)) + do i=1,N + iprodt1 = iprodt1*A(i) + if (i.eq.1) then +! landt1=B(1) + else + landt1 = landt1 .and.B(i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end + + +C ----------------------------------------------------RED1115 + subroutine RED1115 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2 + integer imaxloct1,iminloct1 + +!dvm$ distribute A(BLOCK) + + tname='RED1115' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL +!dvm$ remote_access (A(1)) + imaxt1=A(1) + imaxloct1=imaxt1 + ni1=N/2 + A(ni1)=-(N+1+NL) + imin1=-(N+1+NL) +!dvm$ remote_access (A(1)) + imint1=A(1) + iminloct1=imint1 + it1=0 + it2=0 + +!dvm$ actual(imaxloct1,it1,iminloct1,it2) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( max( imaxt1 ), +!dvm$*maxloc( imaxloct1,it1,1 ),minloc( iminloct1,it2,1 ) ) + do i=1,N + if (A(i).GT.imaxt1) imaxt1 =A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + enddo +!dvm$ end region +!dvm$ get_actual(imaxloct1,it1,iminloct1,it2) + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,it2,ni,ni1 + + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(imaxt1.eq.imaxloct1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------RED1116 + subroutine RED1116 + integer, parameter :: N = 16 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:),C(:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer it1,it2,ni,ni1 +!dvm$ distribute A(BLOCK) + + tname='RED1116' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1mr(C,NN,NNL,isum1) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + imaxloct1=imaxt1 + ni1=N/2 + A(ni1)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + iminloct1=imint1 + isumt1 = 0. + it1=0 + it2=0 + + +!dvm$ actual(isumt1,imaxloct1,it1,iminloct1,it2) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( sum( isumt1 ), +!dvm$*maxloc( imaxloct1,it1,1 ),minloc( iminloct1,it2,1 ) ) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxloct1,it1,iminloct1,it2) + +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,it2,ni,ni1 +c print *,isum1,isumt1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------- + + subroutine sersum1(AR,N,NL,S) + integer AR(N) + integer S,NL + do i=1,N + AR(i) = i+NL + enddo + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + + + subroutine sersum1m(AR,N,NL,S) + integer AR(N) + integer S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2-1 + AR(ni)=N+1+NL + ni=N/2 + AR(ni)=-(N+1+NL) + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + + subroutine sersum1mr(AR,N,NL,S) + real AR(N) + real S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2-1 + AR(ni)=N+1+NL + ni=N/2 + AR(ni)=-(N+1+NL) + S=0. + do i=1,N + S = S+ AR(i) + enddo + end + + subroutine serprod1(AR,N,NL,P) + integer AR(N) + integer P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1 + do i=1,N + P = P* AR(i) + enddo + end + + subroutine serprodr1(AR,N,NL,P) + real AR(N) + real P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1. + do i=1,N + P = P* AR(i) + enddo + end + + subroutine serlog1(AR,N,LAND,LOR,LEQV,LNEQV) + logical AR(N) + logical LAND,LOR,LEQV,LNEQV + do i=1,N,2 + AR(i) = .true. + AR(i+1)=.false. + enddo + LAND=AR(1) + LOR=AR(1) +c LEQV=.true. +c LNEQV=.false. + LEQV=AR(1) + LNEQV=AR(1) + do i=2,N + LAND = LAND .and. AR(i) + LOR = LOR .or.AR(i) + enddo + do i=2,N + LEQV = LEQV .eqv. AR(i) + enddo + do i=2,N + LNEQV = LNEQV .neqv. AR(i) + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red12.fdv new file mode 100644 index 0000000..67164a1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red12.fdv @@ -0,0 +1,941 @@ + program RED12 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM.PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N). + + print *,'===START OF RED12========================' +C -------------------------------------------------- + call red1201 +C -------------------------------------------------- + call red1202 +C -------------------------------------------------- + call red1203 +C ------------------------------------------------- + call red1204 +C ------------------------------------------------- + call red1205 +C ------------------------------------------------- + call red1206 +C -------------------------------------------------- + call red1207 +C -------------------------------------------------- + call red1208 +C -------------------------------------------------- + call red1209 +C ------------------------------------------------- + call red1210 +C ------------------------------------------------- + call red1211 +C ------------------------------------------------- + call red1212 +C ------------------------------------------------- + call red1213 +C -------------------------------------------------- + call red1214 +C -------------------------------------------------- + call red1215 +C ------------------------------------------------- + call red1216 +C ------------------------------------------------- + +C +C + print *,'=== END OF RED12 ========================= ' + end + +C ----------------------------------------------------RED1201 + subroutine RED1201 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer isum1,isumt1 + +!dvm$ distribute A(*) + + tname='RED1201' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1(C,NN,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( sum( isumt1 ) ) + do i=1,N + isumt1 = isumt1+A(i) + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1202 + subroutine RED1202 + integer, parameter :: N = 16, NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer iprod1,iprodt1 + +!dvm$ distribute A(*) + + tname='RED1202' + allocate (A(N),C(N)) + NNL=NL + NN=N + call serprod1(C,NN,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( product( iprodt1 ) ) + do i=1,N + iprodt1 = iprodt1*A(i) + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED1203 + subroutine RED1203 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(*) + + tname='RED1203' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( max( imaxt1 ) ) + do i=2,N + if (A(i).GT.imaxt1) imaxt1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED1204 + subroutine RED1204 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(*) + + tname='RED1204' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( min( imint1 ) ) + do i=2,N + if (A(i).LT.imint1) imint1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED1205 + subroutine RED1205 + integer, parameter :: N = 16 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:),C(:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(*) + + tname='RED1205' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2 + A(ni)=N+1.+NL + imax1=N+1.+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( max( imaxt1 ) ) + do i=2,N + if (A(i).GT.imaxt1) imaxt1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED1206 + subroutine RED1206 + integer, parameter :: N = 8 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:),C(:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(*) + + tname='RED1206' + allocate (A(N),C(N)) + NNL=NL + NN=N + call serprodr1(C,NN,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( product( iprodt1 ) ) + do i=1,N + iprodt1 = iprodt1*A(i) + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED1207 + subroutine RED1207 + integer, parameter :: N = 16 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(*) + + tname='RED1207' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i+1) + do i=1,N-1,2 + A(i+1)=.false. + enddo + +!dvm$ remote_access (A(1)) + landt1 = A(1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( AND( landt1 ) ) + do i=2,N + landt1 = landt1 .and.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1208 + subroutine RED1208 + integer, parameter :: N = 16 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(*) + + tname='RED1208' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i+1) + do i=1,N-1,2 + A(i+1)=.false. + enddo + +!dvm$ remote_access (A(1)) + lort1 = A(1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( OR( lort1 ) ) + do i=2,N + lort1 = lort1 .or.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1209 + subroutine RED1209 + integer, parameter :: N = 16 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(*) + + tname='RED1209' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i+1) + do i=1,N-1,2 + A(i+1)=.false. + enddo + +!dvm$ remote_access (A(1)) + leqvt1 = A(1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( EQV( leqvt1 ) ) + do i=2,N + leqvt1 = leqvt1 .eqv.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED1210 + subroutine RED1210 + integer, parameter :: N = 16 + character*7 tname + logical, allocatable :: A(:),C(:) + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(*) + + tname='RED1210' + allocate (A(N),C(N)) + NN=N + call serlog1(C,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on A(i) + do i=1,N,2 + A(i) = .true. + enddo + +!dvm$ parallel (i) on A(i+1) + do i=1,N-1,2 + A(i+1)=.false. + enddo + +!dvm$ remote_access (A(1)) + lneqvt1 = A(1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( NEQV( lneqvt1 ) ) + do i=2,N + lneqvt1 = lneqvt1 .neqv.A(i) + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED1211 + + subroutine RED1211 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin,lit + +!dvm$ distribute A(*) + + tname='RED1211' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + ni=N/2 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + lit=1 + it1=0 + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( maxloc( imaxt1,it1,1 ) ) + do i=2,N + if (A(i).GT.imaxt1)then + imaxt1=A(i) + it1=i + endif + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,it1,lit) + + if ((imax1 .eq.imaxt1) .and. (it1.eq.ni)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------RED1212 + subroutine RED1212 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin,lit + +!dvm$ distribute A(*) + + tname='RED1212' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + lit=1 + it1=0 + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( minloc( imint1,it1,1 ) ) + do i=2,N + if (A(i).LT.imint1)then + imint1=A(i) + it1=i + endif + enddo +!dvm$ end region +!dvm$ get_actual(imint1,it1,lit) + + if ((imin1 .eq.imint1) .and. (it1.eq.ni)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------RED1213 + subroutine RED1213 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer isum1,isumt1 + integer imax1,imaxt1 ,ni,imin1,imint1 + +!dvm$ distribute A(*) + + tname='RED1213' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1m(C,NN,NNL,isum1) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + isumt1 = 0 + +!dvm$ actual(isumt1,imaxt1, imint1) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxt1) imaxt1=A(i) + if (A(i).LT.imint1) imint1=A(i) + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1, imint1) + +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED1214 + subroutine RED1214 + integer, parameter :: N = 16 ,NL=1 + character*7 tname + integer, allocatable :: A(:),C(:) + integer iprod1,iprodt1 + logical, allocatable :: B(:),CL(:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(*) +!dvm$ align B(I) with A(I) + + tname='RED1214' + allocate (A(N),C(N)) + allocate (B(N),CL(N)) + NNL=NL + NN=N + call serprod1(C,NN,NNL,iprod1) + call serlog1(CL,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on B(i) + do i=1,N,2 + B(i) = .true. + enddo + +!dvm$ parallel (i) on B(i+1) + do i=1,N-1,2 + B(i+1)=.false. + enddo + +!dvm$ remote_access (B(1)) + landt1 = B(1) + iprodt1 = 1 + +!dvm$ actual(iprodt1,landt1) +!dvm$ region local(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ parallel (i) on A(i), reduction( product( iprodt1 ), +!dvm$* and(landt1)) + do i=1,N + iprodt1 = iprodt1*A(i) + if (i.eq.1) then +! landt1=B(1) + else + landt1 = landt1 .and.B(i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end + + +C ----------------------------------------------------RED1215 + subroutine RED1215 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2 + integer imaxloct1,iminloct1,lit +!dvm$ distribute A(*) + + tname='RED1215' + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + imaxloct1=imaxt1 + ni1=N/2 + A(ni1)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + iminloct1=imint1 + lit=1 + it1=0 + it2=0 + +!dvm$ actual(imaxt1,imaxloct1,it1,lit,iminloct1,it2,lit) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( max( imaxt1 ), +!dvm$*maxloc( imaxloct1,it1,1 ),minloc( iminloct1,it2,1 ) ) + do i=1,N + if (A(i).GT.imaxt1) imaxt1 =A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,imaxloct1,it1,iminloct1,it2) + + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(imaxt1.eq.imaxloct1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------RED1216 + subroutine RED1216 + integer, parameter :: N = 16,NL=1000 + character*7 tname + real, allocatable :: A(:),C(:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer it1,it2,ni,ni1,lit + +!dvm$ distribute A(*) + + tname='RED1216' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1mr(C,NN,NNL,isum1) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + imaxloct1=imaxt1 + ni1=N/2 + A(ni1)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + iminloct1=imint1 + isumt1 = 0. + lit=1 + it1=0 + it2=0 + +!dvm$ actual(isumt1,imaxloct1,it1,lit,iminloct1,it2) +!dvm$ region +!dvm$ parallel (i) on A(i), reduction( sum( isumt1 ), +!dvm$*maxloc( imaxloct1,it1,1 ),minloc( iminloct1,it2,1 ) ) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + + + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxloct1,it1,iminloct1,it2) + + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------- + + subroutine sersum1(AR,N,NL,S) + integer AR(N) + integer S,NL + + do i=1,N + AR(i) = i+NL + enddo + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + + subroutine sersum1m(AR,N,NL,S) + integer AR(N) + integer S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2-1 + AR(ni)=N+1+NL + ni=N/2 + AR(ni)=-(N+1+NL) + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + + subroutine sersum1mr(AR,N,NL,S) + real AR(N) + real S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2-1 + AR(ni)=N+1+NL + ni=N/2 + AR(ni)=-(N+1+NL) + S=0. + do i=1,N + S = S+ AR(i) + enddo + end + + subroutine serprod1(AR,N,NL,P) + integer AR(N) + integer P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1 + do i=1,N + P = P* AR(i) + enddo + end + + subroutine serprodr1(AR,N,NL,P) + real AR(N) + real P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1. + do i=1,N + P = P* AR(i) + enddo + end + + subroutine serlog1(AR,N,LAND,LOR,LEQV,LNEQV) + logical AR(N) + logical LAND,LOR,LEQV,LNEQV + do i=1,N,2 + AR(i) = .true. + AR(i+1)=.false. + enddo + LAND=AR(1) + LOR=AR(1) +C LEQV=.true. +C LNEQV=.false. + LEQV=AR(1) + LNEQV=AR(1) + do i=2,N + LAND = LAND .and. AR(i) + LOR = LOR .or.AR(i) + enddo + do i=2,N + LEQV = LEQV .eqv. AR(i) + enddo + do i=2,N + LNEQV = LNEQV .neqv. AR(i) + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red21.fdv new file mode 100644 index 0000000..2383968 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red21.fdv @@ -0,0 +1,938 @@ + program RED21 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM,PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N,M). + + print *,'===START OF RED21=======================' +C -------------------------------------------------- + call red2101 +C -------------------------------------------------- + call red2102 +C -------------------------------------------------- + call red2103 +C ------------------------------------------------- + call red2104 +C ------------------------------------------------- + call red2105 +C ------------------------------------------------- + call red2106 +C -------------------------------------------------- + call red2107 +C -------------------------------------------------- + call red2108 +C -------------------------------------------------- + call red2109 +C ------------------------------------------------- + call red2110 +C ------------------------------------------------- + call red2111 +C ------------------------------------------------- + call red2112 +C -------------------------------------------------- + call red2113 +C -------------------------------------------------- + call red2114 +C -------------------------------------------------- +C +C + print *,'=== END OF RED21 ========================= ' + end + +C ----------------------------------------------------RED2101 + subroutine RED2101 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer isum1,isumt1 + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2101' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2(C,NN,MM,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( sum( isumt1 ) ) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2102 + subroutine RED2102 + integer, parameter :: N = 16,M=8,NL=1 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer iprod1,iprodt1 + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2102' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call serprod2(C,NN,MM,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2103 + subroutine RED2103 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:) + integer imax1,imaxt1 ,ni,imin,nj + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2103' + allocate (A(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + +!dvm$ actual(imaxt1,A) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( max( imaxt1 ) ) + do i=1,N + do j=1,M + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A) + + end + +C ----------------------------------------------------RED2104 + subroutine RED2104 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imax1,imaxt1 ,ni,imin,nj + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2104' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + + ni=N/2 + nj=M/2 + A(ni,nj)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +!dvm$ remote_access (A(1,1)) + imint1=A(1,1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( min( imint1 ) ) + do i=2,N + do j=1,M + if (A(i,j).LT.imint1) imint1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2105 + subroutine RED2105 + integer, parameter :: N = 16,M=8 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:,:),C(:,:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2105' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1.+NL + imax1=N+M+1.+NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( max( imaxt1 ) ) + do i=2,N + do j=1,M + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED2106 + subroutine RED2106 + integer, parameter :: N = 8,M=6 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:,:),C(:,:) + real iprod1,iprodt1 + real NNl + intrinsic INT +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2106' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call serprodr2(C,NN,Mm,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + if(i.eq.j) then + A(i,j) = I+NL + else + A(i,j) = 1. + endif + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + if(INT(iprod1) .eq. INT(iprodt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2107 + subroutine RED2107 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2107' + allocate (A(N,M),C(N,M)) + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,J) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + landt1 = A(1,1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( AND( landt1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then + continue +! landt1=A(i,j) + else + landt1 = landt1 .and. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2108 + subroutine RED2108 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2108' + allocate (A(N,M),C(N,M)) + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,J) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + lort1 = A(1,1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( OR( lort1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then + continue +! lort1=A(i,j) + else + lort1 = lort1 .or. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lort1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2109 + subroutine RED2109 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2109' + allocate (A(N,M),C(N,M)) + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,J) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + leqvt1 = A(1,1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( EQV( leqvt1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then + continue +! leqvt1=A(i,j) + else + leqvt1 = leqvt1 .eqv. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2110 + subroutine RED2110 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2110' + allocate (A(N,M),C(N,M)) + + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,J) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + lneqvt1 = A(1,1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( NEQV( lneqvt1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then + continue +! lneqvt1=A(i,j) + else + lneqvt1 = lneqvt1 .neqv. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2111 + subroutine RED2111 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imax1,imaxt1 ,ni,imin,nj + integer it1,jt1,it2,jt2 + integer coor(2),lcoor +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2111' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i * NL + j + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1+NL * NL + imax1=N+M+1+NL * NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + lcoor=2 + coor(1)=0 + coor(2)=0 + +!dvm$ actual(imaxt1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( maxloc( imaxt1,coor,2)) + do i=2,N + do j=1,M + if (A(i,j).GT.imaxt1)then + imaxt1=A(i,j) + coor(1)=i + coor(2)=j + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,coor) + + if ((imax1 .eq.imaxt1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2112 + subroutine RED2112 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imin1,imint1 ,ni +c integer it1,jt1,it2,jt2 + integer coor(2),lcoor + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2112' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i * NL + j + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=-(N+M+1+NL * NL) + imin1=-(N+M+1+NL * NL) + +!dvm$ remote_access (A(1,1)) + imint1=A(1,1) + + lcoor=2 + coor(1)=0 + coor(2)=0 + +!dvm$ actual(imint1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( minloc( imint1,coor,2)) + do i=2,N + do j=1,M + if (A(i,j).LT.imint1)then + imint1=A(i,j) + coor(1)=i + coor(2)=j + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1,coor) + +c print *,imin1, imint1 +c print *,coor(1),ni +c print *,coor(2),nj + if ((imin1 .eq.imint1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2113 + subroutine RED2113 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +!dvm$ distribute A(BLOCK,BLOCK) + + tname='RED2113' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2m(C,NN,MM,NNL,isum1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + ni1=N/2 + nj1=M/2 + A(ni1,nj1)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +!dvm$ remote_access (A(1,1)) + imint1=A(1,1) + + isumt1 = 0 +!dvm$ actual(isumt1,imaxt1,imint1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + if (A(i,j).LT.imint1) imint1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1,imint1) + +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2114 + subroutine RED2114 + integer, parameter :: N = 16,M=8,NL=1 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:),CL(:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align B(I,J) with A(I,J) + + tname='RED2114' + allocate (A(N,M),C(N,M)) + allocate (B(N,M),CL(N,M)) + NNL=NL + NN=N + MM=M + call serprod2(C,NN,MM,NNL,iprod1) + call serlog2(CL,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=1,M,2 + B(i,J) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=2,M,2 + B(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (B(1,1)) + landt1 = B(1,1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +C print *,A + iprodt1 = 1 + +!dvm$ actual(iprodt1,landt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( product( iprodt1 ), +!dvm$* and(landt1)) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) +c print *,i, j,iprodt1 + if ((i.eq.1).and.(j.eq.1)) then + continue +! landt1=B(i,j) + else + landt1 = landt1 .and. B(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + +c print *,iprod1,iprodt1,land1,landt1 + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end +C ----------------------------------------------------- + + subroutine sersum2(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + S=0 + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine sersum2m(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + AR(ni,nj)=N+M+1+NL + ni=N/2 + nj=M/2 + AR(ni,nj)=-(N+M+1+NL) + S=0 + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + + end + + subroutine sersum2mr(AR,N,M,NL,S) + real AR(N,M) + real S,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + AR(ni,nj)=N+M+1.+NL + ni=N/2 + nj=M/2 + AR(ni,ni)=-(N+M+1.+NL) + S=0. + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine serprod2(AR,N,M,NL,P) + integer AR(N,M) + integer P,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + P=1 + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serprodr2(AR,N,M,NL,P) + real AR(N,M) + real P,NL + do i=1,N + do j=1,M + if(i.eq.j)then + AR(i,j) = I+NL + else + AR(i,j) = 1. + endif + enddo + enddo + P=1. + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serlog2(AR,N,M,LAND,LOR,LEQV,LNEQV) + logical AR(N,M) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M,2 + AR(i,J) = .true. + enddo + enddo + do i=1,N + do j=2,M,2 + AR(i,j)=.false. + enddo + enddo + do i=1,N + do j= 1,M + if ((i.eq.1).and.(j.eq.1)) then + LAND=AR(1,1) + LOR=AR(1,1) +C LEQV=.true. +C LNEQV=.false. + LNEQV=AR(1,1) + LEQV=AR(1,1) + else + LAND = LAND .and. AR(i,j) + LOR = LOR .or.AR(i,j) + LEQV = LEQV .eqv. AR(i,j) + LNEQV = LNEQV .neqv. AR(i,j) + endif + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red22.fdv new file mode 100644 index 0000000..91b1a3c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red22.fdv @@ -0,0 +1,939 @@ + program RED22 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM,PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N,M). + + print *,'===START OF RED22=======================' +C -------------------------------------------------- + call red2201 +C -------------------------------------------------- + call red2202 +C -------------------------------------------------- + call red2203 +C ------------------------------------------------- + call red2204 +C ------------------------------------------------- + call red2205 +C ------------------------------------------------- + call red2206 +C -------------------------------------------------- + call red2207 +C -------------------------------------------------- + call red2208 +C -------------------------------------------------- + call red2209 +C ------------------------------------------------- + call red2210 +C ------------------------------------------------- + call red2211 +C ------------------------------------------------- + call red2212 +C ------------------------------------------------- + call red2213 +C -------------------------------------------------- + call red2214 +C -------------------------------------------------- + +C +C + print *,'=== END OF RED22 ========================= ' + end + +C ----------------------------------------------------RED2201 + subroutine RED2201 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer isum1,isumt1 + +!dvm$ distribute A(BLOCK,*) + + + tname='RED2201' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2(C,NN,MM,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( sum( isumt1 ) ) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2202 + subroutine RED2202 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer iprod1,iprodt1 + +!dvm$ distribute A(*,BLOCK) + + tname='RED2202' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call serprod2(C,N,M,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + if (i.eq.j) then + A(i,j) = i + else + A(i,j) =1 + endif + enddo + enddo + + +!dvm$ parallel (i,j) on A(i,j), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2203 + subroutine RED2203 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK,*) + + tname='RED2203' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( max( imaxt1 ) ) + do i=1,N + do j=1,M + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED2204 + subroutine RED2204 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(*,BLOCK) + + tname='RED2204' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + + ni=N/2 + nj=M/2 + A(ni,nj)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +!dvm$ remote_access (A(1,1)) + imint1=A(1,1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( min( imint1 ) ) + do i=2,N + do j=1,M + if (A(i,j).LT.imint1) imint1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2205 + subroutine RED2205 + integer, parameter :: N = 16,M=8 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:,:),C(:,:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(BLOCK,*) + + tname='RED2205' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1.+NL + imax1=N+M+1.+NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( max( imaxt1 ) ) + do i=2,N + do j=1,M + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED2206 + subroutine RED2206 + integer, parameter :: N = 8,M=8 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:,:),C(:,:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(*,BLOCK) + + tname='RED2206' + allocate (A(N,M),C(N,M)) + + NNL=NL + NN=N + MM=M + call serprodr2(C,NN,MM,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + if (i.eq.j) then + A(i,j) = i + else + A(i,j) =1. + endif + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2207 + subroutine RED2207 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(BLOCK,*) + + tname='RED2207' + allocate (A(N,M),C(N,M)) + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,J) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + landt1 = A(1,1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( AND( landt1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then +! landt1=A(i,j) + else + landt1 = landt1 .and. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2208 + subroutine RED2208 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(*,BLOCK) + + tname='RED2208' + allocate (A(N,M),C(N,M)) + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,j) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + lort1 = A(1,1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( OR( lort1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then +! lort1=A(i,j) + else + lort1 = lort1 .or. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2209 + subroutine RED2209 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(BLOCK,*) + + tname='RED2209' + allocate (A(N,M),C(N,M)) + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,J) = .true. + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + leqvt1 = A(1,1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( EQV( leqvt1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then +! leqvt1=A(i,j) + else + leqvt1 = leqvt1 .eqv. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED2210 + subroutine RED2210 + integer, parameter :: N = 16,M=8 + character*7 tname + logical, allocatable :: A(:,:),C(:,:) + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(*,BLOCK) + + tname='RED2210' + allocate (A(N,M),C(N,M)) + NN=N + MM=M + call serlog2(C,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M,2 + A(i,J) = .true. + enddo + enddo +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=2,M,2 + A(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (A(1,1)) + lneqvt1 = A(1,1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( NEQV( lneqvt1 ) ) + do i=1,N + do j=1,M + if ((i.eq.1).and.(j.eq.1)) then + continue +! lneqvt1=A(i,j) + else + lneqvt1 = lneqvt1 .neqv. A(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2211 + subroutine RED2211 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imax1,imaxt1 ,ni,imin + integer it1,jt1,it2,jt2 + integer coor(2),lcoor + +!dvm$ distribute A(BLOCK,*) + + tname='RED2211' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i*NL+j + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1+NL*NL + imax1=N+M+1+NL*NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + lcoor=2 + coor(1)=0 + coor(2)=0 + +!dvm$ actual(imaxt1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( maxloc( imaxt1,coor,2)) + do i=2,N + do j=1,M + if (A(i,j).GT.imaxt1)then + imaxt1=A(i,j) + coor(1)=i + coor(2)=j + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,coor) + + if ((imax1 .eq.imaxt1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2212 + subroutine RED2212 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imin1,imint1 ,ni + integer it1,jt1,it2,jt2 + integer coor(2),lcoor + +!dvm$ distribute A(*,BLOCK) + + tname='RED2212' + allocate (A(N,M),C(N,M)) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i*NL+j + enddo + enddo + ni=N/2 + nj=M/2 + A(ni,nj)=-(N+M+1+NL*NL) + imin1=-(N+M+1+NL*NL) + +!dvm$ remote_access (A(1,1)) + imint1=A(1,1) + + lcoor=2 + coor(1)=0 + coor(2)=0 + +!dvm$ actual(imint1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( minloc( imint1,coor,2)) + do i=2,N + do j=1,M + if (A(i,j).LT.imint1)then + imint1=A(i,j) + coor(1)=i + coor(2)=j + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1,coor) + + if ((imin1 .eq.imint1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2213 + subroutine RED2213 + integer, parameter :: N = 16,M=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +!dvm$ distribute A(BLOCK,*) + + tname='RED2213' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2m(C,NN,MM,NNL,isum1) + +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +!dvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + ni1=N/2 + nj1=M/2 + A(ni1,nj1)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +!dvm$ remote_access (A(1,1)) + imint1=A(1,1) + + isumt1 = 0 +!dvm$ actual(isumt1,imaxt1,imint1) +!dvm$ region +!dvm$ parallel (i,j) on A(i,j), reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + if (A(i,j).LT.imint1) imint1=A(i,j) + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1,imint1) + +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED2214 + subroutine RED2214 + integer, parameter :: N = 16,M=8,NL=1 + character*7 tname + integer, allocatable :: A(:,:),C(:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:),CL(:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,*) +!dvm$ align B(I,J) with A(I,J) + + tname='RED2214' + allocate (A(N,M),C(N,M)) + allocate (B(N,M),CL(N,M)) + + NNL=NL + NN=N + MM=M + call serprod2(C,NN,MM,NNL,iprod1) + call serlog2(CL,NN,MM,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=1,M,2 + B(i,J) = .true. + enddo + enddo +!dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=2,M,2 + B(i,j)=.false. + enddo + enddo + +!dvm$ remote_access (B(1,1)) + landt1 = B(1,1) + iprodt1 = 1 + +!dvm$ actual(iprodt1,landt1) +!dvm$ region local(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + if (i.eq.j) then + A(i,j) = i + else + A(i,j) =1 + endif + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( product( iprodt1 ), +!dvm$* and(landt1)) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) + if ((i.eq.1).and.(j.eq.1)) then +! landt1=B(i,j) + else + landt1 = landt1 .and. B(i,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end +C ----------------------------------------------------- + + subroutine sersum2(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + S=0 + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine sersum2m(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + AR(ni,nj)=N+M+1+NL + ni=N/2 + nj=M/2 + AR(ni,nj)=-(N+M+1+NL) + S=0 + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine sersum2mr(AR,N,M,NL,S) + real AR(N,M) + real S,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + AR(ni,nj)=N+M+1.+NL + ni=N/2 + nj=M/2 + AR(ni,ni)=-(N+M+1.+NL) + S=0. + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine serprod2(AR,N,M,NL,P) + integer AR(N,M) + integer P,NL + do i=1,N + do j=1,M + if (i.eq.j) then + AR(i,j) = i + else + AR(i,j) =1 + endif + enddo + enddo + P=1 + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serprodr2(AR,N,M,NL,P) + real AR(N,M) + real P,NL + do i=1,N + do j=1,M + if (i.eq.j) then + AR(i,j) = i + else + AR(i,j) =1. + endif + enddo + enddo + P=1. + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serlog2(AR,N,M,LAND,LOR,LEQV,LNEQV) + logical AR(N,M) + logical LAND,LOR,LEQV,LNEQV + do i=1,N,1 + do j=1,M,2 + AR(i,j) = .true. + enddo + enddo + do i=1,N,1 + do j=2,M,2 + AR(i,j)=.false. + enddo + enddo + do i=1,N + do j= 1,M + if ((i.eq.1).and.(j.eq.1)) then + LAND=AR(1,1) + LOR=AR(1,1) + LEQV=AR(1,1) + LNEQV=AR(1,1) + else + LAND = LAND .and. AR(i,j) + LOR = LOR .or.AR(i,j) + LEQV = LEQV .eqv. AR(i,j) + LNEQV = LNEQV .neqv. AR(i,j) + endif + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red31.fdv new file mode 100644 index 0000000..9716b99 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red31.fdv @@ -0,0 +1,1052 @@ + program RED31 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM,PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N,M,K). + + print *,'===START OF RED31=======================' +C -------------------------------------------------- + call red3101 +C -------------------------------------------------- + call red3102 +C -------------------------------------------------- + call red3103 +C ------------------------------------------------- + call red3104 +C ------------------------------------------------- + call red3105 +C ------------------------------------------------- + call red3106 +C -------------------------------------------------- + call red3107 +C -------------------------------------------------- + call red3108 +C -------------------------------------------------- + call red3109 +C ------------------------------------------------- + call red3110 +C ------------------------------------------------- + call red3111 +C ------------------------------------------------- + call red3112 +C ------------------------------------------------- + call red3113 +C -------------------------------------------------- + call red3114 +C -------------------------------------------------- + +C +C + print *,'=== END OF RED31 ========================= ' + end + +C ----------------------------------------------------RED3101 + subroutine RED3101 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer isum1,isumt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3101' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3(C,NN,MM,KK,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( sum( isumt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3102 + subroutine RED3102 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer iprod1,iprodt1 +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3102' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call serprod3(C,NN,MM,KK,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + A(i,j,ii) = i + else + A(i,j,ii) =1 + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3103 + subroutine RED3103 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3103' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( max( imaxt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED3104 + subroutine RED3104 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3104' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +!dvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( min( imint1 ) ) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).LT.imint1) imint1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3105 + subroutine RED3105 + integer, parameter :: N = 16,M=8,K=8 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:,:,:),C(:,:,:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3105' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1.+NL + imax1=N+M+K+1.+NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( max( imaxt1 ) ) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED3106 + subroutine RED3106 + integer, parameter :: N = 16,M=8,K=8 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:,:,:),C(:,:,:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3106' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call serprodr3(C,NN,MM,KK,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + A(i,j,ii) = i + else + A(i,j,ii) =1. + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3107 + subroutine RED3107 + integer, parameter :: N = 16,M=8,K=8 + character*7 tname + logical, allocatable :: A(:,:,:),C(:,:,:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3107' + allocate (A(N,M,K),C(N,M,K)) + NN=N + MM=M + KK=K + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + landt1 = A(1,1,1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( AND( landt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + else + landt1 = landt1 .and. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3108 + subroutine RED3108 + integer, parameter :: N = 16,M=8,K=16 + character*7 tname + logical, allocatable :: A(:,:,:),C(:,:,:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3108' + allocate (A(N,M,K),C(N,M,K)) + + NN=N + MM=M + KK=K + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + lort1 = A(1,1,1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( OR( lort1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + else + lort1 = lort1 .or. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3109 + subroutine RED3109 + integer, parameter :: N = 16,M=8,K=8 + character*7 tname + logical, allocatable :: A(:,:,:),C(:,:,:) + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3109' + allocate (A(N,M,K),C(N,M,K)) + NN=N + MM=M + KK=K + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + leqvt1 = A(1,1,1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( EQV( leqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + else + leqvt1 = leqvt1 .eqv. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3110 + subroutine RED3110 + integer, parameter :: N = 16,M=8,K=8 + character*7 tname + logical, allocatable :: A(:,:,:),C(:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3110' + allocate (A(N,M,K),C(N,M,K)) + + NN=N + MM=M + KK=K + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + lneqvt1 = A(1,1,1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( NEQV( lneqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + continue + else + lneqvt1 = lneqvt1 .neqv. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3111 + subroutine RED3111 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin + integer it1,jt1,it2,jt2,iit1 + integer coor(3),lcoor +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3111' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i*NL*NL+j*NL+ii + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1+NL*NL*NL + imax1=N+M+K+1+NL*NL*NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + lcoor=3 + coor(1)=0 + coor(2)=0 + coor(3)=0 + +!dvm$ actual(imaxt1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$* reduction( maxloc( imaxt1,coor,3)) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1)then + imaxt1=A(i,j,ii) + coor(1)=i + coor(2)=j + coor(3)=ii + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,coor) + + if ((imax1 .eq.imaxt1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3112 + subroutine RED3112 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imin1,imint1 ,ni + integer it1,jt1,it2,jt2,iit1 + integer coor(3),lcoor +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3112' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i*NL*NL+j*NL+ii + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=-(N+M+K+1+NL*NL*NL) + imin1=-(N+M+K+1+NL*NL*NL) + +!dvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + lcoor=3 + coor(1)=0 + coor(2)=0 + coor(3)=0 + +!dvm$ actual(imint1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$* reduction( minloc( imint1,coor,3)) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).LT.imint1)then + imint1=A(i,j,ii) + coor(1)=i + coor(2)=j + coor(3)=ii + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1,coor) + + if ((imin1 .eq.imint1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3113 + subroutine RED3113 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) + + tname='RED3113' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3m(C,NN,MM,KK,NNL,isum1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + ni1=N/2 + nj1=M/2 + nii1=K/2 + A(ni1,nj1,nii1)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +!dvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + isumt1 = 0 + +!dvm$ actual(isumt1,imaxt1,imint1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + if (A(i,j,ii).LT.imint1) imint1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1,imint1) + + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3114 + subroutine RED3114 + integer, parameter :: N = 16,M=8,K=16,NL=1 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:),CL(:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align B(I,J,II) with A(I,J,II) + + tname='RED3114' + allocate (A(N,M,K),C(N,M,K)) + allocate (B(N,M,K),CL(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call serprod3(C,NN,MM,KK,NNL,iprod1) + call serlog3(CL,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=1,N,2 + do j=1,M,2 + do ii=1,K,2 + B(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i+1,j+1,ii+1) + do i=1,N-1,2 + do j=1,M-1,2 + do ii=1,K-1,2 + B(i+1,j+1,ii+1)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (B(1,1,1)) + landt1 = B(1,1,1) + iprodt1 = 1 + +!dvm$ actual(iprodt1,landt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + A(i,j,ii) = i + else + A(i,j,ii) =1 + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( product( iprodt1 ), +!dvm$* and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + else + landt1 = landt1 .and. B(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,CL) + + end +C ----------------------------------------------------- + + subroutine sersum3(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine sersum3m(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + + end + + subroutine sersum3mr(AR,N,M,K,NL,S) + real AR(N,M,K) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprod3(AR,N,M,K,NL,P) + integer AR(N,M,K) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + AR(i,j,ii) = i + else + AR(i,j,ii) = 1 + endif + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprodr3(AR,N,M,K,NL,P) + real AR(N,M,K) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + AR(i,j,ii) = i + else + AR(i,j,ii) = 1. + endif + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serlog3(AR,N,M,K,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K) + logical LAND,LOR,LEQV,LNEQV + + do i=1,N,1 + do j=1,M,1 + do ii=1,K,2 + AR(i,j,ii) = .true. + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=2,K,2 + AR(i,j,ii)=.false. + enddo + enddo + enddo + do i=1,N + do j= 1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + LAND=AR(1,1,1) + LOR=AR(1,1,1) + LEQV=AR(1,1,1) + LNEQV=AR(1,1,1) + else + LAND = LAND .and. AR(i,j,ii) + LOR = LOR .or.AR(i,j,ii) + LEQV = LEQV .eqv. AR(i,j,ii) + LNEQV = LNEQV .neqv. AR(i,j,ii) + endif + enddo + enddo + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red32.fdv new file mode 100644 index 0000000..5a8909a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red32.fdv @@ -0,0 +1,1064 @@ + program RED32 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM,PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N,M,K). + + print *,'===START OF RED32=======================' +C -------------------------------------------------- + call red3201 +C -------------------------------------------------- + call red3202 +C -------------------------------------------------- + call red3203 +C ------------------------------------------------- + call red3204 +C ------------------------------------------------- + call red3205 +C ------------------------------------------------- + call red3206 +C -------------------------------------------------- + call red3207 +C -------------------------------------------------- + call red3208 +C -------------------------------------------------- + call red3209 +C ------------------------------------------------- + call red3210 +C ------------------------------------------------- + call red3211 +C ------------------------------------------------- + call red3212 +C ------------------------------------------------- + call red3213 +C -------------------------------------------------- + call red3214 +C ------------------------------------------------- + +C +C + print *,'=== END OF RED32 ========================= ' + end + +C ----------------------------------------------------RED3201 + subroutine RED3201 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer isum1,isumt1 + +!dvm$ distribute A(BLOCK,BLOCK,*) + + + tname='RED3201' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3(C,NN,MM,KK,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( sum( isumt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3202 + subroutine RED3202 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer iprod1,iprodt1 + +!dvm$ distribute A(BLOCK,*,BLOCK) + + tname='RED3202' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call serprod3(C,NN,MM,KK,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + A(i,j,ii) = i + else + A(i,j,ii) =1 + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3203 + subroutine RED3203 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(*,BLOCK,BLOCK) + + tname='RED3203' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( max( imaxt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED3204 + subroutine RED3204 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK,BLOCK,*) + + tname='RED3204' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +!dvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( min( imint1 ) ) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).LT.imint1) imint1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3205 + subroutine RED3205 + integer, parameter :: N = 16,M=8,K=8 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:,:,:),C(:,:,:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(BLOCK,*,BLOCK) + + tname='RED3205' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1.+NL + imax1=N+M+K+1.+NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( max( imaxt1 ) ) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED3206 + subroutine RED3206 + integer, parameter :: N =8,M=8,K=8 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:,:,:),C(:,:,:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(*,BLOCK,BLOCK) + + tname='RED3206' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call serprodr3(C,NN,MM,KK,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + A(i,j,ii) = i + else + A(i,j,ii) =1. + endif + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3207 + subroutine RED3207 + integer, parameter :: N = 16,M=8,K=8 + character*7 tname + logical, allocatable :: A(:,:,:),C(:,:,:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(BLOCK,BLOCK,*) + + tname='RED3207' + allocate (A(N,M,K),C(N,M,K)) + NN=N + MM=M + KK=K + + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + landt1 = A(1,1,1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( AND( landt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then +! landt1=A(i,j,ii) + else + landt1 = landt1 .and. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3208 + subroutine RED3208 + integer, parameter :: N = 16,M=8,K=16 + character*7 tname + logical, allocatable :: A(:,:,:),C(:,:,:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,*,BLOCK) + + tname='RED3208' + allocate (A(N,M,K),C(N,M,K)) + NN=N + MM=M + KK=K + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + lort1 = A(1,1,1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( OR( lort1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then +! lort1=A(i,j,ii) + else + lort1 = lort1 .or. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3209 + subroutine RED3209 + integer, parameter :: N = 16,M=8,K=8 + logical, allocatable :: A(:,:,:),C(:,:,:) + character*7 tname + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(*,BLOCK,BLOCK) + + tname='RED3209' + allocate (A(N,M,K),C(N,M,K)) + NN=N + MM=M + KK=K + + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + leqvt1 = A(1,1,1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( EQV( leqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then +! leqvt1=A(i,j,ii) + else + leqvt1 = leqvt1 .eqv. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED3210 + subroutine RED3210 + integer, parameter :: N = 16,M=8,K=8 + logical, allocatable :: A(:,:,:),C(:,:,:) + character*7 tname + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(BLOCK,BLOCK,*) + + tname='RED3210' + allocate (A(N,M,K),C(N,M,K)) + NN=N + MM=M + KK=K + call serlog3(C,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + A(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + A(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1)) + lneqvt1 = A(1,1,1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( NEQV( lneqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + continue +! lneqvt1=A(i,j,ii) + else + lneqvt1 = lneqvt1 .neqv. A(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3211 + subroutine RED3211 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin + integer it1,jt1,it2,jt2,iit1 + integer coor(3),lcoor +!dvm$ distribute A(BLOCK,*,BLOCK) + + tname='RED3211' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i*NL*NL+j*NL+ii + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1+NL*NL*NL + imax1=N+M+K+1+NL*NL*NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + lcoor=3 + coor(1)=0 + coor(2)=0 + coor(3)=0 + +!dvm$ actual(imaxt1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$* reduction( maxloc( imaxt1,coor,3)) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1)then + imaxt1=A(i,j,ii) + coor(1)=i + coor(2)=j + coor(3)=ii + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,coor) + + if ((imax1 .eq.imaxt1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3212 + subroutine RED3212 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imin1,imint1 ,ni + integer it1,jt1,it2,jt2,iit1 + integer coor(3),lcoor +!dvm$ distribute A(*,BLOCK,BLOCK) + + tname='RED3212' + allocate (A(N,M,K),C(N,M,K)) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i*NL*NL+j*NL+ii + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=-(N+M+K+1+NL*NL*NL) + imin1=-(N+M+K+1+NL*NL*NL) + +!dvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + lcoor=3 + coor(1)=0 + coor(2)=0 + coor(3)=0 + +!dvm$ actual(imint1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$* reduction( minloc( imint1,coor,3)) + do i=2,N + do j=1,M + do ii=1,K + if (A(i,j,ii).LT.imint1)then + imint1=A(i,j,ii) + coor(1)=i + coor(2)=j + coor(3)=ii + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1,coor) + + if ((imin1 .eq.imint1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3213 + subroutine RED3213 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +!dvm$ distribute A(BLOCK,BLOCK,*) + + tname='RED3213' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3m(C,NN,MM,KK,NNL,isum1) + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +!dvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + ni1=N/2 + nj1=M/2 + nii1=K/2 + A(ni1,nj1,nii1)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +!dvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + isumt1 = 0 +!dvm$ actual(isumt1,imaxt1,imint1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + if (A(i,j,ii).LT.imint1) imint1=A(i,j,ii) + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1,imint1) +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED3214 + subroutine RED3214 + integer, parameter :: N = 16,M=8,K=16,NL=1 + character*7 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:),CL(:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ align B(I,J,II) with A(I,J,II) + + tname='RED3214' + allocate (A(N,M,K),C(N,M,K)) + allocate (B(N,M,K),CL(N,M,K)) + + NNL=NL + NN=N + MM=M + KK=K + call serprod3(C,NN,MM,KK,NNL,iprod1) + call serlog3(CL,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + B(i,j,ii) = .true. + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + B(i,j,ii)=.false. + enddo + enddo + enddo + +!dvm$ remote_access (B(1,1,1)) + landt1 = B(1,1,1) + iprodt1 = 1 + +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + A(i,j,ii) = i + else + A(i,j,ii) =1 + endif + enddo + enddo + enddo + +!dvm$ actual(iprodt1,landt1) +!dvm$ region +!dvm$ parallel (i,j,ii) on A(i,j,ii), reduction( product( iprodt1 ), +!dvm$* and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then +! landt1=B(i,j,ii) + else + landt1 = landt1 .and. B(i,j,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end +C ----------------------------------------------------- + + subroutine sersum3(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + + subroutine sersum3m(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + + end + + subroutine sersum3mr(AR,N,M,K,NL,S) + real AR(N,M,K) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprod3(AR,N,M,K,NL,P) + integer AR(N,M,K) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + AR(i,j,ii) = i + else + AR(i,j,ii) =1 + endif + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprodr3(AR,N,M,K,NL,P) + real AR(N,M,K) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + if ((i.eq.j).and.(j.eq.ii)) then + AR(i,j,ii) = i + else + AR(i,j,ii) =1. + endif + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + + subroutine serlog3(AR,N,M,K,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K) + logical LAND,LOR,LEQV,LNEQV + do i=1,N,1 + do j=1,M,1 + do ii=1,K,2 + AR(i,j,ii) = .true. + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=2,K,2 + AR(i,j,ii)=.false. + enddo + enddo + enddo + + do i=1,N + do j= 1,M + do ii=1,K + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1)) then + LAND=AR(1,1,1) + LOR=AR(1,1,1) + LEQV=AR(1,1,1) + LNEQV=AR(1,1,1) + else + LAND = LAND .and. AR(i,j,ii) + LOR = LOR .or.AR(i,j,ii) + LEQV = LEQV .eqv. AR(i,j,ii) + LNEQV = LNEQV .neqv. AR(i,j,ii) + endif + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red41.fdv new file mode 100644 index 0000000..0ceaa97 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red41.fdv @@ -0,0 +1,1200 @@ + program RED41 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM,PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N,M,K,L). + + print *,'===START OF RED41=======================' +C -------------------------------------------------- + call red4101 +C -------------------------------------------------- + call red4102 +C -------------------------------------------------- + call red4103 +C ------------------------------------------------- + call red4104 +C ------------------------------------------------- + call red4105 +C ------------------------------------------------- + call red4106 +C -------------------------------------------------- + call red4107 +C -------------------------------------------------- + call red4108 +C -------------------------------------------------- + call red4109 +C ------------------------------------------------- + call red4110 +C ------------------------------------------------- + call red4111 +C ------------------------------------------------- + call red4112 +C ------------------------------------------------- + call red4113 +C -------------------------------------------------- + call red4114 +C -------------------------------------------------- + +C +C + print *,'=== END OF RED41 ========================= ' + end + +C ----------------------------------------------------RED4101 + subroutine RED4101 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer isum1,isumt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4101' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4(C,NN,MM,KK,LL,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), reduction( sum( isumt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4102 + subroutine RED4102 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=10 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4102' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4103 + subroutine RED4103 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4103' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( max( imaxt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED4104 + subroutine RED4104 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4104' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( min( imint1 ) ) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4105 + subroutine RED4105 + integer, parameter :: N = 16,M=8,K=8,L=8 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4105' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1.+NL + + imax1=N+M+K+L+1.+NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( max( imaxt1 ) ) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED4106 + subroutine RED4106 + integer, parameter :: N = 8,M=8,K=8,L=8 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4106' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprodr4(C,NN,MM,KK,LL,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1. + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4107 + subroutine RED4107 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4107' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + landt1 = A(1,1,1,1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( AND( landt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! landt1=A(i,j,ii,jj) + else + landt1 = landt1 .and. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4108 + subroutine RED4108 + integer, parameter :: N = 16,M=8,K=16,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4108' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + lort1 = A(1,1,1,1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( OR( lort1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! lORt1=A(i,j,ii,jj) + else + lort1 = lort1 .or. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4109 + subroutine RED4109 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4109' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + leqvt1 = A(1,1,1,1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( EQV( leqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! leqvt1=A(i,j,ii,jj) + else + leqvt1 = leqvt1 .eqv. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4110 + subroutine RED4110 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4110' + allocate (A(N,M,K,L),C(N,M,K,L)) + + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + lneqvt1 = A(1,1,1,1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( NEQV( lneqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! lneqvt1=A(i,j,ii,jj) + else + lneqvt1 = lneqvt1 .neqv. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4111 + subroutine RED4111 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=100 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + integer it1,jt1,it2,jt2,iit1,jjt1 + integer coor(4),lcoor +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4111' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i * NL*NL*NL+j*NL*NL+ii*NL+jj + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL*NL*NL*NL + imax1=N+M+K+L+1+NL*NL*NL*NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + lcoor=4 + coor(1)=0 + coor(2)=0 + coor(3)=0 + coor(4)=0 + +!dvm$ actual(imaxt1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( maxloc( imaxt1,coor,4)) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1)then + imaxt1=A(i,j,ii,jj) + coor(1)=i + coor(2)=j + coor(3)=ii + coor(4)=jj + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,coor) + + if ((imax1 .eq.imaxt1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii) + *.and.(coor(4).eq.njj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4112 + subroutine RED4112 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=100 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer it1,jt1,it2,jt2,iit1,jjt1 + integer coor(4),lcoor + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4112' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i*NL*NL*NL+j*NL*NL+ii*NL+jj + enddo + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL*NL*NL*NL ) + + imin1=-(N+M+K+L+1+NL*NL*NL*NL ) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + lcoor=4 + coor(1)=0 + coor(2)=0 + coor(3)=0 + coor(4)=0 + +!dvm$ actual(imint1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( minloc( imint1,coor,4)) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).LT.imint1)then + imint1=A(i,j,ii,jj) + coor(1)=i + coor(2)=j + coor(3)=ii + coor(4)=jj + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1,coor) + + if ((imin1 .eq.imint1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii) + * .and.(coor(4).eq.njj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4113 + subroutine RED4113 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='RED4113' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + + call sersum4m(C,NN,MM,KK,LL,NNL,isum1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL +c print *,'before remote' + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + isumt1 = 0 +c print *,'before cycle' +!dvm$ actual(isumt1,imaxt1,imint1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1,imint1) +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4114 + subroutine RED4114 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:,:),CL(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align B(I,J,II,JJ) with A(I,J,II,JJ) + + tname='RED4114' + allocate (A(N,M,K,L),C(N,M,K,L)) + allocate (B(N,M,K,L),CL(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + call serlog4(CL,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + B(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + B(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (B(1,1,1,1)) + landt1 = B(1,1,1,1) + iprodt1 = 1 + +!dvm$ actual(iprodt1,landt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ), and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! landt1=B(i,j,ii,jj) + else + landt1 = landt1 .and. B(i,j,ii,jj) + endif +! landt1 = landt1 .and.B(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end +C ----------------------------------------------------- + + subroutine sersum4(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4m(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4mr(AR,N,M,K,L,NL,S) + real AR(N,M,K,L) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1.+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1.+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprod4(AR,N,M,K,L,NL,P) + integer AR(N,M,K,L) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + AR(i,j,ii,jj) = i + else + AR(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprodr4(AR,N,M,K,L,NL,P) + real AR(N,M,K,L) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + AR(i,j,ii,jj) = i + else + AR(i,j,ii,jj) =1. + endif + enddo + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serlog4(AR,N,M,K,L,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K,L) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + AR(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + AR(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + + do i=1,N + do j= 1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1).and.(jj.eq.1)) then + LAND=AR(1,1,1,1) + LOR=AR(1,1,1,1) + LEQV=AR(1,1,1,1) + LNEQV=AR(1,1,1,1) + else + LAND = LAND .and. AR(i,j,ii,jj) + LOR = LOR .or.AR(i,j,ii,jj) + LEQV = LEQV .eqv. AR(i,j,ii,jj) + LNEQV = LNEQV .neqv. AR(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red42.fdv new file mode 100644 index 0000000..8bf183e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red42.fdv @@ -0,0 +1,1200 @@ + program RED42 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM,PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N,M,K,L). + + print *,'===START OF RED42=======================' +C -------------------------------------------------- + call red4201 +C -------------------------------------------------- + call red4202 +C -------------------------------------------------- + call red4203 +C ------------------------------------------------- + call red4204 +C ------------------------------------------------- + call red4205 +C ------------------------------------------------- + call red4206 +C -------------------------------------------------- + call red4207 +C -------------------------------------------------- + call red4208 +C -------------------------------------------------- + call red4209 +C ------------------------------------------------- + call red4210 +C ------------------------------------------------- + call red4211 +C ------------------------------------------------- + call red4212 +C ------------------------------------------------- + call red4213 +C -------------------------------------------------- + call red4214 +C -------------------------------------------------- + +C +C + print *,'=== END OF RED42 ========================= ' + end + +C ----------------------------------------------------RED4201 + subroutine RED4201 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer isum1,isumt1 + +!dvm$ distribute A(*,*,*,*) + + tname='RED4201' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4(C,NN,MM,KK,LL,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), reduction( sum( isumt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4202 + subroutine RED4202 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=10 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + +!dvm$ distribute A(*,*,*,*) + + tname='RED4202' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4203 + subroutine RED4203 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(*,*,*,*) + + tname='RED4203' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( max( imaxt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED4204 + subroutine RED4204 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(*,*,*,*) + + tname='RED4204' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( min( imint1 ) ) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4205 + subroutine RED4205 + integer, parameter :: N = 16,M=8,K=8,L=8 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(*,*,*,*) + + tname='RED4205' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1.+NL + + imax1=N+M+K+L+1.+NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( max( imaxt1 ) ) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED4206 + subroutine RED4206 + integer, parameter :: N = 8,M=8,K=8,L=8 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(*,*,*,*) + + tname='RED4206' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprodr4(C,NN,MM,KK,LL,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1. + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4207 + subroutine RED4207 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(*,*,*,*) + + tname='RED4207' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + landt1 = A(1,1,1,1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( AND( landt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! landt1=A(i,j,ii,jj) + else + landt1 = landt1 .and. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4208 + subroutine RED4208 + integer, parameter :: N = 16,M=8,K=16,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(*,*,*,*) + + tname='RED4208' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + lort1 = A(1,1,1,1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( OR( lort1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! lORt1=A(i,j,ii,jj) + else + lort1 = lort1 .or. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4209 + subroutine RED4209 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(*,*,*,*) + + tname='RED4209' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + leqvt1 = A(1,1,1,1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( EQV( leqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! leqvt1=A(i,j,ii,jj) + else + leqvt1 = leqvt1 .eqv. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4210 + subroutine RED4210 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(*,*,*,*) + + tname='RED4210' + allocate (A(N,M,K,L),C(N,M,K,L)) + + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + lneqvt1 = A(1,1,1,1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( NEQV( lneqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! lneqvt1=A(i,j,ii,jj) + else + lneqvt1 = lneqvt1 .neqv. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4211 + subroutine RED4211 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=100 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + integer it1,jt1,it2,jt2,iit1,jjt1 + integer coor(4),lcoor +!dvm$ distribute A(*,*,*,*) + + tname='RED4211' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i*NL*NL*NL+j*NL*NL+ii*NL+jj + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL*NL*NL*NL + imax1=N+M+K+L+1+NL*NL*NL*NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + lcoor=4 + coor(1)=0 + coor(2)=0 + coor(3)=0 + coor(4)=0 + +!dvm$ actual(imaxt1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( maxloc( imaxt1,coor,4)) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1)then + imaxt1=A(i,j,ii,jj) + coor(1)=i + coor(2)=j + coor(3)=ii + coor(4)=jj + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,coor) + + if ((imax1 .eq.imaxt1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii) + *.and.(coor(4).eq.njj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4212 + subroutine RED4212 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=100 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer it1,jt1,it2,jt2,iit1,jjt1 + integer coor(4),lcoor + +!dvm$ distribute A(*,*,*,*) + + tname='RED4212' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i*NL*NL*NL+j*NL*NL+ii*NL+jj + enddo + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL*NL*NL*NL ) + + imin1=-(N+M+K+L+1+NL*NL*NL*NL ) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + lcoor=4 + coor(1)=0 + coor(2)=0 + coor(3)=0 + coor(4)=0 + +!dvm$ actual(imint1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( minloc( imint1,coor,4)) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).LT.imint1)then + imint1=A(i,j,ii,jj) + coor(1)=i + coor(2)=j + coor(3)=ii + coor(4)=jj + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1,coor) + + if ((imin1 .eq.imint1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii) + * .and.(coor(4).eq.njj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4213 + subroutine RED4213 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +!dvm$ distribute A(*,*,*,*) + + tname='RED4213' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + + call sersum4m(C,NN,MM,KK,LL,NNL,isum1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL +c print *,'before remote' + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + isumt1 = 0 +c print *,'before cycle' +!dvm$ actual(isumt1,imaxt1,imint1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1,imint1) +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4214 + subroutine RED4214 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:,:),CL(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(*,*,*,*) +!dvm$ align B(I,J,II,JJ) with A(I,J,II,JJ) + + tname='RED4214' + allocate (A(N,M,K,L),C(N,M,K,L)) + allocate (B(N,M,K,L),CL(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + call serlog4(CL,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + B(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + B(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (B(1,1,1,1)) + landt1 = B(1,1,1,1) + iprodt1 = 1 + +!dvm$ actual(iprodt1,landt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ), and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! landt1=B(i,j,ii,jj) + else + landt1 = landt1 .and. B(i,j,ii,jj) + endif +! landt1 = landt1 .and.B(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end +C ----------------------------------------------------- + + subroutine sersum4(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4m(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4mr(AR,N,M,K,L,NL,S) + real AR(N,M,K,L) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1.+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1.+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprod4(AR,N,M,K,L,NL,P) + integer AR(N,M,K,L) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + AR(i,j,ii,jj) = i + else + AR(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprodr4(AR,N,M,K,L,NL,P) + real AR(N,M,K,L) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + AR(i,j,ii,jj) = i + else + AR(i,j,ii,jj) =1. + endif + enddo + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serlog4(AR,N,M,K,L,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K,L) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + AR(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + AR(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + + do i=1,N + do j= 1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1).and.(jj.eq.1)) then + LAND=AR(1,1,1,1) + LOR=AR(1,1,1,1) + LEQV=AR(1,1,1,1) + LNEQV=AR(1,1,1,1) + else + LAND = LAND .and. AR(i,j,ii,jj) + LOR = LOR .or.AR(i,j,ii,jj) + LEQV = LEQV .eqv. AR(i,j,ii,jj) + LNEQV = LNEQV .neqv. AR(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red43.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red43.fdv new file mode 100644 index 0000000..0739f5b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTION/red43.fdv @@ -0,0 +1,1200 @@ + program RED43 + +c TESTING OF THE REDUCTION CLAUSE . +c REDUCTION OPERATION : SUM,PRODUCT,MAX,MIN,AND,OR, EQV, +C NEQV,MAXLOC,MINLOC AND THEIR COMBINATION ARE EXECUTED +c FOR DISTRIBUTED ARRAY A(N,M,K,L). + + print *,'===START OF RED43=======================' +C -------------------------------------------------- + call red4301 +C -------------------------------------------------- + call red4302 +C -------------------------------------------------- + call red4303 +C ------------------------------------------------- + call red4304 +C ------------------------------------------------- + call red4305 +C ------------------------------------------------- + call red4306 +C -------------------------------------------------- + call red4307 +C -------------------------------------------------- + call red4308 +C -------------------------------------------------- + call red4309 +C ------------------------------------------------- + call red4310 +C ------------------------------------------------- + call red4311 +C ------------------------------------------------- + call red4312 +C ------------------------------------------------- + call red4313 +C -------------------------------------------------- + call red4314 +C -------------------------------------------------- + +C +C + print *,'=== END OF RED43 ========================= ' + end + +C ----------------------------------------------------RED4301 + subroutine RED4301 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer isum1,isumt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,*) + + tname='RED4301' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4(C,NN,MM,KK,LL,NNL,isum1) + isumt1 = 0 + +!dvm$ actual(isumt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), reduction( sum( isumt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1) + + if (isum1 .eq.isumt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4302 + subroutine RED4302 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=10 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) + + tname='RED4302' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + iprodt1 = 1 + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4303 + subroutine RED4303 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(BLOCK,*,BLOCK,BLOCK) + + tname='RED4303' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( max( imaxt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------RED4304 + subroutine RED4304 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + +!dvm$ distribute A(*,BLOCK,BLOCK,BLOCK) + + tname='RED4304' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + +!dvm$ actual(imint1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( min( imint1 ) ) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1) + + if (imin1 .eq.imint1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4305 + subroutine RED4305 + integer, parameter :: N = 16,M=8,K=8,L=8 + real, parameter :: NL=1000. + character*7 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer ni + real imax1,imaxt1 +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,*) + + tname='RED4305' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1.+NL + + imax1=N+M+K+L+1.+NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + +!dvm$ actual(imaxt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( max( imaxt1 ) ) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1) + + if (imax1 .eq.imaxt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------RED4306 + subroutine RED4306 + integer, parameter :: N = 8,M=8,K=8,L=8 + real, parameter :: NL=1. + character*7 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + real iprod1,iprodt1 + real NNl + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) + + tname='RED4306' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprodr4(C,NN,MM,KK,LL,NNL,iprod1) + iprodt1 = 1. + +!dvm$ actual(iprodt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1. + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1) + + if (iprod1 .eq.iprodt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4307 + subroutine RED4307 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,leqv1,lneqv1,lor1 + +!dvm$ distribute A(BLOCK,*,BLOCK,BLOCK) + + tname='RED4307' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + landt1 = A(1,1,1,1) + +!dvm$ actual(landt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( AND( landt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! landt1=A(i,j,ii,jj) + else + landt1 = landt1 .and. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(landt1) + + if (land1 .eqv.landt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4308 + subroutine RED4308 + integer, parameter :: N = 16,M=8,K=16,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,lort1,leqv1,lneqv1 + +!dvm$ distribute A(*,BLOCK,BLOCK,BLOCK) + + tname='RED4308' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + lort1 = A(1,1,1,1) + +!dvm$ actual(lort1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( OR( lort1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! lORt1=A(i,j,ii,jj) + else + lort1 = lort1 .or. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lort1) + + if (lor1 .eqv.lort1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4309 + subroutine RED4309 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,leqv1,leqvt1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,*) + + tname='RED4309' + allocate (A(N,M,K,L),C(N,M,K,L)) + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + leqvt1 = A(1,1,1,1) + +!dvm$ actual(leqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( EQV( leqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! leqvt1=A(i,j,ii,jj) + else + leqvt1 = leqvt1 .eqv. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(leqvt1) + + if (leqv1 .eqv.leqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C -----------------------------------------------------RED4310 + subroutine RED4310 + integer, parameter :: N = 16,M=8,K=8,L=8 + character*7 tname + logical, allocatable :: A(:,:,:,:),C(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1,lneqvt1 + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) + + tname='RED4310' + allocate (A(N,M,K,L),C(N,M,K,L)) + + NN=N + MM=M + KK=K + LL=L + call serlog4(C,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + A(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + A(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (A(1,1,1,1)) + lneqvt1 = A(1,1,1,1) + +!dvm$ actual(lneqvt1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( NEQV( lneqvt1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! lneqvt1=A(i,j,ii,jj) + else + lneqvt1 = lneqvt1 .neqv. A(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(lneqvt1) + + if (lneqv1 .eqv.lneqvt1) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4311 + subroutine RED4311 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=100 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin + integer it1,jt1,it2,jt2,iit1,jjt1 + integer coor(4),lcoor +!dvm$ distribute A(BLOCK,*,BLOCK,BLOCK) + + tname='RED4311' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i*NL*NL*NL+j*NL*NL+ii*NL+jj + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL*NL*NL*NL + imax1=N+M+K+L+1+NL*NL*NL*NL + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + lcoor=4 + coor(1)=0 + coor(2)=0 + coor(3)=0 + coor(4)=0 + +!dvm$ actual(imaxt1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( maxloc( imaxt1,coor,4)) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1)then + imaxt1=A(i,j,ii,jj) + coor(1)=i + coor(2)=j + coor(3)=ii + coor(4)=jj + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imaxt1,coor) + + if ((imax1 .eq.imaxt1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii) + *.and.(coor(4).eq.njj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4312 + subroutine RED4312 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=100 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer it1,jt1,it2,jt2,iit1,jjt1 + integer coor(4),lcoor + +!dvm$ distribute A(*,BLOCK,BLOCK,BLOCK) + + tname='RED4312' + allocate (A(N,M,K,L),C(N,M,K,L)) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i*NL*NL*NL+j*NL*NL+ii*NL+jj + enddo + enddo + enddo + enddo + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL*NL*NL*NL ) + + imin1=-(N+M+K+L+1+NL*NL*NL*NL ) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + lcoor=4 + coor(1)=0 + coor(2)=0 + coor(3)=0 + coor(4)=0 + +!dvm$ actual(imint1,coor,lcoor) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( minloc( imint1,coor,4)) + do i=2,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).LT.imint1)then + imint1=A(i,j,ii,jj) + coor(1)=i + coor(2)=j + coor(3)=ii + coor(4)=jj + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(imint1,coor) + + if ((imin1 .eq.imint1) .and.(coor(1).eq.ni) + *.and.(coor(2).eq.nj).and.(coor(3).eq.nii) + * .and.(coor(4).eq.njj)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4313 + subroutine RED4313 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,*) + + tname='RED4313' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + + call sersum4m(C,NN,MM,KK,LL,NNL,isum1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL +c print *,'before remote' + +!dvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +!dvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + isumt1 = 0 +c print *,'before cycle' +!dvm$ actual(isumt1,imaxt1,imint1) +!dvm$ region +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( sum( isumt1 ), +!dvm$*max( imaxt1 ),min( imint1 ) ) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(isumt1,imaxt1,imint1) +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------RED4314 + subroutine RED4314 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1 + character*7 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:,:),CL(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) +!dvm$ align B(I,J,II,JJ) with A(I,J,II,JJ) + + tname='RED4314' + allocate (A(N,M,K,L),C(N,M,K,L)) + allocate (B(N,M,K,L),CL(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + call serlog4(CL,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + B(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + B(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +!dvm$ remote_access (B(1,1,1,1)) + landt1 = B(1,1,1,1) + iprodt1 = 1 + +!dvm$ actual(iprodt1,landt1) +!dvm$ region local(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + A(i,j,ii,jj) = i + else + A(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$* reduction( product( iprodt1 ), and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + if ((i.eq.1).and.(j.eq.1) + *.and.(ii.eq.1).and.(jj.eq.1)) then +! landt1=B(i,j,ii,jj) + else + landt1 = landt1 .and. B(i,j,ii,jj) + endif +! landt1 = landt1 .and.B(i,j,ii,jj) + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(iprodt1,landt1) + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,CL) + deallocate (A,C) + + end +C ----------------------------------------------------- + + subroutine sersum4(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4m(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4mr(AR,N,M,K,L,NL,S) + real AR(N,M,K,L) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1.+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1.+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprod4(AR,N,M,K,L,NL,P) + integer AR(N,M,K,L) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + AR(i,j,ii,jj) = i + else + AR(i,j,ii,jj) =1 + endif + enddo + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprodr4(AR,N,M,K,L,NL,P) + real AR(N,M,K,L) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if ((i.eq.j).and.(j.eq.ii).and.(ii.eq.jj)) then + AR(i,j,ii,jj) = i + else + AR(i,j,ii,jj) =1. + endif + enddo + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serlog4(AR,N,M,K,L,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K,L) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + AR(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + AR(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + + do i=1,N + do j= 1,M + do ii=1,K + do jj=1,L + if ((i.eq.1).and.(j.eq.1).and.(ii.eq.1).and.(jj.eq.1)) then + LAND=AR(1,1,1,1) + LOR=AR(1,1,1,1) + LEQV=AR(1,1,1,1) + LNEQV=AR(1,1,1,1) + else + LAND = LAND .and. AR(i,j,ii,jj) + LOR = LOR .or.AR(i,j,ii,jj) + LEQV = LEQV .eqv. AR(i,j,ii,jj) + LNEQV = LNEQV .neqv. AR(i,j,ii,jj) + endif + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda11.fdv new file mode 100644 index 0000000..677f781 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda11.fdv @@ -0,0 +1,400 @@ + program REDA11 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUP IS EXECUTED FOR DISTRIBUTED ARRAY A(N). +c + + print *,'===START OF REDA11========================' +C -------------------------------------------------- + call reda1101 +C -------------------------------------------------- + call reda1102 +C -------------------------------------------------- + call reda1103 +C -------------------------------------------------- + call reda1104 +C -------------------------------------------------- +C + print *,'=== END OF REDA11 ========================= ' + + end + +C ----------------------------------------------------REDA1101 + subroutine REDA1101 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),C(:) + integer isum1,isumt1 + integer imax1,imaxt1 ,ni,imin1,imint1 + character(8) :: tname='REDA1101' + +!dvm$ distribute A(BLOCK) +!dvm$ reduction_group smaxmin + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1m(C,NN,NNL,isum1) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + isumt1 = 0 + +!dvm$ parallel (i) on A(i), +!dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxt1) imaxt1=A(i) + if (A(i).LT.imint1) imint1=A(i) + enddo + +!dvm$ reduction_start smaxmin +!dvm$ reduction_wait smaxmin + + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A,C) + + end + +C -----------------------------------------------------REDA1102 + subroutine REDA1102 + integer, parameter :: N = 16, NL=1000 + integer, allocatable :: A(:),C(:) + integer iprod1,iprodt1 + logical, allocatable :: B(:),CL(:) + logical land1,landt1,lor1,leqv1,lneqv1 + character(8) :: tname='REDA1102' + +!dvm$ distribute A(BLOCK) +!dvm$ align B(I) with A(I) +!dvm$ reduction_group prodand + allocate (A(N),C(N)) + allocate (B(N),CL(N)) + NNL=NL + NN=N + call serprod1(C,NN,NNL,iprod1) + call serlog1(CL,NN,land1,lor1,leqv1,lneqv1) + +!dvm$ parallel (i) on B(i) + do i=1,N,2 + B(i) = .true. + enddo +!dvm$ parallel (i) on B(i+1) + do i=1,N-1,2 + B(i+1)=.false. + enddo + +!dvm$ remote_access (B(1)) + landt1 = B(1) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + iprodt1 = 1 + +!dvm$ parallel (i) on B(i), +!dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + iprodt1 = iprodt1*A(i) + landt1 = landt1 .and.B(i) + enddo + +!dvm$ reduction_start prodand + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +!dvm$ reduction_wait prodand + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A,C) + deallocate (B,CL) + + end + +C ----------------------------------------------------REDA1103 + subroutine REDA1103 + integer, parameter :: N = 8,NL=1000 + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2,lit + integer imaxloct1,iminloct1 + character(8) :: tname='REDA1103' + +!dvm$ distribute A(BLOCK) +!dvm$ reduction_group locmaxmin +c dvm$ reduction_group maxminloc + + allocate (A(N),C(N)) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2+2 + A(ni)=N+1+NL + imax1=N+1+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + imaxloct1=imaxt1 + ni1=N/2+1 + A(ni1)=-(N+1+NL) + imin1=-(N+1+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + iminloct1=imint1 + lit=1 + it1=0 + it2=0 + +!dvm$ parallel (i) on A(i), +!dvm$*reduction(locmaxmin:max( imaxt1 ), +!dvm$*maxloc( imaxloct1,it1,lit), +!dvm$*minloc( iminloct1,it2,lit)) + + do i=1,N + if (A(i).GT.imaxt1) imaxt1 =A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + enddo + +!dvm$ reduction_start locmaxmin +!dvm$ reduction_wait locmaxmin + + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(imaxt1.eq.imaxloct1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA1104 + subroutine REDA1104 + integer, parameter :: N = 16 + real, parameter :: NL=1000. + real, allocatable :: A(:),C(:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer it1,it2,ni,ni1,lit + character(8) :: tname='REDA1104' + +!dvm$ distribute A(BLOCK) +!dvm$ reduction_group locsumloc + + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1mr(C,NN,NNL,isum1) + +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2+1 + A(ni)=N+1.+NL + imax1=N+1.+NL + +!dvm$ remote_access (A(1)) + imaxt1=A(1) + + imaxloct1=imaxt1 + ni1=N/2+2 + A(ni1)=-(N+1.+NL) + imin1=-(N+1.+NL) + +!dvm$ remote_access (A(1)) + imint1=A(1) + + iminloct1=imint1 + isumt1 = 0. + lit=1 + it1=0 + it2=0 + +!dvm$ parallel (i) on A(i), +!dvm$*reduction(locsumloc:sum( isumt1 ), +!dvm$*maxloc( imaxloct1,it1,lit),minloc( iminloct1,it2,lit )) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + enddo + +!dvm$ reduction_start locsumloc +!dvm$ reduction_wait locsumloc + + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + + deallocate (A,C) + + end + +C ----------------------------------------------------- + + subroutine sersum1(AR,N,NL,S) + integer AR(N) + integer S,NL + do i=1,N + AR(i) = i+NL + enddo + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + +C ------ + subroutine sersum1m(AR,N,NL,S) + integer AR(N) + integer S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2-1 + AR(ni)=N+1+NL + ni=N/2 + AR(ni)=-(N+1+NL) + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + +C ------ + subroutine sersum1mr(AR,N,NL,S) + real AR(N) + real S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2+1 + AR(ni)=N+1.+NL + ni=N/2+2 + AR(ni)=-(N+1.+NL) + S=0. + do i=1,N + S = S+ AR(i) + enddo + end + +C ------ + subroutine serprod1(AR,N,NL,P) + integer AR(N) + integer P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1 + do i=1,N + P = P* AR(i) + enddo + end + + subroutine serprodr1(AR,N,NL,P) + real AR(N) + real P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1. + do i=1,N + P = P* AR(i) + enddo + end + +C ------ + subroutine serlog1(AR,N,LAND,LOR,LEQV,LNEQV) + logical AR(N) + logical LAND,LOR,LEQV,LNEQV + do i=1,N,2 + AR(i) = .true. + AR(i+1)=.false. + enddo + LAND=AR(1) + LOR=AR(1) + LEQV=AR(1) + LNEQV=AR(1) + do i=2,N + LAND = LAND .and. AR(i) + LOR = LOR .or.AR(i) + enddo + do i=1,N,2 + LEQV = LEQV .eqv. AR(i) + enddo + do i=1,N + LNEQV = LNEQV .neqv. AR(i) + enddo + end + +C ----------------------------------------------------- + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda12.fdv new file mode 100644 index 0000000..2a36de2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda12.fdv @@ -0,0 +1,392 @@ + program REDA12 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N). +c + + print *,'===START OF REDA12========================' +C -------------------------------------------------- + call reda1201 +C -------------------------------------------------- + call reda1202 +C -------------------------------------------------- + call reda1203 +C -------------------------------------------------- + call reda1204 +C -------------------------------------------------- +C + print *,'=== END OF REDA12 ========================= ' + end + + +C ----------------------------------------------------REDA1201 + subroutine REDA1201 + integer, parameter :: N = 16,NL=1000 + character*8 tname + integer, allocatable :: A(:),C(:) + integer isum1,isumt1 + integer imax1,imaxt1 ,ni,imin1,imint1 + +cdvm$ distribute A(*) +cdvm$ reduction_group smaxmin + tname='REDA1201' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1m(C,NN,NNL,isum1) + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2-1 + A(ni)=N+1+NL + imax1=N+1+NL + +cdvm$ remote_access (A(1)) + imaxt1=A(1) + + ni=N/2 + A(ni)=-(N+1+NL) + imin1=-(N+1+NL) + +cdvm$ remote_access (A(1)) + imint1=A(1) + + isumt1 = 0 + +*dvm$ parallel (i) on A(i), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxt1) imaxt1=A(i) + if (A(i).LT.imint1) imint1=A(i) + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin + + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C -----------------------------------------------------REDA1202 + subroutine REDA1202 + integer, parameter :: N = 16, NL=1000 + character*8 tname + integer, allocatable :: A(:),C(:) + integer iprod1,iprodt1 + logical, allocatable :: B(:),CL(:) + logical land1,landt1,lor1,leqv1,lneqv1 + +cdvm$ distribute A(*) +cdvm$ align B(I) with A(I) +cdvm$ reduction_group prodand + tname='REDA1202' + allocate (A(N),C(N)) + allocate (B(N),CL(N)) + NNL=NL + NN=N + call serprod1(C,NN,NNL,iprod1) + call serlog1(CL,NN,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i) on B(i) + do i=1,N,2 + B(i) = .true. + enddo +*dvm$ parallel (i) on B(i+1) + do i=1,N-1,2 + B(i+1)=.false. + enddo + +cdvm$ remote_access (B(1)) + landt1 = B(1) + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + iprodt1 = 1 + +*dvm$ parallel (i) on A(i), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + iprodt1 = iprodt1*A(i) + landt1 = landt1 .and.B(i) + enddo + +cdvm$ reduction_start prodand + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + +cdvm$ reduction_wait prodand + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA1203 + subroutine REDA1203 + integer, parameter :: N = 8,NL=1000 + character*8 tname + integer, allocatable :: A(:),C(:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2,lit + integer imaxloct1,iminloct1 +cdvm$ distribute A(*) +cdvm$ reduction_group locmaxmin +c dvm$ reduction_group maxminloc + tname='REDA1203' + allocate (A(N),C(N)) + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2+2 + A(ni)=N+1+NL + imax1=N+1+NL + +cdvm$ remote_access (A(1)) + imaxt1=A(1) + + imaxloct1=imaxt1 + ni1=N/2+1 + A(ni1)=-(N+1+NL) + imin1=-(N+1+NL) + +cdvm$ remote_access (A(1)) + imint1=A(1) + + iminloct1=imint1 + lit=1 + it1=0 + it2=0 + +*dvm$ parallel (i) on A(i), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,it1,lit), +*dvm$*minloc( iminloct1,it2,lit)) + do i=1,N + if (A(i).GT.imaxt1) imaxt1 =A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + enddo + +cdvm$ reduction_start locmaxmin +cdvm$ reduction_wait locmaxmin + + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(imaxt1.eq.imaxloct1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA1204 + subroutine REDA1204 + integer, parameter :: N = 16 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:),C(:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer it1,it2,ni,ni1,lit + +cdvm$ distribute A(*) +cdvm$ reduction_group locsumloc + + tname='REDA1204' + allocate (A(N),C(N)) + NNL=NL + NN=N + call sersum1mr(C,NN,NNL,isum1) + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = i+NL + enddo + + ni=N/2+1 + A(ni)=N+1.+NL + imax1=N+1.+NL + +cdvm$ remote_access (A(1)) + imaxt1=A(1) + + imaxloct1=imaxt1 + ni1=N/2+2 + A(ni1)=-(N+1.+NL) + imin1=-(N+1.+NL) + +cdvm$ remote_access (A(1)) + imint1=A(1) + + iminloct1=imint1 + isumt1 = 0. + lit=1 + it1=0 + it2=0 + +*dvm$ parallel (i) on A(i), +*dvm$*reduction(locsumloc:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,it1,lit),minloc( iminloct1,it2,lit )) + do i=1,N + isumt1 = isumt1+A(i) + if (A(i).GT.imaxloct1) then + imaxloct1=A(i) + it1=i + endif + if (A(i).LT.iminloct1) then + iminloct1=A(i) + it2=i + endif + enddo + +cdvm$ reduction_start locsumloc +cdvm$ reduction_wait locsumloc + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(it1.eq.ni) + *.and.(it2.eq.ni1) ) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + +C ----------------------------------------------------- + + subroutine sersum1(AR,N,NL,S) + integer AR(N) + integer S,NL + do i=1,N + AR(i) = i+NL + enddo + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + + subroutine sersum1m(AR,N,NL,S) + integer AR(N) + integer S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2-1 + AR(ni)=N+1+NL + ni=N/2 + AR(ni)=-(N+1+NL) + S=0 + do i=1,N + s = s+ AR(i) + enddo + end + + subroutine sersum1mr(AR,N,NL,S) + real AR(N) + real S,NL + do i=1,N + AR(i) = i+NL + enddo + ni=N/2+1 + AR(ni)=N+1.+NL + ni=N/2+2 + AR(ni)=-(N+1.+NL) + S=0. + do i=1,N + S = S+ AR(i) + enddo + end + + subroutine serprod1(AR,N,NL,P) + integer AR(N) + integer P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1 + do i=1,N + P = P* AR(i) + enddo + end + + subroutine serprodr1(AR,N,NL,P) + real AR(N) + real P,NL + do i=1,N + AR(i) = i+NL + enddo + P=1. + do i=1,N + P = P* AR(i) + enddo + end + + subroutine serlog1(AR,N,LAND,LOR,LEQV,LNEQV) + logical AR(N) + logical LAND,LOR,LEQV,LNEQV + do i=1,N,2 + AR(i) = .true. + AR(i+1)=.false. + enddo + LAND=AR(1) + LOR=AR(1) + LEQV=AR(1) + LNEQV=AR(1) + do i=2,N + LAND = LAND .and. AR(i) + LOR = LOR .or.AR(i) + enddo + do i=1,N,2 + LEQV = LEQV .eqv. AR(i) + enddo + do i=1,N + LNEQV = LNEQV .neqv. AR(i) + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda21.fdv new file mode 100644 index 0000000..19c313b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda21.fdv @@ -0,0 +1,495 @@ + program REDA21 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N,M). +c + print *,'===START OF REDA21=======================' +C -------------------------------------------------- + call reda2101 +C -------------------------------------------------- + call reda2102 +C -------------------------------------------------- + call reda2103 +C ------------------------------------------------- + call reda2104 +C ------------------------------------------------- + +C +C + print *,'=== END OF REDA21 ========================= ' + end + + + + +C ----------------------------------------------------REDA2101 + subroutine REDA2101 + integer, parameter :: N = 16,M=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:),C(:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +cdvm$ distribute A(BLOCK,BLOCK) +cdvm$ reduction_group smaxmin + tname='REDA2101' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2m(C,NN,MM,NNL,isum1) + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +cdvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + ni=N/2 + nj=M/2 + A(ni,nj)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +cdvm$ remote_access (A(1,1)) + imint1=A(1,1) + + isumt1 = 0 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + if (A(i,j).LT.imint1) imint1=A(i,j) + enddo + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------REDA2102 + subroutine REDA2102 + integer, parameter :: N = 16,M=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:),C(:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:),CL(:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +cdvm$ distribute A(BLOCK,BLOCK) +cdvm$ align B(I,J) with A(I,J) +cdvm$ reduction_group prodand + + tname='REDA2102' + allocate (A(N,M),C(N,M)) + allocate (B(N,M),CL(N,M)) + NNL=NL + NN=N + MM=M + call serprod2(C,NN,MM,NNL,iprod1) + call serlog2(CL,NN,MM,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=1,M,2 + B(i,j) = .true. + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=2,M,2 + B(i,j)=.false. + enddo + enddo +cdvm$ remote_access (B(1,1)) + landt1 = B(1,1) + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + + iprodt1 = 1 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) + landt1 = landt1 .and.B(i,j) + enddo + enddo +cdvm$ reduction_start prodand + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +cdvm$ reduction_wait prodand + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA2103 + subroutine REDA2103 + integer, parameter :: N = 8, M=4,PN = 2,NL=1000 + character*8 tname + integer, allocatable :: A(:,:),C(:,:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2,jt1,jt2 + integer imaxloct1,iminloct1,lcoor + integer coor1(2),coor2(2) +cdvm$ distribute A(BLOCK,BLOCK) +cdvm$ reduction_group locmaxmin + tname='REDA2103' + allocate (A(N,M),C(N,M)) + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +cdvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + A(ni1,nj1)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +cdvm$ remote_access (A(1,1)) + imint1=A(1,1) + + iminloct1=imint1 + lcoor=2 + coor1(1)=0 + coor1(2)=0 + coor2(1)=0 + coor2(2)=0 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor), +*dvm$*minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + if (A(i,j).GT.imaxt1) imaxt1 =A(i,j) + if (A(i,j).GT.imaxloct1) then + imaxloct1=A(i,j) + coor1(1)=i + coor1(2)=j + endif + if (A(i,j).LT.iminloct1) then + iminloct1=A(i,j) + coor2(1)=i + coor2(2)=j + endif + enddo + enddo + +cdvm$ reduction_start locmaxmin +cdvm$ reduction_wait locmaxmin + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(imaxt1.eq.imaxloct1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1) + *.and.(coor1(2).eq.nj) .and.(coor2(2).eq.nj1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA2104 + subroutine REDA2104 + + integer, parameter :: N = 8,M=6 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:,:),C(:,:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer it1,it2,ni,ni1,jt1,jt2 + integer coor1(2),coor2(2),lcoor +cdvm$ distribute A(BLOCK,BLOCK) +cdvm$ reduction_group locsum + + tname='REDA2104' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2mr(C,NN,MM,NNL,isum1) +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +c ni=N/2+1 +c nj=M/2+1 + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1.+NL + imax1=N+M+1.+NL + +cdvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + A(ni1,nj1)=-(N+M+1.+NL) + imin1=-(N+M+1.+NL) + +cdvm$ remote_access (A(1,1)) + imint1=A(1,1) + + iminloct1=imint1 + isumt1 = 0. + lcoor=2 + coor1(1)=0 + coor1(2)=0 + coor2(1)=0 + coor2(2)=0 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(locsum:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor ),minloc( iminloct1,coor2,lcoor )) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + if (A(i,j).GT.imaxloct1) then + imaxloct1=A(i,j) + coor1(1)=i + coor1(2)=j + endif + if (A(i,j).LT.iminloct1) then + iminloct1=A(i,j) + coor2(1)=i + coor2(2)=j + endif + enddo + enddo + +cdvm$ reduction_start locsum +cdvm$ reduction_wait locsum +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 + +c print *,isum1,isumt1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1) + *.and.(coor1(2).eq.nj) .and.(coor2(2).eq.nj1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------- + subroutine sersum2(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + S=0 + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine sersum2m(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + + ni=N/2-1 + nj=M/2-1 + AR(ni,nj)=N+M+1+NL + ni=N/2 + nj=M/2 + AR(ni,nj)=-(N+M+1+NL) + S=0 + + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + + end + + subroutine sersum2mr(AR,N,M,NL,S) + real AR(N,M) + real S,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + ni=N/2 + nj=M/2 + AR(ni,nj)=N+M+1.+NL + ni1=N/2-1 + nj1=M/2-1 + AR(ni1,nj1)=-(N+M+1.+NL) + S=0. + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine serprod2(AR,N,M,NL,P) + integer AR(N,M) + integer P,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + P=1 + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serprodr2(AR,N,M,NL,P) + real AR(N,M) + real P,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + P=1. + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serlog2(AR,N,M,LAND,LOR,LEQV,LNEQV) + logical AR(N,M) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M,2 + AR(i,J) = .true. + enddo + enddo + do i=1,N + do j=2,M,2 + AR(i,j)=.false. + enddo + enddo + LAND=AR(1,1) + LOR=AR(1,1) + LEQV=AR(1,1) + LNEQV=AR(1,1) + do i=1,N + do j=1,M + LAND = LAND .and. AR(i,j) + LOR = LOR .or.AR(i,j) + enddo + enddo + do i=1,N + do j=1,M + LEQV = LEQV .eqv. AR(i,j) + enddo + enddo + do i=1,N + do j=1,M + LNEQV = LNEQV .neqv. AR(i,j) + enddo + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda22.fdv new file mode 100644 index 0000000..25ab6fd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda22.fdv @@ -0,0 +1,495 @@ + program REDA22 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N,M). +c + print *,'===START OF REDA22=======================' +C -------------------------------------------------- + call reda2201 +C -------------------------------------------------- + call reda2202 +C -------------------------------------------------- + call reda2203 +C ------------------------------------------------- + call reda2204 +C ------------------------------------------------- + +C +C + print *,'=== END OF REDA22 ========================= ' + end + + + + +C ----------------------------------------------------REDA2201 + subroutine REDA2201 + integer, parameter :: N = 16,M=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:),C(:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +cdvm$ distribute A(BLOCK,*) +cdvm$ reduction_group smaxmin + tname='REDA2201' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2m(C,NN,MM,NNL,isum1) + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + ni=N/2-1 + nj=M/2-1 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +cdvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + ni=N/2 + nj=M/2 + A(ni,nj)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +cdvm$ remote_access (A(1,1)) + imint1=A(1,1) + + isumt1 = 0 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + if (A(i,j).GT.imaxt1) imaxt1=A(i,j) + if (A(i,j).LT.imint1) imint1=A(i,j) + enddo + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------REDA2202 + subroutine REDA2202 + integer, parameter :: N = 16,M=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:),C(:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:),CL(:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +cdvm$ distribute A(*,BLOCK) +cdvm$ align B(I,J) with A(I,J) +cdvm$ reduction_group prodand + + tname='REDA2202' + allocate (A(N,M),C(N,M)) + allocate (B(N,M),CL(N,M)) + NNL=NL + NN=N + MM=M + call serprod2(C,NN,MM,NNL,iprod1) + call serlog2(CL,NN,MM,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=1,M,2 + B(i,j) = .true. + enddo + enddo + +*dvm$ parallel (i,j) on B(i,j) + do i=1,N + do j=2,M,2 + B(i,j)=.false. + enddo + enddo +cdvm$ remote_access (B(1,1)) + landt1 = B(1,1) + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + + iprodt1 = 1 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + do j=1,M + iprodt1 = iprodt1*A(i,j) + landt1 = landt1 .and.B(i,j) + enddo + enddo +cdvm$ reduction_start prodand + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +cdvm$ reduction_wait prodand + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA2203 + subroutine REDA2203 + integer, parameter :: N = 8, M=4,PN = 2,NL=1000 + character*8 tname + integer, allocatable :: A(:,:),C(:,:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2,jt1,jt2 + integer imaxloct1,iminloct1,lcoor + integer coor1(2),coor2(2) +cdvm$ distribute A(BLOCK,*) +cdvm$ reduction_group locmaxmin + tname='REDA2203' + allocate (A(N,M),C(N,M)) + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1+NL + imax1=N+M+1+NL + +cdvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + A(ni1,nj1)=-(N+M+1+NL) + imin1=-(N+M+1+NL) + +cdvm$ remote_access (A(1,1)) + imint1=A(1,1) + + iminloct1=imint1 + lcoor=2 + coor1(1)=0 + coor1(2)=0 + coor2(1)=0 + coor2(2)=0 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor), +*dvm$*minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + if (A(i,j).GT.imaxt1) imaxt1 =A(i,j) + if (A(i,j).GT.imaxloct1) then + imaxloct1=A(i,j) + coor1(1)=i + coor1(2)=j + endif + if (A(i,j).LT.iminloct1) then + iminloct1=A(i,j) + coor2(1)=i + coor2(2)=j + endif + enddo + enddo + +cdvm$ reduction_start locmaxmin +cdvm$ reduction_wait locmaxmin + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(imaxt1.eq.imaxloct1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1) + *.and.(coor1(2).eq.nj) .and.(coor2(2).eq.nj1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA2204 + subroutine REDA2204 + + integer, parameter :: N = 8,M=6 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:,:),C(:,:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer it1,it2,ni,ni1,jt1,jt2 + integer coor1(2),coor2(2),lcoor +cdvm$ distribute A(*,BLOCK) +cdvm$ reduction_group locsum + + tname='REDA2204' + allocate (A(N,M),C(N,M)) + NNL=NL + NN=N + MM=M + call sersum2mr(C,NN,MM,NNL,isum1) +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = i+j+NL + enddo + enddo + +c ni=N/2+1 +c nj=M/2+1 + ni=N/2 + nj=M/2 + A(ni,nj)=N+M+1.+NL + imax1=N+M+1.+NL + +cdvm$ remote_access (A(1,1)) + imaxt1=A(1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + A(ni1,nj1)=-(N+M+1.+NL) + imin1=-(N+M+1.+NL) + +cdvm$ remote_access (A(1,1)) + imint1=A(1,1) + + iminloct1=imint1 + isumt1 = 0. + lcoor=2 + coor1(1)=0 + coor1(2)=0 + coor2(1)=0 + coor2(2)=0 + +*dvm$ parallel (i,j) on A(i,j), +*dvm$*reduction(locsum:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor ),minloc( iminloct1,coor2,lcoor )) + do i=1,N + do j=1,M + isumt1 = isumt1+A(i,j) + if (A(i,j).GT.imaxloct1) then + imaxloct1=A(i,j) + coor1(1)=i + coor1(2)=j + endif + if (A(i,j).LT.iminloct1) then + iminloct1=A(i,j) + coor2(1)=i + coor2(2)=j + endif + enddo + enddo + +cdvm$ reduction_start locsum +cdvm$ reduction_wait locsum +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 + +c print *,isum1,isumt1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1) + *.and.(coor1(2).eq.nj) .and.(coor2(2).eq.nj1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------- + subroutine sersum2(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + S=0 + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine sersum2m(AR,N,M,NL,S) + integer AR(N,M) + integer S,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + + ni=N/2-1 + nj=M/2-1 + AR(ni,nj)=N+M+1+NL + ni=N/2 + nj=M/2 + AR(ni,nj)=-(N+M+1+NL) + S=0 + + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + + end + + subroutine sersum2mr(AR,N,M,NL,S) + real AR(N,M) + real S,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + ni=N/2 + nj=M/2 + AR(ni,nj)=N+M+1.+NL + ni1=N/2-1 + nj1=M/2-1 + AR(ni1,nj1)=-(N+M+1.+NL) + S=0. + do i=1,N + do j=1,M + s = s+ AR(i,j) + enddo + enddo + end + + subroutine serprod2(AR,N,M,NL,P) + integer AR(N,M) + integer P,NL + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + P=1 + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serprodr2(AR,N,M,NL,P) + real AR(N,M) + real P,NL + + do i=1,N + do j=1,M + AR(i,j) = i+j+NL + enddo + enddo + P=1. + do i=1,N + do j=1,M + P = P* AR(i,j) + enddo + enddo + end + + subroutine serlog2(AR,N,M,LAND,LOR,LEQV,LNEQV) + logical AR(N,M) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M,2 + AR(i,J) = .true. + enddo + enddo + do i=1,N + do j=2,M,2 + AR(i,j)=.false. + enddo + enddo + LAND=AR(1,1) + LOR=AR(1,1) + LEQV=AR(1,1) + LNEQV=AR(1,1) + do i=1,N + do j=1,M + LAND = LAND .and. AR(i,j) + LOR = LOR .or.AR(i,j) + enddo + enddo + do i=1,N + do j=1,M + LEQV = LEQV .eqv. AR(i,j) + enddo + enddo + do i=1,N + do j=1,M + LNEQV = LNEQV .neqv. AR(i,j) + enddo + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda31.fdv new file mode 100644 index 0000000..f15e2af --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda31.fdv @@ -0,0 +1,568 @@ + program REDA31 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N,M,K). +c + print *,'===START OF REDA31=======================' +C -------------------------------------------------- + call reda3101 +C -------------------------------------------------- + call reda3102 +C -------------------------------------------------- + call reda3103 +C ------------------------------------------------- + call reda3104 +C ------------------------------------------------- + +C +C + print *,'=== END OF REDA31 ========================= ' + end + + + + +C ----------------------------------------------------REDA3101 + subroutine REDA3101 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK) +cdvm$ reduction_group smaxmin + + tname='REDA3101' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3m(C,NN,MM,KK,NNL,isum1) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +cdvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +cdvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + isumt1 = 0 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + if (A(i,j,ii).LT.imint1) imint1=A(i,j,ii) + enddo + enddo + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------REDA3102 + subroutine REDA3102 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:),CL(:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK) +cdvm$ align B(I,J,II) with A(I,J,II) +cdvm$ reduction_group prodand + + tname='REDA3102' + allocate (A(N,M,K),C(N,M,K)) + allocate (B(N,M,K),CL(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call serprod3(C,NN,MM,KK,NNL,iprod1) + call serlog3(CL,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + B(i,j,ii) = .true. + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + B(i,j,ii)=.false. + enddo + enddo + enddo + +cdvm$ remote_access (B(1,1,1)) + landt1 = B(1,1,1) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + iprodt1 = 1 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + landt1 = landt1 .and.B(i,j,ii) + enddo + enddo + enddo + +cdvm$ reduction_start prodand + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo +cdvm$ reduction_wait prodand + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA3103 + subroutine REDA3103 + integer, parameter :: N = 8, M=4,K=16,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2,jt1,jt2 + integer imaxloct1,iminloct1,lcoor + integer coor1(3),coor2(3) + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK) +cdvm$ reduction_group locmaxmin + + tname='REDA3103' + allocate (A(N,M,K),C(N,M,K)) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +cdvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + A(ni1,nj1,nii1)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +cdvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + iminloct1=imint1 + lcoor=3 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor), +*dvm$*minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1) imaxt1 =A(i,j,ii) + if (A(i,j,ii).GT.imaxloct1) then + imaxloct1=A(i,j,ii) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + endif + if (A(i,j,ii).LT.iminloct1) then + iminloct1=A(i,j,ii) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + endif + enddo + enddo + enddo + +cdvm$ reduction_startlocmaxmin +cdvm$ reduction_wait locmaxmin + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1).and. + * (imaxt1.eq.imaxloct1).and.(coor1(1).eq.ni).and. + * (coor1(2).eq.nj).and.(coor1(3).eq.nii).and. + * (coor2(1).eq.ni1) .and.(coor2(2).eq.nj1) + * .and.(coor2(3).eq.nii1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA3104 + subroutine REDA3104 + integer, parameter :: N = 8,M=6,K=16 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:,:,:),C(:,:,:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer ni,ni1,lcoor + integer coor1(3),coor2(3) + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK) +cdvm$ reduction_group locsum + + tname='REDA3104' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3mr(C,NN,MM,KK,NNL,isum1) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1.+NL + imax1=N+M+K+1.+NL + +cdvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + A(ni1,nj1,nii1)=-(N+M+K+1.+NL) + imin1=-(N+M+K+1.+NL) + +cdvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + iminloct1=imint1 + isumt1 = 0. + lcoor=3 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(locsum:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor),minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + if (A(i,j,ii).GT.imaxloct1) then + imaxloct1=A(i,j,ii) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + endif + if (A(i,j,ii).LT.iminloct1) then + iminloct1=A(i,j,ii) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + endif + enddo + enddo + enddo + +cdvm$ reduction_start locsum +cdvm$ reduction_wait locsum +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 + +c print *,isum1,isumt1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1).and.(coor1(2).eq.nj) + *.and.(coor2(2).eq.nj1) + *.and.(coor1(3).eq.nii).and.(coor2(3).eq.nii1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------- + + subroutine sersum3(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine sersum3m(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine sersum3mr(AR,N,M,K,NL,S) + real AR(N,M,K) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprod3(AR,N,M,K,NL,P) + integer AR(N,M,K) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprodr3(AR,N,M,K,NL,P) + real AR(N,M,K) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serlog3(AR,N,M,K,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K,2 + AR(i,j,ii) = .true. + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=2,K,2 + AR(i,j,ii)=.false. + enddo + enddo + enddo + LAND=AR(1,1,1) + LOR=AR(1,1,1) + LEQV=AR(1,1,1) + LNEQV=AR(1,1,1) + do i=1,N + do j=1,M + do ii=1,K + LAND = LAND .and. AR(i,j,ii) + LOR = LOR .or.AR(i,j,ii) + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + LEQV = LEQV .eqv. AR(i,j,ii) + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + LNEQV = LNEQV .neqv. AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda32.fdv new file mode 100644 index 0000000..ae5d390 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda32.fdv @@ -0,0 +1,568 @@ + program REDA32 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N,M,K). +c + print *,'===START OF REDA32=======================' +C -------------------------------------------------- + call reda3201 +C -------------------------------------------------- + call reda3202 +C -------------------------------------------------- + call reda3203 +C ------------------------------------------------- + call reda3204 +C ------------------------------------------------- + +C +C + print *,'=== END OF REDA32 ========================= ' + end + + + + +C ----------------------------------------------------REDA3201 + subroutine REDA3201 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +cdvm$ distribute A(BLOCK,BLOCK,*) +cdvm$ reduction_group smaxmin + + tname='REDA3201' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3m(C,NN,MM,KK,NNL,isum1) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +cdvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +cdvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + isumt1 = 0 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + if (A(i,j,ii).GT.imaxt1) imaxt1=A(i,j,ii) + if (A(i,j,ii).LT.imint1) imint1=A(i,j,ii) + enddo + enddo + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------REDA3202 + subroutine REDA3202 + integer, parameter :: N = 16,M=8,K=16,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:),CL(:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + +cdvm$ distribute A(BLOCK,*,BLOCK) +cdvm$ align B(I,J,II) with A(I,J,II) +cdvm$ reduction_group prodand + + tname='REDA3202' + allocate (A(N,M,K),C(N,M,K)) + allocate (B(N,M,K),CL(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call serprod3(C,NN,MM,KK,NNL,iprod1) + call serlog3(CL,NN,MM,KK,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K,2 + B(i,j,ii) = .true. + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=1,N + do j=1,M + do ii=2,K,2 + B(i,j,ii)=.false. + enddo + enddo + enddo + +cdvm$ remote_access (B(1,1,1)) + landt1 = B(1,1,1) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + iprodt1 = 1 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + iprodt1 = iprodt1*A(i,j,ii) + landt1 = landt1 .and.B(i,j,ii) + enddo + enddo + enddo + +cdvm$ reduction_start prodand + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo +cdvm$ reduction_wait prodand + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA3203 + subroutine REDA3203 + integer, parameter :: N = 8, M=4,K=16,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:),C(:,:,:) + integer imax1,imaxt1 ,ni,imin1,imint1,it1,it2,jt1,jt2 + integer imaxloct1,iminloct1,lcoor + integer coor1(3),coor2(3) + +cdvm$ distribute A(*,BLOCK,BLOCK) +cdvm$ reduction_group locmaxmin + + tname='REDA3203' + allocate (A(N,M,K),C(N,M,K)) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1+NL + imax1=N+M+K+1+NL + +cdvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + A(ni1,nj1,nii1)=-(N+M+K+1+NL) + imin1=-(N+M+K+1+NL) + +cdvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + iminloct1=imint1 + lcoor=3 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor), +*dvm$*minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + do ii=1,K + if (A(i,j,ii).GT.imaxt1) imaxt1 =A(i,j,ii) + if (A(i,j,ii).GT.imaxloct1) then + imaxloct1=A(i,j,ii) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + endif + if (A(i,j,ii).LT.iminloct1) then + iminloct1=A(i,j,ii) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + endif + enddo + enddo + enddo + +cdvm$ reduction_startlocmaxmin +cdvm$ reduction_wait locmaxmin + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1).and. + * (imaxt1.eq.imaxloct1).and.(coor1(1).eq.ni).and. + * (coor1(2).eq.nj).and.(coor1(3).eq.nii).and. + * (coor2(1).eq.ni1) .and.(coor2(2).eq.nj1) + * .and.(coor2(3).eq.nii1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA3204 + subroutine REDA3204 + integer, parameter :: N = 8,M=6,K=16 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:,:,:),C(:,:,:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer ni,ni1,lcoor + integer coor1(3),coor2(3) + +cdvm$ distribute A(BLOCK,BLOCK,*) +cdvm$ reduction_group locsum + + tname='REDA3204' + allocate (A(N,M,K),C(N,M,K)) + NNL=NL + NN=N + MM=M + KK=K + call sersum3mr(C,NN,MM,KK,NNL,isum1) + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + A(ni,nj,nii)=N+M+K+1.+NL + imax1=N+M+K+1.+NL + +cdvm$ remote_access (A(1,1,1)) + imaxt1=A(1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + A(ni1,nj1,nii1)=-(N+M+K+1.+NL) + imin1=-(N+M+K+1.+NL) + +cdvm$ remote_access (A(1,1,1)) + imint1=A(1,1,1) + + iminloct1=imint1 + isumt1 = 0. + lcoor=3 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + +*dvm$ parallel (i,j,ii) on A(i,j,ii), +*dvm$*reduction(locsum:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor),minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + do ii=1,K + isumt1 = isumt1+A(i,j,ii) + if (A(i,j,ii).GT.imaxloct1) then + imaxloct1=A(i,j,ii) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + endif + if (A(i,j,ii).LT.iminloct1) then + iminloct1=A(i,j,ii) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + endif + enddo + enddo + enddo + +cdvm$ reduction_start locsum +cdvm$ reduction_wait locsum +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 + +c print *,isum1,isumt1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1).and.(coor1(2).eq.nj) + *.and.(coor2(2).eq.nj1) + *.and.(coor1(3).eq.nii).and.(coor2(3).eq.nii1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------- + + subroutine sersum3(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine sersum3m(AR,N,M,K,NL,S) + integer AR(N,M,K) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine sersum3mr(AR,N,M,K,NL,S) + real AR(N,M,K) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + AR(ni,nj,nii)=N+M+K+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + AR(ni,nj,nii)=-(N+M+K+1+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + s = s+ AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprod3(AR,N,M,K,NL,P) + integer AR(N,M,K) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serprodr3(AR,N,M,K,NL,P) + real AR(N,M,K) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = i+j+ii+NL + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + P = P* AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine serlog3(AR,N,M,K,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K,2 + AR(i,j,ii) = .true. + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=2,K,2 + AR(i,j,ii)=.false. + enddo + enddo + enddo + LAND=AR(1,1,1) + LOR=AR(1,1,1) + LEQV=AR(1,1,1) + LNEQV=AR(1,1,1) + do i=1,N + do j=1,M + do ii=1,K + LAND = LAND .and. AR(i,j,ii) + LOR = LOR .or.AR(i,j,ii) + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + LEQV = LEQV .eqv. AR(i,j,ii) + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + LNEQV = LNEQV .neqv. AR(i,j,ii) + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda41.fdv new file mode 100644 index 0000000..05c1048 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda41.fdv @@ -0,0 +1,643 @@ + program REDA41 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N,M,K,L). +c + print *,'===START OF REDA41=======================' +C -------------------------------------------------- + call reda4101 +C -------------------------------------------------- + call reda4102 +C -------------------------------------------------- + call reda4103 +C ------------------------------------------------- + call reda4104 +C ------------------------------------------------- + +C +C + print *,'=== END OF REDA41 ========================= ' + end + +C ----------------------------------------------------REDA4101 + subroutine REDA4101 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ reduction_group smaxmin + + tname='REDA4101' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4m(C,NN,MM,KK,LL,NNL,isum1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + isumt1 = 0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------REDA4102 + subroutine REDA4102 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:,:),CL(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ align B(I,J,II,JJ) with A(I,J,II,JJ) +cdvm$ reduction_group prodand + + tname='REDA4102' + allocate (A(N,M,K,L),C(N,M,K,L)) + allocate (B(N,M,K,L),CL(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + call serlog4(CL,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + B(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + B(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +cdvm$ remote_access (B(1,1,1,1)) + landt1 = B(1,1,1,1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + iprodt1 = 1 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + landt1 = landt1 .and.B(i,j,ii,jj) + enddo + enddo + enddo + enddo + +cdvm$ reduction_start prodand + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + +cdvm$ reduction_wait prodand + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA4103 + subroutine REDA4103 + integer, parameter :: N = 8, M=4,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin1,imint1 + integer imaxloct1,iminloct1,lcoor + integer coor1(4),coor2(4) +cdvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ reduction_group locmaxmin + + tname='REDA4103' + allocate (A(N,M,K,L),C(N,M,K,L)) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + njj1=L/2-1 + A(ni1,nj1,nii1,njj1)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + iminloct1=imint1 + lcoor=4 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor1(4)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + coor2(4)=0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor), +*dvm$*minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1 =A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxloct1) then + imaxloct1=A(i,j,ii,jj) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + coor1(4)=jj + endif + if (A(i,j,ii,jj).LT.iminloct1) then + iminloct1=A(i,j,ii,jj) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + coor2(4)=jj + endif + enddo + enddo + enddo + enddo + +cdvm$ reduction_start locmaxmin +cdvm$ reduction_wait locmaxmin + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1).and. + * (imaxt1.eq.imaxloct1).and.( coor1(1).eq.ni).and. + * (coor1(2).eq.nj).and.(coor1(3).eq.nii) + * .and.(coor1(4).eq.njj).and. + * (coor2(1).eq.ni1) .and.(coor2(2).eq.nj1) + * .and.(coor2(3).eq.nii1).and. + * (coor2(4).eq.njj1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA4104 + subroutine REDA4104 + integer, parameter :: N = 8,M=6,K=16,L=8 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer ni,ni1,lcoor + integer coor1(4),coor2(4) + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ reduction_group locsum + + tname='REDA4104' + allocate (A(N,M,K,L),C(N,M,K,L)) + + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4mr(C,NN,MM,KK,LL,NNL,isum1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1.+NL + imax1=N+M+K+L+1.+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + njj1=L/2-1 + A(ni1,nj1,nii1,njj1)=-(N+M+K+L+1.+NL) + imin1=-(N+M+K+L+1.+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + iminloct1=imint1 + isumt1 = 0. + lcoor=4 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor1(4)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + coor2(4)=0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(locsum:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor ),minloc( iminloct1,coor2,lcoor )) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxloct1) then + imaxloct1=A(i,j,ii,jj) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + coor1(4)=jj + endif + if (A(i,j,ii,jj).LT.iminloct1) then + iminloct1=A(i,j,ii,jj) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + coor2(4)=jj + endif + enddo + enddo + enddo + enddo + +cdvm$ reduction_start locsum +cdvm$ reduction_wait locsum +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 + +c print *,isum1,isumt1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1).and.(coor1(2).eq.nj) + * .and.(coor2(2).eq.nj1) + *.and.(coor1(3).eq.nii).and.(coor2(3).eq.nii1).and. + * (coor1(4).eq.njj).and.(coor2(4).eq.njj1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------- + + subroutine sersum4(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4m(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4mr(AR,N,M,K,L,NL,S) + real AR(N,M,K,L) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1.+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1.+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprod4(AR,N,M,K,L,NL,P) + integer AR(N,M,K,L) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprodr4(AR,N,M,K,L,NL,P) + real AR(N,M,K,L) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serlog4(AR,N,M,K,L,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K,L) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + AR(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + AR(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + LAND=AR(1,1,1,1) + LOR=AR(1,1,1,1) + LEQV=AR(1,1,1,1) + LNEQV=AR(1,1,1,1) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + LAND = LAND .and. AR(i,j,ii,jj) + LOR = LOR .or.AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + LEQV = LEQV .eqv. AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + LNEQV = LNEQV .neqv. AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda42.fdv new file mode 100644 index 0000000..aa7748d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda42.fdv @@ -0,0 +1,643 @@ + program REDA42 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N,M,K,L). +c + print *,'===START OF REDA42=======================' +C -------------------------------------------------- + call reda4201 +C -------------------------------------------------- + call reda4202 +C -------------------------------------------------- + call reda4203 +C ------------------------------------------------- + call reda4204 +C ------------------------------------------------- + +C +C + print *,'=== END OF REDA42 ========================= ' + end + +C ----------------------------------------------------REDA4201 + subroutine REDA4201 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +cdvm$ distribute A(*,*,*,*) +cdvm$ reduction_group smaxmin + + tname='REDA4201' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4m(C,NN,MM,KK,LL,NNL,isum1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + isumt1 = 0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------REDA4202 + subroutine REDA4202 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:,:),CL(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + + +cdvm$ distribute A(*,*,*,*) +cdvm$ align B(I,J,II,JJ) with A(I,J,II,JJ) +cdvm$ reduction_group prodand + + tname='REDA4202' + allocate (A(N,M,K,L),C(N,M,K,L)) + allocate (B(N,M,K,L),CL(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + call serlog4(CL,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + B(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +cdvm$ remote_access (B(1,1,1,1)) + landt1 = B(1,1,1,1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + iprodt1 = 1 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + landt1 = landt1 .and.B(i,j,ii,jj) + enddo + enddo + enddo + enddo + +cdvm$ reduction_start prodand + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + +cdvm$ reduction_wait prodand + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA4203 + subroutine REDA4203 + integer, parameter :: N = 8, M=4,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin1,imint1 + integer imaxloct1,iminloct1,lcoor + integer coor1(4),coor2(4) +cdvm$ distribute A(*,*,*,*) +cdvm$ reduction_group locmaxmin + + tname='REDA4203' + allocate (A(N,M,K,L),C(N,M,K,L)) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + njj1=L/2-1 + A(ni1,nj1,nii1,njj1)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + iminloct1=imint1 + lcoor=4 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor1(4)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + coor2(4)=0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor), +*dvm$*minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1 =A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxloct1) then + imaxloct1=A(i,j,ii,jj) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + coor1(4)=jj + endif + if (A(i,j,ii,jj).LT.iminloct1) then + iminloct1=A(i,j,ii,jj) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + coor2(4)=jj + endif + enddo + enddo + enddo + enddo + +cdvm$ reduction_start locmaxmin +cdvm$ reduction_wait locmaxmin + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1).and. + * (imaxt1.eq.imaxloct1).and.( coor1(1).eq.ni).and. + * (coor1(2).eq.nj).and.(coor1(3).eq.nii) + * .and.(coor1(4).eq.njj).and. + * (coor2(1).eq.ni1) .and.(coor2(2).eq.nj1) + * .and.(coor2(3).eq.nii1).and. + * (coor2(4).eq.njj1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA4204 + subroutine REDA4204 + integer, parameter :: N = 8,M=6,K=16,L=8 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer ni,ni1,lcoor + integer coor1(4),coor2(4) + +cdvm$ distribute A(*,*,*,*) +cdvm$ reduction_group locsum + + tname='REDA4204' + allocate (A(N,M,K,L),C(N,M,K,L)) + + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4mr(C,NN,MM,KK,LL,NNL,isum1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1.+NL + imax1=N+M+K+L+1.+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + njj1=L/2-1 + A(ni1,nj1,nii1,njj1)=-(N+M+K+L+1.+NL) + imin1=-(N+M+K+L+1.+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + iminloct1=imint1 + isumt1 = 0. + lcoor=4 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor1(4)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + coor2(4)=0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(locsum:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor ),minloc( iminloct1,coor2,lcoor )) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxloct1) then + imaxloct1=A(i,j,ii,jj) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + coor1(4)=jj + endif + if (A(i,j,ii,jj).LT.iminloct1) then + iminloct1=A(i,j,ii,jj) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + coor2(4)=jj + endif + enddo + enddo + enddo + enddo + +cdvm$ reduction_start locsum +cdvm$ reduction_wait locsum +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 + +c print *,isum1,isumt1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1).and.(coor1(2).eq.nj) + * .and.(coor2(2).eq.nj1) + *.and.(coor1(3).eq.nii).and.(coor2(3).eq.nii1).and. + * (coor1(4).eq.njj).and.(coor2(4).eq.njj1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------- + + subroutine sersum4(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4m(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4mr(AR,N,M,K,L,NL,S) + real AR(N,M,K,L) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1.+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1.+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprod4(AR,N,M,K,L,NL,P) + integer AR(N,M,K,L) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprodr4(AR,N,M,K,L,NL,P) + real AR(N,M,K,L) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serlog4(AR,N,M,K,L,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K,L) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + AR(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + AR(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + LAND=AR(1,1,1,1) + LOR=AR(1,1,1,1) + LEQV=AR(1,1,1,1) + LNEQV=AR(1,1,1,1) + do i=2,N + do j=2,M + do ii=2,K + do jj=2,L + LAND = LAND .and. AR(i,j,ii,jj) + LOR = LOR .or.AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + do i=1,N,2 + do j=1,M,2 + do ii=1,K,2 + do jj=1,L,2 + LEQV = LEQV .eqv. AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + LNEQV = LNEQV .neqv. AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda43.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda43.fdv new file mode 100644 index 0000000..19af3be --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/reda43.fdv @@ -0,0 +1,643 @@ + program REDA43 + +c TESTING OF THE REDUCTION_GROUP DIRECTIVE,REDUCTION_START +c DIRECTIVE,REDUCTION_WAIT DIRECTIVE. +c REDUCTION GROUPE IS EXECUTED FOR DISTRIBUTED ARRAY A(N,M,K,L). +c + print *,'===START OF REDA43=======================' +C -------------------------------------------------- + call reda4301 +C -------------------------------------------------- + call reda4302 +C -------------------------------------------------- + call reda4303 +C ------------------------------------------------- + call reda4304 +C ------------------------------------------------- + +C +C + print *,'=== END OF REDA43 ========================= ' + end + +C ----------------------------------------------------REDA4301 + subroutine REDA4301 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imin1,imint1 ,ni + integer isum1,isumt1 + integer imax1,imaxt1 + +cdvm$ distribute A(BLOCK,BLOCK,BLOCK,*) +cdvm$ reduction_group smaxmin + + tname='REDA4301' + allocate (A(N,M,K,L),C(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4m(C,NN,MM,KK,LL,NNL,isum1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + isumt1 = 0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(smaxmin:sum(isumt1),max(imaxt1),min(imint1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxt1) imaxt1=A(i,j,ii,jj) + if (A(i,j,ii,jj).LT.imint1) imint1=A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +cdvm$ reduction_start smaxmin +cdvm$ reduction_wait smaxmin +c print *,isumt1,isum1 +c print *,imaxt1,imax1 +c print *,imint1,imin1 + if ((isum1 .eq.isumt1) .and.(imax1 .eq.imaxt1) + * .and.(imin1 .eq.imint1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end +C ----------------------------------------------------REDA4302 + subroutine REDA4302 + integer, parameter :: N = 16,M=8,K=16,L=8,NL=10 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer iprod1,iprodt1 + logical, allocatable :: B(:,:,:,:),CL(:,:,:,:) + logical land1,landt1,lor1,leqv1,lneqv1 + + +cdvm$ distribute A(BLOCK,BLOCK,*,BLOCK) +cdvm$ align B(I,J,II,JJ) with A(I,J,II,JJ) +cdvm$ reduction_group prodand + + tname='REDA4302' + allocate (A(N,M,K,L),C(N,M,K,L)) + allocate (B(N,M,K,L),CL(N,M,K,L)) + NNL=NL + NN=N + MM=M + KK=K + LL=L + call serprod4(C,NN,MM,KK,LL,NNL,iprod1) + call serlog4(CL,NN,MM,KK,LL,land1,lor1,leqv1,lneqv1) + +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo +*dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + B(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + +cdvm$ remote_access (B(1,1,1,1)) + landt1 = B(1,1,1,1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + iprodt1 = 1 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(prodand:product( iprodt1 ),and(landt1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + iprodt1 = iprodt1*A(i,j,ii,jj) + landt1 = landt1 .and.B(i,j,ii,jj) + enddo + enddo + enddo + enddo + +cdvm$ reduction_start prodand + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + +cdvm$ reduction_wait prodand + + if ((iprod1 .eq.iprodt1) + *.and. (land1 .eqv.landt1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + deallocate (B,CL) + + end + + +C ----------------------------------------------------REDA4303 + subroutine REDA4303 + integer, parameter :: N = 8, M=4,K=16,L=8,NL=1000 + character*8 tname + integer, allocatable :: A(:,:,:,:),C(:,:,:,:) + integer imax1,imaxt1 ,ni,imin1,imint1 + integer imaxloct1,iminloct1,lcoor + integer coor1(4),coor2(4) +cdvm$ distribute A(BLOCK,*,BLOCK,BLOCK) +cdvm$ reduction_group locmaxmin + + tname='REDA4303' + allocate (A(N,M,K,L),C(N,M,K,L)) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1+NL + imax1=N+M+K+L+1+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + njj1=L/2-1 + A(ni1,nj1,nii1,njj1)=-(N+M+K+L+1+NL) + imin1=-(N+M+K+L+1+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + iminloct1=imint1 + lcoor=4 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor1(4)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + coor2(4)=0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(locmaxmin:max( imaxt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor), +*dvm$*minloc( iminloct1,coor2,lcoor)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (A(i,j,ii,jj).GT.imaxt1) imaxt1 =A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxloct1) then + imaxloct1=A(i,j,ii,jj) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + coor1(4)=jj + endif + if (A(i,j,ii,jj).LT.iminloct1) then + iminloct1=A(i,j,ii,jj) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + coor2(4)=jj + endif + enddo + enddo + enddo + enddo + +cdvm$ reduction_start locmaxmin +cdvm$ reduction_wait locmaxmin + +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1).and. + * (imaxt1.eq.imaxloct1).and.( coor1(1).eq.ni).and. + * (coor1(2).eq.nj).and.(coor1(3).eq.nii) + * .and.(coor1(4).eq.njj).and. + * (coor2(1).eq.ni1) .and.(coor2(2).eq.nj1) + * .and.(coor2(3).eq.nii1).and. + * (coor2(4).eq.njj1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------REDA4304 + subroutine REDA4304 + integer, parameter :: N = 8,M=6,K=16,L=8 + real, parameter :: NL=1000. + character*8 tname + real, allocatable :: A(:,:,:,:),C(:,:,:,:) + real isum1,isumt1 + real imax1,imaxt1 ,imin1,imint1 + real imaxloct1,iminloct1,NNL + integer ni,ni1,lcoor + integer coor1(4),coor2(4) + +cdvm$ distribute A(*,BLOCK,BLOCK,BLOCK) +cdvm$ reduction_group locsum + + tname='REDA4304' + allocate (A(N,M,K,L),C(N,M,K,L)) + + NNL=NL + NN=N + MM=M + KK=K + LL=L + call sersum4mr(C,NN,MM,KK,LL,NNL,isum1) + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + A(ni,nj,nii,njj)=N+M+K+L+1.+NL + imax1=N+M+K+L+1.+NL + +cdvm$ remote_access (A(1,1,1,1)) + imaxt1=A(1,1,1,1) + + imaxloct1=imaxt1 + ni1=N/2-1 + nj1=M/2-1 + nii1=K/2-1 + njj1=L/2-1 + A(ni1,nj1,nii1,njj1)=-(N+M+K+L+1.+NL) + imin1=-(N+M+K+L+1.+NL) + +cdvm$ remote_access (A(1,1,1,1)) + imint1=A(1,1,1,1) + + iminloct1=imint1 + isumt1 = 0. + lcoor=4 + coor1(1)=0 + coor1(2)=0 + coor1(3)=0 + coor1(4)=0 + coor2(1)=0 + coor2(2)=0 + coor2(3)=0 + coor2(4)=0 + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +*dvm$*reduction(locsum:sum( isumt1 ), +*dvm$*maxloc( imaxloct1,coor1,lcoor ),minloc( iminloct1,coor2,lcoor )) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + isumt1 = isumt1+A(i,j,ii,jj) + if (A(i,j,ii,jj).GT.imaxloct1) then + imaxloct1=A(i,j,ii,jj) + coor1(1)=i + coor1(2)=j + coor1(3)=ii + coor1(4)=jj + endif + if (A(i,j,ii,jj).LT.iminloct1) then + iminloct1=A(i,j,ii,jj) + coor2(1)=i + coor2(2)=j + coor2(3)=ii + coor2(4)=jj + endif + enddo + enddo + enddo + enddo + +cdvm$ reduction_start locsum +cdvm$ reduction_wait locsum +c print *,A +c print *,imax1,imaxt1,imaxloct1 +c print *,imin1,imint1,iminloct1 + +c print *,isum1,isumt1 +c print *,it1,ni +c print *,it2,ni1 +c print *,jt1,nj +c print *,jt2,nj1 + if ((imaxloct1.eq.imax1).and.(iminloct1.eq.imin1) + *.and.(isumt1.eq.isum1).and.(coor1(1).eq.ni) + *.and.(coor2(1).eq.ni1).and.(coor1(2).eq.nj) + * .and.(coor2(2).eq.nj1) + *.and.(coor1(3).eq.nii).and.(coor2(3).eq.nii1).and. + * (coor1(4).eq.njj).and.(coor2(4).eq.njj1))then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,C) + + end + + +C ----------------------------------------------------- + + subroutine sersum4(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4m(AR,N,M,K,L,NL,S) + integer AR(N,M,K,L) + integer S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1+NL) + S=0 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine sersum4mr(AR,N,M,K,L,NL,S) + real AR(N,M,K,L) + real S,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + ni=N/2-1 + nj=M/2-1 + nii=K/2-1 + njj=L/2-1 + AR(ni,nj,nii,njj)=N+M+K+L+1.+NL + ni=N/2 + nj=M/2 + nii=K/2 + njj=L/2 + AR(ni,nj,nii,njj)=-(N+M+K+L+1.+NL) + S=0. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + s = s+ AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprod4(AR,N,M,K,L,NL,P) + integer AR(N,M,K,L) + integer P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + P=1 + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serprodr4(AR,N,M,K,L,NL,P) + real AR(N,M,K,L) + real P,NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = i+j+ii+jj+NL + enddo + enddo + enddo + enddo + P=1. + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + P = P* AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine serlog4(AR,N,M,K,L,LAND,LOR,LEQV,LNEQV) + logical AR(N,M,K,L) + logical LAND,LOR,LEQV,LNEQV + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L,2 + AR(i,j,ii,jj) = .true. + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=2,L,2 + AR(i,j,ii,jj)=.false. + enddo + enddo + enddo + enddo + LAND=AR(1,1,1,1) + LOR=AR(1,1,1,1) + LEQV=AR(1,1,1,1) + LNEQV=AR(1,1,1,1) + do i=2,N + do j=2,M + do ii=2,K + do jj=2,L + LAND = LAND .and. AR(i,j,ii,jj) + LOR = LOR .or.AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + do i=1,N,2 + do j=1,M,2 + do ii=1,K,2 + do jj=1,L,2 + LEQV = LEQV .eqv. AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + LNEQV = LNEQV .neqv. AR(i,j,ii,jj) + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*8 name + print *,name,' - complete' + end + subroutine ansno(name) + character*8 name + print *,name,' - ***error' + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/settings b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/settings new file mode 100644 index 0000000..3ef2d72 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REDUCTIONA/settings @@ -0,0 +1 @@ +DVM_ONLY=1 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem11.fdv new file mode 100644 index 0000000..a8a2118 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem11.fdv @@ -0,0 +1,538 @@ + program REM11 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM11========================' +C -------------------------------------------------- + call rem1101 +C -------------------------------------------------- + call rem1102 +C -------------------------------------------------- + call rem1103 +C ------------------------------------------------- + call rem1104 +C ------------------------------------------------- + call rem1105 +C ------------------------------------------------- + call rem1106 +C -------------------------------------------------- + call rem1107 +C -------------------------------------------------- + call rem1108 +C -------------------------------------------------- + call rem1109 +C ------------------------------------------------- + call rem1110 +C ------------------------------------------------- + call rem1111 +C ------------------------------------------------- + call rem1112 +C ------------------------------------------------- + +C +C + print *,'=== END OF REM11 ========================= ' + end +C ---------------------------------------------REM1101 + subroutine REM1101 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1101' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo +!dvm$ end region +!dvm$ get_actual(A(1)) +!dvm$ remote_access (A(1)) + ib=A(1) + + if (ib .eq.C(1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------REM1102 + subroutine REM1102 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1102' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ end region +!dvm$ get_actual(A(N)) +!dvm$ remote_access (A(N)) + ib=A(N) + if (ib .eq.C(N)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------REM1103 + subroutine REM1103 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1103' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ end region +!dvm$ get_actual(A(N/2)) +!dvm$ remote_access (A(N/2)) + ib=A(N/2) + if (ib .eq.C(N/2)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------REM1104 + subroutine REM1104 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop,isumc,isuma + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1104' + allocate (B(N),A(N),C(N),D(N)) + isumc=0 + isuma=0 + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ end region + do i=1,N +!dvm$ get_actual(A(i)) +!dvm$ remote_access (A(i)) + D(i)=A(i) + isumc=isumc+C(i) + isuma=isuma+D(i) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C,D) + + end + +C ----------------------------------------REM1105 + subroutine REM1105 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop,isumc,isuma + character*7 tname + +!dvm$ distribute B(BLOCK) + +!dvm$ align (I) with B(I) ::A + + tname='REM1105' + allocate (B(N),A(N),C(N),D(N)) + isumc=0 + isuma=0 + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N +!dvm$ remote_access (A(:)) + D(i)=A(i) + isumc=isumc+C(i) + isuma=isuma+D(i) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C,D) + + end + +C ----------------------------------------REM1106 + subroutine REM1106 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop,isumc,isuma + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1106' + allocate (B(N),A(N),C(N),D(N)) + isumc=0 + isuma=0 + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ end region + kk=2 + kk1=3 + + do i=1,N/kk-kk1 +!dvm$ get_actual(A(kk*i+kk1)) +!dvm$ remote_access (A(kk*i+kk1)) + D(i)=A(kk*i+kk1) + isumc=isumc+C(kk*i+kk1) + isuma=isuma+D(i) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C,D) + + end +C ---------------------------------------------REM1107 + subroutine REM1107 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1107' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region local(A, B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(1)) + do i=1,N + B(i) = A(1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(1)) nloop=min(nloop, i); + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------REM1108 + subroutine REM1108 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1108' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(N)) + do i=1,N + B(i) = A(N) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(N)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------REM1109 + + subroutine REM1109 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1109' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(N/2)) + do i=1,N + B(i) = A(N/2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(N/2)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------REM1110 + + subroutine REM1110 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1110' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A) + do i=1,N + B(i) = A(i) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(i)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------REM1111 + subroutine REM1111 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1111' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(i)) + do i=1,N + B(i) = A(i) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(i)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------REM1112 + subroutine REM1112 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='REM1112' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + kk=2 + kk1=3 +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(kk*i+kk1)) + do i=1,N/kk-kk1 + B(i) = A(kk*i+kk1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N/kk-kk1 + if (B(i).ne.C(kk*i+kk1)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem12.fdv new file mode 100644 index 0000000..2d67fc7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem12.fdv @@ -0,0 +1,533 @@ + program REM12 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM12========================' +C -------------------------------------------------- + call rem1201 +C -------------------------------------------------- + call rem1202 +C -------------------------------------------------- + call rem1203 +C ------------------------------------------------- + call rem1204 +C ------------------------------------------------- + call rem1205 +C ------------------------------------------------- + call rem1206 +C -------------------------------------------------- + call rem1207 +C -------------------------------------------------- + call rem1208 +C -------------------------------------------------- + call rem1209 +C ------------------------------------------------- + call rem1210 +C ------------------------------------------------- + call rem1211 +C ------------------------------------------------- + call rem1212 +C ------------------------------------------------- + +C +C + print *,'=== END OF REM12 ========================= ' + end +C ---------------------------------------------REM1201 + subroutine REM1201 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1201' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo +!dvm$ end region +!dvm$ get_actual(A(1)) +!dvm$ remote_access (A(1)) + ib=A(1) + + if (ib .eq.C(1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------REM1202 + subroutine REM1202 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1202' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo +!dvm$ end region +!dvm$ get_actual(A(N)) +!dvm$ remote_access (A(N)) + ib=A(N) + if (ib .eq.C(N)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------REM1203 + subroutine REM1203 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1203' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo +!dvm$ end region +!dvm$ get_actual(A(N/2)) +!dvm$ remote_access (A(N/2)) + ib=A(N/2) + if (ib .eq.C(N/2)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------REM1204 + subroutine REM1204 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop,isumc,isuma + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1204' + allocate (B(N),A(N),C(N),D(N)) + isumc=0 + isuma=0 + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N +!dvm$ remote_access (A(i)) + D(i)=A(i) + isumc=isumc+C(i) + isuma=isuma+D(i) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C,D) + + end + +C ----------------------------------------REM1205 + subroutine REM1205 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop,isumc,isuma + character*7 tname + +!dvm$ distribute B(*) + +!dvm$ align (I) with B(I) ::A + + tname='REM1205' + allocate (B(N),A(N),C(N),D(N)) + isumc=0 + isuma=0 + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N +!dvm$ remote_access (A(:)) + D(i)=A(i) + isumc=isumc+C(i) + isuma=isuma+D(i) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C,D) + + end + +C ----------------------------------------REM1206 + subroutine REM1206 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:),D(:) + integer nloop,isumc,isuma + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1206' + allocate (B(N),A(N),C(N),D(N)) + isumc=0 + isuma=0 + NNL=NL + call serial1(C,N,NNL) + nloop=NL + + kk=2 + kk1=3 +!dvm$ region out(A) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ end region +!dvm$ get_actual(A) + + do i=1,N/kk-kk1 +!dvm$ remote_access (A(kk*i+kk1)) + D(i)=A(kk*i+kk1) + isumc=isumc+C(kk*i+kk1) + isuma=isuma+D(i) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C,D) + + end +C ---------------------------------------------REM1207 + subroutine REM1207 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1207' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(1)) + do i=1,N + B(i) = A(1) + enddo + +!dvm$ parallel (i) on A(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(1)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------REM1208 + subroutine REM1208 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1208' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(N)) + do i=1,N + B(i) = A(N) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(N)) nloop=min(nloop, i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------REM1209 + + subroutine REM1209 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1209' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(N/2)) + do i=1,N + B(i) = A(N/2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(N/2)) nloop=min(nloop, i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------REM1210 + + subroutine REM1210 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1210' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +c !dvm$ parallel (i) on B(i),remote_access(A) +!dvm$ parallel (i) on B(i),remote_access(A(:)) + do i=1,N + B(i) = A(i) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(i)) nloop=min(nloop, i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ---------------------------------------------REM1211 + subroutine REM1211 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1211' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(:)) + do i=1,N + B(i) = A(i) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N + if (B(i).ne.C(i)) nloop=min(nloop, i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C ---------------------------------------------REM1212 + subroutine REM1212 + integer, parameter :: N = 16,NL=1000 + integer, allocatable :: A(:),B(:),C(:) + integer nloop + character*7 tname + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='REM1212' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + kk=2 + kk1=3 +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),remote_access(A(:)) + do i=1,N/kk-kk1 + B(i) = A(kk*i+kk1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=1,N/kk-kk1 + if (B(i).ne.C(kk*i+kk1)) nloop=min(nloop, i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem21.fdv new file mode 100644 index 0000000..8e2ecb2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem21.fdv @@ -0,0 +1,992 @@ + program REM21 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM21========================' +C -------------------------------------------------- + call rem2101 +C -------------------------------------------------- + call rem2102 +C -------------------------------------------------- + call rem2103 +C ------------------------------------------------- + call rem2104 +C ------------------------------------------------- + call rem2105 +C ------------------------------------------------- + call rem2106 +C -------------------------------------------------- + call rem2107 +C -------------------------------------------------- + call rem2108 +C -------------------------------------------------- + call rem2109 +C ------------------------------------------------- + call rem2110 +C ------------------------------------------------- + call rem2111 +C ------------------------------------------------- + call rem2112 +C ------------------------------------------------- + call rem2113 +C ------------------------------------------------- + call rem2114 +C ------------------------------------------------- + call rem2115 +C ----------------------------------------------- + call rem2116 +C ----------------------------------------------- + call rem2117 +C ------------------------------------------------- + call rem2118 +C ------------------------------------------------ + call rem2119 +C ------------------------------------------------- + call rem2120 +C ------------------------------------------------- + +C + print *,'=== END OF REM21 ========================= ' + end +C ---------------------------------------------------------REM2101 + + subroutine REM2101 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ align :: A + + tname='REM2101' + allocate(B(N,M),A(N,M),C(N,M)) +!dvm$ realign A(i,j) with B(i,j) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,1)) +!dvm$ remote_access (A(1,1)) + ib=A(1,1) + + if (ib .eq.C(1,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(A,B,C) + + end + +C ------------------------------------------------------REM2102 + subroutine REM2102 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align :: B + + tname='REM2102' + allocate(A(N,M),B(N,M),C(N,M)) +!dvm$ realign B(i,j) with A(i,j) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,M)) +!dvm$ remote_access (A(N,M)) + ib=A(N,M) + if (ib .eq.C(N,M)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C) + + end + +C ------------------------------------------------------REM2103 + subroutine REM2103 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2103' + allocate(A(N,M),B(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,M)) +!dvm$ remote_access (A(1,M)) + ib=A(1,M) + + if (ib .eq.C(1,M)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C) + + end + +C ------------------------------------------------------REM2104 + subroutine REM2104 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2104' + allocate(A(N,M),B(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,1)) +!dvm$ remote_access (A(N,1)) + ib=A(N,1) + if (ib .eq.C(N,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C) + + end + +C ------------------------------------------------------REM2105 + subroutine REM2105 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2105' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M +!dvm$ remote_access (A(:,:)) + D(i,j)=A(i,j) + isumc=isumc+C(i,j) + isuma=isuma+D(i,j) + enddo + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ------------------------------------------------------REM2106 + subroutine REM2106 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2106' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,1)) + do i=1,N +!dvm$ remote_access (A(:,1)) + D(i,1)=A(i,1) + isumc=isumc+C(i,1) + isuma=isuma+D(i,1) + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ------------------------------------------------------REM2107 + subroutine REM2107 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2107' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,:)) + do j=1,M +!dvm$ remote_access (A(1,:)) + D(1,j)=A(1,j) + isumc=isumc+C(1,j) + isuma=isuma+D(1,j) + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C -----------------------------------------------------REM2108 + subroutine REM2108 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2108' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,M)) + do i=1,N +!dvm$ remote_access (A(:,M)) + D(i,M)=A(i,M) + isumc=isumc+C(i,M) + isuma=isuma+D(i,M) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2109 + subroutine REM2109 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2109' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out (A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,:)) + do j=1,M +!dvm$ remote_access (A(N,:)) + D(N,j)=A(N,j) + isumc=isumc+C(N,j) + isuma=isuma+D(N,j) + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2110 + subroutine REM2110 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2110' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M +!dvm$ remote_access (A(i,j)) + D(i,j)=A(i,j) + isumc=isumc+C(i,j) + isuma=isuma+D(i,j) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ------------------------------------------------------REM2111 + subroutine REM2111 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + integer ki +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2111' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + ki=2 + ki1=3 + kj=2 + kj1=3 + do i=1,N/ki-ki1 + do j=i,M/kj-kj1 +!dvm$ remote_access (A(ki*i+ki1,kj*j+kj1)) + D(i,j)=A(ki*i+ki1,kj*j+kj1) + isumc=isumc+C(ki*i+ki1,kj*j+kj1 ) + isuma=isuma+D(i,j) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2112 + subroutine REM2112 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2112' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(1,1)) + do i=1,N + do j=1,M + B(i,j) = A(1,1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2113 + subroutine REM2113 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2113' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(N,M)) + do i=1,N + do j=1,M + B(i,j) = A(N,M) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,M)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2114 + subroutine REM2114 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2114' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(1,M)) + do i=1,N + do j=1,M + B(i,j) = A(1,M) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,M)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2115 + subroutine REM2115 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2115' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(N,1)) + do i=1,N + do j=1,M + B(i,j) = A(N,1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2116 + subroutine REM2116 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2116' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(:,:)) + do i=1,N + do j=1,M + B(i,j) = A(i,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2117 + subroutine REM2117 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2117' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i) on B(i,1),remote_access(A(:,1)) + do i=1,N + B(i,1) = A(i,1) + enddo + +!dvm$ parallel (i) on B(i,1), reduction( min( nloopi),min(nloopj)) + do i=1,N + if (B(i,1).ne.C(i,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C -----------------------------------------------------REM2118 + subroutine REM2118 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2118' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on A(i,j),remote_access(A(1,:)) + do i=1,N + do j=1,M + B(i,j) = A(1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ----------------------------------------------------REM2119 + subroutine REM2119 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2119' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(:,M)) + do i=1,N + do j=1,M + B(i,j) = A(i,M) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,M)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2120 + subroutine REM2120 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK) +!dvm$ align(i,j) with A(i,j) :: B + + tname='REM2120' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on A(i,j),remote_access(A(N,:)) + do i=1,N + do j=1,M + B(i,j) = A(N,j) + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C --------------------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem22.fdv new file mode 100644 index 0000000..fd7d9e1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem22.fdv @@ -0,0 +1,992 @@ + program REM22 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM22========================' +C -------------------------------------------------- + call rem2201 +C -------------------------------------------------- + call rem2202 +C -------------------------------------------------- + call rem2203 +C ------------------------------------------------- + call rem2204 +C ------------------------------------------------- + call rem2205 +C ------------------------------------------------- + call rem2206 +C -------------------------------------------------- + call rem2207 +C -------------------------------------------------- + call rem2208 +C -------------------------------------------------- + call rem2209 +C ------------------------------------------------- + call rem2210 +C ------------------------------------------------- + call rem2211 +C ------------------------------------------------- + call rem2212 +C ------------------------------------------------- + call rem2213 +C ------------------------------------------------- + call rem2214 +C ------------------------------------------------- + call rem2215 +C ----------------------------------------------- + call rem2216 +C ----------------------------------------------- + call rem2217 +C ------------------------------------------------- + call rem2218 +C ------------------------------------------------ + call rem2219 +C ------------------------------------------------- + call rem2220 +C ------------------------------------------------- + +C + print *,'=== END OF REM22 ========================= ' + end +C ---------------------------------------------------------REM2201 + + subroutine REM2201 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute B(*,BLOCK) +!dvm$ align(:,:) with B(:,:) :: A + + tname='REM2201' + allocate(B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,1)) +!dvm$ remote_access (A(1,1)) + ib=A(1,1) + + if (ib .eq.C(1,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(A,B,C) + + end + +C ------------------------------------------------------REM2202 + subroutine REM2202 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2202' + allocate(A(N,M),B(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,M)) +!dvm$ remote_access (A(N,M)) + ib=A(N,M) + if (ib .eq.C(N,M)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C) + + end + +C ------------------------------------------------------REM2203 + subroutine REM2203 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2203' + allocate(A(N,M),B(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,M)) +!dvm$ remote_access (A(1,M)) + ib=A(1,M) + + if (ib .eq.C(1,M)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C) + + end + +C ------------------------------------------------------REM2204 + subroutine REM2204 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2204' + allocate(A(N,M),B(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,1)) +!dvm$ remote_access (A(N,1)) + ib=A(N,1) + if (ib .eq.C(N,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C) + + end + +C ------------------------------------------------------REM2205 + subroutine REM2205 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2205' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M +!dvm$ remote_access (A(:,:)) + D(i,j)=A(i,j) + isumc=isumc+C(i,j) + isuma=isuma+D(i,j) + enddo + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ------------------------------------------------------REM2206 + subroutine REM2206 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2206' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,1)) + do i=1,N +!dvm$ remote_access (A(:,1)) + D(i,1)=A(i,1) + isumc=isumc+C(i,1) + isuma=isuma+D(i,1) + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ------------------------------------------------------REM2207 + subroutine REM2207 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2207' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,:)) + do j=1,M +!dvm$ remote_access (A(1,:)) + D(1,j)=A(1,j) + isumc=isumc+C(1,j) + isuma=isuma+D(1,j) + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C -----------------------------------------------------REM2208 + subroutine REM2208 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2208' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,M)) + do i=1,N +!dvm$ remote_access (A(:,M)) + D(i,M)=A(i,M) + isumc=isumc+C(i,M) + isuma=isuma+D(i,M) + enddo + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2209 + subroutine REM2209 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2209' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,:)) + do j=1,M +!dvm$ remote_access (A(N,:)) + D(N,j)=A(N,j) + isumc=isumc+C(N,j) + isuma=isuma+D(N,j) + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2210 + subroutine REM2210 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2210' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M +!dvm$ remote_access (A(i,j)) + D(i,j)=A(i,j) + isumc=isumc+C(i,j) + isuma=isuma+D(i,j) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ------------------------------------------------------REM2211 + subroutine REM2211 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj,isumc,isuma + character*7 tname + integer ki +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2211' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + isumc=0 + isuma=0 + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region out(A) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + ki=2 + ki1=3 + kj=2 + kj1=3 + do i=1,N/ki-ki1 + do j=i,M/kj-kj1 +!dvm$ remote_access (A(ki*i+ki1,kj*j+kj1)) + D(i,j)=A(ki*i+ki1,kj*j+kj1) + isumc=isumc+C(ki*i+ki1,kj*j+kj1 ) + isuma=isuma+D(i,j) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2212 + subroutine REM2212 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2212' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(1,1)) + do i=1,N + do j=1,M + B(i,j) = A(1,1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2213 + subroutine REM2213 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2213' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(N,M)) + do i=1,N + do j=1,M + B(i,j) = A(N,M) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,M)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2214 + subroutine REM2214 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2214' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(1,M)) + do i=1,N + do j=1,M + B(i,j) = A(1,M) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,M)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2215 + subroutine REM2215 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2215' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(N,1)) + do i=1,N + do j=1,M + B(i,j) = A(N,1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2216 + subroutine REM2216 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2216' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +c !dvm$ parallel (i,J) on A(i,j),remote_access(A) +!dvm$ parallel (i,J) on B(i,j),remote_access(A(:,:)) + do i=1,N + do j=1,M + B(i,j) = A(i,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C -----------------------------------------------------REM2217 + subroutine REM2217 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2217' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i) on B(i,1),remote_access(A(:,1)) + do i=1,N + B(i,1) = A(i,1) + enddo + +!dvm$ parallel (i) on B(i,1), reduction( min( nloopi),min(nloopj)) + do i=1,N + if (B(i,1).ne.C(i,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C -----------------------------------------------------REM2218 + subroutine REM2218 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2218' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on A(i,j),remote_access(A(1,:)) + do i=1,N + do j=1,M + B(i,j) = A(1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(1,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C ----------------------------------------------------REM2219 + subroutine REM2219 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(*,BLOCK) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2219' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),remote_access(A(:,M)) + do i=1,N + do j=1,M + B(i,j) = A(i,M) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(i,M)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end +C ------------------------------------------------------REM2220 + subroutine REM2220 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:),D(:,:) + integer nloopi,nloopj + character*7 tname + +!dvm$ distribute A(BLOCK,*) +!dvm$ align(:,:) with A(:,:) :: B + + tname='REM2220' + allocate(A(N,M),B(N,M),C(N,M),D(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on A(i,j),remote_access(A(N,:)) + do i=1,N + do j=1,M + B(i,j) = A(N,j) + enddo + enddo + +!dvm$ parallel (i,j) on A(i,j), reduction( min( nloopi),min(nloopj)) + do i=1,N + do j=1,M + if (B(i,j).ne.C(N,j)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate(B,A,C,D) + + end + +C --------------------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem31.fdv new file mode 100644 index 0000000..921f5ff --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem31.fdv @@ -0,0 +1,763 @@ + program REM31 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM31========================' +C -------------------------------------------------- + call rem3101 +C -------------------------------------------------- + call rem3102 +C -------------------------------------------------- + call rem3103 +C ------------------------------------------------- + call rem3104 +C ------------------------------------------------- + call rem3105 +C ------------------------------------------------- + call rem3106 +C -------------------------------------------------- + call rem3107 +C -------------------------------------------------- + call rem3108 +C -------------------------------------------------- + call rem3109 +C ------------------------------------------------- + call rem3110 +C ------------------------------------------------- + call rem3111 +C ------------------------------------------------- + call rem3112 +C ------------------------------------------------- + call rem3113 +C ------------------------------------------------- +C + print *,'=== END OF REM31 ========================= ' + end +C ---------------------------------------------------------REM3101 + subroutine REM3101 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with B(:,:,:) :: A + + tname='REM3101' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,1,1)) +!dvm$ remote_access (A(1,1,1)) + ib=A(1,1,1) + + if (ib .eq.C(1,1,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------------------REM3102 + subroutine REM3102 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3102' + allocate (A(N,M,K),B(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,M,K)) +!dvm$ remote_access (A(N,M,K)) + ib=A(N,M,K) + if (ib .eq.C(N,M,K)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM3103 + subroutine REM3103 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3103' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M + do ii=1,K +!dvm$ remote_access (A(:,:,:)) + D(i,j,ii)=A(i,j,ii) + isumc=isumc+C(i,j,ii) + isuma=isuma+D(i,j,ii) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ------------------------------------------------------REM3104 + subroutine REM3104 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3104' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=Nl + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,:,:)) + + do j=1,M + do ii=1,K +!dvm$ remote_access (A(1,:,:)) + D(1,j,ii)=A(1,j,ii) + isumc=isumc+C(1,j,ii) + isuma=isuma+D(1,j,ii) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C -----------------------------------------------------REM3105 + subroutine REM3105 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3105' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,M,:)) + + do i=1,N + do ii=1,K +!dvm$ remote_access (A(:,M,:)) + D(i,M,ii)=A(i,M,ii) + isumc=isumc+C(i,M,ii) + isuma=isuma+D(i,M,ii) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3106 + subroutine REM3106 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3106' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,K)) + + do i=1,N + do j=1,M +!dvm$ remote_access (A(:,:,K)) + D(i,j,K)=A(i,j,K) + isumc=isumc+C(i,j,K) + isuma=isuma+D(i,j,K) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ------------------------------------------------------REM3107 + subroutine REM3107 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3107' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + + ki=2 + ki1=3 + kj=2 + kj1=3 + kii=2 + kii1=3 + do i=1,N/ki-ki1 + do j=1,M/kj-kj1 + do ii=1,K/kii-kii1 +!dvm$ remote_access (A(ki*i+ki1,kj*j+kj1,kii*ii+kii1)) + D(i,j,ii)=A(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isumc=isumc+C(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isuma=isuma+D(i,j,ii) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3108 + subroutine REM3108 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3108' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A(1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,1,1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,1,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3109 + subroutine REM3109 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3109' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A(N,M,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(N,M,K) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(N,M,K)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM3110 + subroutine REM3110 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3110' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM3111 + subroutine REM3111 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3111' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii),remote_access(A(1,:,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,j,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ----------------------------------------------------REM3112 + subroutine REM3112 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3112' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A(:,M,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,M,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,M,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3113 + subroutine REM3113 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3113' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$*remote_access(A(:,:,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,j,K) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,K)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C --------------------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem32.fdv new file mode 100644 index 0000000..6bc085f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem32.fdv @@ -0,0 +1,763 @@ + program REM32 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM32========================' +C -------------------------------------------------- + call rem3201 +C -------------------------------------------------- + call rem3202 +C -------------------------------------------------- + call rem3203 +C ------------------------------------------------- + call rem3204 +C ------------------------------------------------- + call rem3205 +C ------------------------------------------------- + call rem3206 +C -------------------------------------------------- + call rem3207 +C -------------------------------------------------- + call rem3208 +C -------------------------------------------------- + call rem3209 +C ------------------------------------------------- + call rem3210 +C ------------------------------------------------- + call rem3211 +C ------------------------------------------------- + call rem3212 +C ------------------------------------------------- + call rem3213 +C ------------------------------------------------- +C + print *,'=== END OF REM32 ========================= ' + end +C ---------------------------------------------------------REM3201 + subroutine REM3201 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ align(:,:,:) with B(:,:,:) :: A + + tname='REM3201' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,1,1)) +!dvm$ remote_access (A(1,1,1)) + ib=A(1,1,1) + + if (ib .eq.C(1,1,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------------------REM3202 + subroutine REM3202 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3202' + allocate (A(N,M,K),B(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,M,K)) +!dvm$ remote_access (A(N,M,K)) + ib=A(N,M,K) + if (ib .eq.C(N,M,K)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM3203 + subroutine REM3203 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3203' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M + do ii=1,K +!dvm$ remote_access (A(:,:,:)) + D(i,j,ii)=A(i,j,ii) + isumc=isumc+C(i,j,ii) + isuma=isuma+D(i,j,ii) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ------------------------------------------------------REM3204 + subroutine REM3204 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(*,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3204' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=Nl + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,:,:)) + + do j=1,M + do ii=1,K +!dvm$ remote_access (A(1,:,:)) + D(1,j,ii)=A(1,j,ii) + isumc=isumc+C(1,j,ii) + isuma=isuma+D(1,j,ii) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C -----------------------------------------------------REM3205 + subroutine REM3205 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3205' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,M,:)) + + do i=1,N + do ii=1,K +!dvm$ remote_access (A(:,M,:)) + D(i,M,ii)=A(i,M,ii) + isumc=isumc+C(i,M,ii) + isuma=isuma+D(i,M,ii) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3206 + subroutine REM3206 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3206' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,K)) + + do i=1,N + do j=1,M +!dvm$ remote_access (A(:,:,K)) + D(i,j,K)=A(i,j,K) + isumc=isumc+C(i,j,K) + isuma=isuma+D(i,j,K) + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ------------------------------------------------------REM3207 + subroutine REM3207 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii,isumc,isuma + character*7 tname + +!dvm$ distribute A(*,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3207' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + isumc=0 + isuma=0 + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + + ki=2 + ki1=3 + kj=2 + kj1=3 + kii=2 + kii1=3 + do i=1,N/ki-ki1 + do j=1,M/kj-kj1 + do ii=1,K/kii-kii1 +!dvm$ remote_access (A(ki*i+ki1,kj*j+kj1,kii*ii+kii1)) + D(i,j,ii)=A(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isumc=isumc+C(ki*i+ki1,kj*j+kj1,kii*ii+kii1) + isuma=isuma+D(i,j,ii) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3208 + subroutine REM3208 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3208' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A(1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,1,1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,1,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3209 + subroutine REM3209 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3209' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A(N,M,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(N,M,K) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(N,M,K)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM3210 + subroutine REM3210 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(*,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3210' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,j,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM3211 + subroutine REM3211 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,*,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3211' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii),remote_access(A(1,:,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(1,j,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(1,j,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ----------------------------------------------------REM3212 + subroutine REM3212 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3212' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),remote_access(A(:,M,:)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,M,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,M,ii)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM3213 + subroutine REM3213 + integer, parameter :: N=8,M=4,K=4,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:),D(:,:,:) + integer nloopi,nloopj,nloopii + character*7 tname + +!dvm$ distribute A(*,BLOCK,BLOCK) +!dvm$ align(:,:,:) with A(:,:,:) :: B + + tname='REM3213' + allocate (A(N,M,K),B(N,M,K),C(N,M,K),D(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$*remote_access(A(:,:,K)) + do i=1,N + do j=1,M + do ii=1,K + B(i,j,ii) = A(i,j,K) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on A(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) + do i=1,N + do j=1,M + do ii=1,K + if (B(i,j,ii).ne.C(i,j,K)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C --------------------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem41.fdv new file mode 100644 index 0000000..4d5852a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem41.fdv @@ -0,0 +1,883 @@ + program REM41 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM41========================' +C -------------------------------------------------- + call rem4101 +C -------------------------------------------------- + call rem4102 +C -------------------------------------------------- + call rem4103 +C ------------------------------------------------- + call rem4104 +C ------------------------------------------------- + call rem4105 +C ------------------------------------------------- + call rem4106 +C -------------------------------------------------- + call rem4107 +C -------------------------------------------------- + call rem4108 +C -------------------------------------------------- + call rem4109 +C ------------------------------------------------- + call rem4110 +C ------------------------------------------------- + call rem4111 +C ------------------------------------------------- + call rem4112 +C ------------------------------------------------- + call rem4113 +C ------------------------------------------------- + call rem4114 +C ------------------------------------------------- +C + print *,'=== END OF REM41 ========================= ' + end +C ---------------------------------------------------------REM3101 + subroutine REM4101 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + character*7 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with B(:,:,:,:) :: A + + tname='REM4101' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,1,1,1)) + +!dvm$ remote_access (A(1,1,1,1)) + ib=A(1,1,1,1) + + if (ib .eq.C(1,1,1,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------------------REM4102 + subroutine REM4102 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4102' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,M,K,L)) + +!dvm$ remote_access (A(N,M,K,L)) + ib=A(N,M,K,L) + + if (ib .eq.C(N,M,K,L)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM4103 + subroutine REM4103 + integer, parameter :: N = 4,M=4,K=4,L=4,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4103' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(:,:,:,:)) + D(i,j,ii,jj)=A(i,j,ii,jj) + isumc=isumc+C(i,j,ii,jj) + isuma=isuma+D(i,j,ii,jj) + enddo + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM4104 + subroutine REM4104 + integer, parameter :: N = 6,M=8,K=8,L=4,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4104' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,:,:,:)) + + do j=1,M + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(1,:,:,:)) + D(1,j,ii,jj)=A(1,j,ii,jj) + isumc=isumc+C(1,j,ii,jj) + isuma=isuma+D(1,j,ii,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C -----------------------------------------------------REM4105 + subroutine REM4105 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4105' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,M,:,:)) + + do i=1,N + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(:,M,:,:)) + D(i,M,ii,jj)=A(i,M,ii,jj) + isumc=isumc+C(i,M,ii,jj) + isuma=isuma+D(i,M,ii,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4106 + subroutine REM4106 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4106' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,K,:)) + + do i=1,N + do j=1,M + do jj=1,L +!dvm$ remote_access (A(:,:,K,:)) + D(i,j,K,jj)=A(i,j,K,jj) + isumc=isumc+C(i,j,K,jj) + isuma=isuma+D(i,j,K,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4107 + subroutine REM4107 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4107' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,:,L)) + + do i=1,N + do j=1,M + do ii=1,K +!dvm$ remote_access (A(:,:,:,L)) + D(i,j,ii,L)=A(i,j,ii,L) + isumc=isumc+C(i,j,ii,L) + isuma=isuma+D(i,j,ii,L) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4108 + subroutine REM4108 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4108' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*remote_access(A(1,1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,1,1,1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,1,1,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4109 + subroutine REM4109 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4109' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(A(N,M,K,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(N,M,K,L) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(N,M,K,L)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM4110 + subroutine REM4110 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4110' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(A) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM4111 + subroutine REM4111 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4111' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),remote_access(A(1,:,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,j,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ----------------------------------------------------REM4112 + subroutine REM4112 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4112' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*remote_access(A(:,M,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,M,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,M,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4113 + subroutine REM4113 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4113' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*remote_access(A(:,:,K,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,K,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,K,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4114 + subroutine REM4114 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4114' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*remote_access(A(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,L) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,L)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C --------------------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem42.fdv new file mode 100644 index 0000000..46a7963 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem42.fdv @@ -0,0 +1,883 @@ + program REM42 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM42========================' +C -------------------------------------------------- + call rem4201 +C -------------------------------------------------- + call rem4202 +C -------------------------------------------------- + call rem4203 +C ------------------------------------------------- + call rem4204 +C ------------------------------------------------- + call rem4205 +C ------------------------------------------------- + call rem4206 +C -------------------------------------------------- + call rem4207 +C -------------------------------------------------- + call rem4208 +C -------------------------------------------------- + call rem4209 +C ------------------------------------------------- + call rem4210 +C ------------------------------------------------- + call rem4211 +C ------------------------------------------------- + call rem4212 +C ------------------------------------------------- + call rem4213 +C ------------------------------------------------- + call rem4214 +C ------------------------------------------------- +C + print *,'=== END OF REM42 ========================= ' + end +C ---------------------------------------------------------REM3101 + subroutine REM4201 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + character*7 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ align(:,:,:,:) with B(:,:,:,:) :: A + + tname='REM4201' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,1,1,1)) + +!dvm$ remote_access (A(1,1,1,1)) + ib=A(1,1,1,1) + + if (ib .eq.C(1,1,1,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------------------REM4202 + subroutine REM4202 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4202' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,M,K,L)) + +!dvm$ remote_access (A(N,M,K,L)) + ib=A(N,M,K,L) + + if (ib .eq.C(N,M,K,L)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM4203 + subroutine REM4203 + integer, parameter :: N = 4,M=4,K=4,L=4,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4203' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(:,:,:,:)) + D(i,j,ii,jj)=A(i,j,ii,jj) + isumc=isumc+C(i,j,ii,jj) + isuma=isuma+D(i,j,ii,jj) + enddo + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM4204 + subroutine REM4204 + integer, parameter :: N = 6,M=8,K=8,L=4,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4204' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,:,:,:)) + + do j=1,M + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(1,:,:,:)) + D(1,j,ii,jj)=A(1,j,ii,jj) + isumc=isumc+C(1,j,ii,jj) + isuma=isuma+D(1,j,ii,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C -----------------------------------------------------REM4205 + subroutine REM4205 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4205' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,M,:,:)) + + do i=1,N + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(:,M,:,:)) + D(i,M,ii,jj)=A(i,M,ii,jj) + isumc=isumc+C(i,M,ii,jj) + isuma=isuma+D(i,M,ii,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4206 + subroutine REM4206 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4206' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,K,:)) + + do i=1,N + do j=1,M + do jj=1,L +!dvm$ remote_access (A(:,:,K,:)) + D(i,j,K,jj)=A(i,j,K,jj) + isumc=isumc+C(i,j,K,jj) + isuma=isuma+D(i,j,K,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4207 + subroutine REM4207 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4207' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,:,L)) + + do i=1,N + do j=1,M + do ii=1,K +!dvm$ remote_access (A(:,:,:,L)) + D(i,j,ii,L)=A(i,j,ii,L) + isumc=isumc+C(i,j,ii,L) + isuma=isuma+D(i,j,ii,L) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4208 + subroutine REM4208 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4208' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*remote_access(A(1,1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,1,1,1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,1,1,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4209 + subroutine REM4209 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4209' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(A(N,M,K,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(N,M,K,L) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(N,M,K,L)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM4210 + subroutine REM4210 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4210' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(A) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM4211 + subroutine REM4211 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4211' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),remote_access(A(1,:,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,j,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ----------------------------------------------------REM4212 + subroutine REM4212 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4212' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*remote_access(A(:,M,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,M,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,M,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4213 + subroutine REM4213 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4213' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*remote_access(A(:,:,K,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,K,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,K,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4214 + subroutine REM4214 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,*,*,*) +!dvm$ align(:,:,:,:) with A(:,:,:,:) :: B + + tname='REM4214' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*remote_access(A(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,L) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,L)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C --------------------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem43.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem43.fdv new file mode 100644 index 0000000..d58a86a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/REMOTE/rem43.fdv @@ -0,0 +1,884 @@ + program REM43 + +c TESTING OF THE REMOTE_ACCESS DIRECTIVE AND THE REMOTE_ACCESS CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) OR ELEMENTS OF THIS ARRAY ARE REPLICATED +c ON ALL PROCESSORS. + + print *,'===START OF REM43========================' +C -------------------------------------------------- + call rem4301 +C -------------------------------------------------- + call rem4302 +C -------------------------------------------------- + call rem4303 +C ------------------------------------------------- + call rem4304 +C ------------------------------------------------- + call rem4305 +C ------------------------------------------------- + call rem4306 +C -------------------------------------------------- + call rem4307 +C -------------------------------------------------- + call rem4308 +C -------------------------------------------------- + call rem4309 +C ------------------------------------------------- + call rem4310 +C ------------------------------------------------- + call rem4311 +C ------------------------------------------------- + call rem4312 +C ------------------------------------------------- + call rem4313 +C ------------------------------------------------- + call rem4314 +C ------------------------------------------------- +C + print *,'=== END OF REM43 ========================= ' + end +C ---------------------------------------------------------REM3101 + subroutine REM4301 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + character*7 tname + integer :: i,j,ii,jj + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,*) +!dvm$ align(i,j,ii,jj) with B(i,j,ii,jj) :: A + + tname='REM4301' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,1,1,1)) + +!dvm$ remote_access (A(1,1,1,1)) + ib=A(1,1,1,1) + + if (ib .eq.C(1,1,1,1)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------------------REM4302 + subroutine REM4302 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4302' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(N,M,K,L)) + +!dvm$ remote_access (A(N,M,K,L)) + ib=A(N,M,K,L) + + if (ib .eq.C(N,M,K,L)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM4303 + subroutine REM4303 + integer, parameter :: N = 4,M=4,K=4,L=4,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,*,BLOCK,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4303' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A) + do i=1,N + do j=i,M + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(:,:,:,:)) + D(i,j,ii,jj)=A(i,j,ii,jj) + isumc=isumc+C(i,j,ii,jj) + isuma=isuma+D(i,j,ii,jj) + enddo + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C) + + end + +C ------------------------------------------------------REM4304 + subroutine REM4304 + integer, parameter :: N = 6,M=8,K=8,L=4,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(*,BLOCK,BLOCK,BLOCK) +!dvm$ align(i1,i2,i3,i4) with A(i1,i2,i3,i4) :: B + + tname='REM4304' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(1,:,:,:)) + + do j=1,M + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(1,:,:,:)) + D(1,j,ii,jj)=A(1,j,ii,jj) + isumc=isumc+C(1,j,ii,jj) + isuma=isuma+D(1,j,ii,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C -----------------------------------------------------REM4305 + subroutine REM4305 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,*) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4305' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,M,:,:)) + + do i=1,N + do ii=1,K + do jj=1,L +!dvm$ remote_access (A(:,M,:,:)) + D(i,M,ii,jj)=A(i,M,ii,jj) + isumc=isumc+C(i,M,ii,jj) + isuma=isuma+D(i,M,ii,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4306 + subroutine REM4306 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4306' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,K,:)) + + do i=1,N + do j=1,M + do jj=1,L +!dvm$ remote_access (A(:,:,K,:)) + D(i,j,K,jj)=A(i,j,K,jj) + isumc=isumc+C(i,j,K,jj) + isuma=isuma+D(i,j,K,jj) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4307 + subroutine REM4307 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer isumc,isuma + character*7 tname + +!dvm$ distribute A(BLOCK,*,BLOCK,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4307' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + isumc=0 + isuma=0 + NNL=NL + call serial4(C,N,M,K,L,NNL) + +!dvm$ region out(A) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(A(:,:,:,L)) + + do i=1,N + do j=1,M + do ii=1,K +!dvm$ remote_access (A(:,:,:,L)) + D(i,j,ii,L)=A(i,j,ii,L) + isumc=isumc+C(i,j,ii,L) + isuma=isuma+D(i,j,ii,L) + enddo + enddo + enddo + + if (isumc .eq.isuma) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4308 + subroutine REM4308 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,BLOCK,BLOCK,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4308' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*remote_access(A(1,1,1,1)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,1,1,1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,1,1,1)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4309 + subroutine REM4309 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,*) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4309' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(A(N,M,K,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(N,M,K,L) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(N,M,K,L)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM4310 + subroutine REM4310 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4310' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),remote_access(A) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C -----------------------------------------------------REM4311 + subroutine REM4311 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,*,BLOCK,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4311' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),remote_access(A(1,:,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(1,j,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(1,j,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C ----------------------------------------------------REM4312 + subroutine REM4312 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(*,BLOCK,BLOCK,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4312' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*remote_access(A(:,M,:,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,M,ii,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$* reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,M,ii,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4313 + subroutine REM4313 + integer, parameter :: N = 6,M=8,K=8,L=6,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,BLOCK,*) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4313' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*remote_access(A(:,:,K,:)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,K,jj) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,K,jj)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end +C ------------------------------------------------------REM4314 + subroutine REM4314 + integer, parameter :: N = 16,M=8,K=8,L=16,NL=1000 + integer,allocatable::A(:,:,:,:),B(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj + character*7 tname + +!dvm$ distribute A(BLOCK,BLOCK,*,BLOCK) +!dvm$ align(i,j,ii,jj) with A(i,j,ii,jj) :: B + + tname='REM4314' + allocate (A(N,M,K,L),B(N,M,K,L),C(N,M,K,L),D(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*remote_access(A(:,:,:,L)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + B(i,j,ii,jj) = A(i,j,ii,L) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + if (B(i,j,ii,jj).ne.C(i,j,ii,L)) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (B,A,C,D) + + end + +C --------------------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh11.fdv new file mode 100644 index 0000000..6dfa3ea --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh11.fdv @@ -0,0 +1,830 @@ + program SH11 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH11========================' +C -------------------------------------------------- + call sh1101 +C -------------------------------------------------- + call sh1102 +C -------------------------------------------------- + call sh1103 +C ------------------------------------------------- + call sh1104 +C ------------------------------------------------- + call sh1105 +C ------------------------------------------------- + call sh1106 +C -------------------------------------------------- + call sh1107 +C -------------------------------------------------- + call sh1108 +C -------------------------------------------------- + call sh1109 +C ------------------------------------------------- + call sh1110 +C ------------------------------------------------- + call sh1111 +C ------------------------------------------------- + call sh1112 +C ------------------------------------------------- + call sh1113 +C -------------------------------------------------- + call sh1114 +C -------------------------------------------------- + call sh1115 +C ------------------------------------------------- + call sh1116 +C ------------------------------------------------- + call sh1117 +C ------------------------------------------------- + +C ------------------------------------------------- + +C +C + print *,'=== END OF SH11 ========================= ' + end +C ---------------------------------------------SH1101 + subroutine SH1101 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SH1101' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=2,N-1 + B(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(C(i-1)+c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH1102 + subroutine sh1102 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SH1102' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(1:1)) + do i=2,N-1 + B(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(C(i-1)+c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH1103 + subroutine sh1103 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SH1103' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:1)) + do i=2,N-1 + B(i) = A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH1104 + subroutine sh1104 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SH1104' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(1:0)) + do i=2,N + B(i) = A(i-1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N + if (B(i).ne.(c(i-1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH1105 + subroutine sh1105 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:1) + + tname='SH1105' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:1)) + do i=2,N-1 + B(i) = A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C --------------------------------------------SH1106 + + subroutine sh1106 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(1:0) + + tname='SH1106' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(1:0)) + do i=2,N + B(i) = A(i-1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N + if (B(i).ne.(c(i-1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1107 + + subroutine sh1107 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SH1107' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(2:2)) + do i=3,N-2 + B(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N-2 + if (B(i).ne.(C(i-1)+c(i+1)+c(i-2)+c(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1108 + + subroutine sh1108 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SH1108' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:2)) + do i=2,N-2 + B(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-2 + if (B(i).ne.(c(i+1)+c(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH1109 + + subroutine sh1109 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SH1109' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(2:0)) + do i=3,N + B(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N + if (B(i).ne.(c(i-1)+c(i-2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1110 + + subroutine sh1110 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:2) + + tname='SH1110' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=2,N-2 + B(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-2 + if (B(i).ne.(c(i+1)+c(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1111 + + subroutine sh1111 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:0) + + tname='SH1111' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=3,N + B(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N + if (B(i).ne.(c(i-1)+c(i-2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1112 + + subroutine sh1112 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SH1112' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=4,N-3 + B(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2)+A(i-3)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N-3 + if (B(i).ne.(C(i-1)+c(i+1)+c(i-2)+c(i+2)+c(i-3)+c(i+3))) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1113 + + subroutine sh1113 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SH1113' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:3)) + do i=2,N-3 + B(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-3 + if (B(i).ne.(c(i+1)+c(i+2)+c(i+3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1114 + + subroutine sh1114 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SH1114' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(3:0)) + do i=4,N + B(i) = A(i-1)+A(i-2)+A(i-3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N + if (B(i).ne.(c(i-1)+c(i-2)+c(i-3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1115 + + subroutine sh1115 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:0) + + tname='SH1115' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=4,N + B(i) = A(i-1)+A(i-2)+A(i-3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N + if (B(i).ne.(c(i-1)+c(i-2)+c(i-3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1116 + + subroutine sh1116 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:3) + + tname='SH1116' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=2,N-3 + B(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-3 + if (B(i).ne.(c(i+1)+c(i+2)+c(i+3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH1117 + + subroutine sh1117 + integer, parameter :: N = 500,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(11:11) + + tname='SH1117' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=12,N-11 + B(i) = A(i-9)+A(i+9)+A(i+10)+A(i-10)+A(i-11)+A(i+11) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=12,N-11 + if (B(i).ne.(C(i-9)+c(i+9)+c(i-10)+c(i+10)+ + *c(i-11)+c(i+11))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh12.fdv new file mode 100644 index 0000000..27ca477 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh12.fdv @@ -0,0 +1,831 @@ + program SH12 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH12========================' +C -------------------------------------------------- + call sh1201 +C -------------------------------------------------- + call sh1202 +C -------------------------------------------------- + call sh1203 +C ------------------------------------------------- + call sh1204 +C ------------------------------------------------- + call sh1205 +C ------------------------------------------------- + call sh1206 +C -------------------------------------------------- + call sh1207 +C -------------------------------------------------- + call sh1208 +C -------------------------------------------------- + call sh1209 +C ------------------------------------------------- + call sh1210 +C ------------------------------------------------- + call sh1211 +C ------------------------------------------------- + call sh1212 +C ------------------------------------------------- + call sh1213 +C -------------------------------------------------- + call sh1214 +C -------------------------------------------------- + call sh1215 +C ------------------------------------------------- + call sh1216 +C ------------------------------------------------- + call sh1217 +C ------------------------------------------------- + +C ------------------------------------------------- + +C +C + print *,'=== END OF SH12 ========================= ' + end +C ---------------------------------------------SH1201 + subroutine SH1201 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='SH1201' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=2,N-1 + B(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(C(i-1)+c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH1202 + subroutine sh1202 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='SH1202' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(1:1)) + do i=2,N-1 + B(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(C(i-1)+c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH1203 + subroutine sh1203 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='SH1203' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:1)) + do i=2,N-1 + B(i) = A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH1204 + subroutine sh1204 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A + + tname='SH1204' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(1:0)) + do i=2,N + B(i) = A(i-1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N + if (B(i).ne.(c(i-1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH1205 + subroutine sh1205 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:1) + + tname='SH1205' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:1)) + do i=2,N-1 + B(i) = A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(c(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C --------------------------------------------SH1206 + + subroutine sh1206 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(1:0) + + tname='SH1206' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(1:0)) + do i=2,N + B(i) = A(i-1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N + if (B(i).ne.(c(i-1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1207 + + subroutine sh1207 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SH1207' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(2:2)) + do i=3,N-2 + B(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N-2 + if (B(i).ne.(C(i-1)+c(i+1)+c(i-2)+c(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1208 + + subroutine sh1208 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SH1208' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:2)) + do i=2,N-2 + B(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-2 + if (B(i).ne.(c(i+1)+c(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH1209 + + subroutine sh1209 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SH1209' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(2:0)) + do i=3,N + B(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N + if (B(i).ne.(c(i-1)+c(i-2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1210 + + subroutine sh1210 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:2) + + tname='SH1210' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=2,N-2 + B(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-2 + if (B(i).ne.(c(i+1)+c(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1211 + + subroutine sh1211 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:0) + + tname='SH1211' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=3,N + B(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N + if (B(i).ne.(c(i-1)+c(i-2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1212 + + subroutine sh1212 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SH1212' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=4,N-3 + B(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2)+A(i-3)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N-3 + if (B(i).ne.(C(i-1)+c(i+1)+c(i-2)+c(i+2)+c(i-3)+c(i+3))) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1213 + + subroutine sh1213 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SH1213' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(0:3)) + do i=2,N-3 + B(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-3 + if (B(i).ne.(c(i+1)+c(i+2)+c(i+3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1214 + + subroutine sh1214 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SH1214' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A(3:0)) + do i=4,N + B(i) = A(i-1)+A(i-2)+A(i-3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N + if (B(i).ne.(c(i-1)+c(i-2)+c(i-3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1215 + + subroutine sh1215 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:0) + + tname='SH1215' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=4,N + B(i) = A(i-1)+A(i-2)+A(i-3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N + if (B(i).ne.(c(i-1)+c(i-2)+c(i-3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH1216 + + subroutine sh1216 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:3) + + tname='SH1216' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=2,N-3 + B(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-3 + if (B(i).ne.(c(i+1)+c(i+2)+c(i+3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH1217 + + subroutine sh1217 + integer, parameter :: N = 50,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(*) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(11:11) + + tname='SH1217' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + enddo + + +!dvm$ parallel (i) on B(i),shadow_renew(A) + do i=12,N-11 + B(i) = A(i-9)+A(i+9)+A(i+10)+A(i-10)+A(i-11)+A(i+11) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=12,N-11 + if (B(i).ne.(C(i-9)+c(i+9)+c(i-10)+c(i+10)+ + *c(i-11)+c(i+11))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh21.fdv new file mode 100644 index 0000000..696cb49 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh21.fdv @@ -0,0 +1,1220 @@ + program SH21 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH21========================' +C -------------------------------------------------- + call sh2101 +C -------------------------------------------------- + call sh2102 +C -------------------------------------------------- + call sh2103 +C ------------------------------------------------- + call sh2104 +C ------------------------------------------------- + call sh2105 +C ------------------------------------------------- + call sh2106 +C -------------------------------------------------- + call sh2107 +C -------------------------------------------------- + call sh2108 +C---------------------------------------------------- + call sh2109 +C ------------------------------------------------- + call sh2110 +C ------------------------------------------------- + call sh2111 +C ------------------------------------------------- + call sh2112 +C ------------------------------------------------- + call sh2113 +C -------------------------------------------------- + call sh2114 +C -------------------------------------------------- + call sh2115 +C ------------------------------------------------- + call sh2116 +C ------------------------------------------------- + call sh2117 +C ------------------------------------------------- + call sh2118 +C ------------------------------------------------- + call sh2119 +C ------------------------------------------------- + call sh2120 +C ------------------------------------------------- + +C ------------------------------------------------- + +C +C + print *,'=== END OF SH21 ========================= ' + end +C ---------------------------------------------SH2101 + subroutine SH2101 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + character*6 tname +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2101' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j),shadow_renew(A(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i-1,j)+A(i,j-1)+ + *A(i-1,j-1)+ A(i+1,j+1)+A(i-1,j+1)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i-1,j)+C(i,j-1)+ + *C(i-1,j-1)+ C(i+1,j+1)+C(i-1,j+1)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH2102 + subroutine sh2102 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2102' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:1)(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH2103 + subroutine sh2103 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2103' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(1:0,0:1)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i-1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i-1,j)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH2104 + subroutine sh2104 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(1:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2104' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:1)(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH2105 + subroutine sh2105 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(0:1,1:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2105' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,1:0)(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i,j-1)+A(i+1,j)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1)+C(i+1,j)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C --------------------------------------------SH2106 + + subroutine sh2106 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(0:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2106' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:0)) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2107 + + subroutine sh2107 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(1:0,1:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2107' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:0,1:0)) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2108 + + subroutine sh2108 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2108' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j)+A(i,j+2)+A(i+2,j)+A(i+2,j+2)+ + * A(i-2,j+2)+A(i-2,j)+A(i,j-2)+A(i-2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j)+C(i,j+2)+C(i+2,j)+C(i+2,j+2)+ + *C(i-2,j+2)+C(i-2,j)+C(i,j-2)+C(i-2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH2109 + + subroutine sh2109 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2109' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:2,2:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i,j+2)+A(i,j-2)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i,j+2)+C(i,j-2)+A(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2110 + + subroutine sh2110 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2110' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(2:2,2:0)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-2,j-2)+ A(i-1,j-1)+A(i-2,j)+A(i+2,j)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-2,j-2)+C(i-1,j-1)+C(i-2,j)+C(i+2,j)+C(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2111 + + subroutine sh2111 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,0:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2111' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(2:2,0:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i-2,j+2)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i-2,j+2)+C(i+2,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2112 + + subroutine sh2112 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2112' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(1:0,0:1)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-1,j+1)+ A(i,j+1)+A(i-1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-1,j+1)+ C(i,j+1)+C(i-1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2113 + + subroutine sh2113 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2113' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:0)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2114 + + subroutine sh2114 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2114' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:0,0:2)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+2)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+2)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2115 + + subroutine sh2115 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2115' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i+1,j+1)+A(i+2,j+2)+A(i+3,j+3)+A(i-3,j-3)+ + * A(i-2,j-2)+A(i-1,j-1)+A(i-3,j+3)+A(i+3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i+1,j+1)+C(i+2,j+2)+C(i+3,j+3)+C(i-3,j-3)+ + * C(i-2,j-2)+C(i-1,j-1)+C(i-3,j+3)+C(i+3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2116 + + subroutine sh2116 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:3,0:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2116' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:0,0:1)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2117 + + subroutine sh2117 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2117' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:0)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2118 + + subroutine sh2118 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:3,3:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2118' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i+3,j)+A(i-3,j)+A(i-3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i+3,j)+C(i-3,j)+C(i-3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2119 + + subroutine sh2119 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:0,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2119' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(3:0,3:3)(CORNER)) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i,j+3)+A(i-3,j+3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i,j+3)+C(i-3,j+3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2120 + + subroutine sh2120 + integer, parameter :: N = 480,M=480,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2120' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=12,N-11 + do j=12,M-11 + B(i,j) = A(i+11,j+11)+A(i+10,j+10)+A(i+9,j+9)+ + *A(i-11,j-11)+A(i-10,j-10)+A(i-9,j-9)+A(i+11,j-11)+ + *A(i-11,j+11) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + isum = C(i+11,j+11)+C(i+10,j+10)+C(i+9,j+9)+ + *C(i-11,j-11)+C(i-10,j-10)+C(i-9,j-9)+C(i+11,j-11)+ + *C(i-11,j+11) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh22.fdv new file mode 100644 index 0000000..1b573c1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh22.fdv @@ -0,0 +1,1221 @@ + program SH22 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH22========================' +C -------------------------------------------------- + call sh2201 +C -------------------------------------------------- + call sh2202 +C -------------------------------------------------- + call sh2203 +C ------------------------------------------------- + call sh2204 +C ------------------------------------------------- + call sh2205 +C ------------------------------------------------- + call sh2206 +C -------------------------------------------------- + call sh2207 +C -------------------------------------------------- + call sh2208 +C---------------------------------------------------- + call sh2209 +C ------------------------------------------------- + call sh2210 +C ------------------------------------------------- + call sh2211 +C ------------------------------------------------- + call sh2212 +C ------------------------------------------------- + call sh2213 +C -------------------------------------------------- + call sh2214 +C -------------------------------------------------- + call sh2215 +C ------------------------------------------------- + call sh2216 +C ------------------------------------------------- + call sh2217 +C ------------------------------------------------- + call sh2218 +C ------------------------------------------------- + call sh2219 +C ------------------------------------------------- + call sh2220 +C ------------------------------------------------- + +C ------------------------------------------------- + +C +C + print *,'=== END OF SH22 ========================= ' + end +C ---------------------------------------------SH2201 + subroutine SH2201 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + character*6 tname +!dvm$ distribute B(BLOCK,*) +!dvm$ align (I,J) with B(I,J) ::A + + + tname='SH2201' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j),shadow_renew(A(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i-1,j)+A(i,j-1)+ + *A(i-1,j-1)+ A(i+1,j+1)+A(i-1,j+1)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i-1,j)+C(i,j-1)+ + *C(i-1,j-1)+ C(i+1,j+1)+C(i-1,j+1)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH2202 + subroutine sh2202 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2202' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:1)(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH2203 + subroutine sh2203 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2203' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(1:0,0:1)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i-1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i-1,j)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH2204 + subroutine sh2204 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(1:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2204' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:1)(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH2205 + subroutine sh2205 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(0:1,1:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2205' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,1:0)(CORNER)) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i,j-1)+A(i+1,j)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1)+C(i+1,j)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C --------------------------------------------SH2206 + + subroutine sh2206 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(0:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2206' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:0)) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2207 + + subroutine sh2207 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(1:0,1:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2207' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:0,1:0)) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2208 + + subroutine sh2208 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2208' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j)+A(i,j+2)+A(i+2,j)+A(i+2,j+2)+ + * A(i-2,j+2)+A(i-2,j)+A(i,j-2)+A(i-2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j)+C(i,j+2)+C(i+2,j)+C(i+2,j+2)+ + *C(i-2,j+2)+C(i-2,j)+C(i,j-2)+C(i-2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH2209 + + subroutine sh2209 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2209' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:2,2:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i,j+2)+A(i,j-2)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i,j+2)+C(i,j-2)+A(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2210 + + subroutine sh2210 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2210' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(2:2,2:0)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-2,j-2)+ A(i-1,j-1)+A(i-2,j)+A(i+2,j)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-2,j-2)+C(i-1,j-1)+C(i-2,j)+C(i+2,j)+C(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2211 + + subroutine sh2211 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(2:2,0:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2211' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(2:2,0:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i-2,j+2)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i-2,j+2)+C(i+2,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2212 + + subroutine sh2212 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2212' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(1:0,0:1)(CORNER)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-1,j+1)+ A(i,j+1)+A(i-1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-1,j+1)+ C(i,j+1)+C(i-1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2213 + + subroutine sh2213 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(2:2,2:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2213' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:0)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2214 + + subroutine sh2214 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2214' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:0,0:2)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+2)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+2)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2215 + + subroutine sh2215 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(3:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2215' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i+1,j+1)+A(i+2,j+2)+A(i+3,j+3)+A(i-3,j-3)+ + * A(i-2,j-2)+A(i-1,j-1)+A(i-3,j+3)+A(i+3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i+1,j+1)+C(i+2,j+2)+C(i+3,j+3)+C(i-3,j-3)+ + * C(i-2,j-2)+C(i-1,j-1)+C(i-3,j+3)+C(i+3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH2216 + + subroutine sh2216 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(3:3,0:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2216' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:0,0:1)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2217 + + subroutine sh2217 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(0:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2217' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(0:1,0:0)) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2218 + + subroutine sh2218 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(3:3,3:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2218' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i+3,j)+A(i-3,j)+A(i-3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i+3,j)+C(i-3,j)+C(i-3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2219 + + subroutine sh2219 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(3:0,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2219' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(3:0,3:3)(CORNER)) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i,j+3)+A(i-3,j+3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i,j+3)+C(i-3,j+3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH2220 + + subroutine sh2220 + integer, parameter :: N = 480,M=480,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(11:11,11:11) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SH2220' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j),shadow_renew(A(CORNER)) + do i=12,N-11 + do j=12,M-11 + B(i,j) = A(i+11,j+11)+A(i+10,j+10)+A(i+9,j+9)+ + *A(i-11,j-11)+A(i-10,j-10)+A(i-9,j-9)+A(i+11,j-11)+ + *A(i-11,j+11) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + isum = C(i+11,j+11)+C(i+10,j+10)+C(i+9,j+9)+ + *C(i-11,j-11)+C(i-10,j-10)+C(i-9,j-9)+C(i+11,j-11)+ + *C(i-11,j+11) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh31.fdv new file mode 100644 index 0000000..b2eac6f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh31.fdv @@ -0,0 +1,691 @@ + program SH31 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH31========================' +C -------------------------------------------------- + call sh3101 +C -------------------------------------------------- + call sh3102 +C -------------------------------------------------- + call sh3103 +C ------------------------------------------------- + call sh3104 +C ------------------------------------------------- + call sh3105 +C ------------------------------------------------- + call sh3106 +C -------------------------------------------------- + call sh3107 +C -------------------------------------------------- + call sh3108 +C---------------------------------------------------- + call sh3109 +C---------------------------------------------------- + +C +C + print *,'=== END OF SH31 ========================= ' + end +C ---------------------------------------------SH3101 + subroutine SH3101 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3101' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),shadow_renew(A(CORNER)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+A(i-1,j,ii)+ + *A(i,j-1,ii)+ A(i,j,ii-1)+A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1)+ + *A(i-1,j+1,ii)+A(i+1,j-1,ii)+A(i-1,j+1,ii-1)+A(i-1,j+1,ii+1)+ + *A(i+1,j-1,ii-1)+A(i+1,j-1,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + isum = C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+C(i-1,j,ii)+ + *C(i,j-1,ii)+ C(i,j,ii-1)+C(i-1,j-1,ii-1)+C(i+1,j+1,ii+1)+ + *C(i-1,j+1,ii)+C(i+1,j-1,ii)+C(i-1,j+1,ii-1)+C(i-1,j+1,ii+1)+ + *C(i+1,j-1,ii-1)+C(i+1,j-1,ii+1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH3102 + subroutine SH3102 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3102' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(1:2,2:2,1:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i-1,j-2,ii+2)+A(i-1,j+2,ii-1)+A(i-1,j+2,ii+2)+ + *A(i+2,j+2,ii+2)+ A(i+2,j+2,ii-1)+A(i+2,j-2,ii+2)+A(i+2,j-2,ii-1)+ + *A(i-1,j-2,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i-1,j-2,ii+2)+C(i-1,j+2,ii-1)+C(i-1,j+2,ii+2)+ + *C(i+2,j+2,ii+2)+ C(i+2,j+2,ii-1)+C(i+2,j-2,ii+2)+C(i+2,j-2,ii-1)+ + *C(i-1,j-2,ii-1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH3103 + subroutine SH3103 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3103' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(0:2,2:2,0:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + *A(i+2,j-2,ii)+A(i,j+2,ii)+ A(i,j+2,ii+2)+A(i+2,j-2,ii+2)+ + * A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + *C(i+2,j-2,ii)+C(i,j+2,ii)+ C(i,j+2,ii+2)+C(i+2,j-2,ii+2)+ + *C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH3104 + subroutine SH3104 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3104' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(2:2,2:0,2:0)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j,ii)+A(i-2,j-2,ii-2)+ + *A(i+2,j-2,ii-2)+ A(i-2,j,ii-2)+A(i-2,j-2,ii)+ + *A(i-2,j,ii)+A(i+2,j-2,ii)+A(i+2,j,ii-2) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j,ii)+C(i-2,j-2,ii-2)+ + *C(i+2,j-2,ii-2)+ C(i-2,j,ii-2)+C(i-2,j-2,ii)+ + *C(i-2,j,ii)+C(i+2,j-2,ii)+C(i+2,j,ii-2) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH3105 + subroutine SH3105 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:2,2:2,0:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3105' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + * A(i+2,j-2,ii)+ A(i,j+2,ii)+A(i,j+2,ii+2)+ + * A(i+2,j-2,ii+2)+A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + * C(i+2,j-2,ii)+ C(i,j+2,ii)+C(i,j+2,ii+2)+ + * C(i+2,j-2,ii+2)+C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C --------------------------------------------SH3106 + subroutine SH3106 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3106' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i-3,j-3,ii+3)+A(i+3,j+3,ii-3)+ + * A(i+3,j-3,ii+3)+ A(i-3,j+3,ii+3)+A(i-3,j+3,ii-3)+ + * A(i+3,j-3,ii-3)+A(i+3,j+3,ii+3)+A(i-3,j-3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i-3,j-3,ii+3)+C(i+3,j+3,ii-3)+ + * C(i+3,j-3,ii+3)+ C(i-3,j+3,ii+3)+C(i-3,j+3,ii-3)+ + * C(i+3,j-3,ii-3)+ C(i+3,j+3,ii+3)+ C(i-3,j-3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH3107 + subroutine SH3107 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,0:3,3:0) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3107' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii)+A(i-3,j,ii-3)+ + * A(i+3,j,ii-3)+ A(i-3,j+3,ii-3)+ A(i-3,j,ii)+ + * A(i-3,j+3,ii)+ A(i+3,j,ii)+ A(i+3,j+3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii)+C(i-3,j,ii-3)+ + * C(i+3,j,ii-3)+ C(i-3,j+3,ii-3)+C(i-3,j,ii)+ + * C(i-3,j+3,ii)+ C(i+3,j,ii)+ C(i+3,j+3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C -------------------------------------------SH3108 + subroutine SH3108 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,0:3,0:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3108' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(0:3,0:3,0:3)(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii+3)+A(i+3,j,ii)+ + * A(i,j+3,ii)+ A(i,j,ii+3)+ A(i,j+3,ii+3)+ + * A(i+3,j,ii+3)+ A(i+3,j+3,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii+3)+C(i+3,j,ii)+ + * C(i,j+3,ii)+ C(i,j,ii+3)+ C(i,j+3,ii+3)+ + * C(i+3,j,ii+3)+ C(i+3,j+3,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH3109 + subroutine SH3109 + integer, parameter :: N = 120,M=120,K=120,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3109' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + B(i,j,ii) = A(i+11,j+11,ii+11)+A(i-11,j-11,ii-11)+ + * A(i+11,j-11,ii-11)+ A(i-11,j+11,ii-11)+ A(i-11,j-11,ii+11)+ + * A(i-11,j+11,ii+11)+ A(i+11,j-11,ii+11)+A(i+11,j+11,ii-11) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + isum = C(i+11,j+11,ii+11)+C(i-11,j-11,ii-11)+ + * C(i+11,j-11,ii-11)+ C(i-11,j+11,ii-11)+ C(i-11,j-11,ii+11)+ + * C(i-11,j+11,ii+11)+ C(i+11,j-11,ii+11)+C(i+11,j+11,ii-11) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh32.fdv new file mode 100644 index 0000000..c1c800c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh32.fdv @@ -0,0 +1,692 @@ + program SH32 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH32========================' +C -------------------------------------------------- + call sh3201 +C -------------------------------------------------- + call sh3202 +C -------------------------------------------------- + call sh3203 +C ------------------------------------------------- + call sh3204 +C ------------------------------------------------- + call sh3205 +C ------------------------------------------------- + call sh3206 +C -------------------------------------------------- + call sh3207 +C -------------------------------------------------- + call sh3208 +C---------------------------------------------------- + call sh3209 +C---------------------------------------------------- + +C +C + print *,'=== END OF SH32 ========================= ' + end +C ---------------------------------------------SH3201 + subroutine SH3201 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3201' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii),shadow_renew(A(CORNER)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+A(i-1,j,ii)+ + *A(i,j-1,ii)+ A(i,j,ii-1)+A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1)+ + *A(i-1,j+1,ii)+A(i+1,j-1,ii)+A(i-1,j+1,ii-1)+A(i-1,j+1,ii+1)+ + *A(i+1,j-1,ii-1)+A(i+1,j-1,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + isum = C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+C(i-1,j,ii)+ + *C(i,j-1,ii)+ C(i,j,ii-1)+C(i-1,j-1,ii-1)+C(i+1,j+1,ii+1)+ + *C(i-1,j+1,ii)+C(i+1,j-1,ii)+C(i-1,j+1,ii-1)+C(i-1,j+1,ii+1)+ + *C(i+1,j-1,ii-1)+C(i+1,j-1,ii+1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH3202 + subroutine SH3202 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3202' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(1:2,2:2,1:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i-1,j-2,ii+2)+A(i-1,j+2,ii-1)+A(i-1,j+2,ii+2)+ + *A(i+2,j+2,ii+2)+ A(i+2,j+2,ii-1)+A(i+2,j-2,ii+2)+A(i+2,j-2,ii-1)+ + *A(i-1,j-2,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i-1,j-2,ii+2)+C(i-1,j+2,ii-1)+C(i-1,j+2,ii+2)+ + *C(i+2,j+2,ii+2)+ C(i+2,j+2,ii-1)+C(i+2,j-2,ii+2)+C(i+2,j-2,ii-1)+ + *C(i-1,j-2,ii-1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH3203 + subroutine SH3203 + integer, parameter :: N = 16,M=116,K=116,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3203' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(0:2,2:2,0:2)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + *A(i+2,j-2,ii)+A(i,j+2,ii)+ A(i,j+2,ii+2)+A(i+2,j-2,ii+2)+ + * A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + *C(i+2,j-2,ii)+C(i,j+2,ii)+ C(i,j+2,ii+2)+C(i+2,j-2,ii+2)+ + *C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH3204 + subroutine SH3204 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3204' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(2:2,2:0,2:0)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j,ii)+A(i-2,j-2,ii-2)+ + *A(i+2,j-2,ii-2)+ A(i-2,j,ii-2)+A(i-2,j-2,ii)+ + *A(i-2,j,ii)+A(i+2,j-2,ii)+A(i+2,j,ii-2) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j,ii)+C(i-2,j-2,ii-2)+ + *C(i+2,j-2,ii-2)+ C(i-2,j,ii-2)+C(i-2,j-2,ii)+ + *C(i-2,j,ii)+C(i+2,j-2,ii)+C(i+2,j,ii-2) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SH3205 + subroutine SH3205 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ shadow(0:2,2:2,0:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3205' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + * A(i+2,j-2,ii)+ A(i,j+2,ii)+A(i,j+2,ii+2)+ + * A(i+2,j-2,ii+2)+A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + * C(i+2,j-2,ii)+ C(i,j+2,ii)+C(i,j+2,ii+2)+ + * C(i+2,j-2,ii+2)+C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C --------------------------------------------SH3206 + subroutine SH3206 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3206' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i-3,j-3,ii+3)+A(i+3,j+3,ii-3)+ + * A(i+3,j-3,ii+3)+ A(i-3,j+3,ii+3)+A(i-3,j+3,ii-3)+ + * A(i+3,j-3,ii-3)+A(i+3,j+3,ii+3)+A(i-3,j-3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i-3,j-3,ii+3)+C(i+3,j+3,ii-3)+ + * C(i+3,j-3,ii+3)+ C(i-3,j+3,ii+3)+C(i-3,j+3,ii-3)+ + * C(i+3,j-3,ii-3)+ C(i+3,j+3,ii+3)+ C(i-3,j-3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH3207 + subroutine SH3207 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ shadow(3:3,0:3,3:0) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3207' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii)+A(i-3,j,ii-3)+ + * A(i+3,j,ii-3)+ A(i-3,j+3,ii-3)+ A(i-3,j,ii)+ + * A(i-3,j+3,ii)+ A(i+3,j,ii)+ A(i+3,j+3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii)+C(i-3,j,ii-3)+ + * C(i+3,j,ii-3)+ C(i-3,j+3,ii-3)+C(i-3,j,ii)+ + * C(i-3,j+3,ii)+ C(i+3,j,ii)+ C(i+3,j+3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C -------------------------------------------SH3208 + subroutine SH3208 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ shadow(0:3,0:3,0:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3208' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(0:3,0:3,0:3)(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii+3)+A(i+3,j,ii)+ + * A(i,j+3,ii)+ A(i,j,ii+3)+ A(i,j+3,ii+3)+ + * A(i+3,j,ii+3)+ A(i+3,j+3,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii+3)+C(i+3,j,ii)+ + * C(i,j+3,ii)+ C(i,j,ii+3)+ C(i,j+3,ii+3)+ + * C(i+3,j,ii+3)+ C(i+3,j+3,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SH3209 + subroutine SH3209 + integer, parameter :: N = 120,M=120,K=120,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SH3209' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*shadow_renew(A(CORNER)) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + B(i,j,ii) = A(i+11,j+11,ii+11)+A(i-11,j-11,ii-11)+ + * A(i+11,j-11,ii-11)+ A(i-11,j+11,ii-11)+ A(i-11,j-11,ii+11)+ + * A(i-11,j+11,ii+11)+ A(i+11,j-11,ii+11)+A(i+11,j+11,ii-11) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + isum = C(i+11,j+11,ii+11)+C(i-11,j-11,ii-11)+ + * C(i+11,j-11,ii-11)+ C(i-11,j+11,ii-11)+ C(i-11,j-11,ii+11)+ + * C(i-11,j+11,ii+11)+ C(i+11,j-11,ii+11)+C(i+11,j+11,ii-11) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh41.fdv new file mode 100644 index 0000000..2b81283 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh41.fdv @@ -0,0 +1,803 @@ + program SH41 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH41========================' +C -------------------------------------------------- + call sh4101 +C -------------------------------------------------- + call sh4102 +C -------------------------------------------------- + call sh4103 +C ------------------------------------------------- + call sh4104 +C ------------------------------------------------- + call sh4105 +C ------------------------------------------------- + call sh4106 +C -------------------------------------------------- + call sh4107 +C -------------------------------------------------- + call sh4108 +C---------------------------------------------------- + call sh4109 +C---------------------------------------------------- + +C +C + print *,'=== END OF SH41 ========================= ' + end +C ---------------------------------------------SH4101 + subroutine SH4101 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4101' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + B(i,j,ii,jj) = A(i+1,j+1,ii+1,jj+1)+A(i-1,j-1,ii-1,jj-1)+ + * A(i+1,j-1,ii-1,jj-1)+A(i-1,j+1,ii-1,jj-1)+ + * A(i-1,j-1,ii+1,jj-1)+ A(i-1,j-1,ii-1,jj+1)+ + * A(i+1,j+1,ii-1,jj-1)+A(i-1,j+1,ii+1,jj-1)+ + * A(i-1,j-1,ii+1,jj+1)+A(i+1,j-1,ii-1,jj+1)+ + * A(i+1,j-1,ii+1,jj-1)+A(i-1,j+1,ii-1,jj+1)+ + * A(i+1,j+1,ii+1,jj-1)+A(i-1,j+1,ii+1,jj+1)+ + * A(i+1,j-1,ii+1,jj+1)+A(i+1,j+1,ii-1,jj+1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + isum = C(i+1,j+1,ii+1,jj+1)+C(i-1,j-1,ii-1,jj-1)+ + * C(i+1,j-1,ii-1,jj-1)+ C(i-1,j+1,ii-1,jj-1)+ + * C(i-1,j-1,ii+1,jj-1)+ C(i-1,j-1,ii-1,jj+1)+ + * C(i+1,j+1,ii-1,jj-1)+ C(i-1,j+1,ii+1,jj-1)+ + * C(i-1,j-1,ii+1,jj+1)+ C(i+1,j-1,ii-1,jj+1)+ + * C(i+1,j-1,ii+1,jj-1)+ C(i-1,j+1,ii-1,jj+1)+ + * C(i+1,j+1,ii+1,jj-1)+ C(i-1,j+1,ii+1,jj+1)+ + * C(i+1,j-1,ii+1,jj+1)+ C(i+1,j+1,ii-1,jj+1) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH4102 + + subroutine SH4102 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4102' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj+2)+A(i-2,j-2,ii-2,jj-2)+ + * A(i+2,j-2,ii-2,jj-2)+ A(i-2,j+2,ii-2,jj-2)+ + * A(i-2,j-2,ii+2,jj-2)+ A(i-2,j-2,ii-2,jj+2)+ + * A(i+2,j+2,ii-2,jj-2)+ A(i-2,j+2,ii+2,jj-2)+ + * A(i-2,j-2,ii+2,jj+2)+ A(i+2,j-2,ii-2,jj+2)+ + * A(i+2,j-2,ii+2,jj-2)+ A(i-2,j+2,ii-2,jj+2)+ + * A(i+2,j+2,ii+2,jj-2)+ A(i-2,j+2,ii+2,jj+2)+ + * A(i+2,j-2,ii+2,jj+2)+ A(i+2,j+2,ii-2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj+2)+C(i-2,j-2,ii-2,jj-2)+ + * C(i+2,j-2,ii-2,jj-2)+ C(i-2,j+2,ii-2,jj-2)+ + * C(i-2,j-2,ii+2,jj-2)+ C(i-2,j-2,ii-2,jj+2)+ + * C(i+2,j+2,ii-2,jj-2)+ C(i-2,j+2,ii+2,jj-2)+ + * C(i-2,j-2,ii+2,jj+2)+ C(i+2,j-2,ii-2,jj+2)+ + * C(i+2,j-2,ii+2,jj-2)+ C(i-2,j+2,ii-2,jj+2)+ + * C(i+2,j+2,ii+2,jj-2)+ C(i-2,j+2,ii+2,jj+2)+ + * C(i+2,j-2,ii+2,jj+2)+ C(i+2,j+2,ii-2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH4103 + subroutine SH4103 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4103' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(2:0,2:2,2:0,2:0)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i-2,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj)+ A(i-2,j-2,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j-2,ii-2,jj)+ + * A(i-2,j-2,ii,jj)+ A(i,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj-2)+ A(i-2,j-2,ii-2,jj)+ + * A(i,j-2,ii-2,jj-2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i-2,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj)+ C(i-2,j-2,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j-2,ii-2,jj)+ + * C(i-2,j-2,ii,jj)+ C(i,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj-2)+ C(i-2,j-2,ii-2,jj)+ + * C(i,j-2,ii-2,jj-2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SH4104 + subroutine SH4104 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:2,2:2,0:2,0:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4104' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj)+ + * A(i,j-2,ii,jj)+ A(i+2,j-2,ii,jj)+ + * A(i,j+2,ii,jj)+ A(i,j-2,ii+2,jj)+ + * A(i+2,j+2,ii,jj)+ A(i,j-2,ii+2,jj+2)+ + * A(i,j+2,ii,jj+2)+ A(i+2,j+2,ii+2,jj)+ + * A(i,j+2,ii+2,jj+2)+A(i+2,j-2,ii+2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj)+ + * C(i,j-2,ii,jj)+ C(i+2,j-2,ii,jj)+ + * C(i,j+2,ii,jj)+ C(i,j-2,ii+2,jj)+ + * C(i+2,j+2,ii,jj)+ C(i,j-2,ii+2,jj+2)+ + * C(i,j+2,ii,jj+2)+ C(i+2,j+2,ii+2,jj)+ + * C(i,j+2,ii+2,jj+2)+C(i+2,j-2,ii+2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SH4105 + subroutine SH4105 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:0,0:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4105' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(0:0,0:0,0:0,0:2)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i,j,ii,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i,j,ii,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH4106 + subroutine SH4106 + integer, parameter :: N = 32,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3,3:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4106' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i-3,j-3,ii-3,jj-3)+ + * A(i+3,j-3,ii-3,jj-3)+ A(i-3,j+3,ii-3,jj-3)+ + * A(i-3,j-3,ii+3,jj-3)+ A(i-3,j-3,ii-3,jj+3)+ + * A(i+3,j+3,ii-3,jj-3)+ A(i-3,j+3,ii+3,jj-3)+ + * A(i-3,j-3,ii+3,jj+3)+ A(i+3,j-3,ii-3,jj+3)+ + * A(i+3,j-3,ii+3,jj-3)+ A(i-3,j+3,ii-3,jj+3)+ + * A(i+3,j+3,ii+3,jj-3)+ A(i-3,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3)+ A(i+3,j+3,ii-3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i-3,j-3,ii-3,jj-3)+ + * C(i+3,j-3,ii-3,jj-3)+ C(i-3,j+3,ii-3,jj-3)+ + * C(i-3,j-3,ii+3,jj-3)+ C(i-3,j-3,ii-3,jj+3)+ + * C(i+3,j+3,ii-3,jj-3)+ C(i-3,j+3,ii+3,jj-3)+ + * C(i-3,j-3,ii+3,jj+3)+ C(i+3,j-3,ii-3,jj+3)+ + * C(i+3,j-3,ii+3,jj-3)+ C(i-3,j+3,ii-3,jj+3)+ + * C(i+3,j+3,ii+3,jj-3)+ C(i-3,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3)+ C(i+3,j+3,ii-3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH4107 + subroutine SH4107 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,0:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4107' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i,j-3,ii,jj)+ + * A(i+3,j-3,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj)+ A(i+3,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj+3)+ A(i,j+3,ii,jj+3)+ + * A(i+3,j+3,ii+3,jj)+ A(i,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i,j-3,ii,jj)+ + * C(i+3,j-3,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj)+ C(i+3,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj+3)+ C(i,j+3,ii,jj+3)+ + * C(i+3,j+3,ii+3,jj)+ C(i,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH4108 + subroutine SH4108 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,3:0) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4108' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(0:0,0:0,0:0,3:0)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i,j,ii,jj-3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum =C(i,j,ii,jj-3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH4109 + subroutine SH4109 + integer, parameter :: N = 60,M=60,K=60,L=60,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11,11:11) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4109' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + B(i,j,ii,jj) = A(i+11,j+11,ii+11,jj+11)+ + * A(i-11,j-11,ii-11,jj-11)+ + * A(i+11,j-11,ii-11,jj-11)+ A(i-11,j+11,ii-11,jj-11)+ + * A(i-11,j-11,ii+11,jj-11)+ A(i-11,j-11,ii-11,jj+11)+ + * A(i+11,j+11,ii-11,jj-11)+ A(i-11,j+11,ii+11,jj-11)+ + * A(i-11,j-11,ii+11,jj+11)+ A(i+11,j-11,ii-11,jj+11)+ + * A(i+11,j-11,ii+11,jj-11)+ A(i-11,j+11,ii-11,jj+11)+ + * A(i+11,j+11,ii+11,jj-11)+ A(i-11,j+11,ii+11,jj+11)+ + * A(i+11,j-11,ii+11,jj+11)+ A(i+11,j+11,ii-11,jj+11) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + isum = C(i+11,j+11,ii+11,jj+11)+ + * C(i-11,j-11,ii-11,jj-11)+ + * C(i+11,j-11,ii-11,jj-11)+ C(i-11,j+11,ii-11,jj-11)+ + * C(i-11,j-11,ii+11,jj-11)+ C(i-11,j-11,ii-11,jj+11)+ + * C(i+11,j+11,ii-11,jj-11)+ C(i-11,j+11,ii+11,jj-11)+ + * C(i-11,j-11,ii+11,jj+11)+ C(i+11,j-11,ii-11,jj+11)+ + * C(i+11,j-11,ii+11,jj-11)+ C(i-11,j+11,ii-11,jj+11)+ + * C(i+11,j+11,ii+11,jj-11)+ C(i-11,j+11,ii+11,jj+11)+ + * C(i+11,j-11,ii+11,jj+11)+ C(i+11,j+11,ii-11,jj+11) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh42.fdv new file mode 100644 index 0000000..17ae5de --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW/sh42.fdv @@ -0,0 +1,803 @@ + program SH42 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_RENEW CLAUSE'. +c DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SH42========================' +C -------------------------------------------------- + call sh4201 +C -------------------------------------------------- + call sh4202 +C -------------------------------------------------- + call sh4203 +C ------------------------------------------------- + call sh4204 +C ------------------------------------------------- + call sh4205 +C ------------------------------------------------- + call sh4206 +C -------------------------------------------------- + call sh4207 +C -------------------------------------------------- + call sh4208 +C---------------------------------------------------- + call sh4209 +C---------------------------------------------------- + +C +C + print *,'=== END OF SH42 ========================= ' + end +C ---------------------------------------------SH4201 + subroutine SH4201 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4201' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + B(i,j,ii,jj) = A(i+1,j+1,ii+1,jj+1)+A(i-1,j-1,ii-1,jj-1)+ + * A(i+1,j-1,ii-1,jj-1)+A(i-1,j+1,ii-1,jj-1)+ + * A(i-1,j-1,ii+1,jj-1)+ A(i-1,j-1,ii-1,jj+1)+ + * A(i+1,j+1,ii-1,jj-1)+A(i-1,j+1,ii+1,jj-1)+ + * A(i-1,j-1,ii+1,jj+1)+A(i+1,j-1,ii-1,jj+1)+ + * A(i+1,j-1,ii+1,jj-1)+A(i-1,j+1,ii-1,jj+1)+ + * A(i+1,j+1,ii+1,jj-1)+A(i-1,j+1,ii+1,jj+1)+ + * A(i+1,j-1,ii+1,jj+1)+A(i+1,j+1,ii-1,jj+1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + isum = C(i+1,j+1,ii+1,jj+1)+C(i-1,j-1,ii-1,jj-1)+ + * C(i+1,j-1,ii-1,jj-1)+ C(i-1,j+1,ii-1,jj-1)+ + * C(i-1,j-1,ii+1,jj-1)+ C(i-1,j-1,ii-1,jj+1)+ + * C(i+1,j+1,ii-1,jj-1)+ C(i-1,j+1,ii+1,jj-1)+ + * C(i-1,j-1,ii+1,jj+1)+ C(i+1,j-1,ii-1,jj+1)+ + * C(i+1,j-1,ii+1,jj-1)+ C(i-1,j+1,ii-1,jj+1)+ + * C(i+1,j+1,ii+1,jj-1)+ C(i-1,j+1,ii+1,jj+1)+ + * C(i+1,j-1,ii+1,jj+1)+ C(i+1,j+1,ii-1,jj+1) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SH4202 + + subroutine SH4202 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4202' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj+2)+A(i-2,j-2,ii-2,jj-2)+ + * A(i+2,j-2,ii-2,jj-2)+ A(i-2,j+2,ii-2,jj-2)+ + * A(i-2,j-2,ii+2,jj-2)+ A(i-2,j-2,ii-2,jj+2)+ + * A(i+2,j+2,ii-2,jj-2)+ A(i-2,j+2,ii+2,jj-2)+ + * A(i-2,j-2,ii+2,jj+2)+ A(i+2,j-2,ii-2,jj+2)+ + * A(i+2,j-2,ii+2,jj-2)+ A(i-2,j+2,ii-2,jj+2)+ + * A(i+2,j+2,ii+2,jj-2)+ A(i-2,j+2,ii+2,jj+2)+ + * A(i+2,j-2,ii+2,jj+2)+ A(i+2,j+2,ii-2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj+2)+C(i-2,j-2,ii-2,jj-2)+ + * C(i+2,j-2,ii-2,jj-2)+ C(i-2,j+2,ii-2,jj-2)+ + * C(i-2,j-2,ii+2,jj-2)+ C(i-2,j-2,ii-2,jj+2)+ + * C(i+2,j+2,ii-2,jj-2)+ C(i-2,j+2,ii+2,jj-2)+ + * C(i-2,j-2,ii+2,jj+2)+ C(i+2,j-2,ii-2,jj+2)+ + * C(i+2,j-2,ii+2,jj-2)+ C(i-2,j+2,ii-2,jj+2)+ + * C(i+2,j+2,ii+2,jj-2)+ C(i-2,j+2,ii+2,jj+2)+ + * C(i+2,j-2,ii+2,jj+2)+ C(i+2,j+2,ii-2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SH4203 + subroutine SH4203 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4203' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(2:0,2:2,2:0,2:0)(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i-2,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj)+ A(i-2,j-2,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j-2,ii-2,jj)+ + * A(i-2,j-2,ii,jj)+ A(i,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj-2)+ A(i-2,j-2,ii-2,jj)+ + * A(i,j-2,ii-2,jj-2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i-2,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj)+ C(i-2,j-2,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j-2,ii-2,jj)+ + * C(i-2,j-2,ii,jj)+ C(i,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj-2)+ C(i-2,j-2,ii-2,jj)+ + * C(i,j-2,ii-2,jj-2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SH4204 + subroutine SH4204 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(0:2,2:2,0:2,0:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4204' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(CORNER)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj)+ + * A(i,j-2,ii,jj)+ A(i+2,j-2,ii,jj)+ + * A(i,j+2,ii,jj)+ A(i,j-2,ii+2,jj)+ + * A(i+2,j+2,ii,jj)+ A(i,j-2,ii+2,jj+2)+ + * A(i,j+2,ii,jj+2)+ A(i+2,j+2,ii+2,jj)+ + * A(i,j+2,ii+2,jj+2)+A(i+2,j-2,ii+2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj)+ + * C(i,j-2,ii,jj)+ C(i+2,j-2,ii,jj)+ + * C(i,j+2,ii,jj)+ C(i,j-2,ii+2,jj)+ + * C(i+2,j+2,ii,jj)+ C(i,j-2,ii+2,jj+2)+ + * C(i,j+2,ii,jj+2)+ C(i+2,j+2,ii+2,jj)+ + * C(i,j+2,ii+2,jj+2)+C(i+2,j-2,ii+2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SH4205 + subroutine SH4205 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(2:2,2:0,0:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4205' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(0:0,0:0,0:0,0:2)) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i,j,ii,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i,j,ii,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SH4206 + subroutine SH4206 + integer, parameter :: N = 32,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(3:3,3:3,3:3,3:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4206' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i-3,j-3,ii-3,jj-3)+ + * A(i+3,j-3,ii-3,jj-3)+ A(i-3,j+3,ii-3,jj-3)+ + * A(i-3,j-3,ii+3,jj-3)+ A(i-3,j-3,ii-3,jj+3)+ + * A(i+3,j+3,ii-3,jj-3)+ A(i-3,j+3,ii+3,jj-3)+ + * A(i-3,j-3,ii+3,jj+3)+ A(i+3,j-3,ii-3,jj+3)+ + * A(i+3,j-3,ii+3,jj-3)+ A(i-3,j+3,ii-3,jj+3)+ + * A(i+3,j+3,ii+3,jj-3)+ A(i-3,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3)+ A(i+3,j+3,ii-3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i-3,j-3,ii-3,jj-3)+ + * C(i+3,j-3,ii-3,jj-3)+ C(i-3,j+3,ii-3,jj-3)+ + * C(i-3,j-3,ii+3,jj-3)+ C(i-3,j-3,ii-3,jj+3)+ + * C(i+3,j+3,ii-3,jj-3)+ C(i-3,j+3,ii+3,jj-3)+ + * C(i-3,j-3,ii+3,jj+3)+ C(i+3,j-3,ii-3,jj+3)+ + * C(i+3,j-3,ii+3,jj-3)+ C(i-3,j+3,ii-3,jj+3)+ + * C(i+3,j+3,ii+3,jj-3)+ C(i-3,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3)+ C(i+3,j+3,ii-3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH4207 + subroutine SH4207 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(0:3,3:3,0:3,0:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4207' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i,j-3,ii,jj)+ + * A(i+3,j-3,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj)+ A(i+3,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj+3)+ A(i,j+3,ii,jj+3)+ + * A(i+3,j+3,ii+3,jj)+ A(i,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i,j-3,ii,jj)+ + * C(i+3,j-3,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj)+ C(i+3,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj+3)+ C(i,j+3,ii,jj+3)+ + * C(i+3,j+3,ii+3,jj)+ C(i,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH4208 + subroutine SH4208 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(0:3,3:3,0:3,3:0) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4208' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*shadow_renew(A(0:0,0:0,0:0,3:0)) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i,j,ii,jj-3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum =C(i,j,ii,jj-3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SH4209 + subroutine SH4209 + integer, parameter :: N = 32,M=32,K=32,L=32,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,*,*,*) +!dvm$ shadow(11:11,11:11,11:11,11:11) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SH4209' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj),shadow_renew(A(CORNER)) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + B(i,j,ii,jj) = A(i+11,j+11,ii+11,jj+11)+ + * A(i-11,j-11,ii-11,jj-11)+ + * A(i+11,j-11,ii-11,jj-11)+ A(i-11,j+11,ii-11,jj-11)+ + * A(i-11,j-11,ii+11,jj-11)+ A(i-11,j-11,ii-11,jj+11)+ + * A(i+11,j+11,ii-11,jj-11)+ A(i-11,j+11,ii+11,jj-11)+ + * A(i-11,j-11,ii+11,jj+11)+ A(i+11,j-11,ii-11,jj+11)+ + * A(i+11,j-11,ii+11,jj-11)+ A(i-11,j+11,ii-11,jj+11)+ + * A(i+11,j+11,ii+11,jj-11)+ A(i-11,j+11,ii+11,jj+11)+ + * A(i+11,j-11,ii+11,jj+11)+ A(i+11,j+11,ii-11,jj+11) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + isum = C(i+11,j+11,ii+11,jj+11)+ + * C(i-11,j-11,ii-11,jj-11)+ + * C(i+11,j-11,ii-11,jj-11)+ C(i-11,j+11,ii-11,jj-11)+ + * C(i-11,j-11,ii+11,jj-11)+ C(i-11,j-11,ii-11,jj+11)+ + * C(i+11,j+11,ii-11,jj-11)+ C(i-11,j+11,ii+11,jj-11)+ + * C(i-11,j-11,ii+11,jj+11)+ C(i+11,j-11,ii-11,jj+11)+ + * C(i+11,j-11,ii+11,jj-11)+ C(i-11,j+11,ii-11,jj+11)+ + * C(i+11,j+11,ii+11,jj-11)+ C(i-11,j+11,ii+11,jj+11)+ + * C(i+11,j-11,ii+11,jj+11)+ C(i+11,j+11,ii-11,jj+11) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/settings b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/settings new file mode 100644 index 0000000..3ef2d72 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/settings @@ -0,0 +1 @@ +DVM_ONLY=1 diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha11.fdv new file mode 100644 index 0000000..bc624eb --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha11.fdv @@ -0,0 +1,260 @@ + program SHA11 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N),D(N),F(N) IS TO HAVE DIFFERENT +c SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA11========================' +C -------------------------------------------------- + call sha1101 +C -------------------------------------------------- + call sha1102 +C -------------------------------------------------- + call sha1103 +C ------------------------------------------------- + call sha1104 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA11 ========================= ' + end +C ---------------------------------------------SHA1101 + subroutine SHA1101 + + integer, parameter :: N = 32,NL=1000 + + + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(BLOCK) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1101' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF + +*dvm$ parallel (i) on BA(i) + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA1102 + subroutine SHA1102 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(BLOCK) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1102' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +cdvm$ shadow_start ADF + +*dvm$ parallel (i) on BA(i),shadow_wait ADF + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA1103 + + + subroutine SHA1103 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(BLOCK) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1103' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i) on A(i),shadow_start ADF + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +cdvm$ shadow_wait ADF +*dvm$ parallel (i) on BA(i) + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ---------------------------------------------SHA1104 + subroutine SHA1104 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(BLOCK) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1104' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i) on A(i),shadow_start ADF + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +*dvm$ parallel (i) on BA(i),shadow_wait ADF + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha12.fdv new file mode 100644 index 0000000..a631e8d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha12.fdv @@ -0,0 +1,260 @@ + program SHA12 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N),D(N),F(N) IS TO HAVE DIFFERENT +c SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA12========================' +C -------------------------------------------------- + call sha1201 +C -------------------------------------------------- + call sha1202 +C -------------------------------------------------- + call sha1203 +C ------------------------------------------------- + call sha1204 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA12 ========================= ' + end +C ---------------------------------------------SHA1201 + subroutine SHA1201 + + integer, parameter :: N = 32,NL=1000 + + + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(*) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1201' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF + +*dvm$ parallel (i) on BA(i) + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA1202 + subroutine SHA1202 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(*) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1202' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i) on A(i) + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +cdvm$ shadow_start ADF + +*dvm$ parallel (i) on BA(i),shadow_wait ADF + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA1203 + + + subroutine SHA1203 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(*) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1203' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i) on A(i),shadow_start ADF + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +cdvm$ shadow_wait ADF +*dvm$ parallel (i) on BA(i) + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ---------------------------------------------SHA1204 + subroutine SHA1204 + integer, parameter :: N = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:),BA(:),BD(:),BF(:),C(:),D(:),F(:) + integer nloop + +cdvm$ distribute BA(*) +cdvm$ shadow D(2:2) +cdvm$ shadow F(3:3) +cdvm$ align (I) with BA(I) ::A,D,F,BD,BF + + tname='SHA1204' + allocate (BA(N),A(N),BD(N),BF(N),C(N),D(N),F(N)) +cdvm$ shadow_group ADF(A(1:1),D(2:2),F(3:3)) + + NNL=NL + call serial1(C,N,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i) on A(i),shadow_start ADF + do i=1,N + A(i) = NL+i + D(i) =NL+i + F(i) =NL+i + enddo + +*dvm$ parallel (i) on BA(i),shadow_wait ADF + do i=4,N-3 + BA(i) = A(i-1)+A(i+1) + BD(i)= D(i-2)+D(i+2) + BF(i)= F(i-3)+F(i+3) + enddo + +*dvm$ parallel (i) on BA(i), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + if (BA(i).ne.(C(i-1)+c(i+1))) nloopa=min(nloopa,i) + if (BD(i).ne.(C(i-2)+c(i+2))) nloopd=min(nloopd,i) + if (BF(i).ne.(C(i-3)+c(i+3))) nloopf=min(nloopf,i) + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha21.fdv new file mode 100644 index 0000000..ffcefe5 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha21.fdv @@ -0,0 +1,297 @@ + program SHA21 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N,M),D(N,M),F(N,M) IS TO HAVE DIFFERENT +c SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA21========================' +C -------------------------------------------------- + call sha2101 +C -------------------------------------------------- + call sha2102 +C -------------------------------------------------- + call sha2103 +C ------------------------------------------------- + call sha2104 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA21 ========================= ' + end +C ---------------------------------------------SHA2101 + subroutine SHA2101 + integer,parameter :: N = 16,M=16, PN = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2101' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF + +c print *,'C' +c print *,C +c print *,'A' +c print *,A +*dvm$ parallel (i,j) on BA(i,j),NEW(K) + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +c print *,'BA' +c print *,BA +*dvm$ parallel (i,j) on BA(i,j),NEW(K),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA2102 + subroutine SHA2102 + integer,parameter :: N = 32,M=32,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2102' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +cdvm$ shadow_start ADF + +*dvm$ parallel (i,j) on BA(i,j),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA2103 + + + subroutine SHA2103 + integer,parameter :: N = 32,M=32,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2103' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j) on A(i,j),shadow_start ADF + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +cdvm$ shadow_wait ADF + +*dvm$ parallel (i,j) on BA(i,j) + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ---------------------------------------------SHA2104 + subroutine SHA2104 + integer,parameter :: N = 32,M=32,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2104' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j) on A(i,j),shadow_start ADF + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha22.fdv new file mode 100644 index 0000000..48ef178 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha22.fdv @@ -0,0 +1,297 @@ + program SHA22 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N,M),D(N,M),F(N,M) IS TO HAVE DIFFERENT +c SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA22========================' +C -------------------------------------------------- + call sha2201 +C -------------------------------------------------- + call sha2202 +C -------------------------------------------------- + call sha2203 +C ------------------------------------------------- + call sha2204 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA22 ========================= ' + end +C ---------------------------------------------SHA2201 + subroutine SHA2201 + integer,parameter :: N = 16,M=16, PN = 16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,*) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2201' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF + +c print *,'C' +c print *,C +c print *,'A' +c print *,A +*dvm$ parallel (i,j) on BA(i,j),NEW(K) + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +c print *,'BA' +c print *,BA +*dvm$ parallel (i,j) on BA(i,j),NEW(K),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA2202 + subroutine SHA2202 + integer,parameter :: N = 32,M=32,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(*,BLOCK) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2202' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j) on A(i,j) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +cdvm$ shadow_start ADF + +*dvm$ parallel (i,j) on BA(i,j),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA2203 + + + subroutine SHA2203 + integer,parameter :: N = 32,M=32,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(*,BLOCK) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2203' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j) on A(i,j),shadow_start ADF + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +cdvm$ shadow_wait ADF + +*dvm$ parallel (i,j) on BA(i,j) + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ---------------------------------------------SHA2204 + subroutine SHA2204 + integer,parameter :: N = 32,M=32,NL=1000 + character*7 tname + integer, allocatable :: A(:,:),BA(:,:),BD(:,:) + integer, allocatable :: BF(:,:),C(:,:),D(:,:),F(:,:) + integer nloop + +cdvm$ distribute BA(*,BLOCK) +cdvm$ shadow D(2:2,2:2) +cdvm$ shadow F(3:3,3:3) +cdvm$ align (I,J) with BA(I,J) ::A,D,F,BD,BF + + tname='SHA2204' + allocate (BA(N,M),A(N,M),BD(N,M)) + allocate (BF(N,M),C(N,M),D(N,M),F(N,M)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial2(C,N,M,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j) on A(i,j),shadow_start ADF + do i=1,N + do j=1,M + A(i,j) = NL+i+j + D(i,j) =NL+i+j + F(i,j) =NL+i+j + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + BA(i,j) = A(i-1,j-1)+A(i+1,j+1) + BD(i,j)= D(i-2,j-2)+D(i+2,j+2) + BF(i,j)= F(i-3,j-3)+F(i+3,j+3) + enddo + enddo + +*dvm$ parallel (i,j) on BA(i,j), reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + if (BA(i,j).ne.(C(i-1,j-1)+c(i+1,j+1))) nloopa=min(nloopa,i) + if (BD(i,j).ne.(C(i-2,j-2)+c(i+2,j+2))) nloopd=min(nloopd,i) + if (BF(i,j).ne.(C(i-3,j-3)+c(i+3,j+3))) nloopf=min(nloopf,i) + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha31.fdv new file mode 100644 index 0000000..c694075 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha31.fdv @@ -0,0 +1,335 @@ + program SHA31 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N,M,K),D(N,M,K),F(N,M,K) IS TO HAVE DIFFERENT +c SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA31========================' +C -------------------------------------------------- + call sha3101 +C -------------------------------------------------- + call sha3102 +C -------------------------------------------------- + call sha3103 +C ------------------------------------------------- + call sha3104 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA31 ========================= ' + end +C ---------------------------------------------SHA3101 + subroutine SHA3101 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3101' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF + +c print *,'C' +c print *,C +c print *,'A' +c print *,A + +*dvm$ parallel (i,j,ii) on BA(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo +c print *,'BA' +c print *,BA +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA3102 + subroutine SHA3102 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3102' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +cdvm$ shadow_start ADF + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA3103 + subroutine SHA3103 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3103' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +cdvm$ shadow_wait ADF + +*dvm$ parallel (i,j,ii) on BA(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA3104 + subroutine SHA3104 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3104' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha32.fdv new file mode 100644 index 0000000..e8b6ada --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha32.fdv @@ -0,0 +1,335 @@ + program SHA32 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N,M,K),D(N,M,K),F(N,M,K) IS TO HAVE DIFFERENT +c SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA32========================' +C -------------------------------------------------- + call sha3201 +C -------------------------------------------------- + call sha3202 +C -------------------------------------------------- + call sha3203 +C ------------------------------------------------- + call sha3204 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA32 ========================= ' + end +C ---------------------------------------------SHA3201 + subroutine SHA3201 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,*) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3201' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF + +c print *,'C' +c print *,C +c print *,'A' +c print *,A + +*dvm$ parallel (i,j,ii) on BA(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo +c print *,'BA' +c print *,BA +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA3202 + subroutine SHA3202 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,*,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3202' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +cdvm$ shadow_start ADF + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA3203 + subroutine SHA3203 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(*,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3203' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +cdvm$ shadow_wait ADF + +*dvm$ parallel (i,j,ii) on BA(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end + +C ---------------------------------------------SHA3204 + subroutine SHA3204 + integer, parameter :: N = 16,M=16, K=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:),BA(:,:,:),BD(:,:,:) + integer, allocatable :: BF(:,:,:),C(:,:,:),D(:,:,:),F(:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,*) +cdvm$ shadow D(2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3) +cdvm$ align (I,J,II) with BA(I,J,II) ::A,D,F,BD,BF + + tname='SHA3204' + allocate (BA(N,M,K),A(N,M,K),BD(N,M,K)) + allocate (BF(N,M,K),C(N,M,K),D(N,M,K),F(N,M,K)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial3(C,N,M,K,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + D(i,j,ii) =NL+i+j+ii + F(i,j,ii) =NL+i+j+ii + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + BA(i,j,ii) = A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1) + BD(i,j,ii)= D(i-2,j-2,ii-2)+D(i+2,j+2,ii+2) + BF(i,j,ii)= F(i-3,j-3,ii-3)+F(i+3,j+3,ii+3) + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii) on BA(i,j,ii),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + if (BA(i,j,ii).ne.(C(i-1,j-1,ii-1)+c(i+1,j+1,ii+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii).ne.(C(i-2,j-2,ii-2)+c(i+2,j+2,ii+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii).ne.(C(i-3,j-3,ii-3)+c(i+3,j+3,ii+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,BA,BD,BF,C,D,F) + + end +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha41.fdv new file mode 100644 index 0000000..0f74676 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha41.fdv @@ -0,0 +1,364 @@ + program SHA41 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N,M,K,L),D(N,M,K,L),F(N,M,K,L) +c IS TO HAVE DIFFERENT SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA41========================' +C -------------------------------------------------- + call sha4101 +C -------------------------------------------------- + call sha4102 +C -------------------------------------------------- + call sha4103 +C ------------------------------------------------- + call sha4104 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA41 ========================= ' + end +C ---------------------------------------------------------SHA4101 + subroutine SHA4101 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4101' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF +c print *,'C' +c print *,C +c print *,'A' +c print *,A + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj)=A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------------------SHA4102 + subroutine SHA4102 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4102' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_start ADF +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C --------------------------------------------------------------SHA4103 + subroutine SHA4103 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4103' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_wait ADF + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end +C --------------------------------------------------------------SHA4104 + subroutine SHA4104 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4104' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + + +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha42.fdv new file mode 100644 index 0000000..f886ad0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha42.fdv @@ -0,0 +1,364 @@ + program SHA42 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N,M,K,L),D(N,M,K,L),F(N,M,K,L) +c IS TO HAVE DIFFERENT SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA42========================' +C -------------------------------------------------- + call sha4201 +C -------------------------------------------------- + call sha4202 +C -------------------------------------------------- + call sha4203 +C ------------------------------------------------- + call sha4204 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA42 ========================= ' + end +C ---------------------------------------------------------SHA4201 + subroutine SHA4201 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(*,*,*,*) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4201' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF +c print *,'C' +c print *,C +c print *,'A' +c print *,A + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj)=A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------------------SHA4202 + subroutine SHA4202 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(*,*,*,*) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4202' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_start ADF +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C --------------------------------------------------------------SHA4203 + subroutine SHA4203 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(*,*,*,*) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4203' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_wait ADF + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end +C --------------------------------------------------------------SHA4204 + subroutine SHA4204 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(*,*,*,*) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4204' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + + +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha43.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha43.fdv new file mode 100644 index 0000000..f32afd9 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOWA/sha43.fdv @@ -0,0 +1,364 @@ + program SHA43 + +c TESTING OF THE SHADOW_GROUP DIRECTIVE ,SHADOW_START DIRECRIVE AND +c SHADOW_WAIT DIRECTIVE. +c DISTRIBUTED ARRAYES A(N,M,K,L),D(N,M,K,L),F(N,M,K,L) +c IS TO HAVE DIFFERENT SHADOW WIDTH ON BOTH SIDES + + print *,'===START OF SHA43========================' +C -------------------------------------------------- + call sha4301 +C -------------------------------------------------- + call sha4302 +C -------------------------------------------------- + call sha4303 +C ------------------------------------------------- + call sha4304 +C ------------------------------------------------- + +C +C + print *,'=== END OF SHA43 ========================= ' + end +C ---------------------------------------------------------SHA4301 + subroutine SHA4301 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,BLOCK,*) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4301' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_start ADF +cdvm$ shadow_wait ADF +c print *,'C' +c print *,C +c print *,'A' +c print *,A + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj)=A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C ------------------------------------------------------------SHA4302 + subroutine SHA4302 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,BLOCK,*,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4302' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_start ADF +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + +C --------------------------------------------------------------SHA4303 + subroutine SHA4303 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(BLOCK,*,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4303' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +cdvm$ shadow_wait ADF + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end +C --------------------------------------------------------------SHA4304 + subroutine SHA4304 + integer, parameter :: N = 16,M=16, K=16,L=16,NL=1000 + character*7 tname + integer, allocatable :: A(:,:,:,:),BA(:,:,:,:),BD(:,:,:,:) + integer, allocatable :: BF(:,:,:,:),C(:,:,:,:),D(:,:,:,:) + integer, allocatable :: F(:,:,:,:) + integer nloop + +cdvm$ distribute BA(*,BLOCK,BLOCK,BLOCK) +cdvm$ shadow D(2:2,2:2,2:2,2:2) +cdvm$ shadow F(3:3,3:3,3:3,3:3) +cdvm$ align (I,J,II,JJ) with BA(I,J,II,JJ) ::A,D,F,BD,BF + + tname='SHA4304' + allocate (BA(N,M,K,L),A(N,M,K,L),BD(N,M,K,L)) + allocate (BF(N,M,K,L),C(N,M,K,L),D(N,M,K,L),F(N,M,K,L)) +cdvm$ shadow_group ADF(A(CORNER),D(CORNER),F(CORNER)) + + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopa=NL + nloopd=NL + nloopf=NL + +*dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_start ADF + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + D(i,j,ii,jj) =NL+i+j+ii+jj + F(i,j,ii,jj) =NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),shadow_wait ADF + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + BA(i,j,ii,jj) = A(i-1,j-1,ii-1,jj-1)+A(i+1,j+1,ii+1,jj+1) + BD(i,j,ii,jj)= D(i-2,j-2,ii-2,jj-2)+D(i+2,j+2,ii+2,jj+2) + BF(i,j,ii,jj)= F(i-3,j-3,ii-3,jj-3)+F(i+3,j+3,ii+3,jj+3) + enddo + enddo + enddo + enddo +c print *,'BA' +c print *,BA + +*dvm$ parallel (i,j,ii,jj) on BA(i,j,ii,jj),reduction( min( nloopa), +*dvm$* min(nloopd),min(nloopf) ) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + if (BA(i,j,ii,jj).ne.(C(i-1,j-1,ii-1,jj-1)+c(i+1,j+1,ii+1,jj+1))) + * nloopa=min(nloopa,i) + if (BD(i,j,ii,jj).ne.(C(i-2,j-2,ii-2,jj-2)+c(i+2,j+2,ii+2,jj+2))) + * nloopd=min(nloopd,i) + if (BF(i,j,ii,jj).ne.(C(i-3,j-3,ii-3,jj-3)+c(i+3,j+3,ii+3,jj+3))) + * nloopf=min(nloopf,i) + enddo + enddo + enddo + enddo + + if ((nloopa .eq.NL).and.(nloopd.eq.NL).and.(nloopf.eq.NL)) then + call ansyes(tname) + else + call ansno(tname) + endif + + end + + +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*7 name + print *,name,' - complete' + end + subroutine ansno(name) + character*7 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc11.fdv new file mode 100644 index 0000000..450b018 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc11.fdv @@ -0,0 +1,829 @@ + program SC11 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_COMPUTE CLAUSE +c DISTRIBUTED ARRAY A(N) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SC11========================' +C -------------------------------------------------- + call sc1101 +C -------------------------------------------------- + call sc1102 +C -------------------------------------------------- + call sc1103 +C ------------------------------------------------- + call sc1104 +C ------------------------------------------------- + call sc1105 +C ------------------------------------------------- + call sc1106 +C -------------------------------------------------- + call sc1107 +C -------------------------------------------------- + call sc1108 +C -------------------------------------------------- + call sc1109 +C ------------------------------------------------- + call sc1110 +C ------------------------------------------------- + call sc1111 +C ------------------------------------------------- + call sc1112 +C ------------------------------------------------- + call sc1113 +C -------------------------------------------------- + call sc1114 +C -------------------------------------------------- + call sc1115 +C ------------------------------------------------- + call sc1116 +C ------------------------------------------------- + call sc1117 +C ------------------------------------------------- + +C +C + print *,'=== END OF SC11 ========================= ' + end +C ---------------------------------------------SC1101 + subroutine SC1101 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SC1101' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute + + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-1 + B(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(C(i-1)+C(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SC1102 + subroutine SC1102 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SC1102' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute (A(1:1)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-1 + B(i) = A(i-1)+A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(C(i-1)+C(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SC1103 + subroutine SC1103 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SC1103' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(0:1)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-1 + B(i) = A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.(C(i+1))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC1104 + subroutine SC1104 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A + + tname='SC1104' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(1:0)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N + B(i) = A(i-1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N + if (B(i).ne.C(i-1)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC1105 + subroutine SC1105 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:1) + + tname='SC1105' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(0:1)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-1 + B(i) = A(i+1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-1 + if (B(i).ne.C(i+1)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C --------------------------------------------SC1106 + + subroutine SC1106 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(1:0) + + tname='SC1106' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(1:0)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N + B(i) = A(i-1) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N + if (B(i).ne.C(i-1)) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1107 + + subroutine SC1107 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SC1107' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i) ,shadow_compute(A(2:2)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=3,N-2 + B(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N-2 + if (B(i).ne.(C(i-1)+C(i+1)+C(i-2)+C(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1108 + + subroutine SC1108 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SC1108' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(0:2)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-2 + B(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-2 + if (B(i).ne.(C(i+1)+C(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SC1109 + + subroutine SC1109 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:2) + + tname='SC1109' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(2:0)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=3,N + B(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N + if (B(i).ne.(C(i-1)+C(i-2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1110 + + subroutine SC1110 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:2) + + tname='SC1110' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-2 + B(i) = A(i+1)+A(i+2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-2 + if (B(i).ne.(C(i+1)+C(i+2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1111 + + subroutine SC1111 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(2:0) + + tname='SC1111' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=3,N + B(i) = A(i-1)+A(i-2) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=3,N + if (B(i).ne.(C(i-1)+C(i-2))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1112 + + subroutine SC1112 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SC1112' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=4,N-3 + B(i) = A(i-1)+A(i+1)+A(i+2)+A(i-2)+A(i-3)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N-3 + if (B(i).ne.(C(i-1)+C(i+1)+C(i-2)+C(i+2)+C(i-3)+C(i+3))) then + nloop=min(nloop,i) + endif + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1113 + + subroutine SC1113 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SC1113' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(0:3)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-3 + B(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-3 + if (B(i).ne.(C(i+1)+C(i+2)+C(i+3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1114 + + subroutine SC1114 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:3) + + tname='SC1114' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute(A(3:0)) + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=4,N + B(i) = A(i-1)+A(i-2)+A(i-3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N + if (B(i).ne.(C(i-1)+C(i-2)+C(i-3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1115 + + subroutine SC1115 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(3:0) + + tname='SC1115' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=4,N + B(i) = A(i-1)+A(i-2)+A(i-3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=4,N + if (B(i).ne.(C(i-1)+C(i-2)+C(i-3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC1116 + + subroutine SC1116 + integer, parameter :: N = 16,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(0:3) + + tname='SC1116' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=2,N-3 + B(i) = A(i+1)+A(i+2)+A(i+3) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=2,N-3 + if (B(i).ne.(C(i+1)+C(i+2)+C(i+3))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC1117 + + subroutine SC1117 + integer, parameter :: N = 500,NL=1000 + character*6 tname + integer, allocatable :: A(:),B(:),C(:) + integer nloop + +!dvm$ distribute B(BLOCK) +!dvm$ align (I) with B(I) ::A +!dvm$ shadow A(11:11) + + tname='SC1117' + allocate (B(N),A(N),C(N)) + NNL=NL + call serial1(C,N,NNL) + nloop=NL + +!dvm$ actual(nloop) +!dvm$ region local(A,B) +!dvm$ parallel (i) on A(i),shadow_compute + do i=1,N + A(i) = NL+i + enddo + +!dvm$ parallel (i) on B(i) + do i=12,N-11 + B(i) = A(i-9)+A(i+9)+A(i+10)+A(i-10)+A(i-11)+A(i+11) + enddo + +!dvm$ parallel (i) on B(i), reduction( min( nloop ) ) + do i=12,N-11 + if (B(i).ne.(C(i-9)+C(i+9)+C(i-10)+C(i+10)+ + *C(i-11)+C(i+11))) nloop=min(nloop,i) + enddo +!dvm$ end region +!dvm$ get_actual(nloop) + + if (nloop .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial1(AR,N,NL) + integer AR(N) + integer NL + do i=1,N + AR(i) = NL+i + enddo + end + + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc21.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc21.fdv new file mode 100644 index 0000000..cfc2512 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc21.fdv @@ -0,0 +1,1220 @@ + program SC21 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_COMPUTE CLAUSE'. +c DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SC21========================' +C -------------------------------------------------- + call sc2101 +C -------------------------------------------------- + call sc2102 +C -------------------------------------------------- + call sc2103 +C ------------------------------------------------- + call sc2104 +C ------------------------------------------------- + call sc2105 +C ------------------------------------------------- + call sc2106 +C ------------------------------------------------- + call sc2107 +C -------------------------------------------------- + call sc2108 +C---------------------------------------------------- + call sc2109 +C ------------------------------------------------- + call sc2110 +C ------------------------------------------------- + call sc2111 +C ------------------------------------------------- + call sc2112 +C ------------------------------------------------- + call sc2113 +C -------------------------------------------------- + call sc2114 +C -------------------------------------------------- + call sc2115 +C ------------------------------------------------- + call sc2116 +C ------------------------------------------------- + call sc2117 +C ------------------------------------------------- + call sc2118 +C ------------------------------------------------- + call sc2119 +C ------------------------------------------------- + call sc2120 +C ------------------------------------------------- + +C ------------------------------------------------- + +C +C + print *,'=== END OF SC21 ========================= ' + end +C ---------------------------------------------SC2101 + subroutine sc2101 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + character*6 tname +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2101' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i-1,j)+A(i,j-1)+ + *A(i-1,j-1)+ A(i+1,j+1)+A(i-1,j+1)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i-1,j)+C(i,j-1)+ + *C(i-1,j-1)+ C(i+1,j+1)+C(i-1,j+1)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SC2102 + subroutine sc2102 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2102' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SC2103 + subroutine sc2103 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2103' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(1:0,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i-1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i-1,j)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC2104 + subroutine sc2104 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(1:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2104' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC2105 + subroutine sc2105 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(0:1,1:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2105' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,1:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i,j-1)+A(i+1,j)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1)+C(i+1,j)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C --------------------------------------------SC2106 + + subroutine sc2106 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(0:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2106' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2107 + + subroutine sc2107 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(1:0,1:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2107' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:0,1:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2108 + + subroutine sc2108 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2108' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j)+A(i,j+2)+A(i+2,j)+A(i+2,j+2)+ + * A(i-2,j+2)+A(i-2,j)+A(i,j-2)+A(i-2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j)+C(i,j+2)+C(i+2,j)+C(i+2,j+2)+ + *C(i-2,j+2)+C(i-2,j)+C(i,j-2)+C(i-2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SC2109 + + subroutine sc2109 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2109' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:2,2:2)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i,j+2)+A(i,j-2)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i,j+2)+C(i,j-2)+A(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2110 + + subroutine sc2110 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2110' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(2:2,2:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-2,j-2)+ A(i-1,j-1)+A(i-2,j)+A(i+2,j)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-2,j-2)+C(i-1,j-1)+C(i-2,j)+C(i+2,j)+C(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2111 + + subroutine sc2111 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,0:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2111' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(2:2,0:2)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i-2,j+2)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i-2,j+2)+C(i+2,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2112 + + subroutine sc2112 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2112' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(1:0,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-1,j+1)+ A(i,j+1)+A(i-1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-1,j+1)+ C(i,j+1)+C(i-1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2113 + + subroutine sc2113 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:2,2:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2113' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2114 + + subroutine sc2114 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2114' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:0,0:2)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+2)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+2)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2115 + + subroutine sc2115 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2115' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i+1,j+1)+A(i+2,j+2)+A(i+3,j+3)+A(i-3,j-3)+ + * A(i-2,j-2)+A(i-1,j-1)+A(i-3,j+3)+A(i+3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i+1,j+1)+C(i+2,j+2)+C(i+3,j+3)+C(i-3,j-3)+ + * C(i-2,j-2)+C(i-1,j-1)+C(i-3,j+3)+C(i+3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2116 + + subroutine sc2116 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:3,0:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2116' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:0,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2117 + + subroutine sc2117 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2117' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2118 + + subroutine sc2118 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:3,3:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2118' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i+3,j)+A(i-3,j)+A(i-3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i+3,j)+C(i-3,j)+C(i-3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2119 + + subroutine sc2119 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(3:0,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2119' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(3:0,3:3)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i,j+3)+A(i-3,j+3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i,j+3)+C(i-3,j+3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2120 + + subroutine sc2120 + integer, parameter :: N = 480,M=480,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2120' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=12,N-11 + do j=12,M-11 + B(i,j) = A(i+11,j+11)+A(i+10,j+10)+A(i+9,j+9)+ + *A(i-11,j-11)+A(i-10,j-10)+A(i-9,j-9)+A(i+11,j-11)+ + *A(i-11,j+11) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + isum = C(i+11,j+11)+C(i+10,j+10)+C(i+9,j+9)+ + *C(i-11,j-11)+C(i-10,j-10)+C(i-9,j-9)+C(i+11,j-11)+ + *C(i-11,j+11) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc22.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc22.fdv new file mode 100644 index 0000000..1441eef --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc22.fdv @@ -0,0 +1,1220 @@ + program SC22 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_COMPUTE CLAUSE'. +c DISTRIBUTED ARRAY A(N,M) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SC22========================' +C -------------------------------------------------- + call sc2201 +C -------------------------------------------------- + call sc2202 +C -------------------------------------------------- + call sc2203 +C ------------------------------------------------- + call sc2204 +C ------------------------------------------------- + call sc2205 +C ------------------------------------------------- + call sc2206 +C ------------------------------------------------- + call sc2207 +C -------------------------------------------------- + call sc2208 +C---------------------------------------------------- + call sc2209 +C ------------------------------------------------- + call sc2210 +C ------------------------------------------------- + call sc2211 +C ------------------------------------------------- + call sc2212 +C ------------------------------------------------- + call sc2213 +C -------------------------------------------------- + call sc2214 +C -------------------------------------------------- + call sc2215 +C ------------------------------------------------- + call sc2216 +C ------------------------------------------------- + call sc2217 +C ------------------------------------------------- + call sc2218 +C ------------------------------------------------- + call sc2219 +C ------------------------------------------------- + call sc2220 +C ------------------------------------------------- + +C ------------------------------------------------- + +C +C + print *,'=== END OF SC22 ========================= ' + end +C ---------------------------------------------SC2201 + subroutine SC2201 + integer, parameter :: N = 16,M=8,NL=1000 + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + character*6 tname +!dvm$ distribute B(BLOCK,*) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2201' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i-1,j)+A(i,j-1)+ + *A(i-1,j-1)+ A(i+1,j+1)+A(i-1,j+1)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i-1,j)+C(i,j-1)+ + *C(i-1,j-1)+ C(i+1,j+1)+C(i-1,j+1)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SC2202 + subroutine SC2202 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2202' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SC2203 + subroutine SC2203 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2203' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(1:0,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i-1,j)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i-1,j)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC2204 + subroutine SC2204 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(1:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2204' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i+1,j)+A(i,j+1)+A(i+1,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j)+C(i,j+1)+C(i+1,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC2205 + subroutine SC2205 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(0:1,1:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2205' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,1:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) = A(i,j-1)+A(i+1,j)+A(i+1,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1)+C(i+1,j)+C(i+1,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C --------------------------------------------SC2206 + + subroutine SC2206 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(0:1,0:1) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2206' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2207 + + subroutine SC2207 + integer, parameter :: N = 16,M=8,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(1:0,1:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2207' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:0,1:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=2,N-1 + do j=2,M-1 + B(i,j) =A(i,j-1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + isum = C(i,j-1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2208 + + subroutine SC2208 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2208' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j)+A(i,j+2)+A(i+2,j)+A(i+2,j+2)+ + * A(i-2,j+2)+A(i-2,j)+A(i,j-2)+A(i-2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j)+C(i,j+2)+C(i+2,j)+C(i+2,j+2)+ + *C(i-2,j+2)+C(i-2,j)+C(i,j-2)+C(i-2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SC2209 + + subroutine SC2209 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2209' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:2,2:2)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i,j+2)+A(i,j-2)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i,j+2)+C(i,j-2)+A(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2210 + + subroutine sc2210 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:2,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2210' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(2:2,2:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-2,j-2)+ A(i-1,j-1)+A(i-2,j)+A(i+2,j)+A(i+2,j-2) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-2,j-2)+C(i-1,j-1)+C(i-2,j)+C(i+2,j)+C(i+2,j-2) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2211 + + subroutine SC2211 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(2:2,0:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2211' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(2:2,0:2)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+2,j+2)+ A(i+1,j+1)+A(i-2,j+2)+A(i+2,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+2,j+2)+ C(i+1,j+1)+C(i-2,j+2)+C(i+2,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2212 + + subroutine SC2212 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2212' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(1:0,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i-1,j+1)+ A(i,j+1)+A(i-1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i-1,j+1)+ C(i,j+1)+C(i-1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2213 + + subroutine SC2213 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(2:2,2:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2213' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2214 + + subroutine SC2214 + integer, parameter :: N = 16,M=17,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(2:0,2:2) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2214' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:0,0:2)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+2)+A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+2)+C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2215 + + subroutine SC2215 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(3:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2215' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i+1,j+1)+A(i+2,j+2)+A(i+3,j+3)+A(i-3,j-3)+ + * A(i-2,j-2)+A(i-1,j-1)+A(i-3,j+3)+A(i+3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i+1,j+1)+C(i+2,j+2)+C(i+3,j+3)+C(i-3,j-3)+ + * C(i-2,j-2)+C(i-1,j-1)+C(i-3,j+3)+C(i+3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC2216 + + subroutine SC2216 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(3:3,0:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2216' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:0,0:1)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i,j+1) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i,j+1) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2217 + + subroutine SC2217 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(0:3,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2217' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(0:1,0:0)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=3,N-2 + do j=3,M-2 + B(i,j) = A(i+1,j) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + isum = C(i+1,j) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2218 + + subroutine SC2218 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(3:3,3:0) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2218' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i+3,j)+A(i-3,j)+A(i-3,j-3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i+3,j)+C(i-3,j)+C(i-3,j-3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2219 + + subroutine SC2219 + integer, parameter :: N = 32,M=32,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(BLOCK,*) +!dvm$ shadow(3:0,3:3) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2219' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute(A(3:0,3:3)) + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=4,N-3 + do j=4,M-3 + B(i,j) = A(i-3,j-3)+A(i,j+3)+A(i-3,j+3) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + isum = C(i-3,j-3)+C(i,j+3)+C(i-3,j+3) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC2220 + + subroutine SC2220 + integer, parameter :: N = 480,M=480,NL=1000 + character*6 tname + integer, allocatable :: A(:,:),B(:,:),C(:,:) + integer nloopi,nloopj,isum + +!dvm$ distribute B(*,BLOCK) +!dvm$ shadow(11:11,11:11) :: A +!dvm$ align (I,J) with B(I,J) ::A + + tname='SC2220' + allocate (B(N,M),A(N,M),C(N,M)) + NNL=NL + call serial2(C,N,M,NNL) + nloopi=NL + nloopj=NL + +!dvm$ actual(nloopi,nloopj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j) on A(i,j),shadow_compute + do i=1,N + do j=1,M + A(i,j) = NL+i+j + enddo + enddo + +!dvm$ parallel (i,J) on B(i,j) + do i=12,N-11 + do j=12,M-11 + B(i,j) = A(i+11,j+11)+A(i+10,j+10)+A(i+9,j+9)+ + *A(i-11,j-11)+A(i-10,j-10)+A(i-9,j-9)+A(i+11,j-11)+ + *A(i-11,j+11) + enddo + enddo + +!dvm$ parallel (i,j) on B(i,j), reduction( min( nloopi),min(nloopj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + isum = C(i+11,j+11)+C(i+10,j+10)+C(i+9,j+9)+ + *C(i-11,j-11)+C(i-10,j-10)+C(i-9,j-9)+C(i+11,j-11)+ + *C(i-11,j+11) + if (B(i,j).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial2(AR,N,M,NL) + integer AR(N,M) + integer NL + do i=1,N + do j=1,M + AR(i,j) = NL+i+j + enddo + enddo + end + + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc31.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc31.fdv new file mode 100644 index 0000000..54e6a2a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc31.fdv @@ -0,0 +1,684 @@ + program SC31 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_COMPUTE CLAUSE +c DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SC31========================' +C -------------------------------------------------- + call sc3101 +C -------------------------------------------------- + call sc3102 +C -------------------------------------------------- + call sc3103 +C ------------------------------------------------- + call sc3104 +C ------------------------------------------------- + call sc3105 +C ------------------------------------------------- + call sc3106 +C -------------------------------------------------- + call sc3107 +C -------------------------------------------------- + call sc3108 +C---------------------------------------------------- + call sc3109 +C---------------------------------------------------- + +C +C + print *,'=== END OF SC31 ========================= ' + end +C ---------------------------------------------SC3101 + subroutine sc3101 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3101' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+A(i-1,j,ii)+ + *A(i,j-1,ii)+ A(i,j,ii-1)+A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1)+ + *A(i-1,j+1,ii)+A(i+1,j-1,ii)+A(i-1,j+1,ii-1)+A(i-1,j+1,ii+1)+ + *A(i+1,j-1,ii-1)+A(i+1,j-1,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + isum = C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+C(i-1,j,ii)+ + *C(i,j-1,ii)+ C(i,j,ii-1)+C(i-1,j-1,ii-1)+C(i+1,j+1,ii+1)+ + *C(i-1,j+1,ii)+C(i+1,j-1,ii)+C(i-1,j+1,ii-1)+C(i-1,j+1,ii+1)+ + *C(i+1,j-1,ii-1)+C(i+1,j-1,ii+1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SC3102 + subroutine SC3102 + integer, parameter :: N = 16,M=10,K=10,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3102' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(1:2,2:2,1:2)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i-1,j-2,ii+2)+A(i-1,j+2,ii-1)+A(i-1,j+2,ii+2)+ + *A(i+2,j+2,ii+2)+ A(i+2,j+2,ii-1)+A(i+2,j-2,ii+2)+A(i+2,j-2,ii-1)+ + *A(i-1,j-2,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i-1,j-2,ii+2)+C(i-1,j+2,ii-1)+C(i-1,j+2,ii+2)+ + *C(i+2,j+2,ii+2)+ C(i+2,j+2,ii-1)+C(i+2,j-2,ii+2)+C(i+2,j-2,ii-1)+ + *C(i-1,j-2,ii-1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SC3103 + subroutine SC3103 + integer, parameter :: N = 16,M=10,K=10,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3103' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(0:2,2:2,0:2)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + *A(i+2,j-2,ii)+A(i,j+2,ii)+ A(i,j+2,ii+2)+A(i+2,j-2,ii+2)+ + * A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + *C(i+2,j-2,ii)+C(i,j+2,ii)+ C(i,j+2,ii+2)+C(i+2,j-2,ii+2)+ + *C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC3104 + subroutine SC3104 + integer, parameter :: N = 16,M=10,K=10,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3104' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(2:2,2:0,2:0)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j,ii)+A(i-2,j-2,ii-2)+ + *A(i+2,j-2,ii-2)+ A(i-2,j,ii-2)+A(i-2,j-2,ii)+ + *A(i-2,j,ii)+A(i+2,j-2,ii)+A(i+2,j,ii-2) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j,ii)+C(i-2,j-2,ii-2)+ + *C(i+2,j-2,ii-2)+ C(i-2,j,ii-2)+C(i-2,j-2,ii)+ + *C(i-2,j,ii)+C(i+2,j-2,ii)+C(i+2,j,ii-2) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC3105 + subroutine SC3105 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:2,2:2,0:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3105' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + * A(i+2,j-2,ii)+ A(i,j+2,ii)+A(i,j+2,ii+2)+ + * A(i+2,j-2,ii+2)+A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + * C(i+2,j-2,ii)+ C(i,j+2,ii)+C(i,j+2,ii+2)+ + * C(i+2,j-2,ii+2)+C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C --------------------------------------------SC3106 + subroutine SC3106 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3106' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i-3,j-3,ii+3)+A(i+3,j+3,ii-3)+ + * A(i+3,j-3,ii+3)+ A(i-3,j+3,ii+3)+A(i-3,j+3,ii-3)+ + * A(i+3,j-3,ii-3)+A(i+3,j+3,ii+3)+A(i-3,j-3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i-3,j-3,ii+3)+C(i+3,j+3,ii-3)+ + * C(i+3,j-3,ii+3)+ C(i-3,j+3,ii+3)+C(i-3,j+3,ii-3)+ + * C(i+3,j-3,ii-3)+ C(i+3,j+3,ii+3)+ C(i-3,j-3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SC3107 + subroutine SC3107 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,0:3,3:0) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3107' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii)+A(i-3,j,ii-3)+ + * A(i+3,j,ii-3)+ A(i-3,j+3,ii-3)+ A(i-3,j,ii)+ + * A(i-3,j+3,ii)+ A(i+3,j,ii)+ A(i+3,j+3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii)+C(i-3,j,ii-3)+ + * C(i+3,j,ii-3)+ C(i-3,j+3,ii-3)+C(i-3,j,ii)+ + * C(i-3,j+3,ii)+ C(i+3,j,ii)+ C(i+3,j+3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C -------------------------------------------SC3108 + subroutine SC3108 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,0:3,0:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3108' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(0:3,0:3,0:3)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii+3)+A(i+3,j,ii)+ + * A(i,j+3,ii)+ A(i,j,ii+3)+ A(i,j+3,ii+3)+ + * A(i+3,j,ii+3)+ A(i+3,j+3,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii+3)+C(i+3,j,ii)+ + * C(i,j+3,ii)+ C(i,j,ii+3)+ C(i,j+3,ii+3)+ + * C(i+3,j,ii+3)+ C(i+3,j+3,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SC3109 + subroutine SC3109 + integer, parameter :: N = 120,M=120,K=120,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3109' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + B(i,j,ii) = A(i+11,j+11,ii+11)+A(i-11,j-11,ii-11)+ + * A(i+11,j-11,ii-11)+ A(i-11,j+11,ii-11)+ A(i-11,j-11,ii+11)+ + * A(i-11,j+11,ii+11)+ A(i+11,j-11,ii+11)+A(i+11,j+11,ii-11) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + isum = C(i+11,j+11,ii+11)+C(i-11,j-11,ii-11)+ + * C(i+11,j-11,ii-11)+ C(i-11,j+11,ii-11)+ C(i-11,j-11,ii+11)+ + * C(i-11,j+11,ii+11)+ C(i+11,j-11,ii+11)+C(i+11,j+11,ii-11) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc32.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc32.fdv new file mode 100644 index 0000000..090814f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc32.fdv @@ -0,0 +1,684 @@ + program SC32 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_COMPUTE CLAUSE +c DISTRIBUTED ARRAY A(N,M,K) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SC32========================' +C -------------------------------------------------- + call sc3201 +C -------------------------------------------------- + call sc3202 +C -------------------------------------------------- + call sc3203 +C ------------------------------------------------- + call sc3204 +C ------------------------------------------------- + call sc3205 +C ------------------------------------------------- + call sc3206 +C -------------------------------------------------- + call sc3207 +C -------------------------------------------------- + call sc3208 +C---------------------------------------------------- + call sc3209 +C---------------------------------------------------- + +C +C + print *,'=== END OF SC32 ========================= ' + end +C ---------------------------------------------SC3201 + subroutine sc3201 + integer, parameter :: N = 16,M=8,K=8,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3201' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + B(i,j,ii) = A(i+1,j,ii)+A(i,j+1,ii)+A(i,j,ii+1)+A(i-1,j,ii)+ + *A(i,j-1,ii)+ A(i,j,ii-1)+A(i-1,j-1,ii-1)+A(i+1,j+1,ii+1)+ + *A(i-1,j+1,ii)+A(i+1,j-1,ii)+A(i-1,j+1,ii-1)+A(i-1,j+1,ii+1)+ + *A(i+1,j-1,ii-1)+A(i+1,j-1,ii+1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + isum = C(i+1,j,ii)+C(i,j+1,ii)+C(i,j,ii+1)+C(i-1,j,ii)+ + *C(i,j-1,ii)+ C(i,j,ii-1)+C(i-1,j-1,ii-1)+C(i+1,j+1,ii+1)+ + *C(i-1,j+1,ii)+C(i+1,j-1,ii)+C(i-1,j+1,ii-1)+C(i-1,j+1,ii+1)+ + *C(i+1,j-1,ii-1)+C(i+1,j-1,ii+1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SC3202 + subroutine SC3202 + integer, parameter :: N = 16,M=10,K=10,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3202' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(1:2,2:2,1:2)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i-1,j-2,ii+2)+A(i-1,j+2,ii-1)+A(i-1,j+2,ii+2)+ + *A(i+2,j+2,ii+2)+ A(i+2,j+2,ii-1)+A(i+2,j-2,ii+2)+A(i+2,j-2,ii-1)+ + *A(i-1,j-2,ii-1) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i-1,j-2,ii+2)+C(i-1,j+2,ii-1)+C(i-1,j+2,ii+2)+ + *C(i+2,j+2,ii+2)+ C(i+2,j+2,ii-1)+C(i+2,j-2,ii+2)+C(i+2,j-2,ii-1)+ + *C(i-1,j-2,ii-1) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SC3203 + subroutine SC3203 + integer, parameter :: N = 16,M=10,K=10,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3203' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(0:2,2:2,0:2)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + *A(i+2,j-2,ii)+A(i,j+2,ii)+ A(i,j+2,ii+2)+A(i+2,j-2,ii+2)+ + * A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + *C(i+2,j-2,ii)+C(i,j+2,ii)+ C(i,j+2,ii+2)+C(i+2,j-2,ii+2)+ + *C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC3204 + subroutine SC3204 + integer, parameter :: N = 16,M=10,K=10,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ shadow(2:2,2:2,2:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3204' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(2:2,2:0,2:0)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j,ii)+A(i-2,j-2,ii-2)+ + *A(i+2,j-2,ii-2)+ A(i-2,j,ii-2)+A(i-2,j-2,ii)+ + *A(i-2,j,ii)+A(i+2,j-2,ii)+A(i+2,j,ii-2) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j,ii)+C(i-2,j-2,ii-2)+ + *C(i+2,j-2,ii-2)+ C(i-2,j,ii-2)+C(i-2,j-2,ii)+ + *C(i-2,j,ii)+C(i+2,j-2,ii)+C(i+2,j,ii-2) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ------------------------------------------SC3205 + subroutine SC3205 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ shadow(0:2,2:2,0:2) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3205' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + B(i,j,ii) = A(i+2,j+2,ii+2)+A(i,j-2,ii)+ + * A(i+2,j-2,ii)+ A(i,j+2,ii)+A(i,j+2,ii+2)+ + * A(i+2,j-2,ii+2)+A(i+2,j+2,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + isum = C(i+2,j+2,ii+2)+C(i,j-2,ii)+ + * C(i+2,j-2,ii)+ C(i,j+2,ii)+C(i,j+2,ii+2)+ + * C(i+2,j-2,ii+2)+C(i+2,j+2,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C --------------------------------------------SC3206 + subroutine SC3206 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3206' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i-3,j-3,ii+3)+A(i+3,j+3,ii-3)+ + * A(i+3,j-3,ii+3)+ A(i-3,j+3,ii+3)+A(i-3,j+3,ii-3)+ + * A(i+3,j-3,ii-3)+A(i+3,j+3,ii+3)+A(i-3,j-3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i-3,j-3,ii+3)+C(i+3,j+3,ii-3)+ + * C(i+3,j-3,ii+3)+ C(i-3,j+3,ii+3)+C(i-3,j+3,ii-3)+ + * C(i+3,j-3,ii-3)+ C(i+3,j+3,ii+3)+ C(i-3,j-3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SC3207 + subroutine SC3207 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*) +!dvm$ shadow(3:3,0:3,3:0) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3207' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii)+A(i-3,j,ii-3)+ + * A(i+3,j,ii-3)+ A(i-3,j+3,ii-3)+ A(i-3,j,ii)+ + * A(i-3,j+3,ii)+ A(i+3,j,ii)+ A(i+3,j+3,ii-3) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii)+C(i-3,j,ii-3)+ + * C(i+3,j,ii-3)+ C(i-3,j+3,ii-3)+C(i-3,j,ii)+ + * C(i-3,j+3,ii)+ C(i+3,j,ii)+ C(i+3,j+3,ii-3) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + + +C -------------------------------------------SC3208 + subroutine SC3208 + integer, parameter :: N = 16,M=16,K=16,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK) +!dvm$ shadow(0:3,0:3,0:3) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3208' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute(A(0:3,0:3,0:3)) + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + B(i,j,ii) = A(i+3,j+3,ii+3)+A(i+3,j,ii)+ + * A(i,j+3,ii)+ A(i,j,ii+3)+ A(i,j+3,ii+3)+ + * A(i+3,j,ii+3)+ A(i+3,j+3,ii) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + isum = C(i+3,j+3,ii+3)+C(i+3,j,ii)+ + * C(i,j+3,ii)+ C(i,j,ii+3)+ C(i,j+3,ii+3)+ + * C(i+3,j,ii+3)+ C(i+3,j+3,ii) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C -------------------------------------------SC3209 + subroutine SC3209 + integer, parameter :: N = 120,M=120,K=120,NL=1000 + integer, allocatable :: A(:,:,:),B(:,:,:),C(:,:,:) + integer nloopi,nloopj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11) :: A +!dvm$ align (I,J,II) with B(I,J,II) ::A + + tname='SC3209' + allocate (B(N,M,K),A(N,M,K),C(N,M,K)) + NNL=NL + call serial3(C,N,M,K,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + +!dvm$ actual(nloopi,nloopj,nloopii) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii) on A(i,j,ii),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + A(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + B(i,j,ii) = A(i+11,j+11,ii+11)+A(i-11,j-11,ii-11)+ + * A(i+11,j-11,ii-11)+ A(i-11,j+11,ii-11)+ A(i-11,j-11,ii+11)+ + * A(i-11,j+11,ii+11)+ A(i+11,j-11,ii+11)+A(i+11,j+11,ii-11) + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii) on B(i,j,ii), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + isum = C(i+11,j+11,ii+11)+C(i-11,j-11,ii-11)+ + * C(i+11,j-11,ii-11)+ C(i-11,j+11,ii-11)+ C(i-11,j-11,ii+11)+ + * C(i-11,j+11,ii+11)+ C(i+11,j-11,ii+11)+C(i+11,j+11,ii-11) + if (B(i,j,ii).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + endif + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end + +C ----------------------------------------------- + subroutine serial3(AR,N,M,K,NL) + integer AR(N,M,K) + integer NL + do i=1,N + do j=1,M + do ii=1,K + AR(i,j,ii) = NL+i+j+ii + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc41.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc41.fdv new file mode 100644 index 0000000..49e9dba --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc41.fdv @@ -0,0 +1,801 @@ + program SC41 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_COMPUTE CLAUSE +c DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SC41========================' +C -------------------------------------------------- + call sc4101 +C -------------------------------------------------- + call sc4102 +C -------------------------------------------------- + call sc4103 +C ------------------------------------------------- + call sc4104 +C ------------------------------------------------- + call sc4105 +C ------------------------------------------------- + call sc4106 +C -------------------------------------------------- + call sc4107 +C -------------------------------------------------- + call sc4108 +C---------------------------------------------------- + call sc4109 +C---------------------------------------------------- + +C +C + print *,'=== END OF SC41 ========================= ' + end +C ---------------------------------------------SC4101 + subroutine SC4101 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4101' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + B(i,j,ii,jj) = A(i+1,j+1,ii+1,jj+1)+A(i-1,j-1,ii-1,jj-1)+ + * A(i+1,j-1,ii-1,jj-1)+A(i-1,j+1,ii-1,jj-1)+ + * A(i-1,j-1,ii+1,jj-1)+ A(i-1,j-1,ii-1,jj+1)+ + * A(i+1,j+1,ii-1,jj-1)+A(i-1,j+1,ii+1,jj-1)+ + * A(i-1,j-1,ii+1,jj+1)+A(i+1,j-1,ii-1,jj+1)+ + * A(i+1,j-1,ii+1,jj-1)+A(i-1,j+1,ii-1,jj+1)+ + * A(i+1,j+1,ii+1,jj-1)+A(i-1,j+1,ii+1,jj+1)+ + * A(i+1,j-1,ii+1,jj+1)+A(i+1,j+1,ii-1,jj+1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + isum = C(i+1,j+1,ii+1,jj+1)+C(i-1,j-1,ii-1,jj-1)+ + * C(i+1,j-1,ii-1,jj-1)+ C(i-1,j+1,ii-1,jj-1)+ + * C(i-1,j-1,ii+1,jj-1)+ C(i-1,j-1,ii-1,jj+1)+ + * C(i+1,j+1,ii-1,jj-1)+ C(i-1,j+1,ii+1,jj-1)+ + * C(i-1,j-1,ii+1,jj+1)+ C(i+1,j-1,ii-1,jj+1)+ + * C(i+1,j-1,ii+1,jj-1)+ C(i-1,j+1,ii-1,jj+1)+ + * C(i+1,j+1,ii+1,jj-1)+ C(i-1,j+1,ii+1,jj+1)+ + * C(i+1,j-1,ii+1,jj+1)+ C(i+1,j+1,ii-1,jj+1) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SC4102 + + subroutine SC4102 + integer, parameter :: N = 16,M=10,K=10,L=10,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4102' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj+2)+A(i-2,j-2,ii-2,jj-2)+ + * A(i+2,j-2,ii-2,jj-2)+ A(i-2,j+2,ii-2,jj-2)+ + * A(i-2,j-2,ii+2,jj-2)+ A(i-2,j-2,ii-2,jj+2)+ + * A(i+2,j+2,ii-2,jj-2)+ A(i-2,j+2,ii+2,jj-2)+ + * A(i-2,j-2,ii+2,jj+2)+ A(i+2,j-2,ii-2,jj+2)+ + * A(i+2,j-2,ii+2,jj-2)+ A(i-2,j+2,ii-2,jj+2)+ + * A(i+2,j+2,ii+2,jj-2)+ A(i-2,j+2,ii+2,jj+2)+ + * A(i+2,j-2,ii+2,jj+2)+ A(i+2,j+2,ii-2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj+2)+C(i-2,j-2,ii-2,jj-2)+ + * C(i+2,j-2,ii-2,jj-2)+ C(i-2,j+2,ii-2,jj-2)+ + * C(i-2,j-2,ii+2,jj-2)+ C(i-2,j-2,ii-2,jj+2)+ + * C(i+2,j+2,ii-2,jj-2)+ C(i-2,j+2,ii+2,jj-2)+ + * C(i-2,j-2,ii+2,jj+2)+ C(i+2,j-2,ii-2,jj+2)+ + * C(i+2,j-2,ii+2,jj-2)+ C(i-2,j+2,ii-2,jj+2)+ + * C(i+2,j+2,ii+2,jj-2)+ C(i-2,j+2,ii+2,jj+2)+ + * C(i+2,j-2,ii+2,jj+2)+ C(i+2,j+2,ii-2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SC4103 + subroutine SC4103 + integer, parameter :: N = 16,M=10,K=10,L=10,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4103' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) +!dvm$*,shadow_compute(A(2:0,2:2,2:0,2:0)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i-2,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj)+ A(i-2,j-2,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j-2,ii-2,jj)+ + * A(i-2,j-2,ii,jj)+ A(i,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj-2)+ A(i-2,j-2,ii-2,jj)+ + * A(i,j-2,ii-2,jj-2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i-2,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj)+ C(i-2,j-2,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j-2,ii-2,jj)+ + * C(i-2,j-2,ii,jj)+ C(i,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj-2)+ C(i-2,j-2,ii-2,jj)+ + * C(i,j-2,ii-2,jj-2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SC4104 + subroutine SC4104 + integer, parameter :: N = 16,M=10,K=10,L=10,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:2,2:2,0:2,0:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4104' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj)+ + * A(i,j-2,ii,jj)+ A(i+2,j-2,ii,jj)+ + * A(i,j+2,ii,jj)+ A(i,j-2,ii+2,jj)+ + * A(i+2,j+2,ii,jj)+ A(i,j-2,ii+2,jj+2)+ + * A(i,j+2,ii,jj+2)+ A(i+2,j+2,ii+2,jj)+ + * A(i,j+2,ii+2,jj+2)+A(i+2,j-2,ii+2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj)+ + * C(i,j-2,ii,jj)+ C(i+2,j-2,ii,jj)+ + * C(i,j+2,ii,jj)+ C(i,j-2,ii+2,jj)+ + * C(i+2,j+2,ii,jj)+ C(i,j-2,ii+2,jj+2)+ + * C(i,j+2,ii,jj+2)+ C(i+2,j+2,ii+2,jj)+ + * C(i,j+2,ii+2,jj+2)+C(i+2,j-2,ii+2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SC4105 + subroutine SC4105 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:0,0:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4105' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) +!dvm$*,shadow_compute(A(0:0,0:0,0:0,0:2)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i,j,ii,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i,j,ii,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC4106 + subroutine SC4106 + integer, parameter :: N = 32,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(3:3,3:3,3:3,3:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4106' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i-3,j-3,ii-3,jj-3)+ + * A(i+3,j-3,ii-3,jj-3)+ A(i-3,j+3,ii-3,jj-3)+ + * A(i-3,j-3,ii+3,jj-3)+ A(i-3,j-3,ii-3,jj+3)+ + * A(i+3,j+3,ii-3,jj-3)+ A(i-3,j+3,ii+3,jj-3)+ + * A(i-3,j-3,ii+3,jj+3)+ A(i+3,j-3,ii-3,jj+3)+ + * A(i+3,j-3,ii+3,jj-3)+ A(i-3,j+3,ii-3,jj+3)+ + * A(i+3,j+3,ii+3,jj-3)+ A(i-3,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3)+ A(i+3,j+3,ii-3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i-3,j-3,ii-3,jj-3)+ + * C(i+3,j-3,ii-3,jj-3)+ C(i-3,j+3,ii-3,jj-3)+ + * C(i-3,j-3,ii+3,jj-3)+ C(i-3,j-3,ii-3,jj+3)+ + * C(i+3,j+3,ii-3,jj-3)+ C(i-3,j+3,ii+3,jj-3)+ + * C(i-3,j-3,ii+3,jj+3)+ C(i+3,j-3,ii-3,jj+3)+ + * C(i+3,j-3,ii+3,jj-3)+ C(i-3,j+3,ii-3,jj+3)+ + * C(i+3,j+3,ii+3,jj-3)+ C(i-3,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3)+ C(i+3,j+3,ii-3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC4107 + subroutine SC4107 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,0:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4107' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i,j-3,ii,jj)+ + * A(i+3,j-3,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj)+ A(i+3,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj+3)+ A(i,j+3,ii,jj+3)+ + * A(i+3,j+3,ii+3,jj)+ A(i,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i,j-3,ii,jj)+ + * C(i+3,j-3,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj)+ C(i+3,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj+3)+ C(i,j+3,ii,jj+3)+ + * C(i+3,j+3,ii+3,jj)+ C(i,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC4108 + subroutine SC4108 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,3:0) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4108' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) +!dvm$*,shadow_compute(A(0:0,0:0,0:0,3:0)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i,j,ii,jj-3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum =C(i,j,ii,jj-3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC4109 + subroutine SC4109 + integer, parameter :: N = 60,M=60,K=60,L=60,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(11:11,11:11,11:11,11:11) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4109' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + B(i,j,ii,jj) = A(i+11,j+11,ii+11,jj+11)+ + * A(i-11,j-11,ii-11,jj-11)+ + * A(i+11,j-11,ii-11,jj-11)+ A(i-11,j+11,ii-11,jj-11)+ + * A(i-11,j-11,ii+11,jj-11)+ A(i-11,j-11,ii-11,jj+11)+ + * A(i+11,j+11,ii-11,jj-11)+ A(i-11,j+11,ii+11,jj-11)+ + * A(i-11,j-11,ii+11,jj+11)+ A(i+11,j-11,ii-11,jj+11)+ + * A(i+11,j-11,ii+11,jj-11)+ A(i-11,j+11,ii-11,jj+11)+ + * A(i+11,j+11,ii+11,jj-11)+ A(i-11,j+11,ii+11,jj+11)+ + * A(i+11,j-11,ii+11,jj+11)+ A(i+11,j+11,ii-11,jj+11) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + isum = C(i+11,j+11,ii+11,jj+11)+ + * C(i-11,j-11,ii-11,jj-11)+ + * C(i+11,j-11,ii-11,jj-11)+ C(i-11,j+11,ii-11,jj-11)+ + * C(i-11,j-11,ii+11,jj-11)+ C(i-11,j-11,ii-11,jj+11)+ + * C(i+11,j+11,ii-11,jj-11)+ C(i-11,j+11,ii+11,jj-11)+ + * C(i-11,j-11,ii+11,jj+11)+ C(i+11,j-11,ii-11,jj+11)+ + * C(i+11,j-11,ii+11,jj-11)+ C(i-11,j+11,ii-11,jj+11)+ + * C(i+11,j+11,ii+11,jj-11)+ C(i-11,j+11,ii+11,jj+11)+ + * C(i+11,j-11,ii+11,jj+11)+ C(i+11,j+11,ii-11,jj+11) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc42.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc42.fdv new file mode 100644 index 0000000..f57e6d1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/SHADOW_COMP/sc42.fdv @@ -0,0 +1,801 @@ + program SC42 + +c TESTING OF THE SHADOW DIRECTIVE AND THE SHADOW_COMPUTE CLAUSE +c DISTRIBUTED ARRAY A(N,M,K,L) IS TO HAVE DIFFERENT SHADOW WIDTH +c ON BOTH SIDES + + print *,'===START OF SC42========================' +C -------------------------------------------------- + call sc4201 +C -------------------------------------------------- + call sc4202 +C -------------------------------------------------- + call sc4203 +C ------------------------------------------------- + call sc4204 +C ------------------------------------------------- + call sc4205 +C ------------------------------------------------- + call sc4206 +C -------------------------------------------------- + call sc4207 +C -------------------------------------------------- + call sc4208 +C---------------------------------------------------- + call sc4209 +C---------------------------------------------------- + +C +C + print *,'=== END OF SC42 ========================= ' + end +C ---------------------------------------------SC4201 + subroutine SC4201 + integer, parameter :: N = 16,M=8,K=8,L=8,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,*) +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4201' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + B(i,j,ii,jj) = A(i+1,j+1,ii+1,jj+1)+A(i-1,j-1,ii-1,jj-1)+ + * A(i+1,j-1,ii-1,jj-1)+A(i-1,j+1,ii-1,jj-1)+ + * A(i-1,j-1,ii+1,jj-1)+ A(i-1,j-1,ii-1,jj+1)+ + * A(i+1,j+1,ii-1,jj-1)+A(i-1,j+1,ii+1,jj-1)+ + * A(i-1,j-1,ii+1,jj+1)+A(i+1,j-1,ii-1,jj+1)+ + * A(i+1,j-1,ii+1,jj-1)+A(i-1,j+1,ii-1,jj+1)+ + * A(i+1,j+1,ii+1,jj-1)+A(i-1,j+1,ii+1,jj+1)+ + * A(i+1,j-1,ii+1,jj+1)+A(i+1,j+1,ii-1,jj+1) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=2,N-1 + do j=2,M-1 + do ii=2,K-1 + do jj=2,L-1 + isum = C(i+1,j+1,ii+1,jj+1)+C(i-1,j-1,ii-1,jj-1)+ + * C(i+1,j-1,ii-1,jj-1)+ C(i-1,j+1,ii-1,jj-1)+ + * C(i-1,j-1,ii+1,jj-1)+ C(i-1,j-1,ii-1,jj+1)+ + * C(i+1,j+1,ii-1,jj-1)+ C(i-1,j+1,ii+1,jj-1)+ + * C(i-1,j-1,ii+1,jj+1)+ C(i+1,j-1,ii-1,jj+1)+ + * C(i+1,j-1,ii+1,jj-1)+ C(i-1,j+1,ii-1,jj+1)+ + * C(i+1,j+1,ii+1,jj-1)+ C(i-1,j+1,ii+1,jj+1)+ + * C(i+1,j-1,ii+1,jj+1)+ C(i+1,j+1,ii-1,jj+1) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ---------------------------------------------SC4202 + + subroutine SC4202 + integer, parameter :: N = 16,M=10,K=10,L=10,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4202' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj+2)+A(i-2,j-2,ii-2,jj-2)+ + * A(i+2,j-2,ii-2,jj-2)+ A(i-2,j+2,ii-2,jj-2)+ + * A(i-2,j-2,ii+2,jj-2)+ A(i-2,j-2,ii-2,jj+2)+ + * A(i+2,j+2,ii-2,jj-2)+ A(i-2,j+2,ii+2,jj-2)+ + * A(i-2,j-2,ii+2,jj+2)+ A(i+2,j-2,ii-2,jj+2)+ + * A(i+2,j-2,ii+2,jj-2)+ A(i-2,j+2,ii-2,jj+2)+ + * A(i+2,j+2,ii+2,jj-2)+ A(i-2,j+2,ii+2,jj+2)+ + * A(i+2,j-2,ii+2,jj+2)+ A(i+2,j+2,ii-2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj+2)+C(i-2,j-2,ii-2,jj-2)+ + * C(i+2,j-2,ii-2,jj-2)+ C(i-2,j+2,ii-2,jj-2)+ + * C(i-2,j-2,ii+2,jj-2)+ C(i-2,j-2,ii-2,jj+2)+ + * C(i+2,j+2,ii-2,jj-2)+ C(i-2,j+2,ii+2,jj-2)+ + * C(i-2,j-2,ii+2,jj+2)+ C(i+2,j-2,ii-2,jj+2)+ + * C(i+2,j-2,ii+2,jj-2)+ C(i-2,j+2,ii-2,jj+2)+ + * C(i+2,j+2,ii+2,jj-2)+ C(i-2,j+2,ii+2,jj+2)+ + * C(i+2,j-2,ii+2,jj+2)+ C(i+2,j+2,ii-2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -----------------------------------------SC4203 + subroutine SC4203 + integer, parameter :: N = 16,M=10,K=10,L=10,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK,BLOCK) +!dvm$ shadow(2:2,2:2,2:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4203' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) +!dvm$*,shadow_compute(A(2:0,2:2,2:0,2:0)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i-2,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj)+ A(i-2,j-2,ii,jj)+ + * A(i,j-2,ii,jj)+ A(i,j-2,ii-2,jj)+ + * A(i-2,j-2,ii,jj)+ A(i,j-2,ii-2,jj-2)+ + * A(i,j-2,ii,jj-2)+ A(i-2,j-2,ii-2,jj)+ + * A(i,j-2,ii-2,jj-2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i-2,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj)+ C(i-2,j-2,ii,jj)+ + * C(i,j-2,ii,jj)+ C(i,j-2,ii-2,jj)+ + * C(i-2,j-2,ii,jj)+ C(i,j-2,ii-2,jj-2)+ + * C(i,j-2,ii,jj-2)+ C(i-2,j-2,ii-2,jj)+ + * C(i,j-2,ii-2,jj-2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SC4204 + subroutine SC4204 + integer, parameter :: N = 16,M=10,K=10,L=10,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:2,2:2,0:2,0:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4204' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i+2,j+2,ii+2,jj)+ + * A(i,j-2,ii,jj)+ A(i+2,j-2,ii,jj)+ + * A(i,j+2,ii,jj)+ A(i,j-2,ii+2,jj)+ + * A(i+2,j+2,ii,jj)+ A(i,j-2,ii+2,jj+2)+ + * A(i,j+2,ii,jj+2)+ A(i+2,j+2,ii+2,jj)+ + * A(i,j+2,ii+2,jj+2)+A(i+2,j-2,ii+2,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i+2,j+2,ii+2,jj)+ + * C(i,j-2,ii,jj)+ C(i+2,j-2,ii,jj)+ + * C(i,j+2,ii,jj)+ C(i,j-2,ii+2,jj)+ + * C(i+2,j+2,ii,jj)+ C(i,j-2,ii+2,jj+2)+ + * C(i,j+2,ii,jj+2)+ C(i+2,j+2,ii+2,jj)+ + * C(i,j+2,ii+2,jj+2)+C(i+2,j-2,ii+2,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ------------------------------------------SC4205 + subroutine SC4205 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,*) +!dvm$ shadow(2:2,2:0,0:2,2:2) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4205' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) +!dvm$*,shadow_compute(A(0:0,0:0,0:0,0:2)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + B(i,j,ii,jj) = A(i,j,ii,jj+2) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=3,N-2 + do j=3,M-2 + do ii=3,K-2 + do jj=3,L-2 + isum = C(i,j,ii,jj+2) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C --------------------------------------------SC4206 + subroutine SC4206 + integer, parameter :: N = 32,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,*,BLOCK) +!dvm$ shadow(3:3,3:3,3:3,3:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4206' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i-3,j-3,ii-3,jj-3)+ + * A(i+3,j-3,ii-3,jj-3)+ A(i-3,j+3,ii-3,jj-3)+ + * A(i-3,j-3,ii+3,jj-3)+ A(i-3,j-3,ii-3,jj+3)+ + * A(i+3,j+3,ii-3,jj-3)+ A(i-3,j+3,ii+3,jj-3)+ + * A(i-3,j-3,ii+3,jj+3)+ A(i+3,j-3,ii-3,jj+3)+ + * A(i+3,j-3,ii+3,jj-3)+ A(i-3,j+3,ii-3,jj+3)+ + * A(i+3,j+3,ii+3,jj-3)+ A(i-3,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3)+ A(i+3,j+3,ii-3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i-3,j-3,ii-3,jj-3)+ + * C(i+3,j-3,ii-3,jj-3)+ C(i-3,j+3,ii-3,jj-3)+ + * C(i-3,j-3,ii+3,jj-3)+ C(i-3,j-3,ii-3,jj+3)+ + * C(i+3,j+3,ii-3,jj-3)+ C(i-3,j+3,ii+3,jj-3)+ + * C(i-3,j-3,ii+3,jj+3)+ C(i+3,j-3,ii-3,jj+3)+ + * C(i+3,j-3,ii+3,jj-3)+ C(i-3,j+3,ii-3,jj+3)+ + * C(i+3,j+3,ii+3,jj-3)+ C(i-3,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3)+ C(i+3,j+3,ii-3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC4207 + subroutine SC4207 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,*,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,0:3) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4207' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i+3,j+3,ii+3,jj+3)+A(i,j-3,ii,jj)+ + * A(i+3,j-3,ii,jj)+ A(i,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj)+ A(i+3,j+3,ii,jj)+ + * A(i,j-3,ii+3,jj+3)+ A(i,j+3,ii,jj+3)+ + * A(i+3,j+3,ii+3,jj)+ A(i,j+3,ii+3,jj+3)+ + * A(i+3,j-3,ii+3,jj+3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum = C(i+3,j+3,ii+3,jj+3)+C(i,j-3,ii,jj)+ + * C(i+3,j-3,ii,jj)+ C(i,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj)+ C(i+3,j+3,ii,jj)+ + * C(i,j-3,ii+3,jj+3)+ C(i,j+3,ii,jj+3)+ + * C(i+3,j+3,ii+3,jj)+ C(i,j+3,ii+3,jj+3)+ + * C(i+3,j-3,ii+3,jj+3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC4208 + subroutine SC4208 + integer, parameter :: N = 16,M=16,K=16,L=16,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(*,BLOCK,BLOCK,BLOCK) +!dvm$ shadow(0:3,3:3,0:3,3:0) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4208' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj) +!dvm$*,shadow_compute(A(0:0,0:0,0:0,3:0)) + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + B(i,j,ii,jj) = A(i,j,ii,jj-3) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=4,N-3 + do j=4,M-3 + do ii=4,K-3 + do jj=4,L-3 + isum =C(i,j,ii,jj-3) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C -------------------------------------------SC4209 + subroutine SC4209 + integer, parameter :: N = 60,M=60,K=60,L=60,NL=1000 + integer, allocatable :: A(:,:,:,:),B(:,:,:,:),C(:,:,:,:) + integer nloopi,nloopj,nloopii,nloopjj,isum + character*6 tname + +!dvm$ distribute B(BLOCK,BLOCK,BLOCK,*) +!dvm$ shadow(11:11,11:11,11:11,11:11) :: A +!dvm$ align (i,j,ii,jj) with B(i,j,ii,jj) ::A + + tname='SC4209' + allocate (B(N,M,K,L),A(N,M,K,L),C(N,M,K,L)) + NNL=NL + call serial4(C,N,M,K,L,NNL) + nloopi=NL + nloopj=NL + nloopii=NL + nloopjj=NL + +!dvm$ actual(nloopi,nloopj,nloopii,nloopjj) +!dvm$ region local(A,B) +!dvm$ parallel (i,j,ii,jj) on A(i,j,ii,jj),shadow_compute + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + A(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + B(i,j,ii,jj) = A(i+11,j+11,ii+11,jj+11)+ + * A(i-11,j-11,ii-11,jj-11)+ + * A(i+11,j-11,ii-11,jj-11)+ A(i-11,j+11,ii-11,jj-11)+ + * A(i-11,j-11,ii+11,jj-11)+ A(i-11,j-11,ii-11,jj+11)+ + * A(i+11,j+11,ii-11,jj-11)+ A(i-11,j+11,ii+11,jj-11)+ + * A(i-11,j-11,ii+11,jj+11)+ A(i+11,j-11,ii-11,jj+11)+ + * A(i+11,j-11,ii+11,jj-11)+ A(i-11,j+11,ii-11,jj+11)+ + * A(i+11,j+11,ii+11,jj-11)+ A(i-11,j+11,ii+11,jj+11)+ + * A(i+11,j-11,ii+11,jj+11)+ A(i+11,j+11,ii-11,jj+11) + enddo + enddo + enddo + enddo + +!dvm$ parallel (i,j,ii,jj) on B(i,j,ii,jj), +!dvm$*reduction( min( nloopi),min(nloopj),min(nloopii),min(nloopjj)) +!dvm$*,private(isum) + do i=12,N-11 + do j=12,M-11 + do ii=12,K-11 + do jj=12,L-11 + isum = C(i+11,j+11,ii+11,jj+11)+ + * C(i-11,j-11,ii-11,jj-11)+ + * C(i+11,j-11,ii-11,jj-11)+ C(i-11,j+11,ii-11,jj-11)+ + * C(i-11,j-11,ii+11,jj-11)+ C(i-11,j-11,ii-11,jj+11)+ + * C(i+11,j+11,ii-11,jj-11)+ C(i-11,j+11,ii+11,jj-11)+ + * C(i-11,j-11,ii+11,jj+11)+ C(i+11,j-11,ii-11,jj+11)+ + * C(i+11,j-11,ii+11,jj-11)+ C(i-11,j+11,ii-11,jj+11)+ + * C(i+11,j+11,ii+11,jj-11)+ C(i-11,j+11,ii+11,jj+11)+ + * C(i+11,j-11,ii+11,jj+11)+ C(i+11,j+11,ii-11,jj+11) + if (B(i,j,ii,jj).ne.isum) then + nloopi=min(nloopi,i) + nloopj=min(nloopj,j) + nloopii=min(nloopii,ii) + nloopjj=min(nloopjj,jj) + endif + enddo + enddo + enddo + enddo +!dvm$ end region +!dvm$ get_actual(nloopi,nloopj,nloopii,nloopjj) + + if (nloopi .eq.NL) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (A,B,C) + + end +C ----------------------------------------------- + subroutine serial4(AR,N,M,K,L,NL) + integer AR(N,M,K,L) + integer NL + do i=1,N + do j=1,M + do ii=1,K + do jj=1,L + AR(i,j,ii,jj) = NL+i+j+ii+jj + enddo + enddo + enddo + enddo + end + + subroutine ansyes(name) + character*6 name + print *,name,' - complete' + end + subroutine ansno(name) + character*6 name + print *,name,' - ***error' + end diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst11.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst11.fdv new file mode 100644 index 0000000..77a1f67 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst11.fdv @@ -0,0 +1,203 @@ + PROGRAM taskst11 +! rectangular grid is distributed on two blocks +! +! + PARAMETER (K=8, N1 = 4, ITMAX=20, N2 = K - N1 ) + REAL,ALLOCATABLE :: A(:,:),A1(:,:),A2(:,:) + REAL,ALLOCATABLE :: B(:,:),B1(:,:),B2(:,:) + INTEGER LP(2),HP(2) +!DVM$ PROCESSORS P(NUMBER_OF_PROCESSORS( )) +!DVM$ TASK MB( 2 ) +!DVM$ DISTRIBUTE A(*,BLOCK) ONTO P +!DVM$ ALIGN B( I, J ) WITH A( I, J ) +!DVM$ ALIGN B1( I, J ) WITH A1( I, J ) +!DVM$ ALIGN B2( I, J ) WITH A2( I, J ) +!DVM$ DISTRIBUTE :: A1, A2 + + PRINT *, '===== START OF taskst11 =========' + CALL DPT(LP,HP,2) +!DVM$ MAP MB( 1 ) ONTO P( LP(1) : HP(1) ) + ALLOCATE(A1(N1+1,K)) +!DVM$ REDISTRIBUTE A1( *, BLOCK ) ONTO MB( 1 ) + ALLOCATE(B1(N1+1,K)) +!DVM$ MAP MB( 2 ) ONTO P( LP(2) : HP(2) ) + ALLOCATE(A2(N2+1,K)) +!DVM$ REDISTRIBUTE A2( *, BLOCK ) ONTO MB( 2 ) + ALLOCATE(B2(N2+1,K)) + ALLOCATE(A(K,K),B(K,K)) +! Initialization +!DVM$ TASK_REGION MB +!DVM$ ON MB(1) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON A1(I, J) + DO J = 1, K + DO I = 1, N1 + IF(I.EQ.1 .OR. J.EQ.1 .OR. J.EQ.K) THEN + A1(I, J) = 0. + B1(I, J) = 0. + ELSE + B1(I, J) = 1. + I + J + A1(I, J) = B1(I, J) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ ON MB(2) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON A2(I, J) + DO J = 1, K + DO I = 2, N2+1 + IF(I.EQ.N2+1 .OR. J.EQ.1 .OR. J.EQ.K) THEN + A2(I, J) = 0. + B2(I, J) = 0. + ELSE + B2(I, J) = 1. + (I+N1-1) + J + A2(I, J) = B2(I, J) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ END TASK_REGION + + DO 2 IT = 1, ITMAX + +! exchange bounds +!DVM$ GET_ACTUAL (B2(2,:),B1(N1, :)) +!DVM$ PARALLEL ( J ) ON A1(N1+1, J), +!DVM$* REMOTE_ACCESS (B2( 2, J ) ) + DO J = 1, K + A1(N1+1, J) = B2(2, J) + ENDDO +!DVM$ PARALLEL ( J ) ON A2( 1, J), +!DVM$* REMOTE_ACCESS (B1( N1, J ) ) + DO J = 1, K + A2(1, J) = B1(N1, J) + ENDDO +!DVM$ ACTUAL (A2(1, :),A1(N1+1,:)) +!DVM$ TASK_REGION MB +!DVM$ ON MB( 1 ) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON B1(I, J), +!DVM$* SHADOW_RENEW ( A1 ) + DO J = 2, K-1 + DO I = 2, N1 + B1(I, J)=(A1(I-1, J) + A1(I,J-1) + + * A1(I+1,J) + A1(I,J+1))/4 + ENDDO + ENDDO + +!DVM$ PARALLEL ( J, I ) ON A1(I, J) + DO J = 2, K-1 + DO I = 2, N1 + A1(I, J) = B1( I, J ) + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ ON MB( 2 ) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON B2(I, J), +!DVM$* SHADOW_RENEW ( A2 ) + DO J = 2, K-1 + DO I = 2, N2 + B2(I,J) = (A2(I-1,J) + A2(I,J-1) + + * A2(I+1,J) + A2(I,J+1))/4 + ENDDO + ENDDO +!DVM$ PARALLEL ( J, I ) ON A2(I, J) + DO J = 2, K-1 + DO I = 2, N2 + A2(I, J) = B2( I, J ) + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ END TASK_REGION +2 CONTINUE +!1-task JACOBI + +!DVM$ REGION +!DVM$ PARALLEL (J,I) ON A(I, J) +! nest of two parallel loops, iteration (i,j) will be executed on +! processor, which is owner of element A(i,j) + DO J = 1, K + DO I = 1, K + A(I, J) = 0. + IF(I.EQ.1.OR.J.EQ.1.OR.I.EQ.K.OR.J.EQ.K) THEN + B(I, J) = 0. + ELSE + B(I, J) = ( 1. + I + J ) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION + DO IT = 1, ITMAX +!DVM$ REGION +!DVM$ PARALLEL (J, I) ON A(I, J) +! variable EPS is used for calculation of maximum value + DO J = 2, K-1 + DO I = 2, K-1 + A(I, J) = B(I, J) + ENDDO + ENDDO +!DVM$ PARALLEL (J, I) ON B(I, J), SHADOW_RENEW (A) +! Copying shadow elements of array A from +! neighbouring processors before loop execution + DO J = 2, K-1 + DO I = 2, K-1 + B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+ + * A( I, J+1 )) / 4 + ENDDO + ENDDO +!DVM$ END REGION + ENDDO +!DVM$ GET_ACTUAL (B,B1,B2) +! compare 2-task JACOBI with 1-task JACOBI +!DVM$ PARALLEL (I,J) ON B1(I,J),REMOTE_ACCESS (B(I,J)) + DO I = 2,N1 + DO J = 2, K-1 + IF(B1(I,J).NE.B(I,J)) THEN + PRINT *, ' taskst11 - ***error B1(',I,',',J,')' + print *, '=== END OF taskst11 ==============' + STOP + ENDIF + ENDDO + ENDDO +!DVM$ PARALLEL (I,J) ON B2(I,J),REMOTE_ACCESS (B(I+(N1-1),J)) + DO I = 2,N2 + DO J = 2, K-1 + IF(B2(I,J).NE.B(I+(N1-1),J)) THEN + PRINT *, ' taskst11 - ***error B2(',I,',',J,')', + * 'B(',I+N1-1,',',J,')' + print *, '=== END OF taskst11 ==============' + STOP + ENDIF + ENDDO + ENDDO + PRINT *, ' taskst11 - complete' + print *, '=== END OF taskst11 =====================' + DEALLOCATE (B,B1,B2,A,A1,A2) + END + + SUBROUTINE DPT(LP,HP,NT) +! distributing processors for NT tasks (NT = 2) + INTEGER LP(2), HP(2) + NUMBER_OF_PROCESSORS() = 1 +!DVM$ DEBUG 1 (D = 0) + NP = NUMBER_OF_PROCESSORS() + NTP = NP/NT + IF(NP.EQ.1) THEN + LP(1) = 1 + HP(1) = 1 + LP(2) = 1 + HP(2) = 1 + ELSE + LP(1) = 1 + HP(1) = NTP + LP(2) = NTP+1 + HP(2) = NP + END IF +!DVM$ ENDDEBUG 1 + END diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst12.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst12.fdv new file mode 100644 index 0000000..78c2578 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst12.fdv @@ -0,0 +1,207 @@ + PROGRAM taskst12 +! rectangular grid is distributed on two blocks +! +! + INTEGER,PARAMETER :: K=8, N1 = 4, ITMAX=20, N2 = K - N1 + REAL,ALLOCATABLE :: A(:,:),A1(:,:),A2(:,:) + REAL,ALLOCATABLE :: B(:,:),B1(:,:),B2(:,:) + INTEGER,DIMENSION(2) :: LP,HP +CDVM$ PROCESSORS P(NUMBER_OF_PROCESSORS( )) +CDVM$ TASK MB( 2 ) +CDVM$ DISTRIBUTE A(*,BLOCK) +CDVM$ ALIGN B( I, J ) WITH A( I, J ) +CDVM$ DISTRIBUTE :: A1, A2 +CDVM$ ALIGN :: B1,B2 + + PRINT *, '======== START OF taskst12 ==========' + CALL DPT(LP,HP,2) +CDVM$ MAP MB( 1 ) ONTO P( LP(1) : HP(1) ) + ALLOCATE(A1(N1+1,K)) +CDVM$ REDISTRIBUTE A1( *, BLOCK ) ONTO MB( 1 ) + ALLOCATE(B1(N1+1,K)) +CDVM$ REALIGN B1( I, J ) WITH A1( I, J ) + +CDVM$ MAP MB( 2 ) ONTO P( LP(2) : HP(2) ) + ALLOCATE(A2(N2+1,K)) +CDVM$ REDISTRIBUTE A2( *, BLOCK ) ONTO MB( 2 ) + ALLOCATE(B2(N2+1,K)) +CDVM$ REALIGN B2( I, J ) WITH A2( I, J ) + + ALLOCATE(A(K,K),B(K,K)) + +! Initialization +!DVM$ TASK_REGION MB +!DVM$ ON MB(1) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON A1(I, J) + DO J = 1, K + DO I = 1, N1 + IF(I.EQ.1 .OR. J.EQ.1 .OR. J.EQ.K) THEN + A1(I, J) = 0. + B1(I, J) = 0. + ELSE + B1(I, J) = 1. + I + J + A1(I, J) = B1(I, J) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ ON MB(2) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON A2(I, J) + DO J = 1, K + DO I = 2, N2+1 + IF(I.EQ.N2+1 .OR. J.EQ.1 .OR. J.EQ.K) THEN + A2(I, J) = 0. + B2(I, J) = 0. + ELSE + B2(I, J) = 1. + (I+N1-1) + J + A2(I, J) = B2(I, J) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ END TASK_REGION + + DO 2 IT = 1, ITMAX + +! exchange bounds +!DVM$ GET_ACTUAL (B2(2,:),B1(N1, :)) +!DVM$ PARALLEL ( J ) ON A1(N1+1, J), +!DVM$* REMOTE_ACCESS (B2( 2, J ) ) + DO J = 1, K + A1(N1+1, J) = B2(2, J) + ENDDO +!DVM$ PARALLEL ( J ) ON A2( 1, J), +!DVM$* REMOTE_ACCESS (B1( N1, J ) ) + DO J = 1, K + A2(1, J) = B1(N1, J) + ENDDO +!DVM$ ACTUAL (A2(1, :),A1(N1+1,:)) +!DVM$ TASK_REGION MB +!DVM$ ON MB( 1 ) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON B1(I, J), +!DVM$* SHADOW_RENEW ( A1 ) + DO J = 2, K-1 + DO I = 2, N1 + B1(I, J)=(A1(I-1, J) + A1(I,J-1) + + * A1(I+1,J) + A1(I,J+1))/4 + ENDDO + ENDDO + +!DVM$ PARALLEL ( J, I ) ON A1(I, J) + DO J = 2, K-1 + DO I = 2, N1 + A1(I, J) = B1( I, J ) + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ ON MB( 2 ) +!DVM$ REGION +!DVM$ PARALLEL ( J, I ) ON B2(I, J), +!DVM$* SHADOW_RENEW ( A2 ) + DO J = 2, K-1 + DO I = 2, N2 + B2(I,J) = (A2(I-1,J) + A2(I,J-1) + + * A2(I+1,J) + A2(I,J+1))/4 + ENDDO + ENDDO +!DVM$ PARALLEL ( J, I ) ON A2(I, J) + DO J = 2, K-1 + DO I = 2, N2 + A2(I, J) = B2( I, J ) + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ END ON +!DVM$ END TASK_REGION +2 CONTINUE +!1-task JACOBI + +!DVM$ REGION +!DVM$ PARALLEL (J,I) ON A(I, J) +! nest of two parallel loops, iteration (i,j) will be executed on +! processor, which is owner of element A(i,j) + DO J = 1, K + DO I = 1, K + A(I, J) = 0. + IF(I.EQ.1.OR.J.EQ.1.OR.I.EQ.K.OR.J.EQ.K) THEN + B(I, J) = 0. + ELSE + B(I, J) = ( 1. + I + J ) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION + DO IT = 1, ITMAX +!DVM$ REGION +!DVM$ PARALLEL (J, I) ON A(I, J) +! variable EPS is used for calculation of maximum value + DO J = 2, K-1 + DO I = 2, K-1 + A(I, J) = B(I, J) + ENDDO + ENDDO +!DVM$ PARALLEL (J, I) ON B(I, J), SHADOW_RENEW (A) +! Copying shadow elements of array A from +! neighbouring processors before loop execution + DO J = 2, K-1 + DO I = 2, K-1 + B(I, J) = (A( I-1, J ) + A( I, J-1 ) + A( I+1, J)+ + * A( I, J+1 )) / 4 + ENDDO + ENDDO +!DVM$ END REGION + ENDDO +!DVM$ GET_ACTUAL (B,B1,B2) +! compare 2-task JACOBI with 1-task JACOBI +!DVM$ PARALLEL (I,J) ON B1(I,J),REMOTE_ACCESS (B(I,J)) + DO I = 2,N1 + DO J = 2, K-1 + IF(B1(I,J).NE.B(I,J)) THEN + PRINT *, ' taskst12- ***error B1(',I,',',J,')' + print *, '=== END OF taskst12 ==============' + STOP + ENDIF + ENDDO + ENDDO +!DVM$ PARALLEL (I,J) ON B2(I,J),REMOTE_ACCESS (B(I+(N1-1),J)) + DO I = 2,N2 + DO J = 2, K-1 + IF(B2(I,J).NE.B(I+(N1-1),J)) THEN + PRINT *, ' taskst12 - ***error B2(',I,',',J,')', + * 'B(',I+N1-1,',',J,')' + print *, '=== END OF taskst12 ==============' + STOP + ENDIF + ENDDO + ENDDO + PRINT *, ' taskst12 - complete' + print *, '=== END OF taskst12 =====================' + DEALLOCATE (B,B1,B2,A,A1,A2) + END + + SUBROUTINE DPT(LP,HP,NT) +! distributing processors for NT tasks (NT = 2) + INTEGER LP(2), HP(2) + NUMBER_OF_PROCESSORS() = 1 +!DVM$ DEBUG 1 (D = 0) + NP = NUMBER_OF_PROCESSORS() + NTP = NP/NT + IF(NP.EQ.1) THEN + LP(1) = 1 + HP(1) = 1 + LP(2) = 1 + HP(2) = 1 + ELSE + LP(1) = 1 + HP(1) = NTP + LP(2) = NTP+1 + HP(2) = NP + END IF +!DVM$ ENDDEBUG 1 + END diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst21.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst21.f90 new file mode 100644 index 0000000..a7659b1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst21.f90 @@ -0,0 +1,229 @@ +program taskst21 + integer, parameter :: k = 8, n1 = 4, itmax = 20, n2 = k - n1 + real, allocatable :: a( :, :, : ), a1( :, :, : ), a2( :, :, : ) + real, allocatable :: b( :, :, : ), b1( :, :, : ), b2( :, :, : ) + integer lp( 2 ), hp( 2 ) + !dvm$ processors p( processors_size( 1 ), processors_size( 2 ) ) + !dvm$ task mb( 2 ) + + !dvm$ distribute a( *, block, block ) onto p + !dvm$ align b( i, j, ii ) with a( i, j, ii ) + + !dvm$ distribute :: a1, a2 + !dvm$ align b1( i, j, ii ) with a1( i, j, ii ) + !dvm$ align b2( i, j, ii ) with a2( i, j, ii ) + + print *, '====== START OF taskst21 ========' + call dpt( lp, hp, 2 ) + !dvm$ map mb( 1 ) onto p( lp( 1 ) : hp( 1 ), : ) + allocate( a1( n1 + 1, k, k ) ) + !dvm$ redistribute a1( *, block, block ) onto mb( 1 ) + allocate( b1( n1 + 1, k, k ) ) + + !dvm$ map mb( 2 ) onto p( lp( 2 ) : hp( 2 ), : ) + allocate( a2( n2 + 1, k, k ) ) + !dvm$ redistribute a2( *, block, block ) onto mb( 2 ) + allocate( b2( n2 + 1, k, k ) ) + + allocate( a( k, k, k ), b( k, k, k ) ) + + !initialization + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a1( i, j, ii ) + do ii = 1, k + do j = 1, k + do i = 1, n1 + if( i .eq. 1 .or. j .eq. 1 .or. j .eq. k .or. ii .eq. 1 .or. ii .eq. k ) then + a1( i, j, ii ) = 0. + b1( i, j, ii ) = 0. + else + b1( i, j, ii ) = 1. + i + j + ii + a1( i, j, ii ) = b1( i, j, ii ) + endif + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a2( i, j, ii ) + do ii = 1, k + do j = 1, k + do i = 2, n2 + 1 + if( i .eq. n2 + 1 .or. j .eq. 1 .or. j .eq. k .or. ii .eq. 1 .or. ii .eq. k ) then + a2( i, j, ii ) = 0. + b2( i, j, ii ) = 0. + else + b2( i, j, ii ) = 1. + ( i + n1 - 1 ) + j + ii + a2( i, j, ii ) = b2( i, j, ii ) + endif + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + + do it = 1, itmax + !exchange bounds + !dvm$ get_actual(b2( 2, :, : ),b1( n1, :, : )) + !dvm$ parallel ( ii, j ) on a1( n1 + 1, j, ii ), remote_access ( b2( 2, j, ii ) ) + do ii = 1, k + do j = 1, k + a1( n1 + 1, j, ii ) = b2( 2, j, ii ) + enddo + enddo + + !dvm$ parallel ( ii, j ) on a2( 1, j, ii ), remote_access ( b1( n1, j, ii ) ) + do ii = 1, k + do j = 1, k + a2( 1, j, ii ) = b1( n1, j, ii ) + enddo + enddo + !dvm$ actual(a1( n1 + 1, :, : ),a2( 1, :, : )) + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on b1( i, j, ii ), shadow_renew ( a1 ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + b1( i, j, ii ) = ( a1( i - 1, j, ii ) + a1( i + 1, j, ii ) + & + a1( i, j - 1, ii ) + a1( i, j + 1, ii ) + & + a1( i, j, ii - 1 ) + a1( i, j, ii + 1 ) ) / 6 + enddo + enddo + enddo + + !dvm$ parallel ( ii, j, i ) on a1( i, j, ii ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + a1( i, j, ii ) = b1( i, j, ii ) + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on b2( i, j, ii ), shadow_renew ( a2 ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + b2( i, j, ii ) = ( a2( i - 1, j, ii ) + a2( i + 1, j, ii ) + & + a2( i, j - 1, ii ) + a2( i, j + 1, ii ) + & + a2( i, j, ii - 1 ) + a2( i, j, ii + 1 ) ) / 6 + enddo + enddo + enddo + !dvm$ parallel ( ii, j, i ) on a2( i, j, ii ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + a2( i, j, ii ) = b2( i, j, ii ) + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + enddo + + !1 - task jacobi + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a( i, j, ii ) + do ii = 1, k + do j = 1, k + do i = 1, k + a( i, j, ii ) = 0. + if( i .eq. 1 .or. j .eq. 1 .or. i .eq. k .or. j .eq. k .or. ii .eq. 1 .or. ii .eq. k ) then + b( i, j, ii ) = 0. + else + b( i, j, ii ) = ( 1. + i + j + ii ) + endif + enddo + enddo + enddo + !dvm$ end region + + do it = 1, itmax + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a( i, j, ii ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + a( i, j, ii ) = b( i, j, ii ) + enddo + enddo + enddo + !dvm$ parallel ( ii, j, i ) on b( i, j, ii ), shadow_renew( a ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + b( i, j, ii ) = ( a( i - 1, j, ii ) + a( i + 1, j, ii ) + & + a( i, j - 1, ii ) + a( i, j + 1, ii ) + & + a( i, j, ii - 1 ) + a( i, j, ii + 1 ) ) / 6 + enddo + enddo + enddo + !dvm$ end region + enddo + + ! compare 2 - task jacobi with 1 - task jacobi + !dvm$ get_actual(b,b1,b2) + !dvm$ parallel ( i, j, ii ) on b1( i, j, ii ), remote_access ( b( i, j, ii ) ) + do i = 2, n1 + do j = 2, k - 1 + do ii = 2, k - 1 + if( b1( i, j, ii ) .ne. b( i, j, ii ) ) then + print *, 'taskst21 - ***error b1( ', i, ', ', j, ', ', ii, ' )' + print *, '=== END OF taskst21 ==============' + stop + endif + enddo + enddo + enddo + + !dvm$ parallel ( i, j, ii ) on b2( i, j, ii ), remote_access ( b( i + ( n1 - 1 ), j, ii ) ) + do i = 2, n2 + do j = 2, k - 1 + do ii = 2, k - 1 + if( b2( i, j, ii ) .ne. b( i + ( n1 - 1 ), j, ii ) ) then + print *, 'taskst21 - ***error b2( ', i, ', ', j, ', ', ii, ' )', '( ', i + n1 - 1, ', ', j, ', ', ii, ' )' + print *, '=== END OF taskst21 ==============' + stop + endif + enddo + enddo + enddo + print *, 'taskst21 - complete' + print *, '=== END OF taskst21 =====================' + deallocate(b,b1,b2,a,a1,a2) +end + +subroutine dpt( lp, hp, nt ) + !distributing processors for nt tasks ( nt = 2 ) + integer lp( 2 ), hp( 2 ) + processors_size( i ) = 1 + !dvm$ debug 1 ( d = 0 ) + np = processors_size( 1 ) + ntp = np/nt + if( np .eq. 1 ) then + lp( 1 ) = 1 + hp( 1 ) = 1 + lp( 2 ) = 1 + hp( 2 ) = 1 + else + lp( 1 ) = 1 + hp( 1 ) = ntp + lp( 2 ) = ntp + 1 + hp( 2 ) = np + end if + !dvm$ enddebug 1 +end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst22.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst22.f90 new file mode 100644 index 0000000..824b9fd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst22.f90 @@ -0,0 +1,230 @@ +program taskst22 + integer, parameter :: k = 8, n1 = 4, itmax = 20, n2 = k - n1 + real, allocatable :: a( :, :, : ), a1( :, :, : ), a2( :, :, : ) + real, allocatable :: b( :, :, : ), b1( :, :, : ), b2( :, :, : ) + integer, dimension( 2 ) :: lp, hp + !dvm$ processors p( processors_size( 1 ), processors_size( 2 ) ) + !dvm$ task mb( 2 ) + + !dvm$ distribute a( *, block, block ) onto p + !dvm$ align b( i, j, ii ) with a( i, j, ii ) + + !dvm$ distribute :: a1, a2 + !dvm$ align :: b1, b2 + + print *, '====== START OF taskst22 ==========' + call dpt( lp, hp, 2 ) + !dvm$ map mb( 1 ) onto p( lp( 1 ) : hp( 1 ), : ) + allocate( a1( n1 + 1, k, k ) ) + !dvm$ redistribute a1( *, block, block ) onto mb( 1 ) + allocate( b1( n1 + 1, k, k ) ) + !dvm$ realign b1( i, j, ii ) with a1( i, j, ii ) + + !dvm$ map mb( 2 ) onto p( lp( 2 ) : hp( 2 ), : ) + allocate( a2( n2 + 1, k, k ) ) + !dvm$ redistribute a2( *, block, block ) onto mb( 2 ) + allocate( b2( n2 + 1, k, k ) ) + !dvm$ realign b2( i, j, ii ) with a2( i, j, ii ) + + allocate( a( k, k, k ), b( k, k, k ) ) + + !initialization + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a1( i, j, ii ) + do ii = 1, k + do j = 1, k + do i = 1, n1 + if( i .eq. 1 .or. j .eq. 1 .or. j .eq. k .or. ii .eq. 1 .or. ii .eq. k ) then + a1( i, j, ii ) = 0. + b1( i, j, ii ) = 0. + else + b1( i, j, ii ) = 1. + i + j + ii + a1( i, j, ii ) = b1( i, j, ii ) + endif + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a2( i, j, ii ) + do ii = 1, k + do j = 1, k + do i = 2, n2 + 1 + if( i .eq. n2 + 1 .or. j .eq. 1 .or. j .eq. k .or. ii .eq. 1 .or. ii .eq. k ) then + a2( i, j, ii ) = 0. + b2( i, j, ii ) = 0. + else + b2( i, j, ii ) = 1. + ( i + n1 - 1 ) + j + ii + a2( i, j, ii ) = b2( i, j, ii ) + endif + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + + do it = 1, itmax + !exchange bounds + !dvm$ get_actual(b2( 2, :, : ),b1( n1, :, : )) + !dvm$ parallel ( ii, j ) on a1( n1 + 1, j, ii ), remote_access ( b2( 2, j, ii ) ) + do ii = 1, k + do j = 1, k + a1( n1 + 1, j, ii ) = b2( 2, j, ii ) + enddo + enddo + + !dvm$ parallel ( ii, j ) on a2( 1, j, ii ), remote_access ( b1( n1, j, ii ) ) + do ii = 1, k + do j = 1, k + a2( 1, j, ii ) = b1( n1, j, ii ) + enddo + enddo + !dvm$ actual(a1( n1 + 1, :, : ),a2( 1, :, : )) + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on b1( i, j, ii ), shadow_renew ( a1 ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + b1( i, j, ii ) = ( a1( i - 1, j, ii ) + a1( i + 1, j, ii ) + & + a1( i, j - 1, ii ) + a1( i, j + 1, ii ) + & + a1( i, j, ii - 1 ) + a1( i, j, ii + 1 ) ) / 6 + enddo + enddo + enddo + + !dvm$ parallel ( ii, j, i ) on a1( i, j, ii ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + a1( i, j, ii ) = b1( i, j, ii ) + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( ii, j, i ) on b2( i, j, ii ), shadow_renew ( a2 ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + b2( i, j, ii ) = ( a2( i - 1, j, ii ) + a2( i + 1, j, ii ) + & + a2( i, j - 1, ii ) + a2( i, j + 1, ii ) + & + a2( i, j, ii - 1 ) + a2( i, j, ii + 1 ) ) / 6 + enddo + enddo + enddo + !dvm$ parallel ( ii, j, i ) on a2( i, j, ii ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + a2( i, j, ii ) = b2( i, j, ii ) + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + enddo + + !1 - task jacobi + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a( i, j, ii ) + do ii = 1, k + do j = 1, k + do i = 1, k + a( i, j, ii ) = 0. + if( i .eq. 1 .or. j .eq. 1 .or. i .eq. k .or. j .eq. k .or. ii .eq. 1 .or. ii .eq. k ) then + b( i, j, ii ) = 0. + else + b( i, j, ii ) = ( 1. + i + j + ii ) + endif + enddo + enddo + enddo + !dvm$ end region + + do it = 1, itmax + !dvm$ region + !dvm$ parallel ( ii, j, i ) on a( i, j, ii ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + a( i, j, ii ) = b( i, j, ii ) + enddo + enddo + enddo + !dvm$ parallel ( ii, j, i ) on b( i, j, ii ), shadow_renew( a ) + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + b( i, j, ii ) = ( a( i - 1, j, ii ) + a( i + 1, j, ii ) + & + a( i, j - 1, ii ) + a( i, j + 1, ii ) + & + a( i, j, ii - 1 ) + a( i, j, ii + 1 ) ) / 6 + enddo + enddo + enddo + !dvm$ end region + enddo + + ! compare 2 - task jacobi with 1 - task jacobi + !dvm$ get_actual(b,b1,b2) + !dvm$ parallel ( i, j, ii ) on b1( i, j, ii ), remote_access ( b( i, j, ii ) ) + do i = 2, n1 + do j = 2, k - 1 + do ii = 2, k - 1 + if( b1( i, j, ii ) .ne. b( i, j, ii ) ) then + print *, 'taskst22 - ***error b1( ', i, ', ', j, ', ', ii, ' )' + print *, '=== END OF taskst22 ==============' + stop + endif + enddo + enddo + enddo + + !dvm$ parallel ( i, j, ii ) on b2( i, j, ii ), remote_access ( b( i + ( n1 - 1 ), j, ii ) ) + do i = 2, n2 + do j = 2, k - 1 + do ii = 2, k - 1 + if( b2( i, j, ii ) .ne. b( i + ( n1 - 1 ), j, ii ) ) then + print *, 'taskst22 - ***error b2( ', i, ', ', j, ', ', ii, ' )', '( ', i + n1 - 1, ', ', j, ', ', ii, ' )' + print *, '=== END OF taskst22 ==============' + stop + endif + enddo + enddo + enddo + print *, 'taskst22 - complete' + print *, '=== END OF taskst22 =====================' + deallocate(b,b1,b2,a,a1,a2) +end + +subroutine dpt( lp, hp, nt ) + !distributing processors for nt tasks ( nt = 2 ) + integer lp( 2 ), hp( 2 ) + processors_size( i ) = 1 + !dvm$ debug 1 ( d = 0 ) + np = processors_size( 1 ) + ntp = np/nt + if( np .eq. 1 ) then + lp( 1 ) = 1 + hp( 1 ) = 1 + lp( 2 ) = 1 + hp( 2 ) = 1 + else + lp( 1 ) = 1 + hp( 1 ) = ntp + lp( 2 ) = ntp + 1 + hp( 2 ) = np + end if + !dvm$ enddebug 1 +end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst31.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst31.f90 new file mode 100644 index 0000000..92e0c07 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst31.f90 @@ -0,0 +1,271 @@ +program taskst31 + integer, parameter :: k = 8, n1 = 4, itmax = 20, n2 = k - n1 + real, allocatable :: a( :, :, :, : ), a1( :, :, :, : ), a2( :, :, :, : ) + real, allocatable :: b( :, :, :, : ), b1( :, :, :, : ), b2( :, :, :, : ) + integer lp( 2 ), hp( 2 ) + !dvm$ processors p( processors_size( 1 ), processors_size( 2 ), processors_size( 3 ) ) + !dvm$ task mb( 2 ) + + !dvm$ distribute a( *, block, block, block ) onto p + !dvm$ align b( i, j, ii, jj ) with a( i, j, ii, jj ) + + !dvm$ distribute :: a1, a2 + !dvm$ align b1( i, j, ii, jj ) with a1( i, j, ii, jj ) + !dvm$ align b2( i, j, ii, jj ) with a2( i, j, ii, jj ) + + + print *, '======= START OF taskst31 =========' + call dpt( lp, hp, 2 ) + !dvm$ map mb( 1 ) onto p( lp( 1 ) : hp( 1 ), :, : ) + allocate( a1( n1 + 1, k, k, k ) ) + !dvm$ redistribute a1( *, block, block, block ) onto mb( 1 ) + allocate( b1( n1 + 1, k, k, k ) ) + + !dvm$ map mb( 2 ) onto p( lp( 2 ) : hp( 2 ), :, : ) + allocate( a2( n2 + 1, k, k, k ) ) + !dvm$ redistribute a2( *, block, block, block ) onto mb( 2 ) + allocate( b2( n2 + 1, k, k, k ) ) + + allocate( a( k, k, k, k ), b( k, k, k, k ) ) + + !initialization + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a1( i, j, ii, jj ) + do jj = 1, k + do ii = 1, k + do j = 1, k + do i = 1, n1 + if( i .eq. 1 .or. & + j .eq. 1 .or. j .eq. k .or. & + ii .eq. 1 .or. ii .eq. k .or. & + jj .eq. 1 .or. jj .eq. k ) then + a1( i, j, ii, jj ) = 0. + b1( i, j, ii, jj ) = 0. + else + b1( i, j, ii, jj ) = 1. + i + j + ii + jj + a1( i, j, ii, jj ) = b1( i, j, ii, jj ) + endif + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a2( i, j, ii, jj ) + do jj = 1, k + do ii = 1, k + do j = 1, k + do i = 2, n2 + 1 + if( i .eq. n2 + 1 .or. & + j .eq. 1 .or. j .eq. k .or. & + ii .eq. 1 .or. ii .eq. k .or. & + jj .eq. 1 .or. jj .eq. k ) then + a2( i, j, ii, jj ) = 0. + b2( i, j, ii, jj ) = 0. + else + b2( i, j, ii, jj ) = 1. + ( i + n1 - 1 ) + j + ii + jj + a2( i, j, ii, jj ) = b2( i, j, ii, jj ) + endif + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + + do it = 1, itmax + + !DVM$ get_actual(b2(2,:,:,:)) + !exchange bounds + !dvm$ parallel ( jj, ii, j ) on a1( n1 + 1, j, ii, jj ), remote_access ( b2( 2, j, ii, jj ) ) + do jj = 1, k + do ii = 1, k + do j = 1, k + a1( n1 + 1, j, ii, jj ) = b2( 2, j, ii, jj ) + enddo + enddo + enddo + !dvm$ actual(a1(n1+1,:,:,:)) + !dvm$ get_actual (b1(n1,:,:,:)) + !dvm$ parallel ( jj, ii, j ) on a2( 1, j, ii, jj ), remote_access ( b1( n1, j, ii, jj ) ) + do jj = 1, k + do ii = 1, k + do j = 1, k + a2( 1, j, ii, jj ) = b1( n1, j, ii, jj ) + enddo + enddo + enddo + !dvm$ actual(a2(1,:,:,:)) + + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on b1( i, j, ii, jj ), shadow_renew ( a1 ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + b1( i, j, ii, jj ) = ( a1( i - 1, j, ii, jj ) + a1( i + 1, j, ii, jj ) + & + a1( i, j - 1, ii, jj ) + a1( i, j + 1, ii, jj ) + & + a1( i, j, ii - 1, jj ) + a1( i, j, ii + 1, jj ) + & + a1( i, j, ii, jj - 1 ) + a1( i, j, ii, jj + 1 ) ) / 8 + enddo + enddo + enddo + enddo + + !dvm$ parallel ( jj, ii, j, i ) on a1( i, j, ii, jj ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + a1( i, j, ii, jj ) = b1( i, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on b2( i, j, ii, jj ), shadow_renew ( a2 ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + b2( i, j, ii, jj ) = ( a2( i - 1, j, ii, jj ) + a2( i + 1, j, ii, jj ) + & + a2( i, j - 1, ii, jj ) + a2( i, j + 1, ii, jj ) + & + a2( i, j, ii - 1, jj ) + a2( i, j, ii + 1, jj ) + & + a2( i, j, ii, jj - 1 ) + a2( i, j, ii, jj + 1 ) ) / 8 + enddo + enddo + enddo + enddo + !dvm$ parallel ( jj, ii, j, i ) on a2( i, j, ii, jj ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + a2( i, j, ii, jj ) = b2( i, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + enddo + + !1 - task jacobi + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a( i, j, ii, jj ) + do jj = 1, k + do ii = 1, k + do j = 1, k + do i = 1, k + a( i, j, ii, jj ) = 0. + if( i .eq. 1 .or. j .eq. 1 .or. & + i .eq. k .or. j .eq. k .or. & + ii .eq. 1 .or. ii .eq. k .or. & + jj .eq. 1 .or. jj .eq. k ) then + b( i, j, ii, jj ) = 0. + else + b( i, j, ii, jj ) = ( 1. + i + j + ii + jj ) + endif + enddo + enddo + enddo + enddo + !dvm$ end region + + do it = 1, itmax + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a( i, j, ii, jj ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + a( i, j, ii, jj ) = b( i, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( jj, ii, j, i ) on b( i, j, ii, jj ), shadow_renew( a ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + b( i, j, ii, jj ) = ( a( i - 1, j, ii, jj ) + a( i + 1, j, ii, jj ) + & + a( i, j - 1, ii, jj ) + a( i, j + 1, ii, jj ) + & + a( i, j, ii - 1, jj ) + a( i, j, ii + 1, jj ) + & + a( i, j, ii, jj - 1 ) + a( i, j, ii, jj + 1 ) ) / 8 + enddo + enddo + enddo + enddo + !dvm$ end region + enddo + !dvm$ get_actual(b,b1,b2) + ! compare 2 - task jacobi with 1 - task jacobi + !dvm$ parallel ( i, j, ii, jj ) on b1( i, j, ii, jj ), remote_access ( b( i, j, ii, jj ) ) + do i = 2, n1 + do j = 2, k - 1 + do ii = 2, k - 1 + do jj = 2, k - 1 + if( b1( i, j, ii, jj ) .ne. b( i, j, ii, jj ) ) then + print *, 'taskst31 - ***error b1( ', i, ', ', j, ', ', ii, ', ', jj, ' )' + print *, '=== END OF taskst31 ==============' + stop + endif + enddo + enddo + enddo + enddo + + !dvm$ parallel ( i, j, ii, jj ) on b2( i, j, ii, jj ), remote_access ( b( i + ( n1 - 1 ), j, ii, jj ) ) + do i = 2, n2 + do j = 2, k - 1 + do ii = 2, k - 1 + do jj = 2, k - 1 + if( b2( i, j, ii, jj ) .ne. b( i + ( n1 - 1 ), j, ii, jj ) ) then + print *, 'taskst31 - ***error b2( ', i, ', ', j, ', ', ii, ', ', jj, ' )', '( ', i + n1 - 1, ', ', j, ', ', ii, ', ', jj, ' )' + print *, '=== END OF taskst31 ==============' + stop + endif + enddo + enddo + enddo + enddo + print *, 'taskst31 - complete' + print *, '=== END OF taskst31 =====================' + deallocate(b,b1,b2,a,a1,a2) +end + +subroutine dpt( lp, hp, nt ) + !distributing processors for nt tasks ( nt = 2 ) + integer lp( 2 ), hp( 2 ) + processors_size( i ) = 1 + !dvm$ debug 1 ( d = 0 ) + np = processors_size( 1 ) + ntp = np/nt + if( np .eq. 1 ) then + lp( 1 ) = 1 + hp( 1 ) = 1 + lp( 2 ) = 1 + hp( 2 ) = 1 + else + lp( 1 ) = 1 + hp( 1 ) = ntp + lp( 2 ) = ntp + 1 + hp( 2 ) = np + end if + !dvm$ enddebug 1 +end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst32.f90 b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst32.f90 new file mode 100644 index 0000000..e254eb7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TASK/taskst32.f90 @@ -0,0 +1,271 @@ +program taskst32 + integer, parameter :: k = 8, n1 = 4, itmax = 20, n2 = k - n1 + real, allocatable :: a( :, :, :, : ), a1( :, :, :, : ), a2( :, :, :, : ) + real, allocatable :: b( :, :, :, : ), b1( :, :, :, : ), b2( :, :, :, : ) + integer lp( 2 ), hp( 2 ) + !dvm$ processors p( processors_size( 1 ), processors_size( 2 ), processors_size( 3 ) ) + !dvm$ task mb( 2 ) + + !dvm$ distribute a( *, block, block, block ) onto p + !dvm$ align b( i, j, ii, jj ) with a( i, j, ii, jj ) + + !dvm$ distribute :: a1, a2 + !dvm$ align :: b1, b2 + + print *, '======= START OF taskst32 =========' + call dpt( lp, hp, 2 ) + !dvm$ map mb( 1 ) onto p( lp( 1 ) : hp( 1 ), :, : ) + allocate( a1( n1 + 1, k, k, k ) ) + !dvm$ redistribute a1( *, block, block, block ) onto mb( 1 ) + allocate( b1( n1 + 1, k, k, k ) ) + !dvm$ realign b1( i, j, ii, jj ) with a1( i, j, ii, jj ) + + !dvm$ map mb( 2 ) onto p( lp( 2 ) : hp( 2 ), :, : ) + allocate( a2( n2 + 1, k, k, k ) ) + !dvm$ redistribute a2( *, block, block, block ) onto mb( 2 ) + allocate( b2( n2 + 1, k, k, k ) ) + !dvm$ realign b2( i, j, ii, jj ) with a2( i, j, ii, jj ) + + allocate( a( k, k, k, k ), b( k, k, k, k ) ) + + !initialization + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a1( i, j, ii, jj ) + do jj = 1, k + do ii = 1, k + do j = 1, k + do i = 1, n1 + if( i .eq. 1 .or. & + j .eq. 1 .or. j .eq. k .or. & + ii .eq. 1 .or. ii .eq. k .or. & + jj .eq. 1 .or. jj .eq. k ) then + a1( i, j, ii, jj ) = 0. + b1( i, j, ii, jj ) = 0. + else + b1( i, j, ii, jj ) = 1. + i + j + ii + jj + a1( i, j, ii, jj ) = b1( i, j, ii, jj ) + endif + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a2( i, j, ii, jj ) + do jj = 1, k + do ii = 1, k + do j = 1, k + do i = 2, n2 + 1 + if( i .eq. n2 + 1 .or. & + j .eq. 1 .or. j .eq. k .or. & + ii .eq. 1 .or. ii .eq. k .or. & + jj .eq. 1 .or. jj .eq. k ) then + a2( i, j, ii, jj ) = 0. + b2( i, j, ii, jj ) = 0. + else + b2( i, j, ii, jj ) = 1. + ( i + n1 - 1 ) + j + ii + jj + a2( i, j, ii, jj ) = b2( i, j, ii, jj ) + endif + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + + do it = 1, itmax + + !DVM$ get_actual(b2(2,:,:,:)) + !exchange bounds + !dvm$ parallel ( jj, ii, j ) on a1( n1 + 1, j, ii, jj ), remote_access ( b2( 2, j, ii, jj ) ) + do jj = 1, k + do ii = 1, k + do j = 1, k + a1( n1 + 1, j, ii, jj ) = b2( 2, j, ii, jj ) + enddo + enddo + enddo + !dvm$ actual(a1(n1+1,:,:,:)) + !dvm$ get_actual (b1(n1,:,:,:)) + !dvm$ parallel ( jj, ii, j ) on a2( 1, j, ii, jj ), remote_access ( b1( n1, j, ii, jj ) ) + do jj = 1, k + do ii = 1, k + do j = 1, k + a2( 1, j, ii, jj ) = b1( n1, j, ii, jj ) + enddo + enddo + enddo + !dvm$ actual(a2(1,:,:,:)) + + !dvm$ task_region mb + !dvm$ on mb( 1 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on b1( i, j, ii, jj ), shadow_renew ( a1 ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + b1( i, j, ii, jj ) = ( a1( i - 1, j, ii, jj ) + a1( i + 1, j, ii, jj ) + & + a1( i, j - 1, ii, jj ) + a1( i, j + 1, ii, jj ) + & + a1( i, j, ii - 1, jj ) + a1( i, j, ii + 1, jj ) + & + a1( i, j, ii, jj - 1 ) + a1( i, j, ii, jj + 1 ) ) / 8 + enddo + enddo + enddo + enddo + + !dvm$ parallel ( jj, ii, j, i ) on a1( i, j, ii, jj ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n1 + a1( i, j, ii, jj ) = b1( i, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + + !dvm$ on mb( 2 ) + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on b2( i, j, ii, jj ), shadow_renew ( a2 ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + b2( i, j, ii, jj ) = ( a2( i - 1, j, ii, jj ) + a2( i + 1, j, ii, jj ) + & + a2( i, j - 1, ii, jj ) + a2( i, j + 1, ii, jj ) + & + a2( i, j, ii - 1, jj ) + a2( i, j, ii + 1, jj ) + & + a2( i, j, ii, jj - 1 ) + a2( i, j, ii, jj + 1 ) ) / 8 + enddo + enddo + enddo + enddo + !dvm$ parallel ( jj, ii, j, i ) on a2( i, j, ii, jj ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, n2 + a2( i, j, ii, jj ) = b2( i, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ end region + !dvm$ end on + !dvm$ end task_region + enddo + + !1 - task jacobi + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a( i, j, ii, jj ) + do jj = 1, k + do ii = 1, k + do j = 1, k + do i = 1, k + a( i, j, ii, jj ) = 0. + if( i .eq. 1 .or. j .eq. 1 .or. & + i .eq. k .or. j .eq. k .or. & + ii .eq. 1 .or. ii .eq. k .or. & + jj .eq. 1 .or. jj .eq. k ) then + b( i, j, ii, jj ) = 0. + else + b( i, j, ii, jj ) = ( 1. + i + j + ii + jj ) + endif + enddo + enddo + enddo + enddo + !dvm$ end region + + do it = 1, itmax + !dvm$ region + !dvm$ parallel ( jj, ii, j, i ) on a( i, j, ii, jj ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + a( i, j, ii, jj ) = b( i, j, ii, jj ) + enddo + enddo + enddo + enddo + !dvm$ parallel ( jj, ii, j, i ) on b( i, j, ii, jj ), shadow_renew( a ) + do jj = 2, k - 1 + do ii = 2, k - 1 + do j = 2, k - 1 + do i = 2, k - 1 + b( i, j, ii, jj ) = ( a( i - 1, j, ii, jj ) + a( i + 1, j, ii, jj ) + & + a( i, j - 1, ii, jj ) + a( i, j + 1, ii, jj ) + & + a( i, j, ii - 1, jj ) + a( i, j, ii + 1, jj ) + & + a( i, j, ii, jj - 1 ) + a( i, j, ii, jj + 1 ) ) / 8 + enddo + enddo + enddo + enddo + !dvm$ end region + enddo + !dvm$ get_actual(b,b1,b2) + ! compare 2 - task jacobi with 1 - task jacobi + !dvm$ parallel ( i, j, ii, jj ) on b1( i, j, ii, jj ), remote_access ( b( i, j, ii, jj ) ) + do i = 2, n1 + do j = 2, k - 1 + do ii = 2, k - 1 + do jj = 2, k - 1 + if( b1( i, j, ii, jj ) .ne. b( i, j, ii, jj ) ) then + print *, 'taskst32 - ***error b1( ', i, ', ', j, ', ', ii, ', ', jj, ' )' + print *, '=== END OF taskst32 ==============' + stop + endif + enddo + enddo + enddo + enddo + + !dvm$ parallel ( i, j, ii, jj ) on b2( i, j, ii, jj ), remote_access ( b( i + ( n1 - 1 ), j, ii, jj ) ) + do i = 2, n2 + do j = 2, k - 1 + do ii = 2, k - 1 + do jj = 2, k - 1 + if( b2( i, j, ii, jj ) .ne. b( i + ( n1 - 1 ), j, ii, jj ) ) then + print *, 'taskst32 - ***error b2( ', i, ', ', j, ', ', ii, ', ', jj, ' )', '( ', i + n1 - 1, ', ', j, ', ', ii, ', ', jj, ' )' + print *, '=== END OF taskst32 ==============' + stop + endif + enddo + enddo + enddo + enddo + print *, 'taskst32 - complete' + print *, '=== END OF taskst32 =====================' + deallocate(b,b1,b2,a,a1,a2) +end + +subroutine dpt( lp, hp, nt ) + !distributing processors for nt tasks ( nt = 2 ) + integer lp( 2 ), hp( 2 ) + processors_size( i ) = 1 + !dvm$ debug 1 ( d = 0 ) + np = processors_size( 1 ) + ntp = np/nt + if( np .eq. 1 ) then + lp( 1 ) = 1 + hp( 1 ) = 1 + lp( 2 ) = 1 + hp( 2 ) = 1 + else + lp( 1 ) = 1 + hp( 1 ) = ntp + lp( 2 ) = ntp + 1 + hp( 2 ) = np + end if + !dvm$ enddebug 1 +end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ1.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ1.fdv new file mode 100644 index 0000000..bfcf11b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ1.fdv @@ -0,0 +1,180 @@ + program TEMPL11 + +c TESTING template CLAUSE . + + print *,'===START OF templ11======================' +C -------------------------------------------------- +c 111 TEMPLATE arrA1[BLOCK] ALIGN arrB[i] WITH arrA[i+4] +c ALIGN arrC[i] WITH arrA[2*i+4] + call templ111 +C -------------------------------------------------- +c 121 TEMPLATE arrA1[BLOCK] ALIGN arrB[][i] WITH arrA[i] +c ALIGN arrC[i][ ] WITH arrA[2*i+1] + call templ121 +C -------------------------------------------------- + print *,'=== END OF templ11 ======================' + end + +C ----------------------------------------------------templ111 +c 111 TEMPLATE arrA[BLOCK] ALIGN arrB[i] WITH arrA[i+4] +c ALIGN arrC[i] WITH arrA[2*i+4] + subroutine templ111 + integer, parameter :: AN1=14,CN1=4,BN1=8,PN = 4,NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA[k1i * i + li] + integer, parameter :: k1i=1,k2i=0,li=4 +c parameters for ALIGN arrC[i] WITH arrA[kc1i * i + lci] + integer, parameter :: kc1i=2,kc2i=0,lci=4 + character*9 tname + integer, allocatable :: C1(:),B1(:) + integer erri,i,ib,ic + +cdvm$ template A1(AN1) +cdvm$ ALIGN B1(i) WITH A1(k1i * i + li) +cdvm$ ALIGN C1(i) WITH A1(kc1i * i + lci) +cdvm$ distribute A1(BLOCK) + + tname='templ111' + allocate (C1(CN1),B1(BN1)) + erri= ER + NNL=NL +!dvm$ actual (erri) +!dvm$ region +*dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +*dvm$ parallel (i) on C1(i) + do i=1,CN1 + C1(i) =i + enddo + +*dvm$ parallel (i) on A1(i), private (ib,erri,ic) + do i=1,AN1 + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1)) then + ib = (i-li)/k1i + if (B1(ib) .eq.(ib)) then + else + erri = i + endif + endif + if (((i-lci) .eq.(((i-lci)/kc1i) * kc1i)) .and. + * (((i-lci)/kc1i) .gt. 0) .and. + * (((i-lci)/kc1i) .le. CN1)) then + ic = (i-lci)/kc1i + if (C1(ic) .eq.(ic)) then + else + erri = i + endif + endif + enddo + +!dvm$ end region +!dvm$ get_actual (erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (C1,B1) + + end +C ----------------------------------------------------templ121 +c 121 TEMPLATE arrA1[BLOCK] +c ALIGN arrB[][i] WITH arrA[i] +c ALIGN arrC[i][ ] WITH arrA[2*i+1] + subroutine templ121 + integer, parameter :: AN1=9,CN1=4,CN2=4,BN1=8,BN2=8 + integer, parameter :: NL=1000,ER=10000 +c parameters for ALIGN arrB(*,i) WITH arrA[k1i*i+li] + integer, parameter :: k1i=1,k2i=0,li=0 +c parameters for ALIGN arrC(i,*) WITH arrA[kc1i*i+lci] + integer, parameter :: kc1i=2,kc2i=0,lci=1 + character*9 tname + integer, allocatable :: C2(:,:),B2(:,:) + integer erri,i,ib,jb,ic,jc + +cdvm$ template A1(AN1) +cdvm$ ALIGN B2(*,i) WITH A1(k1i*i+li) +cdvm$ ALIGN C2(i,*) WITH A1(kc1i*i+lci) +cdvm$ distribute A1(BLOCK) + + tname='templ121' + allocate (C2(CN1,CN2),B2(BN1,BN2)) + erri= ER + NNL=NL + +!dvm$ actual (erri) +!dvm$ region + +*dvm$ parallel (i,j) on B2(i,j) + do i=1,BN1 + do j=1,BN2 + B2(i,j) =(i*NL+j) + enddo + enddo + +*dvm$ parallel (i,j) on C2(i,j) + do i=1,CN1 + do j=1,CN2 + C2(i,j) =(i*NL+j) + enddo + enddo + +*dvm$ parallel (i) on A1(i), private (j,ib,jb,erri,jc,ic,k) + do i=1,AN1 + do j=1,BN1 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((i-li)/k1i) .le. BN2) )then + ib = j + jb = (i-li)/k1i + if (B2(ib,jb) .eq.(ib*NL+jb)) then + else + erri = i*NL/10+j + endif + endif + enddo + do k=1,CN2 + if ( + * ((i-lci) .eq.(((i-lci)/kc1i) * kc1i)) .and. + * (((i-lci)/kc1i) .gt. 0) .and. + * (((i-lci)/kc1i) .le. CN1) )then + jc = k + ic = (i-lci)/kc1i + if (C2(ic,jc) .eq.(ic*NL+jc)) then + else + erri = i*NL/10+j + endif + endif + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (erri) + + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (C2,B2) + + end +C ------------------------------------------------- + + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ2.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ2.fdv new file mode 100644 index 0000000..619c78c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ2.fdv @@ -0,0 +1,194 @@ + program TEMPL2 + +c TESTING template CLAUSE . + + print *,'===START OF templ2=======================' +C -------------------------------------------------- +c 211 TEMPLATE arrA2[BLOCK][BLOCK] +c ALIGN arrB[i] WITH arrA[1][i] +c ALIGN arrC[i][j] WITH arrA[2*i+2][j] + call templ211 +C -------------------------------------------------- +c 221 TEMPLATE arrA1[BLOCK][BLOCK] +c ALIGN arrB[i][j] WITH arrA[i+4][j+4] +c ALIGN arrC[i][j] WITH arrA[i+1][j+1] + call templ221 +C -------------------------------------------------- + print *,'=== END OF templ2 =======================' + end + +C ----------------------------------------------------templ211 +c 211 TEMPLATE arrA2[BLOCK][BLOCK] +c ALIGN arrB[i] WITH arrA[1][i] +c ALIGN arrC[i][j] WITH arrA[2*i+2][j] + subroutine templ211 + integer, parameter :: AN1=14,AN2=14,CN1=4,CN2=4,BN1=8 + integer, parameter :: NL=1000,ER=10000 +c parameters for ALIGN arrB[i] WITH arrA(1,i) + integer, parameter :: k1i=0,k2i=0,li=1,k1j=1,k2j=0,lj=0 +c parameters for ALIGN arrC[i][j] WITH arrA[kc1i * i + lci][kc2j * j + lcj] + integer, parameter :: kc1i=2,kc2i=0,lci=2,kc1j=0,kc2j=1,lcj=0 + character*9 tname + integer, allocatable :: C2(:,:),B1(:) + integer erri,i,ib,ic,jc + +cdvm$ template A2(AN1,AN2) +cdvm$ ALIGN B1(i) WITH A2(1,i) +cdvm$ ALIGN C2(i,j) WITH A2(kc1i * i + lci,kc2j * j + lcj) +cdvm$ distribute A2(BLOCK,BLOCK) + + tname='templ211' + allocate (C2(CN1,CN2),B1(BN1)) + erri= ER + NNL=NL + +!dvm$ actual(erri) +!dvm$ region + +*dvm$ parallel (i) on B1(i) + do i=1,BN1 + B1(i) =i + enddo + +*dvm$ parallel (j,i) on C2(i,j) + do j=1,CN2 + do i=1,CN1 + C2(i,j) =(i*NL+j) + enddo + enddo + +*dvm$ parallel (j,i) on A2(i,j), private (ib,erri,ic,jc) + do j=1,AN2 + do i=1,AN1 + if ((i .eq. 1) ) then + if( + * (j .le. BN1) + * ) then + ib = j + if (B1(ib) .eq.(ib)) then + else + erri = i + endif + endif + endif + if (((i-lci) .eq.(((i-lci)/kc1i) * kc1i)) .and. + * ((j-lcj) .eq.(((j-lcj)/kc2j) *kc2j)) .and. + * (((i-lci)/kc1i) .gt. 0) .and. + * (((j-lcj)/kc2j) .gt. 0) .and. + * (((i-lci)/kc1i) .le. CN1) .and. + * (((j-lcj)/kc2j) .le. CN2)) then + ic = (i-lci)/kc1i + jc = (j-lcj)/kc2j + if (C2(ic,jc) .eq.(ic*NL+jc)) then + else + erri = i + endif + endif + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (C2,B1) + + end +C ----------------------------------------------------templ221 +c 221 TEMPLATE arrA1[BLOCK][BLOCK] +c ALIGN arrB[i][j] WITH arrA[i+4][j+4] +c ALIGN arrC[i][j] WITH arrA[i+1][j+1] + subroutine templ221 + integer, parameter :: AN1=14,AN2=14,CN1=4,CN2=4,BN1=8,BN2=8 + integer, parameter :: NL=1000,ER=10000 +c parameters for ALIGN arrB[i][j] WITH arrA[k1i * i + li][k2j * j + lj] + integer, parameter :: k1i=1,k2i=0,li=4,k1j=0,k2j=1,lj=4 +c parameters for ALIGN arrC[i][j] WITH arrA[kc1i * i + lci][kc2j * j + lcj] + integer, parameter :: kc1i=1,kc2i=0,lci=1,kc1j=0,kc2j=1,lcj=1 + character*9 tname + integer, allocatable :: C2(:,:),B2(:,:) + integer erri,i,ib,jb,ic,jc + +cdvm$ template A2(AN1,AN2) +cdvm$ ALIGN B2(i,j) WITH A2(k1i * i + li,k2j * j + lj) +cdvm$ ALIGN C2(i,j) WITH A2(kc1i * i + lci,kc2j * j + lcj) +cdvm$ distribute A2(BLOCK,BLOCK) + + tname='templ221' + allocate (C2(CN1,CN2),B2(BN1,BN2)) + erri= ER + NNL=NL +!dvm$ actual (erri) +!dvm$ region + + +*dvm$ parallel (j,i) on B2(i,j) + do j=1,BN2 + do i=1,BN1 + B2(i,j) =(i*NL+j) + enddo + enddo + +*dvm$ parallel (j,i) on C2(i,j) + do j=1,CN2 + do i=1,CN1 + C2(i,j) =(i*NL+j) + enddo + enddo + +*dvm$ parallel (j,i) on A2(i,j),private (ib,ic,erri,jb,jc) + do j=1,AN2 + do i=1,AN1 + if (((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2)) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + if (B2(ib,jb) .eq.(ib*NL+jb)) then + else + erri = i + endif + endif + if (((i-lci) .eq.(((i-lci)/kc1i) * kc1i)) .and. + * ((j-lcj) .eq.(((j-lcj)/kc2j) *kc2j)) .and. + * (((i-lci)/kc1i) .gt. 0) .and. + * (((j-lcj)/kc2j) .gt. 0) .and. + * (((i-lci)/kc1i) .le. CN1) .and. + * (((j-lcj)/kc2j) .le. CN2)) then + ic = (i-lci)/kc1i + jc = (j-lcj)/kc2j + if (C2(ic,jc) .eq.(ic*NL+jc)) then + else + erri = i + endif + endif + enddo + enddo +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ4.fdv b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ4.fdv new file mode 100644 index 0000000..ca1765b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/Fortran/TEMPLATE/templ4.fdv @@ -0,0 +1,276 @@ + program TEMPL4 + +c TESTING template CLAUSE . + + print *,'===START OF templ4=======================' +C -------------------------------------------------- +c 441 TEMPLATE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] +c arrB[i][j][k][l] WITH arrA[i+2][ j][k][ l+3] +c ALIGN arrC[i][j] WITH arrA[i+2][2][3][ l+3] + call templ441 +C -------------------------------------------------- +c 442 TEMPLATE arrA1[BLOCK][BLOCK][BLOCK][BLOCK] +c ALIGN arrB[i][j][k][l] WITH arrA[l][i][j][k] +c ALIGN arrC[i][j][k][l] WITH [i+2][ j][k][ l+3] + call templ442 +C -------------------------------------------------- + print *,'=== END OF templ4 =======================' + end + +C ----------------------------------------------------templ441 +c 441 TEMPLATE arrA4[BLOCK][BLOCK][BLOCK][BLOCK] +c arrB[i][j][k][l] WITH arrA[i+2][ j][k][ l+3] +c ALIGN arrC[i][j] WITH arrA[i+2][2][3][ l+3] + subroutine templ441 + integer, parameter :: AN1=7,AN2=7,AN3=7,AN4=7 + integer, parameter :: BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: CN1=4,CN2=4 + integer, parameter :: NL=10000,ER=100000 + +c parameters for ALIGN arrB[i][j][n][m] WITH arrA4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) + integer, parameter :: k1i=1,k2i=0,k3i=0,k4i=0,li=2 + integer, parameter :: k1j=0,k2j=1,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=0,k3n=1,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=0,k4m=1,lm=3 +c parameters for ALIGN arrC[i][j] WITH arrA4(kc1i*i+lci,lcj,lcn,kc2m*j+lcm) + integer, parameter :: kc1i=1,kc2i=0,kc3i=0,kc4i=0,lci=2 + integer, parameter :: kc1j=0,kc2j=0,kc3j=0,kc4j=0,lcj=2 + integer, parameter :: kc1n=0,kc2n=0,kc3n=0,kc4n=0,lcn=3 + integer, parameter :: kc1m=0,kc2m=1,kc3m=0,kc4m=0,lcm=3 + + character*9 tname + integer, allocatable :: C2(:,:), B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,ic,jc,nc,mc + +cdvm$ template A4(AN1,AN2,AN3,AN4) +cdvm$ ALIGN B4(i,j,n,m) WITH A4(k1i*i+li,k2j*j+lj,k3n*n+ln,k4m*m+lm) +cdvm$ ALIGN C2(i,j) WITH A4(kc1i*i+lci,lcj,lcn,kc2m*j+lcm) +cdvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='templ441' + allocate (C2(CN1,CN2),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL +!dvm$ actual (erri) +!dvm$ region + + +*dvm$ parallel (m,n,j,i) on B4(i,j,n,m) + do m=1,BN4 + do n=1,BN3 + do j=1,BN2 + do i=1,BN1 + B4(i,j,n,m) =(i*NL/10+j*NL/100+n*NL/1000+m) + enddo + enddo + enddo + enddo + +*dvm$ parallel (j,i) on C2(i,j) + do j=1,CN2 + do i=1,CN1 + C2(i,j) =(i*NL+j) + enddo + enddo + +*dvm$ parallel (m,n,j,i) on A4(i,j,n,m),private(ib,jb,nb,mb,ic,jc,erri) + do m=1,AN4 + do n=1,AN3 + do j=1,AN2 + do i=1,AN1 + if ( + * ((i-li) .eq.(((i-li)/k1i) * k1i)) .and. + * ((j-lj) .eq.(((j-lj)/k2j) *k2j)) .and. + * ((n-ln) .eq.(((n-ln)/k3n) * k3n)) .and. + * ((m-lm) .eq.(((m-lm)/k4m) *k4m)) .and. + * (((i-li)/k1i) .gt. 0) .and. + * (((j-lj)/k2j) .gt. 0) .and. + * (((n-ln)/k3n) .gt. 0) .and. + * (((m-lm)/k4m) .gt. 0) .and. + * (((i-li)/k1i) .le. BN1) .and. + * (((j-lj)/k2j) .le. BN2) .and. + * (((n-ln)/k3n) .le. BN3) .and. + * (((m-lm)/k4m) .le. BN4) + * ) then + ib = (i-li)/k1i + jb = (j-lj)/k2j + nb = (n-ln)/k3n + mb = (m-lm)/k4m + if (B4(ib,jb,nb,mb).eq. + * (ib*NL/10+jb*NL/100+nb*NL/1000+mb))then + else + erri = i*NL/10 + j*NL/100+ n*NL/1000+ m + endif + endif + if ( + * (j .eq. lcj) .and. (n .eq. lcn) .and. + * ((i-lci) .eq.(((i-lci)/kc1i) * kc1i)) .and. + * ((m-lcm) .eq.(((m-lcm)/kc2m) *kc2m)) .and. + * (((i-lci)/kc1i) .gt. 0) .and. + * (((m-lcm)/kc2m) .gt. 0) .and. + * (((i-lci)/kc1i) .le. CN1) .and. + * (((m-lcm)/kc2m) .le. CN2)) then + ic = (i-lci)/kc1i + jc = (m-lcm)/kc2m + if (C2(ic,jc) .eq.(ic*NL+jc)) then + else + erri = i + endif + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual (erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (C2,B4) + + end +C ----------------------------------------------------templ442 +c 442 TEMPLATE arrA1[BLOCK][BLOCK][BLOCK][BLOCK] +c ALIGN arrB[i][j][k][l] WITH arrA[l][i][j][k] +c ALIGN arrC[i][j][k][l] WITH [i+2][ j][k][ l+3] + + subroutine templ442 + integer, parameter :: AN1=7,AN2=7,AN3=7,AN4=7 + integer, parameter :: BN1=2,BN2=2,BN3=2,BN4=2 + integer, parameter :: CN1=4,CN2=4,CN3=4,CN4=4 + integer, parameter :: NL=10000,ER=100000 +c parameters for ALIGN arrB[i][j][n][m] WITH arrA4(k4i*m+li,k1j*i+lj,k2n*j+ln,k3m*n+lm) + integer, parameter :: k1i=0,k2i=0,k3i=0,k4i=1,li=0 + integer, parameter :: k1j=1,k2j=0,k3j=0,k4j=0,lj=0 + integer, parameter :: k1n=0,k2n=1,k3n=0,k4n=0,ln=0 + integer, parameter :: k1m=0,k2m=0,k3m=1,k4m=0,lm=0 +c parameters for ALIGN arrC[i][j][n][m] WITH arrA4(kc1i*i+lci,kc2j*j+lcj,kc3n*n+lcn,kc4m*m+lcm) + integer, parameter :: kc1i=1,kc2i=0,kc3i=0,kc4i=0,lci=2 + integer, parameter :: kc1j=0,kc2j=1,kc3j=0,kc4j=0,lcj=0 + integer, parameter :: kc1n=0,kc2n=0,kc3n=1,kc4n=0,lcn=0 + integer, parameter :: kc1m=0,kc2m=0,kc3m=0,kc4m=1,lcm=3 + + character*9 tname + integer, allocatable :: C4(:,:,:,:),B4(:,:,:,:) + integer s,cs,erri,i,j,n,m,ia,ja,na,ma,ib,jb,nb,mb,ic,jc,nc,mc +cdvm$ template A4(AN1,AN2,AN3,AN4) +cdvm$ ALIGN B4(i,j,n,m) WITH A4(k4i*m+li,k1j*i+lj,k2n*j+ln,k3m*n+lm) +cdvm$ ALIGN C4(i,j,n,m) WITH A4(kc1i*i+lci,kc2j*j+lcj, +cdvm$*kc3n*n+lcn,kc4m*m+lcm) +cdvm$ distribute A4(BLOCK,BLOCK,BLOCK,BLOCK) + + tname='templ442' + allocate (C4(CN1,CN2,CN3,CN4),B4(BN1,BN2,BN3,BN4)) + erri= ER + NNL=NL + +!dvm$ actual (erri) +!dvm$ region + +*dvm$ parallel (m,n,j,i) on B4(i,j,n,m) + do m=1,BN4 + do n=1,BN3 + do j=1,BN2 + do i=1,BN1 + B4(i,j,n,m) =(i*NL/10+j*NL/100+n*NL/1000+m) + enddo + enddo + enddo + enddo + +*dvm$ parallel (m,n,j,i) on C4(i,j,n,m) + do m=1,CN4 + do n=1,CN3 + do j=1,CN2 + do i=1,CN1 + C4(i,j,n,m) =(i*NL/10+j*NL/100+n*NL/1000+m) + enddo + enddo + enddo + enddo + +*dvm$ parallel (m,n,j,i) on A4(i,j,n,m), +*dvm$*private(ib,jb,nb,mb,ic,jc,nc,mc,erri) + do m=1,AN4 + do n=1,AN3 + do j=1,AN2 + do i=1,AN1 + if ( + * ((i-li) .eq.(((i-li)/k4i) * k4i)) .and. + * ((j-lj) .eq.(((j-lj)/k1j) *k1j)) .and. + * ((n-ln) .eq.(((n-ln)/k2n) * k2n)) .and. + * ((m-lm) .eq.(((m-lm)/k3m) *k3m)) .and. + * (((i-li)/k4i) .gt. 0) .and. + * (((j-lj)/k1j) .gt. 0) .and. + * (((n-ln)/k2n) .gt. 0) .and. + * (((m-lm)/k3m) .gt. 0) .and. + * (((i-li)/k4i) .le. BN4) .and. + * (((j-lj)/k1j) .le. BN1) .and. + * (((n-ln)/k2n) .le. BN2) .and. + * (((m-lm)/k3m) .le. BN3) + * ) then + mb = (i-li)/k4i + ib = (j-lj)/k1j + jb = (n-ln)/k2n + nb = (m-lm)/k3m + if (B4(ib,jb,nb,mb).eq. + * (ib*NL/10+jb*NL/100+nb*NL/1000+mb))then + else + erri = i*NL/10 + j*NL/100+ n*NL/1000+ m + endif + endif + if ( + * ((i-lci) .eq.(((i-lci)/kc1i) * kc1i)) .and. + * ((j-lcj) .eq.(((j-lcj)/kc2j) *kc2j)) .and. + * ((n-lcn) .eq.(((n-lcn)/kc3n) * kc3n)) .and. + * ((m-lcm) .eq.(((m-lcm)/kc4m) *kc4m)) .and. + * (((i-lci)/kc1i) .gt. 0) .and. + * (((j-lcj)/kc2j) .gt. 0) .and. + * (((n-lcn)/kc3n) .gt. 0) .and. + * (((m-lcm)/kc4m) .gt. 0) .and. + * (((i-lci)/kc1i) .le. BN1) .and. + * (((j-lcj)/kc2j) .le. BN2) .and. + * (((n-lcn)/kc3n) .le. BN3) .and. + * (((m-lcm)/kc4m) .le. BN4) + * ) then + ic = (i-lci)/kc1i + jc = (j-lcj)/kc2j + nc = (n-lcn)/kc3n + mc = (m-lcm)/kc4m + if (C4(ic,jc,nc,mc) .eq. + * (ic*NL/10+jc*NL/100+nc*NL/1000+mc))then + else + erri = i*NL/10 + j*NL/100+ n*NL/1000+ m + endif + endif + enddo + enddo + enddo + enddo + +!dvm$ end region +!dvm$ get_actual(erri) + + if (erri .eq.ER) then + call ansyes(tname) + else + call ansno(tname) + endif + deallocate (C4,B4) + + end +C ------------------------------------------------- + + subroutine ansyes(name) + character*9 name + print *,name,' - complete' + end + subroutine ansno(name) + character*9 name + print *,name,' - ***error' + end + diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/settings b/dvm/tools/tester/trunk/test-suite/Correctness/settings new file mode 100644 index 0000000..9a42eb0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/settings @@ -0,0 +1,4 @@ +MAX_PROC_COUNT=16 +MAX_DIM_PROC_COUNT=5 +SHARE_RESOURCES=1 +MAX_TIME=120 # In seconds diff --git a/dvm/tools/tester/trunk/test-suite/Correctness/test-analyzer.sh b/dvm/tools/tester/trunk/test-suite/Correctness/test-analyzer.sh new file mode 100644 index 0000000..640168b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Correctness/test-analyzer.sh @@ -0,0 +1,53 @@ +#!/bin/sh + +# This is analyzer of output of standard-formed tests +# Requires variables: LAUNCH_EXIT_CODE, STDOUT_FN, STDERR_FN +# Produces variables: SUBTEST_COUNT, TEST_PASSED, RESULT_COMMENT, ERROR_LEVEL +# Produces functions: analyze_subtest + +SUBTEST_COUNT=`grep -E 'complete|\*\*\*error' <"$STDOUT_FN" | wc -l` + +if [ `grep -E 'Assertion' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Assertion failed" + ERROR_LEVEL=5 +elif [ `grep -E 'RTS fatal' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="RTS fatal" + ERROR_LEVEL=4 +elif [ `grep -E 'RTS err' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="RTS err" + ERROR_LEVEL=3 +elif [ `grep "END OF" <"$STDOUT_FN" | wc -l` -eq 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Crash" + ERROR_LEVEL=2 +elif [ $LAUNCH_EXIT_CODE -ne 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Launch failure" + ERROR_LEVEL=6 +elif [ `grep '\*\*\*error' <"$STDOUT_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Has failed subtests" + ERROR_LEVEL=1 +else + TEST_PASSED=1 + RESULT_COMMENT="OK" + ERROR_LEVEL=0 +fi + +analyze_subtest() { + # Produces variables: SUBTEST_NAME, TEST_PASSED, RESULT_COMMENT, ERROR_LEVEL + local SUBTEST_LINE=`grep -E 'complete|\*\*\*error' <"$STDOUT_FN" | head -n $1 | tail -n 1` + SUBTEST_NAME=`echo "$SUBTEST_LINE" | awk '{print $1}'` + if [ `echo $SUBTEST_LINE | grep "complete" | wc -l` -eq 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Subtest failed" + ERROR_LEVEL=1 + else + TEST_PASSED=1 + RESULT_COMMENT="OK" + ERROR_LEVEL=0 + fi +} diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/Makefile new file mode 100644 index 0000000..f9de9b1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/Makefile @@ -0,0 +1,66 @@ +SHELL=/bin/sh +BENCHMARK=bt +BENCHMARKU=BT + +include ../config/make.def +include ../sys/make.common + +SOURCES = bt.fdv \ + set_constants.fdv \ + initialize.fdv \ + exact_solution.fdv \ + verify.fdv \ + compute_errors.fdv \ + timers.fdv \ + print_result.fdv + +SOURCES_MPI = z_solve_mpi.fdv y_solve_mpi.fdv x_solve_mpi.fdv compute_rhs_mpi.fdv exact_rhs.fdv +SOURCES_SINGLE = z_solve.fdv y_solve.fdv x_solve.fdv compute_rhs.fdv exact_rhs.fdv +SOURCES_BLOCK = z_solve_block.fdv y_solve_block.fdv x_solve_block.fdv compute_rhs_block.fdv exact_rhs_block.fdv +SOURCES_BLOCK1 = z_solve_block.fdv y_solve_block.fdv x_solve_block.fdv compute_rhs.fdv exact_rhs.fdv +SOURCES_BLOCK2 = z_solve_block.fdv y_solve_block.fdv x_solve_block.fdv compute_rhs_block2.fdv exact_rhs.fdv + +OBJS = ${SOURCES:.fdv=.o} +OBJS_SINGLE = ${SOURCES_SINGLE:.fdv=.o} +OBJS_MPI = ${SOURCES_MPI:.fdv=.o} +OBJS_BLOCK = ${SOURCES_BLOCK:.fdv=.o} +OBJS_BLOCK1 = ${SOURCES_BLOCK1:.fdv=.o} +OBJS_BLOCK2 = ${SOURCES_BLOCK2:.fdv=.o} + +${PROGRAM}: config + @if [ "$(VERSION)" = "MPI" ] ; then \ + ${MAKE} MPI_VER; \ + else \ + if [ "$(VERSION)" = "BLOCK" ] ; then \ + ${MAKE} BLOCK_VER; \ + else \ + if [ "$(VERSION)" = "BLOCK1" ] ; then \ + ${MAKE} BLOCK_VER1; \ + else \ + ${MAKE} SINGLE_VER;\ + fi \ + fi \ + fi + +MPI_VER: $(OBJS) $(OBJS_MPI) + ${FLINK} -o ${PROGRAM} ${OBJS} $(OBJS_MPI) + +SINGLE_VER: $(OBJS) $(OBJS_SINGLE) + ${FLINK} -o ${PROGRAM} ${OBJS} $(OBJS_SINGLE) + +BLOCK_VER: $(OBJS) $(OBJS_BLOCK) + ${FLINK} -o ${PROGRAM} ${OBJS} $(OBJS_BLOCK) + +BLOCK_VER1: $(OBJS) $(OBJS_BLOCK1) + ${FLINK} -o ${PROGRAM} ${OBJS} $(OBJS_BLOCK1) + +BLOCK_VER2: $(OBJS) $(OBJS_BLOCK2) + ${FLINK} -o ${PROGRAM} ${OBJS} $(OBJS_BLOCK2) + +%.o: %.fdv npbparams.h header3d.h + ${F77} ${FFLAGS} -c -o $@ $< + +clean: + rm -f npbparams.h + rm -f *.o *~ + rm -f *.cu *.cuf *.c *.f diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/TODO_make.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/TODO_make.bat new file mode 100644 index 0000000..31052e1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/TODO_make.bat @@ -0,0 +1,12 @@ +@echo off + +set CLASS=%1 +set OPT=%2 + +CALL ..\sys\setparams BT %CLASS% +CALL %F77% %OPT% bt 1>out_%CLASS%.txt 2>err_%CLASS%.txt +if exist bt.exe ( + copy bt.exe %BIN%\bt.%CLASS%.x.exe + del bt.exe +) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/bt.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/bt.fdv new file mode 100644 index 0000000..4e6bab8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/bt.fdv @@ -0,0 +1,120 @@ + +!--------------------------------------------------------------------- + program btdv3 + + include 'header3d.h' + integer i,niter,step,fstatus,n3 + double precision navg,mflops + external timer_read,verify + double precision tmax,timer_read + logical verified + character class + +!--------------------------------------------------------------------- +! Root node reads input file (if it exists) else takes +! defaults from parameters +!--------------------------------------------------------------------- + write (unit = *,fmt = 1000) + open (unit = 2,file = 'inputbt.data',status = 'old',iostat = fstat + &us) + if (fstatus .eq. 0) then + write (unit = *,fmt = 233) +233 format(' Reading from input file inputbt.data') + read (unit = 2,fmt = *) niter + read (unit = 2,fmt = *) dt + read (unit = 2,fmt = *) grid_points(1),grid_points(2),grid_poin + &ts(3) + close (unit = 2) + else + write (unit = *,fmt = 234) + niter = niter_default + dt = dt_default + grid_points(1) = problem_size + grid_points(2) = problem_size + grid_points(3) = problem_size + endif +234 format(' No input file inputbt.data. Using compiled defaults') + write (unit = *,fmt = 1001) grid_points(1),grid_points(2),grid_poi + &nts(3) + write (unit = *,fmt = 1002) niter,dt +1000 format(//, ' NAS Parallel Benchmarks 3.3.1 - DVMH version',' - BT + &Benchmark ',/) +1001 format(' Size: ', i3, 'x', i3, 'x', i3) +1002 format(' Iterations: ', i3, ' dt: ', F10.6) + if (grid_points(1) .gt. imax .or. grid_points(2) .gt. jmax .or. gr + &id_points(3) .gt. kmax) then + print *, (grid_points(i), i = 1,3) + print *, ' Problem size too big for compiled array sizes' + goto 999 + endif + open (unit = 2,file = 'inputStage',status = 'old',iostat = fstat + &us) + if (fstatus .eq. 0) then + read (unit = 2,fmt = *) stage_n + close (unit = 2) + else + stage_n = 0 + endif + write(*,*) 'stage = ', stage_n + + call set_constants() + call initialize() + call exact_rhs() + +! ************* DO 2 iterations for touch all code + call adi_first + call adi_first + call initialize + + call timer_clear(1) + call timer_start(1) + do step = 1,niter + if (mod (step,20) .eq. 0 .or. step .eq. 1) then + write (unit = *,fmt = 200) step +200 format(' Time step ', i8) + endif + call adi() + enddo + call timer_stop(1) + tmax = timer_read (1) + call verify(niter,class,verified) + n3 = grid_points(1) * grid_points(2) * grid_points(3) + navg = (grid_points(1) + grid_points(2) + grid_points(3)) / 3.0 + if (tmax .ne. 0.) then + mflops = 1.0e-6 * float (niter) * (3478.8 * float (n3) - 17655. + &7 * navg** 2 + 28023.7 * navg) / tmax + else + mflops = 0.0 + endif + call print_results('BT',class,grid_points(1),grid_points(2),grid_p + &oints(3),niter,tmax,mflops,' floating point',verified,npb + &version) + +! ,compiletime, cs1, cs2, cs3, cs4, cs5,cs6, '(none)') +999 continue + end + + subroutine adi_first() + call compute_rhs() + call x_solve() + call y_solve() + call z_solve() + return + end + + subroutine adi () + +!DVM$ interval 1 + call compute_rhs() +!DVM$ end interval +!DVM$ interval 11 + call x_solve() +!DVM$ end interval +!DVM$ interval 12 + call y_solve() +!DVM$ end interval +!DVM$ interval 13 + call z_solve() +!DVM$ end interval + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_errors.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_errors.fdv new file mode 100644 index 0000000..15e0d30 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_errors.fdv @@ -0,0 +1,117 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! this function computes the norm of the difference between the +! computed solution and the exact solution +!--------------------------------------------------------------------- + subroutine error_norm (rms) + + include 'header3d.h' + integer i,j,k,m,d + double precision xi,eta,zeta,u_exact(5),rms(5),add + double precision r1,r2,r3,r4,r5 + do m = 1,5 + rms(m) = 0.0d0 + enddo + r1 = 0.0d0 + r2 = 0.0d0 + r3 = 0.0d0 + r4 = 0.0d0 + r5 = 0.0d0 + +!DVM$ region +!DVM$ PARALLEL (k,j,i) ON u(*,i,j,k), +!DVM$& REDUCTION(SUM(r1),SUM(r2),SUM(r3),SUM(r4),SUM(r5)), +!DVM$&private(u_exact,xi,eta,zeta,m,add) + do k = 0,problem_size - 1 + do j = 0,problem_size - 1 + do i = 0,problem_size - 1 + zeta = dble (k) * dnzm1 + eta = dble (j) * dnym1 + xi = dble (i) * dnxm1 + +! call exact_solution(xi, eta, zeta, u_exact) + do m = 1,5 + u_exact(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + + & xi * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6 + &) + eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * + &(ce(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + add = u(1,i,j,k) - u_exact(1) + r1 = r1 + add * add + add = u(2,i,j,k) - u_exact(2) + r2 = r2 + add * add + add = u(3,i,j,k) - u_exact(3) + r3 = r3 + add * add + add = u(4,i,j,k) - u_exact(4) + r4 = r4 + add * add + add = u(5,i,j,k) - u_exact(5) + r5 = r5 + add * add + enddo + enddo + enddo + +!DVM$ end region + rms(1) = r1 + rms(2) = r2 + rms(3) = r3 + rms(4) = r4 + rms(5) = r5 + do m = 1,5 + do d = 1,3 + rms(m) = rms(m) / dble (grid_points(d) - 2) + enddo + rms(m) = dsqrt (rms(m)) + enddo + return + end + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine rhs_norm (rms) + + include 'header3d.h' + integer i,j,k,d,m + double precision rms(5),add,r1,r2,r3,r4,r5 + r1 = 0.0d0 + r2 = 0.0d0 + r3 = 0.0d0 + r4 = 0.0d0 + r5 = 0.0d0 + +!DVM$ region +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), +!DVM$&REDUCTION(SUM(r1),SUM(r2),SUM(r3),SUM(r4),SUM(r5)), +!DVM$&private(add) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + add = rhs(1,i,j,k) + r1 = r1 + add * add + add = rhs(2,i,j,k) + r2 = r2 + add * add + add = rhs(3,i,j,k) + r3 = r3 + add * add + add = rhs(4,i,j,k) + r4 = r4 + add * add + add = rhs(5,i,j,k) + r5 = r5 + add * add + enddo + enddo + enddo + +!DVM$ end region + rms(1) = r1 + rms(2) = r2 + rms(3) = r3 + rms(4) = r4 + rms(5) = r5 + do m = 1,5 + do d = 1,3 + rms(m) = rms(m) / dble (grid_points(d) - 2) + enddo + rms(m) = dsqrt (rms(m)) + enddo + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs.fdv new file mode 100644 index 0000000..6f3b785 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs.fdv @@ -0,0 +1,218 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine compute_rhs () + + include 'header3d.h' + integer i,j,k,m + double precision rho_inv,uijk,up1,um1,vijk,vp1,vm1,wijk,wp1,wm1,r + &hs_(5) + +!DVM$ region out(rho_i, us, vs, ws, qs, square) +!DVM$ PARALLEL (k,j,i) ON us(i,j,k), SHADOW_COMPUTE, +!DVM$& PRIVATE(rho_inv,m),cuda_block(128) + do k = 0,problem_size - 1 + do j = 0,problem_size - 1 + do i = 0,problem_size - 1 + rho_inv = 1.0d0 / u(1,i,j,k) + rho_i(i,j,k) = rho_inv + us(i,j,k) = u(2,i,j,k) * rho_inv + vs(i,j,k) = u(3,i,j,k) * rho_inv + ws(i,j,k) = u(4,i,j,k) * rho_inv + square(i,j,k) = 0.5d0 * (u(2,i,j,k) * u(2,i,j,k) + u(3,i, + &j,k) * u(3,i,j,k) + u(4,i,j,k) * u(4,i,j,k)) * rho_inv + qs(i,j,k) = square(i,j,k) * rho_inv + do m = 1,5 + rhs(m,i,j,k) = forcing(m,i,j,k) + enddo + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! compute xi-direction fluxes +!--------------------------------------------------------------------- +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), PRIVATE(uijk,up1,um1,m, +!DVM$&vijk,vp1,vm1,wijk,wp1,wm1,rhs_),cuda_block(32) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + uijk = us(i,j,k) + up1 = us(i + 1,j,k) + um1 = us(i - 1,j,k) + rhs_(1) = forcing(1,i,j,k) + rhs_(2) = forcing(2,i,j,k) + rhs_(3) = forcing(3,i,j,k) + rhs_(4) = forcing(4,i,j,k) + rhs_(5) = forcing(5,i,j,k) + + rhs_(1) = rhs_(1) + dx1tx1 * (u(1,i + 1,j,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i - 1,j,k)) - tx2 * (u(2,i + 1,j,k) - u(2,i - 1,j,k + &)) + rhs_(2) = rhs_(2) + dx2tx1 * (u(2,i + 1,j,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i - 1,j,k)) + xxcon2 * con43 * (up1 - 2.0d0 * uijk + &+ um1) - tx2 * (u(2,i + 1,j,k) * up1 - u(2,i - 1,j,k) * um1 + (u(5 + &,i + 1,j,k) - square(i + 1,j,k) - u(5,i - 1,j,k) + square(i - 1,j, + &k)) * c2) + rhs_(3) = rhs_(3) + dx3tx1 * (u(3,i + 1,j,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i - 1,j,k)) + xxcon2 * (vs(i + 1,j,k) - 2.0d0 * vs( + &i,j,k) + vs(i - 1,j,k)) - tx2 * (u(3,i + 1,j,k) * up1 - u(3,i - 1, + &j,k) * um1) + rhs_(4) = rhs_(4) + dx4tx1 * (u(4,i + 1,j,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i - 1,j,k)) + xxcon2 * (ws(i + 1,j,k) - 2.0d0 * ws( + &i,j,k) + ws(i - 1,j,k)) - tx2 * (u(4,i + 1,j,k) * up1 - u(4,i - 1, + &j,k) * um1) + rhs_(5) = rhs_(5) + dx5tx1 * (u(5,i + 1,j,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i - 1,j,k)) + xxcon3 * (qs(i + 1,j,k) - 2.0d0 * qs( + &i,j,k) + qs(i - 1,j,k)) + xxcon4 * (up1 * up1 - 2.0d0 * uijk * uij + &k + um1 * um1) + xxcon5 * (u(5,i + 1,j,k) * rho_i(i + 1,j,k) - 2.0 + &d0 * u(5,i,j,k) * rho_i(i,j,k) + u(5,i - 1,j,k) * rho_i(i - 1,j,k) + &) - tx2 * ((c1 * u(5,i + 1,j,k) - c2 * square(i + 1,j,k)) * up1 - + &(c1 * u(5,i - 1,j,k) - c2 * square(i - 1,j,k)) * um1) + if (i .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k)) + enddo + else if (i .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i - 1, + &j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k + &)) + enddo + else if (i .ge. 3 .and. i .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m + &,i + 2,j,k)) + enddo + else if (i .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k)) + enddo + else if (i .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.d0 * + & u(m,i - 1,j,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + vijk = vs(i,j,k) + vp1 = vs(i,j + 1,k) + vm1 = vs(i,j - 1,k) + rhs_(1) = rhs_(1) + dy1ty1 * (u(1,i,j + 1,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j - 1,k)) - ty2 * (u(3,i,j + 1,k) - u(3,i,j - 1,k + &)) + rhs_(2) = rhs_(2) + dy2ty1 * (u(2,i,j + 1,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j - 1,k)) + yycon2 * (us(i,j + 1,k) - 2.0d0 * us( + &i,j,k) + us(i,j - 1,k)) - ty2 * (u(2,i,j + 1,k) * vp1 - u(2,i,j - + &1,k) * vm1) + rhs_(3) = rhs_(3) + dy3ty1 * (u(3,i,j + 1,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j - 1,k)) + yycon2 * con43 * (vp1 - 2.0d0 * vijk + &+ vm1) - ty2 * (u(3,i,j + 1,k) * vp1 - u(3,i,j - 1,k) * vm1 + (u(5 + &,i,j + 1,k) - square(i,j + 1,k) - u(5,i,j - 1,k) + square(i,j - 1, + &k)) * c2) + rhs_(4) = rhs_(4) + dy4ty1 * (u(4,i,j + 1,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j - 1,k)) + yycon2 * (ws(i,j + 1,k) - 2.0d0 * ws( + &i,j,k) + ws(i,j - 1,k)) - ty2 * (u(4,i,j + 1,k) * vp1 - u(4,i,j - + &1,k) * vm1) + rhs_(5) = rhs_(5) + dy5ty1 * (u(5,i,j + 1,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j - 1,k)) + yycon3 * (qs(i,j + 1,k) - 2.0d0 * qs( + &i,j,k) + qs(i,j - 1,k)) + yycon4 * (vp1 * vp1 - 2.0d0 * vijk * vij + &k + vm1 * vm1) + yycon5 * (u(5,i,j + 1,k) * rho_i(i,j + 1,k) - 2.0 + &d0 * u(5,i,j,k) * rho_i(i,j,k) + u(5,i,j - 1,k) * rho_i(i,j - 1,k) + &) - ty2 * ((c1 * u(5,i,j + 1,k) - c2 * square(i,j + 1,k)) * vp1 - + &(c1 * u(5,i,j - 1,k) - c2 * square(i,j - 1,k)) * vm1) + if (j .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k)) + enddo + else if (j .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j - + &1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k + &)) + enddo + else if (j .ge. 3 .and. j .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m + &,i,j + 2,k)) + enddo + else if (j .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k)) + enddo + else if (j .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.d0 * + & u(m,i,j - 1,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + wijk = ws(i,j,k) + wp1 = ws(i,j,k + 1) + wm1 = ws(i,j,k - 1) + rhs_(1) = rhs_(1) + dz1tz1 * (u(1,i,j,k + 1) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j,k - 1)) - tz2 * (u(4,i,j,k + 1) - u(4,i,j,k - 1 + &)) + rhs_(2) = rhs_(2) + dz2tz1 * (u(2,i,j,k + 1) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j,k - 1)) + zzcon2 * (us(i,j,k + 1) - 2.0d0 * us( + &i,j,k) + us(i,j,k - 1)) - tz2 * (u(2,i,j,k + 1) * wp1 - u(2,i,j,k + &- 1) * wm1) + rhs_(3) = rhs_(3) + dz3tz1 * (u(3,i,j,k + 1) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j,k - 1)) + zzcon2 * (vs(i,j,k + 1) - 2.0d0 * vs( + &i,j,k) + vs(i,j,k - 1)) - tz2 * (u(3,i,j,k + 1) * wp1 - u(3,i,j,k + &- 1) * wm1) + rhs_(4) = rhs_(4) + dz4tz1 * (u(4,i,j,k + 1) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j,k - 1)) + zzcon2 * con43 * (wp1 - 2.0d0 * wijk + &+ wm1) - tz2 * (u(4,i,j,k + 1) * wp1 - u(4,i,j,k - 1) * wm1 + (u(5 + &,i,j,k + 1) - square(i,j,k + 1) - u(5,i,j,k - 1) + square(i,j,k - + &1)) * c2) + rhs_(5) = rhs_(5) + dz5tz1 * (u(5,i,j,k + 1) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j,k - 1)) + zzcon3 * (qs(i,j,k + 1) - 2.0d0 * qs( + &i,j,k) + qs(i,j,k - 1)) + zzcon4 * (wp1 * wp1 - 2.0d0 * wijk * wij + &k + wm1 * wm1) + zzcon5 * (u(5,i,j,k + 1) * rho_i(i,j,k + 1) - 2.0 + &d0 * u(5,i,j,k) * rho_i(i,j,k) + u(5,i,j,k - 1) * rho_i(i,j,k - 1) + &) - tz2 * ((c1 * u(5,i,j,k + 1) - c2 * square(i,j,k + 1)) * wp1 - + &(c1 * u(5,i,j,k - 1) - c2 * square(i,j,k - 1)) * wm1) + if (k .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2)) + enddo + else if (k .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j,k + &- 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2 + &)) + enddo + else if (k .ge. 3 .and. k .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m + &,i,j,k + 2)) + enddo + else if (k .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1)) + enddo + else if (k .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.d0 * + & u(m,i,j,k - 1) + 5.d0 * u(m,i,j,k)) + enddo + endif + rhs(1,i,j,k) = rhs_(1) * dt + rhs(2,i,j,k) = rhs_(2) * dt + rhs(3,i,j,k) = rhs_(3) * dt + rhs(4,i,j,k) = rhs_(4) * dt + rhs(5,i,j,k) = rhs_(5) * dt + enddo + enddo + enddo + +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_block.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_block.fdv new file mode 100644 index 0000000..924af91 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_block.fdv @@ -0,0 +1,484 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine compute_rhs () + + include 'header3d.h' + integer i,j,k,m,z + double precision rho_inv,uijk,up1,um1,vijk,vp1,vm1,wijk,wp1,wm1,r + &hs_(5),s1,s2,s3,s4,s5,s6,s7,qs1,qs2,qs3,qs4,qs5,qs6,qs7 + double precision ue_(-2:2, 5), buf_(-2:2, 5),cuf_(-2:2),q_(-2:2) + double precision dtemp(5), xi, eta, zeta, dtpp +!DVM$ region +!DVM$ PARALLEL (k,j,i) ON us(i,j,k),PRIVATE(m),cuda_block(128) + do k = 0,problem_size - 1 + do j = 0,problem_size - 1 + do i = 0,problem_size - 1 + do m = 1,5 + rhs(m,i,j,k) = 0 + enddo + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! compute xi-direction fluxes +!--------------------------------------------------------------------- +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), PRIVATE(uijk,up1,um1,m, +!DVM$&vijk,vp1,vm1,wijk,wp1,wm1,rhs_,s1,s2,s3,s4,s5,s6,s7, +!DVM$&qs1,qs2,qs3,qs4,qs5,qs6,qs7, +!DVM$&zeta,eta,xi,dtemp,buf_,cuf_,q_,dtpp,z,ue_),cuda_block(32) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + rhs_(1) = 0 + rhs_(2) = 0 + rhs_(3) = 0 + rhs_(4) = 0 + rhs_(5) = 0 + + zeta = dble(k) * dnzm1 + eta = dble(j) * dnym1 + do z = -2, 2 + xi = dble(i + z) * dnxm1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,2) * buf_(z,2) + buf_(z,1) = cuf_(z) + buf_(z,3) * buf_(z,3) + + > buf_(z,4) * buf_(z,4) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3)* + > ue_(z,3) + buf_(z,4)*ue_(z,4)) + enddo + + rhs_(1) = rhs_(1) - + > tx2*( ue_(1,2)-ue_(-1,2) )+ + > dx1tx1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + rhs_(2) = rhs_(2) - tx2 * ( + > (ue_(1,2)*buf_(1,2)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,2)*buf_(-1,2)+c2*(ue_(-1,5)-q_(-1))))+ + > xxcon1*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dx2tx1*( ue_(1,2)-2.0d0* ue_(0,2)+ue_(-1,2)) + + rhs_(3) = rhs_(3) - tx2 * ( + > ue_(1,3)*buf_(1,2)-ue_(-1,3)*buf_(-1,2))+ + > xxcon2*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dx3tx1*( ue_(1,3)-2.0d0*ue_(0,3) +ue_(-1,3)) + + rhs_(4) = rhs_(4) - tx2*( + > ue_(1,4)*buf_(1,2)-ue_(-1,4)*buf_(-1,2))+ + > xxcon2*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dx4tx1*( ue_(1,4)-2.0d0* ue_(0,4)+ ue_(-1,4)) + + rhs_(5) = rhs_(5) - tx2*( + > buf_(1,2)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,2)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*xxcon3*(buf_(1,1)-2.0d0*buf_(0,1)+ + > buf_(-1,1))+ + > xxcon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > xxcon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dx5tx1*( ue_(1,5)-2.0d0* ue_(0,5)+ ue_(-1,5)) + do m = 1, 5 + if(i .eq. 1) then + rhs_(m) = rhs_(m) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(i .eq. 2) then + rhs_(m) = rhs_(m) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(i .eq. problem_size-3) then + rhs_(m) = rhs_(m) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(i .eq. problem_size-2) then + rhs_(m) = rhs_(m) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + rhs_(m) = rhs_(m) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + + zeta = dble(k) * dnzm1 + xi = dble(i) * dnxm1 + do z = -2, 2 + eta = dble(j + z) * dnym1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,3) * buf_(z,3) + buf_(z,1) = cuf_(z) + buf_(z,2) * buf_(z,2) + + > buf_(z,4) * buf_(z,4) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3) + > *ue_(z,3) + buf_(z,4) * ue_(z,4)) + enddo + + rhs_(1) = rhs_(1) - + > ty2*( ue_(1,3)-ue_(-1,3) )+ + > dy1ty1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + rhs_(2) = rhs_(2) - ty2*( + > ue_(1,2)*buf_(1,3)-ue_(-1,2)*buf_(-1,3))+ + > yycon2*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dy2ty1*( ue_(1,2)-2.0* ue_(0,2)+ ue_(-1,2)) + + rhs_(3) = rhs_(3) - ty2*( + > (ue_(1,3)*buf_(1,3)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,3)*buf_(-1,3)+c2*(ue_(-1,5)-q_(-1))))+ + > yycon1*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dy3ty1*( ue_(1,3)-2.0d0*ue_(0,3) +ue_(-1,3)) + + rhs_(4) = rhs_(4) - ty2*( + > ue_(1,4)*buf_(1,3)-ue_(-1,4)*buf_(-1,3))+ + > yycon2*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dy4ty1*( ue_(1,4)-2.0d0*ue_(0,4)+ ue_(-1,4)) + + rhs_(5) = rhs_(5) - ty2*( + > buf_(1,3)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,3)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*yycon3*(buf_(1,1)-2.0d0*buf_(0,1)+ + > buf_(-1,1))+ + > yycon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > yycon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dy5ty1*(ue_(1,5)-2.0d0*ue_(0,5)+ue_(-1,5)) + do m = 1, 5 + if(j .eq. 1) then + rhs_(m) = rhs_(m) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(j .eq. 2) then + rhs_(m) = rhs_(m) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(j .eq. problem_size-3) then + rhs_(m) = rhs_(m) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(j .eq. problem_size-2) then + rhs_(m) = rhs_(m) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + rhs_(m) = rhs_(m) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + + xi = dble(i) * dnxm1 + eta = dble(j) * dnym1 + do z = -2, 2 + zeta = dble(k + z) * dnzm1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,4) * buf_(z,4) + buf_(z,1) = cuf_(z) + buf_(z,2) * buf_(z,2) + + > buf_(z,3) * buf_(z,3) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3)* + > ue_(z,3) + buf_(z,4)*ue_(z,4)) + enddo + + rhs_(1) = rhs_(1) - + > tz2*( ue_(1,4)-ue_(-1,4) )+ + > dz1tz1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + rhs_(2) = rhs_(2) - tz2 * ( + > ue_(1,2)*buf_(1,4)-ue_(-1,2)*buf_(-1,4))+ + > zzcon2*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dz2tz1*( ue_(1,2)-2.0d0* ue_(0,2)+ ue_(-1,2)) + + rhs_(3) = rhs_(3) - tz2 * ( + > ue_(1,3)*buf_(1,4)-ue_(-1,3)*buf_(-1,4))+ + > zzcon2*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dz3tz1*(ue_(1,3)-2.0d0*ue_(0,3)+ue_(-1,3)) + + rhs_(4) = rhs_(4) - tz2 * ( + > (ue_(1,4)*buf_(1,4)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,4)*buf_(-1,4)+c2*(ue_(-1,5)-q_(-1))))+ + > zzcon1*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dz4tz1*( ue_(1,4)-2.0d0*ue_(0,4) +ue_(-1,4)) + + rhs_(5) = rhs_(5) - tz2 * ( + > buf_(1,4)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,4)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*zzcon3*(buf_(1,1)-2.0d0*buf_(0,1) + > +buf_(-1,1))+ + > zzcon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > zzcon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dz5tz1*( ue_(1,5)-2.0d0*ue_(0,5)+ ue_(-1,5)) + do m = 1, 5 + if(k .eq. 1) then + rhs_(m) = rhs_(m) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(k .eq. 2) then + rhs_(m) = rhs_(m) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(k .eq. problem_size-3) then + rhs_(m) = rhs_(m) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(k .eq. problem_size-2) then + rhs_(m) = rhs_(m) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + rhs_(m) = rhs_(m) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + + do m = 1, 5 + rhs_(m) = -1.d0 * rhs_(m) + end do + + uijk = u(2,i,j,k) / u(1,i,j,k) + up1 = u(2,i + 1,j,k) / u(1,i + 1,j,k) + um1 = u(2,i - 1,j,k) / u(1,i - 1,j,k) + + vijk = u(3,i,j,k) / u(1,i,j,k) + vp1 = u(3,i,j + 1,k) / u(1,i,j + 1,k) + vm1 = u(3,i,j - 1,k) / u(1,i,j - 1,k) + + wijk = u(4,i,j,k) / u(1,i,j,k) + wp1 = u(4,i,j,k + 1) / u(1,i,j,k + 1) + wm1 = u(4,i,j,k - 1) / u(1,i,j,k - 1) + + s1 = 0.5d0 * (u(2,i,j,k) * u(2,i,j,k) + u(3,i, + &j,k) * u(3,i,j,k) + u(4,i,j,k) * u(4,i,j,k)) / u(1,i,j,k) + s2 = 0.5d0 * (u(2,i+1,j,k) * u(2,i+1,j,k) + u(3,i + &+1,j,k) * u(3,i+1,j,k) + u(4,i+1,j,k) * u(4,i+1,j,k)) / + &u(1,i+1,j,k) + s3 = 0.5d0 * (u(2,i-1,j,k) * u(2,i-1,j,k) + u(3,i + &-1,j,k) * u(3,i-1,j,k) + u(4,i-1,j,k) * u(4,i-1,j,k)) / + &u(1,i-1,j,k) + s4 = 0.5d0 * (u(2,i,j+1,k) * u(2,i,j+1,k) + u(3,i, + &j+1,k) * u(3,i,j+1,k) + u(4,i,j+1,k) * u(4,i,j+1,k)) / + &u(1,i,j+1,k) + s5 = 0.5d0 * (u(2,i,j-1,k) * u(2,i,j-1,k) + u(3,i, + &j-1,k) * u(3,i,j-1,k) + u(4,i,j-1,k) * u(4,i,j-1,k)) / + &u(1,i,j-1,k) + s6 = 0.5d0 * (u(2,i,j,k+1) * u(2,i,j,k+1) + u(3,i, + &j,k+1) * u(3,i,j,k+1) + u(4,i,j,k+1) * u(4,i,j,k+1)) / + &u(1,i,j,k+1) + s7 = 0.5d0 * (u(2,i,j,k-1) * u(2,i,j,k-1) + u(3,i, + &j,k-1) * u(3,i,j,k-1) + u(4,i,j,k-1) * u(4,i,j,k-1)) / + &u(1,i,j,k-1) + + qs1 = s1 / u(1,i,j,k) + qs2 = s2 / u(1,i+1,j,k) + qs3 = s3 / u(1,i-1,j,k) + qs4 = s4 / u(1,i,j+1,k) + qs5 = s5 / u(1,i,j-1,k) + qs6 = s6 / u(1,i,j,k+1) + qs7 = s7 / u(1,i,j,k-1) + +! rhs_(1) = forcing(1,i,j,k) +! rhs_(2) = forcing(2,i,j,k) +! rhs_(3) = forcing(3,i,j,k) +! rhs_(4) = forcing(4,i,j,k) +! rhs_(5) = forcing(5,i,j,k) + + rhs_(1) = rhs_(1) + dx1tx1 * (u(1,i + 1,j,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i - 1,j,k)) - tx2 * (u(2,i + 1,j,k) - u(2,i - 1,j,k + &)) + rhs_(2) = rhs_(2) + dx2tx1 * (u(2,i + 1,j,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i - 1,j,k)) + xxcon2 * con43 * (up1 - 2.0d0 * uijk + &+ um1) - tx2 * (u(2,i + 1,j,k) * up1 - u(2,i - 1,j,k) * um1 + (u(5 + &,i + 1,j,k) - s2 - u(5,i - 1,j,k) + s3) * c2) + rhs_(3) = rhs_(3) + dx3tx1 * (u(3,i + 1,j,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i - 1,j,k)) + xxcon2 * (u(3,i + 1,j,k) / + &u(1,i + 1,j,k) - 2.0d0 * vijk + u(3,i - 1,j,k)/u(1,i - 1,j,k)) + &- tx2 * (u(3,i + 1,j,k) * up1 - u(3,i - 1,j,k) * um1) + rhs_(4) = rhs_(4) + dx4tx1 * (u(4,i + 1,j,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i - 1,j,k)) + xxcon2 * (u(4,i + 1,j,k) / + &u(1,i + 1,j,k) - 2.0d0 * wijk + u(4,i - 1,j,k) / u(1,i - 1,j,k)) + &- tx2 * (u(4,i + 1,j,k) * up1 - u(4,i - 1,j,k) * um1) + rhs_(5) = rhs_(5) + dx5tx1 * (u(5,i + 1,j,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i - 1,j,k)) + xxcon3 * (qs2 - 2.0d0 * qs1 + + &qs3) + xxcon4 * (up1 * up1 - 2.0d0 * uijk * uij + &k + um1 * um1) + xxcon5 * (u(5,i + 1,j,k) * 1.0d0 / u(1,i + 1,j,k) + & - 2.0d0 * u(5,i,j,k) * 1.0d0 / u(1,i,j,k) + u(5,i - 1,j,k) * + &1.0d0 / u(1,i - 1,j,k)) - tx2 * ((c1 * u(5,i + 1,j,k) - + &c2 * s2) * up1 - + &(c1 * u(5,i - 1,j,k) - c2 * s3) * um1) + if (i .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k)) + enddo + else if (i .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i - 1, + &j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k + &)) + enddo + else if (i .ge. 3 .and. i .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m + &,i + 2,j,k)) + enddo + else if (i .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k)) + enddo + else if (i .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.d0 * + & u(m,i - 1,j,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + + rhs_(1) = rhs_(1) + dy1ty1 * (u(1,i,j + 1,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j - 1,k)) - ty2 * (u(3,i,j + 1,k) - u(3,i,j - 1,k + &)) + rhs_(2) = rhs_(2) + dy2ty1 * (u(2,i,j + 1,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j - 1,k)) + yycon2 * (u(2,i,j + 1,k) / + &u(1,i,j + 1,k) - 2.0d0 * uijk + u(2,i,j - 1,k)/u(1,i,j - 1,k)) + &- ty2 * (u(2,i,j + 1,k) * vp1 - u(2,i,j -1,k) * vm1) + rhs_(3) = rhs_(3) + dy3ty1 * (u(3,i,j + 1,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j - 1,k)) + yycon2 * con43 * (vp1 - 2.0d0 * vijk + &+ vm1) - ty2 * (u(3,i,j + 1,k) * vp1 - u(3,i,j - 1,k) * vm1 + (u(5 + &,i,j + 1,k) - s4 - u(5,i,j - 1,k) + s5) * c2) + rhs_(4) = rhs_(4) + dy4ty1 * (u(4,i,j + 1,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j - 1,k)) + yycon2 * (u(4,i,j + 1,k) / + &u(1,i,j + 1,k) - 2.0d0 * wijk + u(4,i,j - 1,k) / u(1,i,j - 1,k)) + &- ty2 * (u(4,i,j + 1,k) * vp1 - u(4,i,j - 1,k) * vm1) + rhs_(5) = rhs_(5) + dy5ty1 * (u(5,i,j + 1,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j - 1,k)) + yycon3 * (qs4 - 2.0d0 * qs1 + & + qs5) + yycon4 * (vp1 * vp1 - 2.0d0 * vijk * vij + &k + vm1 * vm1) + yycon5 * (u(5,i,j + 1,k) * 1.0d0 / u(1,i,j + 1,k) + &- 2.0d0 * u(5,i,j,k) * 1.0d0 / u(1,i,j,k) + u(5,i,j - 1,k) * + &1.0d0 / u(1,i,j - 1,k) + &) - ty2 * ((c1 * u(5,i,j + 1,k) - c2 * s4) * vp1 - + &(c1 * u(5,i,j - 1,k) - c2 * s5) * vm1) + if (j .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k)) + enddo + else if (j .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j - + &1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k + &)) + enddo + else if (j .ge. 3 .and. j .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m + &,i,j + 2,k)) + enddo + else if (j .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k)) + enddo + else if (j .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.d0 * + & u(m,i,j - 1,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + + rhs_(1) = rhs_(1) + dz1tz1 * (u(1,i,j,k + 1) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j,k - 1)) - tz2 * (u(4,i,j,k + 1) - u(4,i,j,k - 1 + &)) + rhs_(2) = rhs_(2) + dz2tz1 * (u(2,i,j,k + 1) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j,k - 1)) + zzcon2 * (u(2,i,j,k + 1) / + &u(1,i,j,k + 1) - 2.0d0 * uijk + u(2,i,j,k - 1) / u(1,i,j,k - 1)) + &- tz2 * (u(2,i,j,k + 1) * wp1 - u(2,i,j,k - 1) * wm1) + rhs_(3) = rhs_(3) + dz3tz1 * (u(3,i,j,k + 1) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j,k - 1)) + zzcon2 * (u(3,i,j,k + 1) / + &u(1,i,j,k + 1) - 2.0d0 * vijk + u(3,i,j,k - 1) / u(1,i,j,k - 1)) + &- tz2 * (u(3,i,j,k + 1) * wp1 - u(3,i,j,k - 1) * wm1) + rhs_(4) = rhs_(4) + dz4tz1 * (u(4,i,j,k + 1) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j,k - 1)) + zzcon2 * con43 * (wp1 - 2.0d0 * wijk + &+ wm1) - tz2 * (u(4,i,j,k + 1) * wp1 - u(4,i,j,k - 1) * wm1 + (u(5 + &,i,j,k + 1) - s6 - u(5,i,j,k - 1) + s7) * c2) + rhs_(5) = rhs_(5) + dz5tz1 * (u(5,i,j,k + 1) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j,k - 1)) + zzcon3 * (qs6 - 2.0d0 * qs1 + + &qs7) + zzcon4 * (wp1 * wp1 - 2.0d0 * wijk * wij + &k + wm1 * wm1) + zzcon5 * (u(5,i,j,k + 1) * 1.0d0 / u(1,i,j,k+1) + &- 2.0d0 * u(5,i,j,k) * 1.0d0 / u(1,i,j,k) + u(5,i,j,k - 1) * + &1.0d0 / u(1,i,j,k-1) + &) - tz2 * ((c1 * u(5,i,j,k + 1) - c2 * s6) * wp1 - + &(c1 * u(5,i,j,k - 1) - c2 * s7) * wm1) + if (k .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2)) + enddo + else if (k .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j,k + &- 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2 + &)) + enddo + else if (k .ge. 3 .and. k .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m + &,i,j,k + 2)) + enddo + else if (k .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1)) + enddo + else if (k .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.d0 * + & u(m,i,j,k - 1) + 5.d0 * u(m,i,j,k)) + enddo + endif + rhs(1,i,j,k) = rhs_(1) * dt + rhs(2,i,j,k) = rhs_(2) * dt + rhs(3,i,j,k) = rhs_(3) * dt + rhs(4,i,j,k) = rhs_(4) * dt + rhs(5,i,j,k) = rhs_(5) * dt + enddo + enddo + enddo + +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_block2.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_block2.fdv new file mode 100644 index 0000000..4a8a164 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_block2.fdv @@ -0,0 +1,247 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine compute_rhs () + + include 'header3d.h' + integer i,j,k,m,z + double precision rho_inv,uijk,up1,um1,vijk,vp1,vm1,wijk,wp1,wm1,r + &hs_(5),s1,s2,s3,s4,s5,s6,s7,qs1,qs2,qs3,qs4,qs5,qs6,qs7 +!DVM$ region +!DVM$ PARALLEL (k,j,i) ON us(i,j,k),PRIVATE(m),cuda_block(128) + do k = 0,problem_size - 1 + do j = 0,problem_size - 1 + do i = 0,problem_size - 1 + do m = 1,5 + rhs(m,i,j,k) = 0 + enddo + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! compute xi-direction fluxes +!--------------------------------------------------------------------- +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), PRIVATE(uijk,up1,um1,m, +!DVM$&vijk,vp1,vm1,wijk,wp1,wm1,rhs_,s1,s2,s3,s4,s5,s6,s7, +!DVM$&qs1,qs2,qs3,qs4,qs5,qs6,qs7),cuda_block(32) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + do m = 1, 5 + rhs_(m) = forcing(m,i,j,k) + end do + + uijk = u(2,i,j,k) / u(1,i,j,k) + up1 = u(2,i + 1,j,k) / u(1,i + 1,j,k) + um1 = u(2,i - 1,j,k) / u(1,i - 1,j,k) + + vijk = u(3,i,j,k) / u(1,i,j,k) + vp1 = u(3,i,j + 1,k) / u(1,i,j + 1,k) + vm1 = u(3,i,j - 1,k) / u(1,i,j - 1,k) + + wijk = u(4,i,j,k) / u(1,i,j,k) + wp1 = u(4,i,j,k + 1) / u(1,i,j,k + 1) + wm1 = u(4,i,j,k - 1) / u(1,i,j,k - 1) + + s1 = 0.5d0 * (u(2,i,j,k) * u(2,i,j,k) + u(3,i, + &j,k) * u(3,i,j,k) + u(4,i,j,k) * u(4,i,j,k)) / u(1,i,j,k) + s2 = 0.5d0 * (u(2,i+1,j,k) * u(2,i+1,j,k) + u(3,i + &+1,j,k) * u(3,i+1,j,k) + u(4,i+1,j,k) * u(4,i+1,j,k)) / + &u(1,i+1,j,k) + s3 = 0.5d0 * (u(2,i-1,j,k) * u(2,i-1,j,k) + u(3,i + &-1,j,k) * u(3,i-1,j,k) + u(4,i-1,j,k) * u(4,i-1,j,k)) / + &u(1,i-1,j,k) + s4 = 0.5d0 * (u(2,i,j+1,k) * u(2,i,j+1,k) + u(3,i, + &j+1,k) * u(3,i,j+1,k) + u(4,i,j+1,k) * u(4,i,j+1,k)) / + &u(1,i,j+1,k) + s5 = 0.5d0 * (u(2,i,j-1,k) * u(2,i,j-1,k) + u(3,i, + &j-1,k) * u(3,i,j-1,k) + u(4,i,j-1,k) * u(4,i,j-1,k)) / + &u(1,i,j-1,k) + s6 = 0.5d0 * (u(2,i,j,k+1) * u(2,i,j,k+1) + u(3,i, + &j,k+1) * u(3,i,j,k+1) + u(4,i,j,k+1) * u(4,i,j,k+1)) / + &u(1,i,j,k+1) + s7 = 0.5d0 * (u(2,i,j,k-1) * u(2,i,j,k-1) + u(3,i, + &j,k-1) * u(3,i,j,k-1) + u(4,i,j,k-1) * u(4,i,j,k-1)) / + &u(1,i,j,k-1) + + qs1 = s1 / u(1,i,j,k) + qs2 = s2 / u(1,i+1,j,k) + qs3 = s3 / u(1,i-1,j,k) + qs4 = s4 / u(1,i,j+1,k) + qs5 = s5 / u(1,i,j-1,k) + qs6 = s6 / u(1,i,j,k+1) + qs7 = s7 / u(1,i,j,k-1) + +! rhs_(1) = forcing(1,i,j,k) +! rhs_(2) = forcing(2,i,j,k) +! rhs_(3) = forcing(3,i,j,k) +! rhs_(4) = forcing(4,i,j,k) +! rhs_(5) = forcing(5,i,j,k) + + rhs_(1) = rhs_(1) + dx1tx1 * (u(1,i + 1,j,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i - 1,j,k)) - tx2 * (u(2,i + 1,j,k) - u(2,i - 1,j,k + &)) + rhs_(2) = rhs_(2) + dx2tx1 * (u(2,i + 1,j,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i - 1,j,k)) + xxcon2 * con43 * (up1 - 2.0d0 * uijk + &+ um1) - tx2 * (u(2,i + 1,j,k) * up1 - u(2,i - 1,j,k) * um1 + (u(5 + &,i + 1,j,k) - s2 - u(5,i - 1,j,k) + s3) * c2) + rhs_(3) = rhs_(3) + dx3tx1 * (u(3,i + 1,j,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i - 1,j,k)) + xxcon2 * (u(3,i + 1,j,k) / + &u(1,i + 1,j,k) - 2.0d0 * vijk + u(3,i - 1,j,k)/u(1,i - 1,j,k)) + &- tx2 * (u(3,i + 1,j,k) * up1 - u(3,i - 1,j,k) * um1) + rhs_(4) = rhs_(4) + dx4tx1 * (u(4,i + 1,j,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i - 1,j,k)) + xxcon2 * (u(4,i + 1,j,k) / + &u(1,i + 1,j,k) - 2.0d0 * wijk + u(4,i - 1,j,k) / u(1,i - 1,j,k)) + &- tx2 * (u(4,i + 1,j,k) * up1 - u(4,i - 1,j,k) * um1) + rhs_(5) = rhs_(5) + dx5tx1 * (u(5,i + 1,j,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i - 1,j,k)) + xxcon3 * (qs2 - 2.0d0 * qs1 + + &qs3) + xxcon4 * (up1 * up1 - 2.0d0 * uijk * uij + &k + um1 * um1) + xxcon5 * (u(5,i + 1,j,k) * 1.0d0 / u(1,i + 1,j,k) + & - 2.0d0 * u(5,i,j,k) * 1.0d0 / u(1,i,j,k) + u(5,i - 1,j,k) * + &1.0d0 / u(1,i - 1,j,k)) - tx2 * ((c1 * u(5,i + 1,j,k) - + &c2 * s2) * up1 - + &(c1 * u(5,i - 1,j,k) - c2 * s3) * um1) + if (i .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k)) + enddo + else if (i .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i - 1, + &j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k + &)) + enddo + else if (i .ge. 3 .and. i .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m + &,i + 2,j,k)) + enddo + else if (i .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k)) + enddo + else if (i .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.d0 * + & u(m,i - 1,j,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + + rhs_(1) = rhs_(1) + dy1ty1 * (u(1,i,j + 1,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j - 1,k)) - ty2 * (u(3,i,j + 1,k) - u(3,i,j - 1,k + &)) + rhs_(2) = rhs_(2) + dy2ty1 * (u(2,i,j + 1,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j - 1,k)) + yycon2 * (u(2,i,j + 1,k) / + &u(1,i,j + 1,k) - 2.0d0 * uijk + u(2,i,j - 1,k)/u(1,i,j - 1,k)) + &- ty2 * (u(2,i,j + 1,k) * vp1 - u(2,i,j -1,k) * vm1) + rhs_(3) = rhs_(3) + dy3ty1 * (u(3,i,j + 1,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j - 1,k)) + yycon2 * con43 * (vp1 - 2.0d0 * vijk + &+ vm1) - ty2 * (u(3,i,j + 1,k) * vp1 - u(3,i,j - 1,k) * vm1 + (u(5 + &,i,j + 1,k) - s4 - u(5,i,j - 1,k) + s5) * c2) + rhs_(4) = rhs_(4) + dy4ty1 * (u(4,i,j + 1,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j - 1,k)) + yycon2 * (u(4,i,j + 1,k) / + &u(1,i,j + 1,k) - 2.0d0 * wijk + u(4,i,j - 1,k) / u(1,i,j - 1,k)) + &- ty2 * (u(4,i,j + 1,k) * vp1 - u(4,i,j - 1,k) * vm1) + rhs_(5) = rhs_(5) + dy5ty1 * (u(5,i,j + 1,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j - 1,k)) + yycon3 * (qs4 - 2.0d0 * qs1 + & + qs5) + yycon4 * (vp1 * vp1 - 2.0d0 * vijk * vij + &k + vm1 * vm1) + yycon5 * (u(5,i,j + 1,k) * 1.0d0 / u(1,i,j + 1,k) + &- 2.0d0 * u(5,i,j,k) * 1.0d0 / u(1,i,j,k) + u(5,i,j - 1,k) * + &1.0d0 / u(1,i,j - 1,k) + &) - ty2 * ((c1 * u(5,i,j + 1,k) - c2 * s4) * vp1 - + &(c1 * u(5,i,j - 1,k) - c2 * s5) * vm1) + if (j .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k)) + enddo + else if (j .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j - + &1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k + &)) + enddo + else if (j .ge. 3 .and. j .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m + &,i,j + 2,k)) + enddo + else if (j .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k)) + enddo + else if (j .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.d0 * + & u(m,i,j - 1,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + + rhs_(1) = rhs_(1) + dz1tz1 * (u(1,i,j,k + 1) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j,k - 1)) - tz2 * (u(4,i,j,k + 1) - u(4,i,j,k - 1 + &)) + rhs_(2) = rhs_(2) + dz2tz1 * (u(2,i,j,k + 1) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j,k - 1)) + zzcon2 * (u(2,i,j,k + 1) / + &u(1,i,j,k + 1) - 2.0d0 * uijk + u(2,i,j,k - 1) / u(1,i,j,k - 1)) + &- tz2 * (u(2,i,j,k + 1) * wp1 - u(2,i,j,k - 1) * wm1) + rhs_(3) = rhs_(3) + dz3tz1 * (u(3,i,j,k + 1) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j,k - 1)) + zzcon2 * (u(3,i,j,k + 1) / + &u(1,i,j,k + 1) - 2.0d0 * vijk + u(3,i,j,k - 1) / u(1,i,j,k - 1)) + &- tz2 * (u(3,i,j,k + 1) * wp1 - u(3,i,j,k - 1) * wm1) + rhs_(4) = rhs_(4) + dz4tz1 * (u(4,i,j,k + 1) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j,k - 1)) + zzcon2 * con43 * (wp1 - 2.0d0 * wijk + &+ wm1) - tz2 * (u(4,i,j,k + 1) * wp1 - u(4,i,j,k - 1) * wm1 + (u(5 + &,i,j,k + 1) - s6 - u(5,i,j,k - 1) + s7) * c2) + rhs_(5) = rhs_(5) + dz5tz1 * (u(5,i,j,k + 1) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j,k - 1)) + zzcon3 * (qs6 - 2.0d0 * qs1 + + &qs7) + zzcon4 * (wp1 * wp1 - 2.0d0 * wijk * wij + &k + wm1 * wm1) + zzcon5 * (u(5,i,j,k + 1) * 1.0d0 / u(1,i,j,k+1) + &- 2.0d0 * u(5,i,j,k) * 1.0d0 / u(1,i,j,k) + u(5,i,j,k - 1) * + &1.0d0 / u(1,i,j,k-1) + &) - tz2 * ((c1 * u(5,i,j,k + 1) - c2 * s6) * wp1 - + &(c1 * u(5,i,j,k - 1) - c2 * s7) * wm1) + if (k .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2)) + enddo + else if (k .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j,k + &- 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2 + &)) + enddo + else if (k .ge. 3 .and. k .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m + &,i,j,k + 2)) + enddo + else if (k .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1)) + enddo + else if (k .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.d0 * + & u(m,i,j,k - 1) + 5.d0 * u(m,i,j,k)) + enddo + endif + rhs(1,i,j,k) = rhs_(1) * dt + rhs(2,i,j,k) = rhs_(2) * dt + rhs(3,i,j,k) = rhs_(3) * dt + rhs(4,i,j,k) = rhs_(4) * dt + rhs(5,i,j,k) = rhs_(5) * dt + enddo + enddo + enddo + +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_mpi.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_mpi.fdv new file mode 100644 index 0000000..549948e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/compute_rhs_mpi.fdv @@ -0,0 +1,219 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine compute_rhs () + + include 'header3d.h' + integer i,j,k,m + double precision rho_inv,uijk,up1,um1,vijk,vp1,vm1,wijk,wp1,wm1,r + &hs_(5) + +!DVM$ region out(rho_i, us, vs, ws, qs, square) +!DVM$ PARALLEL (k,j,i) ON us(i,j,k), SHADOW_COMPUTE, +!DVM$& PRIVATE(rho_inv,m),cuda_block(128) +!DVM$& ,SHADOW_RENEW(u(0:0,2:2,2:2,2:2)) + do k = 0,problem_size - 1 + do j = 0,problem_size - 1 + do i = 0,problem_size - 1 + rho_inv = 1.0d0 / u(1,i,j,k) + rho_i(i,j,k) = rho_inv + us(i,j,k) = u(2,i,j,k) * rho_inv + vs(i,j,k) = u(3,i,j,k) * rho_inv + ws(i,j,k) = u(4,i,j,k) * rho_inv + square(i,j,k) = 0.5d0 * (u(2,i,j,k) * u(2,i,j,k) + u(3,i, + &j,k) * u(3,i,j,k) + u(4,i,j,k) * u(4,i,j,k)) * rho_inv + qs(i,j,k) = square(i,j,k) * rho_inv + do m = 1,5 + rhs(m,i,j,k) = forcing(m,i,j,k) + enddo + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! compute xi-direction fluxes +!--------------------------------------------------------------------- +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), PRIVATE(uijk,up1,um1,m, +!DVM$&vijk,vp1,vm1,wijk,wp1,wm1,rhs_),cuda_block(32) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + uijk = us(i,j,k) + up1 = us(i + 1,j,k) + um1 = us(i - 1,j,k) + rhs_(1) = forcing(1,i,j,k) + rhs_(2) = forcing(2,i,j,k) + rhs_(3) = forcing(3,i,j,k) + rhs_(4) = forcing(4,i,j,k) + rhs_(5) = forcing(5,i,j,k) + + rhs_(1) = rhs_(1) + dx1tx1 * (u(1,i + 1,j,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i - 1,j,k)) - tx2 * (u(2,i + 1,j,k) - u(2,i - 1,j,k + &)) + rhs_(2) = rhs_(2) + dx2tx1 * (u(2,i + 1,j,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i - 1,j,k)) + xxcon2 * con43 * (up1 - 2.0d0 * uijk + &+ um1) - tx2 * (u(2,i + 1,j,k) * up1 - u(2,i - 1,j,k) * um1 + (u(5 + &,i + 1,j,k) - square(i + 1,j,k) - u(5,i - 1,j,k) + square(i - 1,j, + &k)) * c2) + rhs_(3) = rhs_(3) + dx3tx1 * (u(3,i + 1,j,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i - 1,j,k)) + xxcon2 * (vs(i + 1,j,k) - 2.0d0 * vs( + &i,j,k) + vs(i - 1,j,k)) - tx2 * (u(3,i + 1,j,k) * up1 - u(3,i - 1, + &j,k) * um1) + rhs_(4) = rhs_(4) + dx4tx1 * (u(4,i + 1,j,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i - 1,j,k)) + xxcon2 * (ws(i + 1,j,k) - 2.0d0 * ws( + &i,j,k) + ws(i - 1,j,k)) - tx2 * (u(4,i + 1,j,k) * up1 - u(4,i - 1, + &j,k) * um1) + rhs_(5) = rhs_(5) + dx5tx1 * (u(5,i + 1,j,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i - 1,j,k)) + xxcon3 * (qs(i + 1,j,k) - 2.0d0 * qs( + &i,j,k) + qs(i - 1,j,k)) + xxcon4 * (up1 * up1 - 2.0d0 * uijk * uij + &k + um1 * um1) + xxcon5 * (u(5,i + 1,j,k) * rho_i(i + 1,j,k) - 2.0 + &d0 * u(5,i,j,k) * rho_i(i,j,k) + u(5,i - 1,j,k) * rho_i(i - 1,j,k) + &) - tx2 * ((c1 * u(5,i + 1,j,k) - c2 * square(i + 1,j,k)) * up1 - + &(c1 * u(5,i - 1,j,k) - c2 * square(i - 1,j,k)) * um1) + if (i .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k)) + enddo + else if (i .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i - 1, + &j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m,i + 2,j,k + &)) + enddo + else if (i .ge. 3 .and. i .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k) + u(m + &,i + 2,j,k)) + enddo + else if (i .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.0d0 + &* u(m,i - 1,j,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i + 1,j,k)) + enddo + else if (i .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i - 2,j,k) - 4.d0 * + & u(m,i - 1,j,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + vijk = vs(i,j,k) + vp1 = vs(i,j + 1,k) + vm1 = vs(i,j - 1,k) + rhs_(1) = rhs_(1) + dy1ty1 * (u(1,i,j + 1,k) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j - 1,k)) - ty2 * (u(3,i,j + 1,k) - u(3,i,j - 1,k + &)) + rhs_(2) = rhs_(2) + dy2ty1 * (u(2,i,j + 1,k) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j - 1,k)) + yycon2 * (us(i,j + 1,k) - 2.0d0 * us( + &i,j,k) + us(i,j - 1,k)) - ty2 * (u(2,i,j + 1,k) * vp1 - u(2,i,j - + &1,k) * vm1) + rhs_(3) = rhs_(3) + dy3ty1 * (u(3,i,j + 1,k) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j - 1,k)) + yycon2 * con43 * (vp1 - 2.0d0 * vijk + &+ vm1) - ty2 * (u(3,i,j + 1,k) * vp1 - u(3,i,j - 1,k) * vm1 + (u(5 + &,i,j + 1,k) - square(i,j + 1,k) - u(5,i,j - 1,k) + square(i,j - 1, + &k)) * c2) + rhs_(4) = rhs_(4) + dy4ty1 * (u(4,i,j + 1,k) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j - 1,k)) + yycon2 * (ws(i,j + 1,k) - 2.0d0 * ws( + &i,j,k) + ws(i,j - 1,k)) - ty2 * (u(4,i,j + 1,k) * vp1 - u(4,i,j - + &1,k) * vm1) + rhs_(5) = rhs_(5) + dy5ty1 * (u(5,i,j + 1,k) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j - 1,k)) + yycon3 * (qs(i,j + 1,k) - 2.0d0 * qs( + &i,j,k) + qs(i,j - 1,k)) + yycon4 * (vp1 * vp1 - 2.0d0 * vijk * vij + &k + vm1 * vm1) + yycon5 * (u(5,i,j + 1,k) * rho_i(i,j + 1,k) - 2.0 + &d0 * u(5,i,j,k) * rho_i(i,j,k) + u(5,i,j - 1,k) * rho_i(i,j - 1,k) + &) - ty2 * ((c1 * u(5,i,j + 1,k) - c2 * square(i,j + 1,k)) * vp1 - + &(c1 * u(5,i,j - 1,k) - c2 * square(i,j - 1,k)) * vm1) + if (j .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k)) + enddo + else if (j .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j - + &1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m,i,j + 2,k + &)) + enddo + else if (j .ge. 3 .and. j .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k) + u(m + &,i,j + 2,k)) + enddo + else if (j .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.0d0 + &* u(m,i,j - 1,k) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j + 1,k)) + enddo + else if (j .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j - 2,k) - 4.d0 * + & u(m,i,j - 1,k) + 5.d0 * u(m,i,j,k)) + enddo + endif + wijk = ws(i,j,k) + wp1 = ws(i,j,k + 1) + wm1 = ws(i,j,k - 1) + rhs_(1) = rhs_(1) + dz1tz1 * (u(1,i,j,k + 1) - 2.0d0 * u( + &1,i,j,k) + u(1,i,j,k - 1)) - tz2 * (u(4,i,j,k + 1) - u(4,i,j,k - 1 + &)) + rhs_(2) = rhs_(2) + dz2tz1 * (u(2,i,j,k + 1) - 2.0d0 * u( + &2,i,j,k) + u(2,i,j,k - 1)) + zzcon2 * (us(i,j,k + 1) - 2.0d0 * us( + &i,j,k) + us(i,j,k - 1)) - tz2 * (u(2,i,j,k + 1) * wp1 - u(2,i,j,k + &- 1) * wm1) + rhs_(3) = rhs_(3) + dz3tz1 * (u(3,i,j,k + 1) - 2.0d0 * u( + &3,i,j,k) + u(3,i,j,k - 1)) + zzcon2 * (vs(i,j,k + 1) - 2.0d0 * vs( + &i,j,k) + vs(i,j,k - 1)) - tz2 * (u(3,i,j,k + 1) * wp1 - u(3,i,j,k + &- 1) * wm1) + rhs_(4) = rhs_(4) + dz4tz1 * (u(4,i,j,k + 1) - 2.0d0 * u( + &4,i,j,k) + u(4,i,j,k - 1)) + zzcon2 * con43 * (wp1 - 2.0d0 * wijk + &+ wm1) - tz2 * (u(4,i,j,k + 1) * wp1 - u(4,i,j,k - 1) * wm1 + (u(5 + &,i,j,k + 1) - square(i,j,k + 1) - u(5,i,j,k - 1) + square(i,j,k - + &1)) * c2) + rhs_(5) = rhs_(5) + dz5tz1 * (u(5,i,j,k + 1) - 2.0d0 * u( + &5,i,j,k) + u(5,i,j,k - 1)) + zzcon3 * (qs(i,j,k + 1) - 2.0d0 * qs( + &i,j,k) + qs(i,j,k - 1)) + zzcon4 * (wp1 * wp1 - 2.0d0 * wijk * wij + &k + wm1 * wm1) + zzcon5 * (u(5,i,j,k + 1) * rho_i(i,j,k + 1) - 2.0 + &d0 * u(5,i,j,k) * rho_i(i,j,k) + u(5,i,j,k - 1) * rho_i(i,j,k - 1) + &) - tz2 * ((c1 * u(5,i,j,k + 1) - c2 * square(i,j,k + 1)) * wp1 - + &(c1 * u(5,i,j,k - 1) - c2 * square(i,j,k - 1)) * wm1) + if (k .eq. 1) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (5.0d0 * u(m,i,j,k) - 4. + &0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2)) + enddo + else if (k .eq. 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * ((-(4.0d0)) * u(m,i,j,k + &- 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m,i,j,k + 2 + &)) + enddo + else if (k .ge. 3 .and. k .le. problem_size - 4) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1) + u(m + &,i,j,k + 2)) + enddo + else if (k .eq. problem_size - 3) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.0d0 + &* u(m,i,j,k - 1) + 6.0d0 * u(m,i,j,k) - 4.0d0 * u(m,i,j,k + 1)) + enddo + else if (k .eq. problem_size - 2) then + do m = 1,5 + rhs_(m) = rhs_(m) - dssp * (u(m,i,j,k - 2) - 4.d0 * + & u(m,i,j,k - 1) + 5.d0 * u(m,i,j,k)) + enddo + endif + rhs(1,i,j,k) = rhs_(1) * dt + rhs(2,i,j,k) = rhs_(2) * dt + rhs(3,i,j,k) = rhs_(3) * dt + rhs(4,i,j,k) = rhs_(4) * dt + rhs(5,i,j,k) = rhs_(5) * dt + enddo + enddo + enddo + +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_rhs.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_rhs.fdv new file mode 100644 index 0000000..01c5640 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_rhs.fdv @@ -0,0 +1,307 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine exact_rhs + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + + include 'header3d.h' + + double precision dtemp(5), xi, eta, zeta, dtpp + integer m, i, j, k, ip1, im1, jp1, p, p1, + > jm1, km1, kp1,z + double precision ue_(-2:2, 5), buf_(-2:2, 5),cuf_(-2:2),q_(-2:2) + + +!DVM$ region +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(m) + do k= 0, problem_size-1 + do j = 0, problem_size-1 + do i = 0, problem_size-1 + do m = 1, 5 + forcing(m,i,j,k) = 0.0d0 + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c xi-direction flux differences +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(zeta,eta,xi,m,dtemp +!DVM$& ,buf_,cuf_,q_,dtpp,z,ue_) + do k = 1, problem_size-2 + do j = 1, problem_size-2 + do i = 1, problem_size-2 + zeta = dble(k) * dnzm1 + eta = dble(j) * dnym1 + do z = -2, 2 + xi = dble(i + z) * dnxm1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,2) * buf_(z,2) + buf_(z,1) = cuf_(z) + buf_(z,3) * buf_(z,3) + + > buf_(z,4) * buf_(z,4) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3)* + > ue_(z,3) + buf_(z,4)*ue_(z,4)) + enddo + + forcing(1,i,j,k) = forcing(1,i,j,k) - + > tx2*( ue_(1,2)-ue_(-1,2) )+ + > dx1tx1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + forcing(2,i,j,k) = forcing(2,i,j,k) - tx2 * ( + > (ue_(1,2)*buf_(1,2)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,2)*buf_(-1,2)+c2*(ue_(-1,5)-q_(-1))))+ + > xxcon1*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dx2tx1*( ue_(1,2)-2.0d0* ue_(0,2)+ue_(-1,2)) + + forcing(3,i,j,k) = forcing(3,i,j,k) - tx2 * ( + > ue_(1,3)*buf_(1,2)-ue_(-1,3)*buf_(-1,2))+ + > xxcon2*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dx3tx1*( ue_(1,3)-2.0d0*ue_(0,3) +ue_(-1,3)) + + forcing(4,i,j,k) = forcing(4,i,j,k) - tx2*( + > ue_(1,4)*buf_(1,2)-ue_(-1,4)*buf_(-1,2))+ + > xxcon2*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dx4tx1*( ue_(1,4)-2.0d0* ue_(0,4)+ ue_(-1,4)) + + forcing(5,i,j,k) = forcing(5,i,j,k) - tx2*( + > buf_(1,2)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,2)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*xxcon3*(buf_(1,1)-2.0d0*buf_(0,1)+ + > buf_(-1,1))+ + > xxcon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > xxcon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dx5tx1*( ue_(1,5)-2.0d0* ue_(0,5)+ ue_(-1,5)) + do m = 1, 5 + if(i .eq. 1) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(i .eq. 2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(i .eq. problem_size-3) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(i .eq. problem_size-2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c eta-direction flux differences +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(zeta,eta,xi,m,dtemp +!DVM$& ,buf_,cuf_,q_,dtpp,z,ue_) + do k = 1, problem_size- 2 + do j = 1, problem_size-2 + do i = 1, problem_size- 2 + zeta = dble(k) * dnzm1 + xi = dble(i) * dnxm1 + do z = -2, 2 + eta = dble(j + z) * dnym1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,3) * buf_(z,3) + buf_(z,1) = cuf_(z) + buf_(z,2) * buf_(z,2) + + > buf_(z,4) * buf_(z,4) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3) + > *ue_(z,3) + buf_(z,4) * ue_(z,4)) + enddo + + forcing(1,i,j,k) = forcing(1,i,j,k) - + > ty2*( ue_(1,3)-ue_(-1,3) )+ + > dy1ty1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + forcing(2,i,j,k) = forcing(2,i,j,k) - ty2*( + > ue_(1,2)*buf_(1,3)-ue_(-1,2)*buf_(-1,3))+ + > yycon2*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dy2ty1*( ue_(1,2)-2.0* ue_(0,2)+ ue_(-1,2)) + + forcing(3,i,j,k) = forcing(3,i,j,k) - ty2*( + > (ue_(1,3)*buf_(1,3)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,3)*buf_(-1,3)+c2*(ue_(-1,5)-q_(-1))))+ + > yycon1*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dy3ty1*( ue_(1,3)-2.0d0*ue_(0,3) +ue_(-1,3)) + + forcing(4,i,j,k) = forcing(4,i,j,k) - ty2*( + > ue_(1,4)*buf_(1,3)-ue_(-1,4)*buf_(-1,3))+ + > yycon2*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dy4ty1*( ue_(1,4)-2.0d0*ue_(0,4)+ ue_(-1,4)) + + forcing(5,i,j,k) = forcing(5,i,j,k) - ty2*( + > buf_(1,3)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,3)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*yycon3*(buf_(1,1)-2.0d0*buf_(0,1)+ + > buf_(-1,1))+ + > yycon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > yycon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dy5ty1*(ue_(1,5)-2.0d0*ue_(0,5)+ue_(-1,5)) + do m = 1, 5 + if(j .eq. 1) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(j .eq. 2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(j .eq. problem_size-3) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(j .eq. problem_size-2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c zeta-direction flux differences +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(zeta,eta,xi,m +!DVM$& ,buf_,cuf_,q_,ue_,dtpp,dtemp,z) + do k = 1, problem_size-2 + do j = 1, problem_size-2 + do i = 1, problem_size-2 + xi = dble(i) * dnxm1 + eta = dble(j) * dnym1 + do z = -2, 2 + zeta = dble(k + z) * dnzm1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,4) * buf_(z,4) + buf_(z,1) = cuf_(z) + buf_(z,2) * buf_(z,2) + + > buf_(z,3) * buf_(z,3) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3)* + > ue_(z,3) + buf_(z,4)*ue_(z,4)) + enddo + + forcing(1,i,j,k) = forcing(1,i,j,k) - + > tz2*( ue_(1,4)-ue_(-1,4) )+ + > dz1tz1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + forcing(2,i,j,k) = forcing(2,i,j,k) - tz2 * ( + > ue_(1,2)*buf_(1,4)-ue_(-1,2)*buf_(-1,4))+ + > zzcon2*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dz2tz1*( ue_(1,2)-2.0d0* ue_(0,2)+ ue_(-1,2)) + + forcing(3,i,j,k) = forcing(3,i,j,k) - tz2 * ( + > ue_(1,3)*buf_(1,4)-ue_(-1,3)*buf_(-1,4))+ + > zzcon2*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dz3tz1*(ue_(1,3)-2.0d0*ue_(0,3)+ue_(-1,3)) + + forcing(4,i,j,k) = forcing(4,i,j,k) - tz2 * ( + > (ue_(1,4)*buf_(1,4)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,4)*buf_(-1,4)+c2*(ue_(-1,5)-q_(-1))))+ + > zzcon1*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dz4tz1*( ue_(1,4)-2.0d0*ue_(0,4) +ue_(-1,4)) + + forcing(5,i,j,k) = forcing(5,i,j,k) - tz2 * ( + > buf_(1,4)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,4)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*zzcon3*(buf_(1,1)-2.0d0*buf_(0,1) + > +buf_(-1,1))+ + > zzcon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > zzcon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dz5tz1*( ue_(1,5)-2.0d0*ue_(0,5)+ ue_(-1,5)) + do m = 1, 5 + if(k .eq. 1) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(k .eq. 2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(k .eq. problem_size-3) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(k .eq. problem_size-2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c now change the sign of the forcing function, +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(m) + do k = 1, problem_size-2 + do j = 1, problem_size-2 + do i = 1, problem_size-2 + do m = 1, 5 + forcing(m,i,j,k) = -1.d0 * forcing(m,i,j,k) + end do + end do + end do + end do +!DVM$ end region + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_rhs_block.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_rhs_block.fdv new file mode 100644 index 0000000..3d74e46 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_rhs_block.fdv @@ -0,0 +1,4 @@ + subroutine exact_rhs + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_solution.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_solution.fdv new file mode 100644 index 0000000..28e00a0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/exact_solution.fdv @@ -0,0 +1,18 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! this function returns the exact solution at point xi, eta, zeta +!--------------------------------------------------------------------- + subroutine exact_solution (xi, eta, zeta, dtemp) + + include 'header3d.h' + double precision xi,eta,zeta,dtemp(5) + integer m + do m = 1,5 + dtemp(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + xi * (ce(m + &,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6) + eta * ( + &ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * (ce(m,7) + + &zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/header3d.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/header3d.h new file mode 100644 index 0000000..88298ef --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/header3d.h @@ -0,0 +1,106 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! +! header.h +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + + implicit none + +!--------------------------------------------------------------------- +! The following include file is generated automatically by the +! "setparams" utility. It defines +! maxcells: the square root of the maximum number of processors +! problem_size: 12, 64, 102, 162 (for class T, A, B, C) +! dt_default: default time step for this problem size if no +! config file +! niter_default: default number of iterations for this problem size +!--------------------------------------------------------------------- + + include 'npbparams.h' + + integer aa, bb, cc, BLOCK_SIZE + parameter (aa=1, bb=2, cc=3, BLOCK_SIZE=5) + + integer grid_points(3) + double precision elapsed_time + common /global/ elapsed_time, grid_points + + double precision tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3 + double precision dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4 + double precision dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt + double precision ce(5,13), dxmax, dymax, dzmax, xxcon1, xxcon2 + double precision xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1 + double precision dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4 + double precision yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1 + double precision zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1 + double precision dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1 + double precision dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2 + double precision c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1 + double precision dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1 + double precision c2dtty1, c2dttz1, comz1, comz4, comz5, comz6 + double precision c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16 + integer stage_n, BL, R + + common /constants/ tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3 + common /constants/ dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4 + common /constants/ dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt + common /constants/ ce, dxmax, dymax, dzmax, xxcon1, xxcon2 + common /constants/ xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1 + common /constants/ dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4 + common /constants/ yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1 + common /constants/ zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1 + common /constants/ dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1 + common /constants/ dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2 + common /constants/ c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1 + common /constants/ dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1 + common /constants/ c2dtty1, c2dttz1, comz1, comz4, comz5, comz6 + common /constants/ c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16 + common /constants/ stage_n + + integer IMAX, JMAX, KMAX + + parameter (IMAX=problem_size,JMAX=problem_size,KMAX=problem_size) + parameter (BL=1, R=0) +! +! to improve cache performance, grid dimensions padded by 1 +! for even number sizes only. +! + double precision us(0:IMAX/2*2, 0:JMAX/2*2, 0:KMAX/2*2) + double precision vs(0:IMAX/2*2, 0:JMAX/2*2, 0:KMAX/2*2) + double precision ws(0:IMAX/2*2, 0:JMAX/2*2, 0:KMAX/2*2) + double precision qs(0:IMAX/2*2, 0:JMAX/2*2, 0:KMAX/2*2) + double precision rho_i(0:IMAX/2*2, 0:JMAX/2*2, 0:KMAX/2*2) + double precision square(0:IMAX/2*2, 0:JMAX/2*2, 0:KMAX/2*2) + double precision forcing (5,0:IMAX/2*2,0:JMAX/2*2, 0:KMAX/2*2) + double precision u(5,0:(IMAX+1)/2*2,0:(JMAX+1)/2*2,0:(KMAX+1)/2*2) + double precision rhs(5,0:IMAX/2*2, 0:JMAX/2*2, 0:KMAX/2*2) + double precision lhs__(5,5,0:IMAX/2*2,0:JMAX/2*2,0:KMAX/2*2/BL+R) + common /fields/ u, us, vs, ws, qs, rho_i, square + common /fields/ rhs, forcing, lhs__ + + double precision cv(-2:problem_size+1) + double precision cuf(-2:problem_size+1), q(-2:problem_size+1) + double precision ue(-2:problem_size+1,5), buf(-2:problem_size+1,5) + common /work_1d/ cv, cuf, q, ue, buf + + double precision tmp1, tmp2, tmp3, tmp11, tmp22 + double precision t1, t2, t3, tm1, tm2, tm3 + + common /work_lhs/ tmp1, tmp2, tmp3, tmp11, tmp22 + common /work_lhs/ t1, t2, t3, tm1, tm2, tm3 + double precision tmp_block(5,5), b_inverse(5,5), tmp_vec(5) + common /work_solve/ tmp_block, b_inverse, tmp_vec +!-------------------------------------------------------------------- +! FDVM Specifications +!-------------------------------------------------------------------- + +!DVM$ DISTRIBUTE us (BLOCK,BLOCK,BLOCK) +!DVM$ ALIGN (i,j,k) WITH us(i,j,k) :: vs, ws, qs, rho_i, square +!DVM$ ALIGN (*,*,i,j,k) WITH us(i,j,k) :: lhs__ +!DVM$ ALIGN (*,i,j,k) WITH us(i,j,k) :: u, rhs +!DVM$ ALIGN (*,i,j,k) WITH us(i,j,k) :: forcing + +!DVM$ SHADOW u(2:2,2:2,2:2,2:2) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/initialize.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/initialize.fdv new file mode 100644 index 0000000..7c39d39 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/initialize.fdv @@ -0,0 +1,181 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! This subroutine initializes the field variable u using +! tri-linear transfinite interpolation of the boundary values +!--------------------------------------------------------------------- + subroutine initialize () + + include 'header3d.h' + integer i,j,k,m,ix,iy,iz + double precision xi,eta,zeta,pface(5,3,2),pxi,peta,pzeta,temp(5), + &xi1,yi1,zi1 + xi = 0.0 + eta = 0.0 + zeta = 0.0 + +!--------------------------------------------------------------------- +! Later (in compute_rhs) we compute 1/u for every element. A few of +! the corner elements are not used, but it convenient (and faster) +! to compute the whole thing with a simple loop. Make sure those +! values are nonzero by initializing the whole thing here. +!--------------------------------------------------------------------- +!DVM$ region out(u) +!DVM$ PARALLEL (k,j,i) ON u(*,i,j,k), SHADOW_COMPUTE, private(m) + do k = 0,imax - 1 + do j = 0,imax - 1 + do i = 0,imax - 1 + do m = 1,5 + u(m,i,j,k) = 1.0 + enddo + enddo + enddo + enddo + +!DVM$ PARALLEL (k,j,i) ON u(*,i,j,k), private(m,zeta,eta, xi,ix, +!DVM$& iy,iz,Pxi,Peta,Pzeta,Pface,xi1,yi1,zi1,temp),SHADOW_COMPUTE + do k = 0,grid_points(3) - 1 + do j = 0,grid_points(2) - 1 + do i = 0,grid_points(1) - 1 + zeta = dble (k) * dnzm1 + eta = dble (j) * dnym1 + xi = dble (i) * dnxm1 + do ix = 1,2 + +! call exact_solution(dble(ix-1), eta, zeta, Pface(1,1,ix)) + xi1 = dble (ix - 1) + do m = 1,5 + pface(m,1,ix) = ce(m,1) + xi1 * (ce(m,2) + xi1 * (c + &e(m,5) + xi1 * (ce(m,8) + xi1 * ce(m,11)))) + eta * (ce(m,3) + eta + & * (ce(m,6) + eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + & + zeta * (ce(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + enddo + do iy = 1,2 + +! call exact_solution(xi, dble(iy-1) , zeta, Pface(1,2,iy)) + yi1 = dble (iy - 1) + do m = 1,5 + pface(m,2,iy) = ce(m,1) + xi * (ce(m,2) + xi * (ce( + &m,5) + xi * (ce(m,8) + xi * ce(m,11)))) + yi1 * (ce(m,3) + yi1 * ( + &ce(m,6) + yi1 * (ce(m,9) + yi1 * ce(m,12)))) + zeta * (ce(m,4) + z + &eta * (ce(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + enddo + do iz = 1,2 + +! call exact_solution(xi, eta, dble(iz-1), Pface(1,3,iz)) + zi1 = dble (iz - 1) + do m = 1,5 + pface(m,3,iz) = ce(m,1) + xi * (ce(m,2) + xi * (ce( + &m,5) + xi * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * ( + &ce(m,6) + eta * (ce(m,9) + eta * ce(m,12)))) + zi1 * (ce(m,4) + zi + &1 * (ce(m,7) + zi1 * (ce(m,10) + zi1 * ce(m,13)))) + enddo + enddo + do m = 1,5 + pxi = xi * pface(m,1,2) + (1.0d0 - xi) * pface(m,1,1) + peta = eta * pface(m,2,2) + (1.0d0 - eta) * pface(m,2, + &1) + pzeta = zeta * pface(m,3,2) + (1.0d0 - zeta) * pface(m + &,3,1) + u(m,i,j,k) = pxi + peta + pzeta - pxi * peta - pxi * p + &zeta - peta * pzeta + pxi * peta * pzeta + enddo + + if(i .eq. 0) then + do m = 1,5 + temp(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + xi + & * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6) + + & eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * (ce + &(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + do m = 1,5 + u(m,i,j,k) = temp(m) + enddo + endif + if(i .eq. grid_points(1) - 1) then + xi = 1.0d0 + do m = 1,5 + temp(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + xi + & * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6) + + & eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * (ce + &(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + do m = 1,5 + u(m,i,j,k) = temp(m) + enddo + endif + + if(j .eq. 0) then + zeta = dble (k) * dnzm1 + xi = dble (i) * dnxm1 + eta = 0.0d0 + + do m = 1,5 + temp(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + xi + & * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6) + + & eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * (ce + &(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + do m = 1,5 + u(m,i,j,k) = temp(m) + enddo + endif + + if(j .eq. grid_points(2) - 1) then + zeta = dble (k) * dnzm1 + xi = dble (i) * dnxm1 + eta = 1.0d0 +! call exact_solution(xi, eta, zeta, temp) + do m = 1,5 + temp(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + xi + & * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6) + + & eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * (ce + &(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + do m = 1,5 + u(m,i,j,k) = temp(m) + enddo + endif + + if(k .eq. 0) then + zeta = 0.0d0 + xi = dble (i) * dnxm1 + eta = dble (j) * dnym1 + +! call exact_solution(xi, eta, zeta, temp) + do m = 1,5 + temp(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + xi + & * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6) + + & eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * (ce + &(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + do m = 1,5 + u(m,i,j,k) = temp(m) + enddo + endif + + if(k .eq. grid_points(3) - 1) then + zeta = 1.0d0 + xi = dble (i) * dnxm1 + eta = dble (j) * dnym1 + +! call exact_solution(xi, eta, zeta, temp) + do m = 1,5 + temp(m) = ce(m,1) + xi * (ce(m,2) + xi * (ce(m,5) + xi + & * (ce(m,8) + xi * ce(m,11)))) + eta * (ce(m,3) + eta * (ce(m,6) + + & eta * (ce(m,9) + eta * ce(m,12)))) + zeta * (ce(m,4) + zeta * (ce + &(m,7) + zeta * (ce(m,10) + zeta * ce(m,13)))) + enddo + do m = 1,5 + u(m,i,j,k) = temp(m) + enddo + endif + enddo + enddo + enddo +!DVM$ end region + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/print_result.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/print_result.fdv new file mode 100644 index 0000000..8d72bdd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/print_result.fdv @@ -0,0 +1,58 @@ + + subroutine print_results (name, class, n1, n2, n3, niter, t, mops, + & optype, verified, npbversion) + +! , compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + implicit none + character*2 name + character*1 class + integer n1,n2,n3,niter,j + double precision t,mops + character optype*24,size*13 + logical verified + character*(*) npbversion + +! , compiletime,cs1, cs2, cs3, cs4, cs5, cs6, cs7 + write (unit = *,fmt = 2) name +2 format(//, ' ', A2, ' Benchmark Completed.') + write (unit = *,fmt = 3) class +3 format(' Class = ', 12x, a12) + +! If this is not a grid-based problem (EP, FT, CG), then +! we only print n1, which contains some measure of the +! problem size. In that case, n2 and n3 are both zero. +! Otherwise, we print the grid size n1xn2xn3 + if (n2 .eq. 0 .and. n3 .eq. 0) then + if (name(1:2) .eq. 'EP') then + write (unit = size,fmt = '(f12.0)') 2.d0** n1 + do j = 13,1,(-(1)) + if (size(j:j) .eq. '.') size(j:j) = ' ' + enddo + write (unit = *,fmt = 42) size +42 format(' Size = ',12x, a14) + else + write (unit = *,fmt = 44) n1 +44 format(' Size = ',12x, i12) + endif + else + write (unit = *,fmt = 4) n1,n2,n3 +4 format(' Size = ',12x, i3,'x',i3,'x',i3) + endif + write (unit = *,fmt = 5) niter +5 format(' Iterations = ', 12x, i12) + write (unit = *,fmt = 6) t +6 format(' Time in seconds = ',12x, f12.2) + write (unit = *,fmt = 9) mops +9 format(' Mop/s total = ',12x, f12.2) + write (unit = *,fmt = 11) optype +11 format(' Operation type = ', a24) + if (verified) then + write (unit = *,fmt = 12) ' SUCCESSFUL' + else + write (unit = *,fmt = 12) 'UNSUCCESSFUL' + endif +12 format(' Verification = ', 12x, a) + write (unit = *,fmt = 13) npbversion +13 format(' Version = ', 12x, a12) + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/set_constants.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/set_constants.fdv new file mode 100644 index 0000000..ff3c15f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/set_constants.fdv @@ -0,0 +1,165 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine set_constants () + + include 'header3d.h' + ce(1,1) = 2.0d0 + ce(1,2) = 0.0d0 + ce(1,3) = 0.0d0 + ce(1,4) = 4.0d0 + ce(1,5) = 5.0d0 + ce(1,6) = 3.0d0 + ce(1,7) = 0.5d0 + ce(1,8) = 0.02d0 + ce(1,9) = 0.01d0 + ce(1,10) = 0.03d0 + ce(1,11) = 0.5d0 + ce(1,12) = 0.4d0 + ce(1,13) = 0.3d0 + ce(2,1) = 1.0d0 + ce(2,2) = 0.0d0 + ce(2,3) = 0.0d0 + ce(2,4) = 0.0d0 + ce(2,5) = 1.0d0 + ce(2,6) = 2.0d0 + ce(2,7) = 3.0d0 + ce(2,8) = 0.01d0 + ce(2,9) = 0.03d0 + ce(2,10) = 0.02d0 + ce(2,11) = 0.4d0 + ce(2,12) = 0.3d0 + ce(2,13) = 0.5d0 + ce(3,1) = 2.0d0 + ce(3,2) = 2.0d0 + ce(3,3) = 0.0d0 + ce(3,4) = 0.0d0 + ce(3,5) = 0.0d0 + ce(3,6) = 2.0d0 + ce(3,7) = 3.0d0 + ce(3,8) = 0.04d0 + ce(3,9) = 0.03d0 + ce(3,10) = 0.05d0 + ce(3,11) = 0.3d0 + ce(3,12) = 0.5d0 + ce(3,13) = 0.4d0 + ce(4,1) = 2.0d0 + ce(4,2) = 2.0d0 + ce(4,3) = 0.0d0 + ce(4,4) = 0.0d0 + ce(4,5) = 0.0d0 + ce(4,6) = 2.0d0 + ce(4,7) = 3.0d0 + ce(4,8) = 0.03d0 + ce(4,9) = 0.05d0 + ce(4,10) = 0.04d0 + ce(4,11) = 0.2d0 + ce(4,12) = 0.1d0 + ce(4,13) = 0.3d0 + ce(5,1) = 5.0d0 + ce(5,2) = 4.0d0 + ce(5,3) = 3.0d0 + ce(5,4) = 2.0d0 + ce(5,5) = 0.1d0 + ce(5,6) = 0.4d0 + ce(5,7) = 0.3d0 + ce(5,8) = 0.05d0 + ce(5,9) = 0.04d0 + ce(5,10) = 0.03d0 + ce(5,11) = 0.1d0 + ce(5,12) = 0.3d0 + ce(5,13) = 0.2d0 + c1 = 1.4d0 + c2 = 0.4d0 + c3 = 0.1d0 + c4 = 1.0d0 + c5 = 1.4d0 + dnxm1 = 1.0d0 / dble (grid_points(1) - 1) + dnym1 = 1.0d0 / dble (grid_points(2) - 1) + dnzm1 = 1.0d0 / dble (grid_points(3) - 1) + c1c2 = c1 * c2 + c1c5 = c1 * c5 + c3c4 = c3 * c4 + c1345 = c1c5 * c3c4 + conz1 = 1.0d0 - c1c5 + tx1 = 1.0d0 / (dnxm1 * dnxm1) + tx2 = 1.0d0 / (2.0d0 * dnxm1) + tx3 = 1.0d0 / dnxm1 + ty1 = 1.0d0 / (dnym1 * dnym1) + ty2 = 1.0d0 / (2.0d0 * dnym1) + ty3 = 1.0d0 / dnym1 + tz1 = 1.0d0 / (dnzm1 * dnzm1) + tz2 = 1.0d0 / (2.0d0 * dnzm1) + tz3 = 1.0d0 / dnzm1 + dx1 = 0.75d0 + dx2 = 0.75d0 + dx3 = 0.75d0 + dx4 = 0.75d0 + dx5 = 0.75d0 + dy1 = 0.75d0 + dy2 = 0.75d0 + dy3 = 0.75d0 + dy4 = 0.75d0 + dy5 = 0.75d0 + dz1 = 1.0d0 + dz2 = 1.0d0 + dz3 = 1.0d0 + dz4 = 1.0d0 + dz5 = 1.0d0 + dxmax = dmax1 (dx3,dx4) + dymax = dmax1 (dy2,dy4) + dzmax = dmax1 (dz2,dz3) + dssp = 0.25d0 * dmax1 (dx1,dmax1 (dy1,dz1)) + c4dssp = 4.0d0 * dssp + c5dssp = 5.0d0 * dssp + dttx1 = dt * tx1 + dttx2 = dt * tx2 + dtty1 = dt * ty1 + dtty2 = dt * ty2 + dttz1 = dt * tz1 + dttz2 = dt * tz2 + c2dttx1 = 2.0d0 * dttx1 + c2dtty1 = 2.0d0 * dtty1 + c2dttz1 = 2.0d0 * dttz1 + dtdssp = dt * dssp + comz1 = dtdssp + comz4 = 4.0d0 * dtdssp + comz5 = 5.0d0 * dtdssp + comz6 = 6.0d0 * dtdssp + c3c4tx3 = c3c4 * tx3 + c3c4ty3 = c3c4 * ty3 + c3c4tz3 = c3c4 * tz3 + dx1tx1 = dx1 * tx1 + dx2tx1 = dx2 * tx1 + dx3tx1 = dx3 * tx1 + dx4tx1 = dx4 * tx1 + dx5tx1 = dx5 * tx1 + dy1ty1 = dy1 * ty1 + dy2ty1 = dy2 * ty1 + dy3ty1 = dy3 * ty1 + dy4ty1 = dy4 * ty1 + dy5ty1 = dy5 * ty1 + dz1tz1 = dz1 * tz1 + dz2tz1 = dz2 * tz1 + dz3tz1 = dz3 * tz1 + dz4tz1 = dz4 * tz1 + dz5tz1 = dz5 * tz1 + c2iv = 2.5d0 + con43 = 4.0d0 / 3.0d0 + con16 = 1.0d0 / 6.0d0 + xxcon1 = c3c4tx3 * con43 * tx3 + xxcon2 = c3c4tx3 * tx3 + xxcon3 = c3c4tx3 * conz1 * tx3 + xxcon4 = c3c4tx3 * con16 * tx3 + xxcon5 = c3c4tx3 * c1c5 * tx3 + yycon1 = c3c4ty3 * con43 * ty3 + yycon2 = c3c4ty3 * ty3 + yycon3 = c3c4ty3 * conz1 * ty3 + yycon4 = c3c4ty3 * con16 * ty3 + yycon5 = c3c4ty3 * c1c5 * ty3 + zzcon1 = c3c4tz3 * con43 * tz3 + zzcon2 = c3c4tz3 * tz3 + zzcon3 = c3c4tz3 * conz1 * tz3 + zzcon4 = c3c4tz3 * con16 * tz3 + zzcon5 = c3c4tz3 * c1c5 * tz3 + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/timers.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/timers.fdv new file mode 100644 index 0000000..d824693 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/timers.fdv @@ -0,0 +1,84 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine timer_clear (n) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + implicit none + integer n + double precision start(64),elapsed(64) + common /tt/start,elapsed + elapsed(n) = 0.0 + return + end + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine timer_start (n) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64),elapsed(64) + common /tt/start,elapsed + start(n) = elapsed_time () + return + end + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine timer_stop (n) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64),elapsed(64) + common /tt/start,elapsed + double precision t,now + now = elapsed_time () + t = now - start(n) + elapsed(n) = elapsed(n) + t + return + end + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + double precision function timer_read (n) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + implicit none + integer n + double precision start(64),elapsed(64) + common /tt/start,elapsed + timer_read = elapsed(n) + return + end + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + double precision function elapsed_time () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + implicit none + double precision t,dvtime + integer dvm_debug + +! dvm_debug = 0 - standard mode, dvm_debug > 0 - debugging mode + parameter (dvm_debug = 0) + data t/0.d0/ + t = dvtime () + elapsed_time = t + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/verify.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/verify.fdv new file mode 100644 index 0000000..874799b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/verify.fdv @@ -0,0 +1,312 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! verification routine +!--------------------------------------------------------------------- + subroutine verify (no_time_steps, class, verified) + + include 'header3d.h' + double precision xcrref(5),xceref(5),xcrdif(5),xcedif(5),epsilon, + &xce(5),xcr(5),dtref + integer m,no_time_steps + character class + logical verified + +!--------------------------------------------------------------------- +! tolerance level +!--------------------------------------------------------------------- + epsilon = 1.0d-08 + +!--------------------------------------------------------------------- +! compute the error norm and the residual norm, and exit if not printing +!--------------------------------------------------------------------- + call error_norm(xce) + call compute_rhs() + call rhs_norm(xcr) + do m = 1,5 + xcr(m) = xcr(m) / dt + enddo + class = 'U' + verified = .TRUE. + do m = 1,5 + xcrref(m) = 1.0 + xceref(m) = 1.0 + enddo + +!--------------------------------------------------------------------- +! reference data for 12X12X12 grids after 100 time steps, with DT = 1.0d-02 +!--------------------------------------------------------------------- + if (problem_size .eq. 12 .and. problem_size .eq. 12 .and. problem_ + &size .eq. 12 .and. no_time_steps .eq. 60) then + class = 'S' + dtref = 1.0d-2 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual. +!--------------------------------------------------------------------- + xcrref(1) = 1.7034283709541311d-01 + xcrref(2) = 1.2975252070034097d-02 + xcrref(3) = 3.2527926989486055d-02 + xcrref(4) = 2.6436421275166801d-02 + xcrref(5) = 1.9211784131744430d-01 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error. +!--------------------------------------------------------------------- + xceref(1) = 4.9976913345811579d-04 + xceref(2) = 4.5195666782961927d-05 + xceref(3) = 7.3973765172921357d-05 + xceref(4) = 7.3821238632439731d-05 + xceref(5) = 8.9269630987491446d-04 + +!--------------------------------------------------------------------- +! reference data for 24X24X24 grids after 200 time steps, with DT = 0.8d-3 +!--------------------------------------------------------------------- + else if (problem_size .eq. 24 .and. problem_size .eq. 24 .and. pro + &blem_size .eq. 24 .and. no_time_steps .eq. 200) then + class = 'W' + dtref = 0.8d-3 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual. +!--------------------------------------------------------------------- + xcrref(1) = 0.1125590409344d+03 + xcrref(2) = 0.1180007595731d+02 + xcrref(3) = 0.2710329767846d+02 + xcrref(4) = 0.2469174937669d+02 + xcrref(5) = 0.2638427874317d+03 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error. +!--------------------------------------------------------------------- + xceref(1) = 0.4419655736008d+01 + xceref(2) = 0.4638531260002d+00 + xceref(3) = 0.1011551749967d+01 + xceref(4) = 0.9235878729944d+00 + xceref(5) = 0.1018045837718d+02 + +!--------------------------------------------------------------------- +! reference data for 64X64X64 grids after 200 time steps, with DT = 0.8d-3 +!--------------------------------------------------------------------- + else if (problem_size .eq. 64 .and. problem_size .eq. 64 .and. pro + &blem_size .eq. 64 .and. no_time_steps .eq. 200) then + class = 'A' + dtref = 0.8d-3 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual. +!--------------------------------------------------------------------- + xcrref(1) = 1.0806346714637264d+02 + xcrref(2) = 1.1319730901220813d+01 + xcrref(3) = 2.5974354511582465d+01 + xcrref(4) = 2.3665622544678910d+01 + xcrref(5) = 2.5278963211748344d+02 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error. +!--------------------------------------------------------------------- + xceref(1) = 4.2348416040525025d+00 + xceref(2) = 4.4390282496995698d-01 + xceref(3) = 9.6692480136345650d-01 + xceref(4) = 8.8302063039765474d-01 + xceref(5) = 9.7379901770829278d+00 + +!--------------------------------------------------------------------- +! reference data for 102X102X102 grids after 200 time steps, +! with DT = 3.0d-04 +!--------------------------------------------------------------------- + else if (problem_size .eq. 102 .and. problem_size .eq. 102 .and. p + &roblem_size .eq. 102 .and. no_time_steps .eq. 200) then + class = 'B' + dtref = 3.0d-4 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual. +!--------------------------------------------------------------------- + xcrref(1) = 1.4233597229287254d+03 + xcrref(2) = 9.9330522590150238d+01 + xcrref(3) = 3.5646025644535285d+02 + xcrref(4) = 3.2485447959084092d+02 + xcrref(5) = 3.2707541254659363d+03 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error. +!--------------------------------------------------------------------- + xceref(1) = 5.2969847140936856d+01 + xceref(2) = 4.4632896115670668d+00 + xceref(3) = 1.3122573342210174d+01 + xceref(4) = 1.2006925323559144d+01 + xceref(5) = 1.2459576151035986d+02 + +!--------------------------------------------------------------------- +! reference data for 162X162X162 grids after 200 time steps, +! with DT = 1.0d-04 +!--------------------------------------------------------------------- + else if (problem_size .eq. 162 .and. problem_size .eq. 162 .and. p + &roblem_size .eq. 162 .and. no_time_steps .eq. 200) then + class = 'C' + dtref = 1.0d-4 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual. +!--------------------------------------------------------------------- + xcrref(1) = 0.62398116551764615d+04 + xcrref(2) = 0.50793239190423964d+03 + xcrref(3) = 0.15423530093013596d+04 + xcrref(4) = 0.13302387929291190d+04 + xcrref(5) = 0.11604087428436455d+05 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error. +!--------------------------------------------------------------------- + xceref(1) = 0.16462008369091265d+03 + xceref(2) = 0.11497107903824313d+02 + xceref(3) = 0.41207446207461508d+02 + xceref(4) = 0.37087651059694167d+02 + xceref(5) = 0.36211053051841265d+03 +!--------------------------------------------------------------------- +! reference data for 408x408x408 grids after 250 time steps, with DT = 0.2d-04 +!--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 408) .and. + & (grid_points(2) .eq. 408) .and. + & (grid_points(3) .eq. 408) .and. + & (no_time_steps . eq. 250) ) then + + class = 'D' + dtref = 0.2d-4 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual. +!--------------------------------------------------------------------- + xcrref(1) = 0.2533188551738d+05 + xcrref(2) = 0.2346393716980d+04 + xcrref(3) = 0.6294554366904d+04 + xcrref(4) = 0.5352565376030d+04 + xcrref(5) = 0.3905864038618d+05 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error. +!--------------------------------------------------------------------- + + xceref(1) = 0.3100009377557d+03 + xceref(2) = 0.2424086324913d+02 + xceref(3) = 0.7782212022645d+02 + xceref(4) = 0.6835623860116d+02 + xceref(5) = 0.6065737200368d+03 + +!--------------------------------------------------------------------- +! reference data for 1020x1020x1020 grids after 250 time steps, with DT = 0.4d-05 +!--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 1020) .and. + & (grid_points(2) .eq. 1020) .and. + & (grid_points(3) .eq. 1020) .and. + & (no_time_steps . eq. 250) ) then + + class = 'E' + dtref = 0.4d-5 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual. +!--------------------------------------------------------------------- + xcrref(1) = 0.9795372484517d+05 + xcrref(2) = 0.9739814511521d+04 + xcrref(3) = 0.2467606342965d+05 + xcrref(4) = 0.2092419572860d+05 + xcrref(5) = 0.1392138856939d+06 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error. +!--------------------------------------------------------------------- + + xceref(1) = 0.4327562208414d+03 + xceref(2) = 0.3699051964887d+02 + xceref(3) = 0.1089845040954d+03 + xceref(4) = 0.9462517622043d+02 + xceref(5) = 0.7765512765309d+03 + + else + verified = .FALSE. + endif + +!--------------------------------------------------------------------- +! verification test for residuals if gridsize is either 12X12X12 or +! 64X64X64 or 102X102X102 or 162X162X162 +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! Compute the difference of solution values and the known reference values. +!--------------------------------------------------------------------- + do m = 1,5 + xcrdif(m) = dabs ((xcr(m) - xcrref(m)) / xcrref(m)) + xcedif(m) = dabs ((xce(m) - xceref(m)) / xceref(m)) + enddo + +!--------------------------------------------------------------------- +! Output the comparison of computed results to known cases. +!--------------------------------------------------------------------- + if (class .ne. 'U') then + write (unit = *,fmt = 1990) class +1990 format(' Verification being performed for class ', a) + write (unit = *,fmt = 2000) epsilon +2000 format(' accuracy setting for epsilon = ', E20.13) + if (dabs (dt - dtref) .gt. epsilon) then + verified = .FALSE. + class = 'U' + write (unit = *,fmt = 1000) dtref +1000 format(' DT does not match the reference value of ', + & E15.8) + endif + else + write (unit = *,fmt = 1995) +1995 format(' Unknown class') + endif + if (class .ne. 'U') then + write (unit = *,fmt = 2001) + else + write (unit = *,fmt = 2005) + endif +2001 format(' Comparison of RMS-norms of residual') +2005 format(' RMS-norms of residual') + do m = 1,5 + if (class .eq. 'U') then + write (unit = *,fmt = 2015) m,xcr(m) + else if (xcrdif(m) .gt. epsilon .or. isnan(xcrdif(m)))then + verified = .FALSE. + write (unit = *,fmt = 2010) m,xcr(m),xcrref(m),xcrdif(m) + else + write (unit = *,fmt = 2011) m,xcr(m),xcrref(m),xcrdif(m) + endif + enddo + if (class .ne. 'U') then + write (unit = *,fmt = 2002) + else + write (unit = *,fmt = 2006) + endif +2002 format(' Comparison of RMS-norms of solution error') +2006 format(' RMS-norms of solution error') + do m = 1,5 + if (class .eq. 'U') then + write (unit = *,fmt = 2015) m,xce(m) + else if (xcedif(m) .gt. epsilon .or. isnan(xcedif(m))) then + verified = .FALSE. + write (unit = *,fmt = 2010) m,xce(m),xceref(m),xcedif(m) + else + write (unit = *,fmt = 2011) m,xce(m),xceref(m),xcedif(m) + endif + enddo +2010 format(' FAILURE: ', i2, E20.13, E20.13, E20.13) +2011 format(' ', i2, E20.13, E20.13, E20.13) +2015 format(' ', i2, E20.13) + if (class .eq. 'U') then + write (unit = *,fmt = 2022) + write (unit = *,fmt = 2023) +2022 format(' No reference values provided') +2023 format(' No verification performed') + else if (verified) then + write (unit = *,fmt = 2020) +2020 format(' Verification Successful') + else + write (unit = *,fmt = 2021) +2021 format(' Verification failed') + endif + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve.fdv new file mode 100644 index 0000000..623ac1c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve.fdv @@ -0,0 +1,627 @@ +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(IMAX) and rhs'(IMAX) will be sent to next cell +!--------------------------------------------------------------------- + subroutine x_solve () + + include 'header3d.h' + double precision pivot,coeff + integer i__0,j__1 + integer m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),u_(0:3,5) + double precision rhs_(5) + integer i,j,k,isize + isize = problem_size - 1 + +!--------------------------------------------------------------------- +! outer most do loops - sweeping in i direction +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! begin inner most do loop +! do all the elements of the cell unless last +!--------------------------------------------------------------------- +!, ACROSS(rhs(1:0,0:0,0:0,0:0),lhs__(1:0,0:0,0:0,0:0,0:0)) +!DVM$ region local(lhs__) +!DVM$ PARALLEL (k,j) ON rhs(*,*,j,k),private(u_,i,rhs_,tmp1,tmp2, +!DVM$&tmp3,t1,t2,t3,tm1,tm2,pivot,coeff, tm3,i__0,j__1,tmp11, +!DVM$&tmp22,lhs_,m,n,coeff__2, pivot__3) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do m = 1,5 + u_(0,m) = u(m,0,j,k) + u_(1,m) = u(m,1,j,k) + enddo + do i = 1,isize - 1 + do m = 1,5 + u_(2,m) = u(m,i + 1,j,k) + enddo + +! if(i .ne. isize) then + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * tx1 + tmp22 = dt * tx2 + lhs_(1,1,1) = (-(tmp11)) * dx1 + lhs_(1,2,1) = (-(tmp22)) + lhs_(1,3,1) = 0. + lhs_(1,4,1) = 0. + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * t2 * u_(0,2))) + + & c2 * 0.50d+00 * (u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + &* u_(0,4)) * t2) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * ((2.0d+00 - c2) * (u_(0,2) / u + &_(0,1))) - tmp11 * con43 * c3c4 * t1 - tmp11 * dx2 + lhs_(2,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * t1)) + lhs_(2,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,4) * t1)) + lhs_(2,5,1) = (-(tmp22)) * c2 + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,3))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,3)) + lhs_(3,2,1) = (-(tmp22)) * u_(0,3) * t1 + lhs_(3,3,1) = (-(tmp22)) * u_(0,2) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dx3 + lhs_(3,4,1) = 0. + lhs_(3,5,1) = 0. + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,4)) + lhs_(4,2,1) = (-(tmp22)) * u_(0,4) * t1 + lhs_(4,3,1) = 0. + lhs_(4,4,1) = (-(tmp22)) * u_(0,2) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dx4 + lhs_(4,5,1) = 0. + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * (u_(0,5) * t1)) * + & (u_(0,2) * t1)) - tmp11 * ((-(con43 * c3c4 - c1345)) * t3 * u_(0, + &2)** 2 - (c3c4 - c1345) * t3 * u_(0,3)** 2 - (c3c4 - c1345) * t3 * + & u_(0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * (c1 * u_(0,5) * t1 - 0.50d+00 + &* c2 * (3.0d+00 * u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + &* u_(0,4)) * t2) - tmp11 * ((con43 * c3c4 - c1345) * t2 * u_(0,2)) + lhs_(5,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,2)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,4) * u_(0,2)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,4) + lhs_(5,5,1) = (-(tmp22)) * c1 * (u_(0,2) * t1) - tmp11 * + &c1345 * t1 - tmp11 * dx5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dx1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3c4 * + &tmp1 + tmp11 * 2.0d+00 * dx2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dx3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dx4 + lhs_(4,5,2) = tmp11 * 2.0d+00 * 0 + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(con43 * c3c4 - c1345) + &) * tmp3 * u_(1,2)** 2 - (c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * ((con43 * c3c4 - c1345) * + & tmp2 * u_(1,2)) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dx5 + if (i .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dx1 + lhs_(1,2,3) = tmp22 + lhs_(1,3,3) = 0. + lhs_(1,4,3) = 0. + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * tm2 * u_(2,2))) + c2 + &* 0.50d+00 * (u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u_ + &(2,4)) * tm2) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * ((2.0d+00 - c2) * (u_(2,2) / u_(2,1 + &))) - tmp11 * con43 * c3c4 * tm1 - tmp11 * dx2 + lhs_(2,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * tm1)) + lhs_(2,4,3) = tmp22 * ((-(c2)) * (u_(2,4) * tm1)) + lhs_(2,5,3) = tmp22 * c2 + lhs_(3,1,3) = tmp22 * ((-(u_(2,2) * u_(2,3))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,3)) + lhs_(3,2,3) = tmp22 * u_(2,3) * tm1 + lhs_(3,3,3) = tmp22 * u_(2,2) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dx3 + lhs_(3,4,3) = 0. + lhs_(3,5,3) = 0. + lhs_(4,1,3) = tmp22 * ((-(u_(2,2) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,4)) + lhs_(4,2,3) = tmp22 * u_(2,4) * tm1 + lhs_(4,3,3) = 0. + lhs_(4,4,3) = tmp22 * u_(2,2) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dx4 + lhs_(4,5,3) = 0. + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * (u_(2,5) * tm1)) * (u + &_(2,2) * tm1)) - tmp11 * ((-(con43 * c3c4 - c1345)) * tm3 * u_(2,2 + &)** 2 - (c3c4 - c1345) * tm3 * u_(2,3)** 2 - (c3c4 - c1345) * tm3 + &* u_(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * (c1 * u_(2,5) * tm1 - 0.50d+00 * c2 + & * (3.0d+00 * u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u_ + &(2,4)) * tm2) - tmp11 * ((con43 * c3c4 - c1345) * tm2 * u_(2,2)) + lhs_(5,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,2)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * ((-(c2)) * (u_(2,4) * u_(2,2)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * (u_(2,2) * tm1) - tmp11 * c134 + &5 * tm1 - tmp11 * dx5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i - 1 + &,j,k) - lhs_(i__0,2,1) * rhs(2,i - 1,j,k) - lhs_(i__0,3,1) * rhs(3 + &,i - 1,j,k) - lhs_(i__0,4,1) * rhs(4,i - 1,j,k) - lhs_(i__0,5,1) * + & rhs(5,i - 1,j,k) + enddo + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + u_(0,m) = u_(1,m) + u_(1,m) = u_(2,m) + enddo + enddo + +! else ! ******************* else case ************************* + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i - 1,j, + &k) - lhs_(i__0,2,1) * rhs(2,i - 1,j,k) - lhs_(i__0,3,1) * rhs(3,i + &- 1,j,k) - lhs_(i__0,4,1) * rhs(4,i - 1,j,k) - lhs_(i__0,5,1) * rh + &s(5,i - 1,j,k) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + +! endif + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + +! enddo + do i = problem_size - 2,0,(-(1)) + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k) * rhs(1,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k) * rhs(2,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k) * rhs(3,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k) * rhs(4,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k) * rhs(5,i + 1,j,k) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + enddo + enddo + enddo + +!DVM$ end region + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve_block.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve_block.fdv new file mode 100644 index 0000000..5219404 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve_block.fdv @@ -0,0 +1,640 @@ +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(IMAX) and rhs'(IMAX) will be sent to next cell +!--------------------------------------------------------------------- + subroutine x_solve () + + include 'header3d.h' + double precision pivot,coeff + integer i__0,j__1 + integer m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),u_(0:3,5) + double precision rhs_(5) + integer i,j,k,isize,low_k,high_k,k1,maxBlK + isize = problem_size - 1 + if(mod((problem_size - 2), BL) .eq. 0) then + maxBlK = (problem_size - 2) / BL + else + maxblK = (problem_size - 2) / BL + 1 + endif +!--------------------------------------------------------------------- +! outer most do loops - sweeping in i direction +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! begin inner most do loop +! do all the elements of the cell unless last +!--------------------------------------------------------------------- +!, ACROSS(rhs(1:0,0:0,0:0,0:0),lhs__(1:0,0:0,0:0,0:0,0:0)) +!DVM$ region local(lhs__) +!DVM$ PARALLEL (k1, j) ON rhs(*,*,j,k1),private(u_,i,rhs_,tmp1,tmp2, +!DVM$&tmp3,t1,t2,t3,tm1,tm2,pivot,coeff, tm3,i__0,j__1,tmp11, +!DVM$&tmp22,lhs_,m,n,coeff__2, pivot__3,low_k,high_k,k), +!DVM$&cuda_block(32) + do k1 = 1, maxblK + do j = 1, problem_size - 2 + low_k = (k1 - 1) * BL + 1 + high_k = k1 * BL + if(high_k .gt. problem_size - 2) then + high_k = problem_size - 2 + endif + do k = low_k, high_k + do m = 1,5 + u_(0,m) = u(m,0,j,k) + u_(1,m) = u(m,1,j,k) + enddo + do i = 1,isize - 1 + do m = 1,5 + u_(2,m) = u(m,i + 1,j,k) + enddo + +! if(i .ne. isize) then + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * tx1 + tmp22 = dt * tx2 + lhs_(1,1,1) = (-(tmp11)) * dx1 + lhs_(1,2,1) = (-(tmp22)) + lhs_(1,3,1) = 0. + lhs_(1,4,1) = 0. + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * t2 * u_(0,2))) + + & c2 * 0.50d+00 * (u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + &* u_(0,4)) * t2) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * ((2.0d+00 - c2) * (u_(0,2) / u + &_(0,1))) - tmp11 * con43 * c3c4 * t1 - tmp11 * dx2 + lhs_(2,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * t1)) + lhs_(2,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,4) * t1)) + lhs_(2,5,1) = (-(tmp22)) * c2 + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,3))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,3)) + lhs_(3,2,1) = (-(tmp22)) * u_(0,3) * t1 + lhs_(3,3,1) = (-(tmp22)) * u_(0,2) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dx3 + lhs_(3,4,1) = 0. + lhs_(3,5,1) = 0. + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,4)) + lhs_(4,2,1) = (-(tmp22)) * u_(0,4) * t1 + lhs_(4,3,1) = 0. + lhs_(4,4,1) = (-(tmp22)) * u_(0,2) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dx4 + lhs_(4,5,1) = 0. + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * (u_(0,5) * t1)) * + & (u_(0,2) * t1)) - tmp11 * ((-(con43 * c3c4 - c1345)) * t3 * u_(0, + &2)** 2 - (c3c4 - c1345) * t3 * u_(0,3)** 2 - (c3c4 - c1345) * t3 * + & u_(0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * (c1 * u_(0,5) * t1 - 0.50d+00 + &* c2 * (3.0d+00 * u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + &* u_(0,4)) * t2) - tmp11 * ((con43 * c3c4 - c1345) * t2 * u_(0,2)) + lhs_(5,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,2)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,4) * u_(0,2)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,4) + lhs_(5,5,1) = (-(tmp22)) * c1 * (u_(0,2) * t1) - tmp11 * + &c1345 * t1 - tmp11 * dx5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dx1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3c4 * + &tmp1 + tmp11 * 2.0d+00 * dx2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dx3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dx4 + lhs_(4,5,2) = tmp11 * 2.0d+00 * 0 + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(con43 * c3c4 - c1345) + &) * tmp3 * u_(1,2)** 2 - (c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * ((con43 * c3c4 - c1345) * + & tmp2 * u_(1,2)) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dx5 + if (i .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dx1 + lhs_(1,2,3) = tmp22 + lhs_(1,3,3) = 0. + lhs_(1,4,3) = 0. + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * tm2 * u_(2,2))) + c2 + &* 0.50d+00 * (u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u_ + &(2,4)) * tm2) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * ((2.0d+00 - c2) * (u_(2,2) / u_(2,1 + &))) - tmp11 * con43 * c3c4 * tm1 - tmp11 * dx2 + lhs_(2,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * tm1)) + lhs_(2,4,3) = tmp22 * ((-(c2)) * (u_(2,4) * tm1)) + lhs_(2,5,3) = tmp22 * c2 + lhs_(3,1,3) = tmp22 * ((-(u_(2,2) * u_(2,3))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,3)) + lhs_(3,2,3) = tmp22 * u_(2,3) * tm1 + lhs_(3,3,3) = tmp22 * u_(2,2) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dx3 + lhs_(3,4,3) = 0. + lhs_(3,5,3) = 0. + lhs_(4,1,3) = tmp22 * ((-(u_(2,2) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,4)) + lhs_(4,2,3) = tmp22 * u_(2,4) * tm1 + lhs_(4,3,3) = 0. + lhs_(4,4,3) = tmp22 * u_(2,2) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dx4 + lhs_(4,5,3) = 0. + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * (u_(2,5) * tm1)) * (u + &_(2,2) * tm1)) - tmp11 * ((-(con43 * c3c4 - c1345)) * tm3 * u_(2,2 + &)** 2 - (c3c4 - c1345) * tm3 * u_(2,3)** 2 - (c3c4 - c1345) * tm3 + &* u_(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * (c1 * u_(2,5) * tm1 - 0.50d+00 * c2 + & * (3.0d+00 * u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u_ + &(2,4)) * tm2) - tmp11 * ((con43 * c3c4 - c1345) * tm2 * u_(2,2)) + lhs_(5,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,2)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * ((-(c2)) * (u_(2,4) * u_(2,2)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * (u_(2,2) * tm1) - tmp11 * c134 + &5 * tm1 - tmp11 * dx5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i - 1 + &,j,k) - lhs_(i__0,2,1) * rhs(2,i - 1,j,k) - lhs_(i__0,3,1) * rhs(3 + &,i - 1,j,k) - lhs_(i__0,4,1) * rhs(4,i - 1,j,k) - lhs_(i__0,5,1) * + & rhs(5,i - 1,j,k) + enddo + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k1) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k1) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k1) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k1) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k1) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + u_(0,m) = u_(1,m) + u_(1,m) = u_(2,m) + enddo + enddo + +! else ! ******************* else case ************************* + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i - 1,j, + &k) - lhs_(i__0,2,1) * rhs(2,i - 1,j,k) - lhs_(i__0,3,1) * rhs(3,i + &- 1,j,k) - lhs_(i__0,4,1) * rhs(4,i - 1,j,k) - lhs_(i__0,5,1) * rh + &s(5,i - 1,j,k) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + +! endif + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + +! enddo + do i = problem_size - 2,0,(-(1)) + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k1) * rhs(1,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k1) * rhs(2,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k1) * rhs(3,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k1) * rhs(4,i + 1,j,k) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k1) * rhs(5,i + 1,j,k) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + enddo + + enddo + enddo + enddo + +!DVM$ end region + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve_mpi.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve_mpi.fdv new file mode 100644 index 0000000..4665bbd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/x_solve_mpi.fdv @@ -0,0 +1,640 @@ +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(IMAX) and rhs'(IMAX) will be sent to next cell +!--------------------------------------------------------------------- + subroutine x_solve () + + include 'header3d.h' + double precision pivot,coeff + integer i__0,j__1 + integer m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),u_(0:3,5) + double precision rhs_(5),rhsp_(5) + integer i,j,k,isize + isize = problem_size - 1 + +!--------------------------------------------------------------------- +! outer most do loops - sweeping in i direction +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! begin inner most do loop +! do all the elements of the cell unless last +!--------------------------------------------------------------------- + +!DVM$ region local(lhs__) +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k),private(u_,rhs_,tmp1,tmp2, +!DVM$&tmp3,t1,t2,t3,tm1,tm2,pivot,coeff, tm3,i__0,j__1,tmp11, +!DVM$&tmp22,lhs_,m,n,coeff__2, pivot__3),stage(stage_n), +!DVM$& ACROSS(rhs(0:0,1:0,0:0,0:0),lhs__(0:0,0:0,1:0,0:0,0:0)) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do i = 1,isize - 1 + if(i .ne. isize) then + do m = 1,5 + lhs_(m,1,3) = lhs__(m,1,i-1,j,k) + lhs_(m,2,3) = lhs__(m,2,i-1,j,k) + lhs_(m,3,3) = lhs__(m,3,i-1,j,k) + lhs_(m,4,3) = lhs__(m,4,i-1,j,k) + lhs_(m,5,3) = lhs__(m,5,i-1,j,k) + + u_(0,m) = u(m,i-1,j,k) + u_(1,m) = u(m,i,j,k) + u_(2,m) = u(m,i+1,j,k) + enddo + + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * tx1 + tmp22 = dt * tx2 + lhs_(1,1,1) = (-(tmp11)) * dx1 + lhs_(1,2,1) = (-(tmp22)) + lhs_(1,3,1) = 0. + lhs_(1,4,1) = 0. + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * t2 * u_(0,2))) + + & c2 * 0.50d+00 * (u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + &* u_(0,4)) * t2) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * ((2.0d+00 - c2) * (u_(0,2) / u + &_(0,1))) - tmp11 * con43 * c3c4 * t1 - tmp11 * dx2 + lhs_(2,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * t1)) + lhs_(2,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,4) * t1)) + lhs_(2,5,1) = (-(tmp22)) * c2 + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,3))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,3)) + lhs_(3,2,1) = (-(tmp22)) * u_(0,3) * t1 + lhs_(3,3,1) = (-(tmp22)) * u_(0,2) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dx3 + lhs_(3,4,1) = 0. + lhs_(3,5,1) = 0. + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,4)) + lhs_(4,2,1) = (-(tmp22)) * u_(0,4) * t1 + lhs_(4,3,1) = 0. + lhs_(4,4,1) = (-(tmp22)) * u_(0,2) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dx4 + lhs_(4,5,1) = 0. + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * (u_(0,5) * t1)) * + & (u_(0,2) * t1)) - tmp11 * ((-(con43 * c3c4 - c1345)) * t3 * u_(0, + &2)** 2 - (c3c4 - c1345) * t3 * u_(0,3)** 2 - (c3c4 - c1345) * t3 * + & u_(0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * (c1 * u_(0,5) * t1 - 0.50d+00 + &* c2 * (3.0d+00 * u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + &* u_(0,4)) * t2) - tmp11 * ((con43 * c3c4 - c1345) * t2 * u_(0,2)) + lhs_(5,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,2)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,4) * u_(0,2)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,4) + lhs_(5,5,1) = (-(tmp22)) * c1 * (u_(0,2) * t1) - tmp11 * + &c1345 * t1 - tmp11 * dx5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dx1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3c4 * + &tmp1 + tmp11 * 2.0d+00 * dx2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dx3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dx4 + lhs_(4,5,2) = tmp11 * 2.0d+00 * 0 + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(con43 * c3c4 - c1345) + &) * tmp3 * u_(1,2)** 2 - (c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * ((con43 * c3c4 - c1345) * + & tmp2 * u_(1,2)) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dx5 + if (i .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dx1 + lhs_(1,2,3) = tmp22 + lhs_(1,3,3) = 0. + lhs_(1,4,3) = 0. + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * tm2 * u_(2,2))) + c2 + &* 0.50d+00 * (u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u_ + &(2,4)) * tm2) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * ((2.0d+00 - c2) * (u_(2,2) / u_(2,1 + &))) - tmp11 * con43 * c3c4 * tm1 - tmp11 * dx2 + lhs_(2,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * tm1)) + lhs_(2,4,3) = tmp22 * ((-(c2)) * (u_(2,4) * tm1)) + lhs_(2,5,3) = tmp22 * c2 + lhs_(3,1,3) = tmp22 * ((-(u_(2,2) * u_(2,3))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,3)) + lhs_(3,2,3) = tmp22 * u_(2,3) * tm1 + lhs_(3,3,3) = tmp22 * u_(2,2) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dx3 + lhs_(3,4,3) = 0. + lhs_(3,5,3) = 0. + lhs_(4,1,3) = tmp22 * ((-(u_(2,2) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,4)) + lhs_(4,2,3) = tmp22 * u_(2,4) * tm1 + lhs_(4,3,3) = 0. + lhs_(4,4,3) = tmp22 * u_(2,2) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dx4 + lhs_(4,5,3) = 0. + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * (u_(2,5) * tm1)) * (u + &_(2,2) * tm1)) - tmp11 * ((-(con43 * c3c4 - c1345)) * tm3 * u_(2,2 + &)** 2 - (c3c4 - c1345) * tm3 * u_(2,3)** 2 - (c3c4 - c1345) * tm3 + &* u_(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * (c1 * u_(2,5) * tm1 - 0.50d+00 * c2 + & * (3.0d+00 * u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u_ + &(2,4)) * tm2) - tmp11 * ((con43 * c3c4 - c1345) * tm2 * u_(2,2)) + lhs_(5,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,2)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * ((-(c2)) * (u_(2,4) * u_(2,2)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * (u_(2,2) * tm1) - tmp11 * c134 + &5 * tm1 - tmp11 * dx5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i - 1 + &,j,k) - lhs_(i__0,2,1) * rhs(2,i - 1,j,k) - lhs_(i__0,3,1) * rhs(3 + &,i - 1,j,k) - lhs_(i__0,4,1) * rhs(4,i - 1,j,k) - lhs_(i__0,5,1) * + & rhs(5,i - 1,j,k) + enddo + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo +! enddo + + else ! ******************* else case ************************* + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i - 1,j, + &k) - lhs_(i__0,2,1) * rhs(2,i - 1,j,k) - lhs_(i__0,3,1) * rhs(3,i + &- 1,j,k) - lhs_(i__0,4,1) * rhs(4,i - 1,j,k) - lhs_(i__0,5,1) * rh + &s(5,i - 1,j,k) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + + endif + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + + enddo + enddo + enddo + +! enddo + +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k),private(m,rhsp_,rhs_), +!DVM$& ACROSS(rhs(0:0,0:1,0:0,0:0)),stage(stage_n) + do k = 1,problem_size - 2 + do j = 1,problem_size - 2 + do i = problem_size - 2,0,(-(1)) + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + rhsp_(m) = rhs(m,i+1,j,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k) * rhsp_(1) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k) * rhsp_(2) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k) * rhsp_(3) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k) * rhsp_(4) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k) * rhsp_(5) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + enddo + enddo + enddo + +!DVM$ end region + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve.fdv new file mode 100644 index 0000000..5bd0f87 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve.fdv @@ -0,0 +1,622 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(JMAX) and rhs'(JMAX) will be sent to next cell +!--------------------------------------------------------------------- + subroutine y_solve () + + include 'header3d.h' + double precision coeff + double precision pivot + integer i__0 + integer j__1,m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),rhs_(5),u_(0:3,5) + integer i,j,k,jsize,jstart + jstart = 0 + jsize = problem_size - 1 + +!ACROSS (rhs(0:0,1:0,0:0,0:0),lhs__(0:0,1:0,0:0,0:0,0:0)) +!DVM$ region local(lhs__) +!DVM$ PARALLEL (k,i) ON rhs(*,i,*,k), private(u_,j,rhs_,pivot, +!DVM$&coeff,tmp1, tmp2, tmp3, t1, t2, t3, tm1, tm2, tm3, tmp11, +!DVM$&tmp22, i__0, j__1,lhs_,coeff__2,pivot__3,m,n) + do k = 1,problem_size - 2 + do i = 1,problem_size - 2 + do m = 1,5 + u_(0,m) = u(m,i,0,k) + u_(1,m) = u(m,i,1,k) + enddo + do j = 1,jsize - 1 + do m = 1,5 + u_(2,m) = u(m,i,j + 1,k) + enddo + +! if(j .ne. jsize) then + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * ty1 + tmp22 = dt * ty2 + lhs_(1,1,1) = (-(tmp11)) * dy1 + lhs_(1,2,1) = 0. + lhs_(1,3,1) = (-(tmp22)) + lhs_(1,4,1) = 0. + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,3))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * u_(0,3) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dy2 + lhs_(2,3,1) = (-(tmp22)) * u_(0,2) * t1 + lhs_(2,4,1) = 0. + lhs_(2,5,1) = 0. + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,3) * t2)) + + & 0.50d+00 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,3)) + lhs_(3,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * t1) + lhs_(3,3,1) = (-(tmp22)) * ((2.0d+00 - c2) * u_(0,3) * t1 + &) - tmp11 * con43 * c3c4 * t1 - tmp11 * dy3 + lhs_(3,4,1) = (-(tmp22)) * ((-(c2)) * u_(0,4) * t1) + lhs_(3,5,1) = (-(tmp22)) * c2 + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,4)) + lhs_(4,2,1) = 0. + lhs_(4,3,1) = (-(tmp22)) * u_(0,4) * t1 + lhs_(4,4,1) = (-(tmp22)) * u_(0,3) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dy4 + lhs_(4,5,1) = 0. + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * u_(0,5) * t1) * u + &_(0,3) * t1) - tmp11 * ((-(c3c4 - c1345)) * t3 * u_(0,2)** 2 - (co + &n43 * c3c4 - c1345) * t3 * u_(0,3)** 2 - (c3c4 - c1345) * t3 * u_( + &0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * u_(0,3) * + & t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,2) + lhs_(5,3,1) = (-(tmp22)) * (c1 * u_(0,5) * t1 - 0.50d+00 + &* c2 * ((u_(0,2) * u_(0,2) + 3.0d+00 * u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * (con43 * c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,4) + lhs_(5,5,1) = (-(tmp22)) * c1 * u_(0,3) * t1 - tmp11 * c1 + &345 * t1 - tmp11 * dy5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dy1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dy2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3c4 * + &tmp1 + tmp11 * 2.0d+00 * dy3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dy4 + lhs_(4,5,2) = 0. + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(c3c4 - c1345)) * tmp3 + & * u_(1,2)** 2 - (con43 * c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,2) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (con43 * c3c4 - c1345) * + &tmp2 * u_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dy5 + if (j .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dy1 + lhs_(1,2,3) = 0. + lhs_(1,3,3) = tmp22 + lhs_(1,4,3) = 0. + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * u_(2,3))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * u_(2,3) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dy2 + lhs_(2,3,3) = tmp22 * u_(2,2) * tm1 + lhs_(2,4,3) = 0. + lhs_(2,5,3) = 0. + lhs_(3,1,3) = tmp22 * ((-(u_(2,3) * u_(2,3) * tm2)) + 0.5 + &0d+00 * c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,3)) + lhs_(3,2,3) = tmp22 * ((-(c2)) * u_(2,2) * tm1) + lhs_(3,3,3) = tmp22 * ((2.0d+00 - c2) * u_(2,3) * tm1) - + &tmp11 * con43 * c3c4 * tm1 - tmp11 * dy3 + lhs_(3,4,3) = tmp22 * ((-(c2)) * u_(2,4) * tm1) + lhs_(3,5,3) = tmp22 * c2 + lhs_(4,1,3) = tmp22 * ((-(u_(2,3) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,4)) + lhs_(4,2,3) = 0. + lhs_(4,3,3) = tmp22 * u_(2,4) * tm1 + lhs_(4,4,3) = tmp22 * u_(2,3) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dy4 + lhs_(4,5,3) = 0. + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * u_(2,5) * tm1) * u_(2 + &,3) * tm1) - tmp11 * ((-(c3c4 - c1345)) * tm3 * u_(2,2)** 2 - (con + &43 * c3c4 - c1345) * tm3 * u_(2,3)** 2 - (c3c4 - c1345) * tm3 * u_ + &(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * ((-(c2)) * u_(2,2) * u_(2,3) * tm2) + & - tmp11 * (c3c4 - c1345) * tm2 * u_(2,2) + lhs_(5,3,3) = tmp22 * (c1 * u_(2,5) * tm1 - 0.50d+00 * c2 + & * ((u_(2,2) * u_(2,2) + 3.0d+00 * u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * (con43 * c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * u_(2,3) * tm1 - tmp11 * c1345 + &* tm1 - tmp11 * dy5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j - + & 1,k) - lhs_(i__0,2,1) * rhs(2,i,j - 1,k) - lhs_(i__0,3,1) * rhs(3 + &,i,j - 1,k) - lhs_(i__0,4,1) * rhs(4,i,j - 1,k) - lhs_(i__0,5,1) * + & rhs(5,i,j - 1,k) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + u_(0,m) = u_(1,m) + u_(1,m) = u_(2,m) + enddo + enddo + +! else ! ******************* else case ************************* + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,jsize + &- 1,k) - lhs_(i__0,2,1) * rhs(2,i,jsize - 1,k) - lhs_(i__0,3,1) * + &rhs(3,i,jsize - 1,k) - lhs_(i__0,4,1) * rhs(4,i,jsize - 1,k) - lhs + &_(i__0,5,1) * rhs(5,i,jsize - 1,k) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + +! endif + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + +! enddo + do j = problem_size - 2,0,(-(1)) + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k) * rhs(1,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k) * rhs(2,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k) * rhs(3,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k) * rhs(4,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k) * rhs(5,i,j + 1,k) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + enddo + enddo + enddo + +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve_block.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve_block.fdv new file mode 100644 index 0000000..5d91c64 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve_block.fdv @@ -0,0 +1,635 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(JMAX) and rhs'(JMAX) will be sent to next cell +!--------------------------------------------------------------------- + subroutine y_solve () + + include 'header3d.h' + double precision coeff + double precision pivot + integer i__0 + integer j__1,m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),rhs_(5),u_(0:3,5) + integer i,j,k,jsize,low_k,high_k,k1,maxBlK + jsize = problem_size - 1 + + if(mod((problem_size - 2), BL) .eq. 0) then + maxBlK = (problem_size - 2) / BL + else + maxblK = (problem_size - 2) / BL + 1 + endif +!ACROSS (rhs(0:0,1:0,0:0,0:0),lhs__(0:0,1:0,0:0,0:0,0:0)) +!DVM$ region local(lhs__) +!DVM$ PARALLEL (k1,i) ON rhs(*,i,*,k1), private(u_,j,rhs_,pivot, +!DVM$&coeff,tmp1, tmp2, tmp3, t1, t2, t3, tm1, tm2, tm3, tmp11, +!DVM$&tmp22, i__0, j__1,lhs_,coeff__2,pivot__3,m,n,k,low_k,high_k) +!DVM$&,cuda_block(32) + do k1 = 1, maxBlK + do i = 1, problem_size - 2 + low_k = (k1 - 1) * BL + 1 + high_k = k1 * BL + if(high_k .gt. problem_size - 2) then + high_k = problem_size - 2 + endif + do k = low_k, high_k + do m = 1,5 + u_(0,m) = u(m,i,0,k) + u_(1,m) = u(m,i,1,k) + enddo + do j = 1,jsize - 1 + do m = 1,5 + u_(2,m) = u(m,i,j + 1,k) + enddo + +! if(j .ne. jsize) then + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * ty1 + tmp22 = dt * ty2 + lhs_(1,1,1) = (-(tmp11)) * dy1 + lhs_(1,2,1) = 0. + lhs_(1,3,1) = (-(tmp22)) + lhs_(1,4,1) = 0. + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,3))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * u_(0,3) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dy2 + lhs_(2,3,1) = (-(tmp22)) * u_(0,2) * t1 + lhs_(2,4,1) = 0. + lhs_(2,5,1) = 0. + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,3) * t2)) + + & 0.50d+00 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,3)) + lhs_(3,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * t1) + lhs_(3,3,1) = (-(tmp22)) * ((2.0d+00 - c2) * u_(0,3) * t1 + &) - tmp11 * con43 * c3c4 * t1 - tmp11 * dy3 + lhs_(3,4,1) = (-(tmp22)) * ((-(c2)) * u_(0,4) * t1) + lhs_(3,5,1) = (-(tmp22)) * c2 + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,4)) + lhs_(4,2,1) = 0. + lhs_(4,3,1) = (-(tmp22)) * u_(0,4) * t1 + lhs_(4,4,1) = (-(tmp22)) * u_(0,3) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dy4 + lhs_(4,5,1) = 0. + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * u_(0,5) * t1) * u + &_(0,3) * t1) - tmp11 * ((-(c3c4 - c1345)) * t3 * u_(0,2)** 2 - (co + &n43 * c3c4 - c1345) * t3 * u_(0,3)** 2 - (c3c4 - c1345) * t3 * u_( + &0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * u_(0,3) * + & t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,2) + lhs_(5,3,1) = (-(tmp22)) * (c1 * u_(0,5) * t1 - 0.50d+00 + &* c2 * ((u_(0,2) * u_(0,2) + 3.0d+00 * u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * (con43 * c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,4) + lhs_(5,5,1) = (-(tmp22)) * c1 * u_(0,3) * t1 - tmp11 * c1 + &345 * t1 - tmp11 * dy5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dy1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dy2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3c4 * + &tmp1 + tmp11 * 2.0d+00 * dy3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dy4 + lhs_(4,5,2) = 0. + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(c3c4 - c1345)) * tmp3 + & * u_(1,2)** 2 - (con43 * c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,2) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (con43 * c3c4 - c1345) * + &tmp2 * u_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dy5 + if (j .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dy1 + lhs_(1,2,3) = 0. + lhs_(1,3,3) = tmp22 + lhs_(1,4,3) = 0. + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * u_(2,3))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * u_(2,3) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dy2 + lhs_(2,3,3) = tmp22 * u_(2,2) * tm1 + lhs_(2,4,3) = 0. + lhs_(2,5,3) = 0. + lhs_(3,1,3) = tmp22 * ((-(u_(2,3) * u_(2,3) * tm2)) + 0.5 + &0d+00 * c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,3)) + lhs_(3,2,3) = tmp22 * ((-(c2)) * u_(2,2) * tm1) + lhs_(3,3,3) = tmp22 * ((2.0d+00 - c2) * u_(2,3) * tm1) - + &tmp11 * con43 * c3c4 * tm1 - tmp11 * dy3 + lhs_(3,4,3) = tmp22 * ((-(c2)) * u_(2,4) * tm1) + lhs_(3,5,3) = tmp22 * c2 + lhs_(4,1,3) = tmp22 * ((-(u_(2,3) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,4)) + lhs_(4,2,3) = 0. + lhs_(4,3,3) = tmp22 * u_(2,4) * tm1 + lhs_(4,4,3) = tmp22 * u_(2,3) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dy4 + lhs_(4,5,3) = 0. + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * u_(2,5) * tm1) * u_(2 + &,3) * tm1) - tmp11 * ((-(c3c4 - c1345)) * tm3 * u_(2,2)** 2 - (con + &43 * c3c4 - c1345) * tm3 * u_(2,3)** 2 - (c3c4 - c1345) * tm3 * u_ + &(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * ((-(c2)) * u_(2,2) * u_(2,3) * tm2) + & - tmp11 * (c3c4 - c1345) * tm2 * u_(2,2) + lhs_(5,3,3) = tmp22 * (c1 * u_(2,5) * tm1 - 0.50d+00 * c2 + & * ((u_(2,2) * u_(2,2) + 3.0d+00 * u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * (con43 * c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * u_(2,3) * tm1 - tmp11 * c1345 + &* tm1 - tmp11 * dy5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j - + & 1,k) - lhs_(i__0,2,1) * rhs(2,i,j - 1,k) - lhs_(i__0,3,1) * rhs(3 + &,i,j - 1,k) - lhs_(i__0,4,1) * rhs(4,i,j - 1,k) - lhs_(i__0,5,1) * + & rhs(5,i,j - 1,k) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k1) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k1) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k1) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k1) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k1) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + u_(0,m) = u_(1,m) + u_(1,m) = u_(2,m) + enddo + enddo + +! else ! ******************* else case ************************* + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,jsize + &- 1,k) - lhs_(i__0,2,1) * rhs(2,i,jsize - 1,k) - lhs_(i__0,3,1) * + &rhs(3,i,jsize - 1,k) - lhs_(i__0,4,1) * rhs(4,i,jsize - 1,k) - lhs + &_(i__0,5,1) * rhs(5,i,jsize - 1,k) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + +! endif + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + +! enddo + do j = problem_size - 2,0,(-(1)) + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k1) * rhs(1,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k1) * rhs(2,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k1) * rhs(3,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k1) * rhs(4,i,j + 1,k) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k1) * rhs(5,i,j + 1,k) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + enddo + + enddo + enddo + enddo + +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve_mpi.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve_mpi.fdv new file mode 100644 index 0000000..d0d5fdd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/y_solve_mpi.fdv @@ -0,0 +1,634 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(JMAX) and rhs'(JMAX) will be sent to next cell +!--------------------------------------------------------------------- + subroutine y_solve () + + include 'header3d.h' + double precision coeff + double precision pivot + integer i__0 + integer j__1,m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),rhs_(5),rhsp_(5),u_(0:3,5) + integer i,j,k,jsize,jstart + jstart = 0 + jsize = problem_size - 1 + +!DVM$ region local(lhs__) +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), private(u_,rhs_,pivot, +!DVM$&coeff,tmp1, tmp2, tmp3, t1, t2, t3, tm1, tm2, tm3, tmp11, +!DVM$&tmp22, i__0, j__1,lhs_,coeff__2,pivot__3,m,n),stage(stage_n), +!DVM$& ACROSS(rhs(0:0,0:0,1:0,0:0),lhs__(0:0,0:0,0:0,1:0,0:0)) + do k = 1,problem_size - 2 + do j = 1,jsize - 1 + do i = 1,problem_size - 2 + if(j .ne. jsize) then + + do m = 1,5 + lhs_(m,1,3) = lhs__(m,1,i,j-1,k) + lhs_(m,2,3) = lhs__(m,2,i,j-1,k) + lhs_(m,3,3) = lhs__(m,3,i,j-1,k) + lhs_(m,4,3) = lhs__(m,4,i,j-1,k) + lhs_(m,5,3) = lhs__(m,5,i,j-1,k) + + u_(0,m) = u(m,i,j-1,k) + u_(1,m) = u(m,i,j,k) + u_(2,m) = u(m,i,j+1,k) + enddo + + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * ty1 + tmp22 = dt * ty2 + lhs_(1,1,1) = (-(tmp11)) * dy1 + lhs_(1,2,1) = 0. + lhs_(1,3,1) = (-(tmp22)) + lhs_(1,4,1) = 0. + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,3))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * u_(0,3) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dy2 + lhs_(2,3,1) = (-(tmp22)) * u_(0,2) * t1 + lhs_(2,4,1) = 0. + lhs_(2,5,1) = 0. + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,3) * t2)) + + & 0.50d+00 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,3)) + lhs_(3,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * t1) + lhs_(3,3,1) = (-(tmp22)) * ((2.0d+00 - c2) * u_(0,3) * t1 + &) - tmp11 * con43 * c3c4 * t1 - tmp11 * dy3 + lhs_(3,4,1) = (-(tmp22)) * ((-(c2)) * u_(0,4) * t1) + lhs_(3,5,1) = (-(tmp22)) * c2 + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,4)) + lhs_(4,2,1) = 0. + lhs_(4,3,1) = (-(tmp22)) * u_(0,4) * t1 + lhs_(4,4,1) = (-(tmp22)) * u_(0,3) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dy4 + lhs_(4,5,1) = 0. + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * u_(0,5) * t1) * u + &_(0,3) * t1) - tmp11 * ((-(c3c4 - c1345)) * t3 * u_(0,2)** 2 - (co + &n43 * c3c4 - c1345) * t3 * u_(0,3)** 2 - (c3c4 - c1345) * t3 * u_( + &0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * u_(0,3) * + & t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,2) + lhs_(5,3,1) = (-(tmp22)) * (c1 * u_(0,5) * t1 - 0.50d+00 + &* c2 * ((u_(0,2) * u_(0,2) + 3.0d+00 * u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * (con43 * c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,4) + lhs_(5,5,1) = (-(tmp22)) * c1 * u_(0,3) * t1 - tmp11 * c1 + &345 * t1 - tmp11 * dy5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dy1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dy2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3c4 * + &tmp1 + tmp11 * 2.0d+00 * dy3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dy4 + lhs_(4,5,2) = 0. + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(c3c4 - c1345)) * tmp3 + & * u_(1,2)** 2 - (con43 * c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,2) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (con43 * c3c4 - c1345) * + &tmp2 * u_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dy5 + if (j .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dy1 + lhs_(1,2,3) = 0. + lhs_(1,3,3) = tmp22 + lhs_(1,4,3) = 0. + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * u_(2,3))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * u_(2,3) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dy2 + lhs_(2,3,3) = tmp22 * u_(2,2) * tm1 + lhs_(2,4,3) = 0. + lhs_(2,5,3) = 0. + lhs_(3,1,3) = tmp22 * ((-(u_(2,3) * u_(2,3) * tm2)) + 0.5 + &0d+00 * c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,3)) + lhs_(3,2,3) = tmp22 * ((-(c2)) * u_(2,2) * tm1) + lhs_(3,3,3) = tmp22 * ((2.0d+00 - c2) * u_(2,3) * tm1) - + &tmp11 * con43 * c3c4 * tm1 - tmp11 * dy3 + lhs_(3,4,3) = tmp22 * ((-(c2)) * u_(2,4) * tm1) + lhs_(3,5,3) = tmp22 * c2 + lhs_(4,1,3) = tmp22 * ((-(u_(2,3) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,4)) + lhs_(4,2,3) = 0. + lhs_(4,3,3) = tmp22 * u_(2,4) * tm1 + lhs_(4,4,3) = tmp22 * u_(2,3) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dy4 + lhs_(4,5,3) = 0. + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * u_(2,5) * tm1) * u_(2 + &,3) * tm1) - tmp11 * ((-(c3c4 - c1345)) * tm3 * u_(2,2)** 2 - (con + &43 * c3c4 - c1345) * tm3 * u_(2,3)** 2 - (c3c4 - c1345) * tm3 * u_ + &(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * ((-(c2)) * u_(2,2) * u_(2,3) * tm2) + & - tmp11 * (c3c4 - c1345) * tm2 * u_(2,2) + lhs_(5,3,3) = tmp22 * (c1 * u_(2,5) * tm1 - 0.50d+00 * c2 + & * ((u_(2,2) * u_(2,2) + 3.0d+00 * u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * (con43 * c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * u_(2,3) * tm1 - tmp11 * c1345 + &* tm1 - tmp11 * dy5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j - + & 1,k) - lhs_(i__0,2,1) * rhs(2,i,j - 1,k) - lhs_(i__0,3,1) * rhs(3 + &,i,j - 1,k) - lhs_(i__0,4,1) * rhs(4,i,j - 1,k) - lhs_(i__0,5,1) * + & rhs(5,i,j - 1,k) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo +! enddo + + else ! ******************* else case ************************* + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,jsize + &- 1,k) - lhs_(i__0,2,1) * rhs(2,i,jsize - 1,k) - lhs_(i__0,3,1) * + &rhs(3,i,jsize - 1,k) - lhs_(i__0,4,1) * rhs(4,i,jsize - 1,k) - lhs + &_(i__0,5,1) * rhs(5,i,jsize - 1,k) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + + endif + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + + enddo + enddo + enddo + + +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), private(m, rhs_,rhsp_) +!DVM$& ,ACROSS(rhs(0:0,0:0,0:1,0:0)),stage(stage_n) + do k = 1,problem_size - 2 + do j = problem_size - 2,0,(-(1)) + do i = 1,problem_size - 2 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + rhsp_(m) = rhs(m,i,j+1,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k) * rhsp_(1) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k) * rhsp_(2) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k) * rhsp_(3) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k) * rhsp_(4) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k) * rhsp_(5) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + enddo + enddo + enddo + +!DVM$ end region + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve.fdv new file mode 100644 index 0000000..d967666 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve.fdv @@ -0,0 +1,623 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(KMAX) and rhs'(KMAX) will be sent to next cell. +!--------------------------------------------------------------------- + subroutine z_solve () + + include 'header3d.h' + double precision coeff + double precision pivot + integer i__0 + integer j__1,m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),rhs_(5),rhsp_(5),u_(0:3,5) + integer i,j,k,ksize, k1 + ksize = problem_size - 1 + +!DVM$ region local(lhs__) +!DVM$ PARALLEL (j,i) ON rhs(*,i,j,*), private(k,u_,rhs_,pivot, +!DVM$& coeff, tmp1, tmp2, tmp3, t1, t2, t3, tm1, tm2, tm3,rhsp_, +!DVM$& tmp11, tmp22, i__0, j__1,lhs_,n,m,pivot__3,coeff__2) + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + do m = 1,5 + u_(0,m) = u(m,i,j,0) + u_(1,m) = u(m,i,j,1) + enddo + do k = 1,ksize - 1 + do m = 1,5 + u_(2,m) = u(m,i,j,k + 1) + enddo + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * tz1 + tmp22 = dt * tz2 + lhs_(1,1,1) = (-(tmp11)) * dz1 + lhs_(1,2,1) = 0. + lhs_(1,3,1) = 0. + lhs_(1,4,1) = (-(tmp22)) + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * u_(0,4) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dz2 + lhs_(2,3,1) = 0. + lhs_(2,4,1) = (-(tmp22)) * u_(0,2) * t1 + lhs_(2,5,1) = 0. + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,3)) + lhs_(3,2,1) = 0. + lhs_(3,3,1) = (-(tmp22)) * u_(0,4) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dz3 + lhs_(3,4,1) = (-(tmp22)) * u_(0,3) * t1 + lhs_(3,5,1) = 0. + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,4) * u_(0,4) * t2)) + + & 0.50d+00 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,4)) + lhs_(4,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * t1) + lhs_(4,3,1) = (-(tmp22)) * ((-(c2)) * u_(0,3) * t1) + lhs_(4,4,1) = (-(tmp22)) * (2.0d+00 - c2) * u_(0,4) * t1 + &- tmp11 * con43 * c3 * c4 * t1 - tmp11 * dz4 + lhs_(4,5,1) = (-(tmp22)) * c2 + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * (u_(0,5) * t1)) * + & (u_(0,4) * t1)) - tmp11 * ((-(c3c4 - c1345)) * t3 * u_(0,2)** 2 - + & (c3c4 - c1345) * t3 * u_(0,3)** 2 - (con43 * c3c4 - c1345) * t3 * + & u_(0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * ((-(c2)) * (u_(0,2) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,2) + lhs_(5,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * (c1 * (u_(0,5) * t1) - 0.50d+0 + &0 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + 3.0d+00 * u_(0, + &4) * u_(0,4)) * t2)) - tmp11 * (con43 * c3c4 - c1345) * t2 * u_(0, + &4) + lhs_(5,5,1) = (-(tmp22)) * c1 * u_(0,4) * t1 - tmp11 * c1 + &345 * t1 - tmp11 * dz5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dz1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dz2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dz3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3 * c4 + & * tmp1 + tmp11 * 2.0d+00 * dz4 + lhs_(4,5,2) = 0. + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(c3c4 - c1345)) * tmp3 + & * u_(1,2)** 2 - (c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (con43 * c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,2) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (con43 * c3c4 - c1345) * + &tmp2 * u_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dz5 + if (k .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dz1 + lhs_(1,2,3) = 0. + lhs_(1,3,3) = 0. + lhs_(1,4,3) = tmp22 + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * u_(2,4) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dz2 + lhs_(2,3,3) = 0. + lhs_(2,4,3) = tmp22 * u_(2,2) * tm1 + lhs_(2,5,3) = 0. + lhs_(3,1,3) = tmp22 * ((-(u_(2,3) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,3)) + lhs_(3,2,3) = 0. + lhs_(3,3,3) = tmp22 * u_(2,4) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dz3 + lhs_(3,4,3) = tmp22 * u_(2,3) * tm1 + lhs_(3,5,3) = 0. + lhs_(4,1,3) = tmp22 * ((-(u_(2,4) * u_(2,4) * tm2)) + 0.5 + &0d+00 * c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,4)) + lhs_(4,2,3) = tmp22 * ((-(c2)) * u_(2,2) * tm1) + lhs_(4,3,3) = tmp22 * ((-(c2)) * u_(2,3) * tm1) + lhs_(4,4,3) = tmp22 * (2.0d+00 - c2) * u_(2,4) * tm1 - tm + &p11 * con43 * c3 * c4 * tm1 - tmp11 * dz4 + lhs_(4,5,3) = tmp22 * c2 + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * (u_(2,5) * tm1)) * (u + &_(2,4) * tm1)) - tmp11 * ((-(c3c4 - c1345)) * tm3 * u_(2,2)** 2 - + &(c3c4 - c1345) * tm3 * u_(2,3)** 2 - (con43 * c3c4 - c1345) * tm3 + &* u_(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * ((-(c2)) * (u_(2,2) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,2) + lhs_(5,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * (c1 * (u_(2,5) * tm1) - 0.50d+00 * + &c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + 3.0d+00 * u_(2,4) * + & u_(2,4)) * tm2)) - tmp11 * (con43 * c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * u_(2,4) * tm1 - tmp11 * c1345 + &* tm1 - tmp11 * dz5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j,k + & - 1) - lhs_(i__0,2,1) * rhs(2,i,j,k - 1) - lhs_(i__0,3,1) * rhs(3 + &,i,j,k - 1) - lhs_(i__0,4,1) * rhs(4,i,j,k - 1) - lhs_(i__0,5,1) * + & rhs(5,i,j,k - 1) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + u_(0,m) = u_(1,m) + u_(1,m) = u_(2,m) + enddo + enddo + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j,ksiz + &e - 1) - lhs_(i__0,2,1) * rhs(2,i,j,ksize - 1) - lhs_(i__0,3,1) * + &rhs(3,i,j,ksize - 1) - lhs_(i__0,4,1) * rhs(4,i,j,ksize - 1) - lhs + &_(i__0,5,1) * rhs(5,i,j,ksize - 1) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + + k = ksize-1 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + rhsp_(m) = rhs(m,i,j,k + 1) + enddo + do k = ksize-1, 1, (-(1)) + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k) * rhsp_(1) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k) * rhsp_(2) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k) * rhsp_(3) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k) * rhsp_(4) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k) * rhsp_(5) + enddo + do m = 1,5 + rhsp_(m) = rhs_(m) + u(m,i,j,k) = u(m,i,j,k) + rhs_(m) + enddo + enddo + enddo + enddo +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve_block.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve_block.fdv new file mode 100644 index 0000000..ac97c19 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve_block.fdv @@ -0,0 +1,636 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(KMAX) and rhs'(KMAX) will be sent to next cell. +!--------------------------------------------------------------------- + subroutine z_solve () + + include 'header3d.h' + double precision coeff + double precision pivot + integer i__0 + integer j__1,m,n + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),rhs_(5),rhsp_(5),u_(0:3,5) + integer i,j,k,ksize,j1,maxblJ,low_j,high_j + ksize = problem_size - 1 + if(mod((problem_size - 2), BL) .eq. 0) then + maxBlJ = (problem_size - 2) / BL + else + maxblJ = (problem_size - 2) / BL + 1 + endif +!DVM$ region local(lhs__) +!DVM$ PARALLEL (j1,i) ON rhs(*,i,j1,*), private(k,u_,rhs_,pivot, +!DVM$& coeff, tmp1, tmp2, tmp3, t1, t2, t3, tm1, tm2, tm3,rhsp_, +!DVM$& tmp11, tmp22, i__0, j__1,lhs_,n,m,pivot__3, +!DVM$& coeff__2,j,low_j,high_j),cuda_block(32) + do j1 = 1, maxBlJ + do i = 1, problem_size - 2 + low_j = (j1 - 1) * BL + 1 + high_j = j1 * BL + if(high_j .gt. problem_size - 2) then + high_j = problem_size - 2 + endif + do j = low_j, high_j + do m = 1,5 + u_(0,m) = u(m,i,j,0) + u_(1,m) = u(m,i,j,1) + enddo + do k = 1,ksize - 1 + do m = 1,5 + u_(2,m) = u(m,i,j,k + 1) + enddo + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * tz1 + tmp22 = dt * tz2 + lhs_(1,1,1) = (-(tmp11)) * dz1 + lhs_(1,2,1) = 0. + lhs_(1,3,1) = 0. + lhs_(1,4,1) = (-(tmp22)) + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * u_(0,4) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dz2 + lhs_(2,3,1) = 0. + lhs_(2,4,1) = (-(tmp22)) * u_(0,2) * t1 + lhs_(2,5,1) = 0. + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,3)) + lhs_(3,2,1) = 0. + lhs_(3,3,1) = (-(tmp22)) * u_(0,4) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dz3 + lhs_(3,4,1) = (-(tmp22)) * u_(0,3) * t1 + lhs_(3,5,1) = 0. + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,4) * u_(0,4) * t2)) + + & 0.50d+00 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,4)) + lhs_(4,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * t1) + lhs_(4,3,1) = (-(tmp22)) * ((-(c2)) * u_(0,3) * t1) + lhs_(4,4,1) = (-(tmp22)) * (2.0d+00 - c2) * u_(0,4) * t1 + &- tmp11 * con43 * c3 * c4 * t1 - tmp11 * dz4 + lhs_(4,5,1) = (-(tmp22)) * c2 + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * (u_(0,5) * t1)) * + & (u_(0,4) * t1)) - tmp11 * ((-(c3c4 - c1345)) * t3 * u_(0,2)** 2 - + & (c3c4 - c1345) * t3 * u_(0,3)** 2 - (con43 * c3c4 - c1345) * t3 * + & u_(0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * ((-(c2)) * (u_(0,2) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,2) + lhs_(5,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * (c1 * (u_(0,5) * t1) - 0.50d+0 + &0 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + 3.0d+00 * u_(0, + &4) * u_(0,4)) * t2)) - tmp11 * (con43 * c3c4 - c1345) * t2 * u_(0, + &4) + lhs_(5,5,1) = (-(tmp22)) * c1 * u_(0,4) * t1 - tmp11 * c1 + &345 * t1 - tmp11 * dz5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dz1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dz2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dz3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3 * c4 + & * tmp1 + tmp11 * 2.0d+00 * dz4 + lhs_(4,5,2) = 0. + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(c3c4 - c1345)) * tmp3 + & * u_(1,2)** 2 - (c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (con43 * c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,2) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (con43 * c3c4 - c1345) * + &tmp2 * u_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dz5 + if (k .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dz1 + lhs_(1,2,3) = 0. + lhs_(1,3,3) = 0. + lhs_(1,4,3) = tmp22 + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * u_(2,4) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dz2 + lhs_(2,3,3) = 0. + lhs_(2,4,3) = tmp22 * u_(2,2) * tm1 + lhs_(2,5,3) = 0. + lhs_(3,1,3) = tmp22 * ((-(u_(2,3) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,3)) + lhs_(3,2,3) = 0. + lhs_(3,3,3) = tmp22 * u_(2,4) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dz3 + lhs_(3,4,3) = tmp22 * u_(2,3) * tm1 + lhs_(3,5,3) = 0. + lhs_(4,1,3) = tmp22 * ((-(u_(2,4) * u_(2,4) * tm2)) + 0.5 + &0d+00 * c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,4)) + lhs_(4,2,3) = tmp22 * ((-(c2)) * u_(2,2) * tm1) + lhs_(4,3,3) = tmp22 * ((-(c2)) * u_(2,3) * tm1) + lhs_(4,4,3) = tmp22 * (2.0d+00 - c2) * u_(2,4) * tm1 - tm + &p11 * con43 * c3 * c4 * tm1 - tmp11 * dz4 + lhs_(4,5,3) = tmp22 * c2 + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * (u_(2,5) * tm1)) * (u + &_(2,4) * tm1)) - tmp11 * ((-(c3c4 - c1345)) * tm3 * u_(2,2)** 2 - + &(c3c4 - c1345) * tm3 * u_(2,3)** 2 - (con43 * c3c4 - c1345) * tm3 + &* u_(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * ((-(c2)) * (u_(2,2) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,2) + lhs_(5,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * (c1 * (u_(2,5) * tm1) - 0.50d+00 * + &c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + 3.0d+00 * u_(2,4) * + & u_(2,4)) * tm2)) - tmp11 * (con43 * c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * u_(2,4) * tm1 - tmp11 * c1345 + &* tm1 - tmp11 * dz5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j,k + & - 1) - lhs_(i__0,2,1) * rhs(2,i,j,k - 1) - lhs_(i__0,3,1) * rhs(3 + &,i,j,k - 1) - lhs_(i__0,4,1) * rhs(4,i,j,k - 1) - lhs_(i__0,5,1) * + & rhs(5,i,j,k - 1) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,k,j1) = lhs_(i__0,1,3) + lhs__(i__0,2,i,k,j1) = lhs_(i__0,2,3) + lhs__(i__0,3,i,k,j1) = lhs_(i__0,3,3) + lhs__(i__0,4,i,k,j1) = lhs_(i__0,4,3) + lhs__(i__0,5,i,k,j1) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + u_(0,m) = u_(1,m) + u_(1,m) = u_(2,m) + enddo + enddo + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j,ksiz + &e - 1) - lhs_(i__0,2,1) * rhs(2,i,j,ksize - 1) - lhs_(i__0,3,1) * + &rhs(3,i,j,ksize - 1) - lhs_(i__0,4,1) * rhs(4,i,j,ksize - 1) - lhs + &_(i__0,5,1) * rhs(5,i,j,ksize - 1) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + + k = ksize-1 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + rhsp_(m) = rhs(m,i,j,k + 1) + enddo + do k = ksize-1, 1, (-(1)) + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,k,j1) * rhsp_(1) + rhs_(m) = rhs_(m) - lhs__(m,2,i,k,j1) * rhsp_(2) + rhs_(m) = rhs_(m) - lhs__(m,3,i,k,j1) * rhsp_(3) + rhs_(m) = rhs_(m) - lhs__(m,4,i,k,j1) * rhsp_(4) + rhs_(m) = rhs_(m) - lhs__(m,5,i,k,j1) * rhsp_(5) + enddo + do m = 1,5 + rhsp_(m) = rhs_(m) + u(m,i,j,k) = u(m,i,j,k) + rhs_(m) + enddo + enddo + + enddo + enddo + enddo +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve_mpi.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve_mpi.fdv new file mode 100644 index 0000000..20f8f35 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/BT/z_solve_mpi.fdv @@ -0,0 +1,640 @@ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! performs guaussian elimination on this cell. +! +! assumes that unpacking routines for non-first cells +! preload C' and rhs' from previous cell. +! +! assumed send happens outside this routine, but that +! c'(KMAX) and rhs'(KMAX) will be sent to next cell. +!--------------------------------------------------------------------- + subroutine z_solve () + + include 'header3d.h' + double precision coeff + double precision pivot + integer i__0 + integer j__1,m,n,zst + double precision coeff__2 + double precision pivot__3 + double precision lhs_(5,5,3),rhs_(5),rhsp_(5),u_(0:3,5) + integer i,j,k,ksize, k1 + ksize = problem_size - 1 + zst = ksize +!DVM$ region local(lhs__) + +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), private(u_,rhs_,pivot, +!DVM$& coeff, tmp1, tmp2, tmp3, t1, t2, t3, tm1, tm2, tm3, +!DVM$& tmp11, tmp22, i__0, j__1,lhs_,n,m,pivot__3,coeff__2), +!DVM$& stage(stage_n) +!DVM$& ,ACROSS(rhs(0:0,0:0,0:0,1:0),lhs__(0:0,0:0,0:0,0:0,1:0)) + do k = 1, problem_size - 1 + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + + if( k .ne. problem_size - 1) then + do m = 1,5 + lhs_(m,1,3) = lhs__(m,1,i,j,k-1) + lhs_(m,2,3) = lhs__(m,2,i,j,k-1) + lhs_(m,3,3) = lhs__(m,3,i,j,k-1) + lhs_(m,4,3) = lhs__(m,4,i,j,k-1) + lhs_(m,5,3) = lhs__(m,5,i,j,k-1) + + u_(0,m) = u(m,i,j,k - 1) + u_(1,m) = u(m,i,j,k) + u_(2,m) = u(m,i,j,k + 1) + enddo + tmp1 = 1.0d+00 / u_(1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + t1 = 1.0d+00 / u_(0,1) + t2 = t1 * t1 + t3 = t1 * t2 + tm1 = 1.0d+00 / u_(2,1) + tm2 = tm1 * tm1 + tm3 = tm1 * tm2 + tmp11 = dt * tz1 + tmp22 = dt * tz2 + lhs_(1,1,1) = (-(tmp11)) * dz1 + lhs_(1,2,1) = 0. + lhs_(1,3,1) = 0. + lhs_(1,4,1) = (-(tmp22)) + lhs_(1,5,1) = 0. + lhs_(2,1,1) = (-(tmp22)) * ((-(u_(0,2) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,2)) + lhs_(2,2,1) = (-(tmp22)) * u_(0,4) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dz2 + lhs_(2,3,1) = 0. + lhs_(2,4,1) = (-(tmp22)) * u_(0,2) * t1 + lhs_(2,5,1) = 0. + lhs_(3,1,1) = (-(tmp22)) * ((-(u_(0,3) * u_(0,4))) * t2) + &- tmp11 * ((-(c3c4)) * t2 * u_(0,3)) + lhs_(3,2,1) = 0. + lhs_(3,3,1) = (-(tmp22)) * u_(0,4) * t1 - tmp11 * c3c4 * + &t1 - tmp11 * dz3 + lhs_(3,4,1) = (-(tmp22)) * u_(0,3) * t1 + lhs_(3,5,1) = 0. + lhs_(4,1,1) = (-(tmp22)) * ((-(u_(0,4) * u_(0,4) * t2)) + + & 0.50d+00 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + u_(0,4) + & * u_(0,4)) * t2)) - tmp11 * ((-(con43)) * c3c4 * t2 * u_(0,4)) + lhs_(4,2,1) = (-(tmp22)) * ((-(c2)) * u_(0,2) * t1) + lhs_(4,3,1) = (-(tmp22)) * ((-(c2)) * u_(0,3) * t1) + lhs_(4,4,1) = (-(tmp22)) * (2.0d+00 - c2) * u_(0,4) * t1 + &- tmp11 * con43 * c3 * c4 * t1 - tmp11 * dz4 + lhs_(4,5,1) = (-(tmp22)) * c2 + lhs_(5,1,1) = (-(tmp22)) * ((c2 * (u_(0,2) * u_(0,2) + u_ + &(0,3) * u_(0,3) + u_(0,4) * u_(0,4)) * t2 - c1 * (u_(0,5) * t1)) * + & (u_(0,4) * t1)) - tmp11 * ((-(c3c4 - c1345)) * t3 * u_(0,2)** 2 - + & (c3c4 - c1345) * t3 * u_(0,3)** 2 - (con43 * c3c4 - c1345) * t3 * + & u_(0,4)** 2 - c1345 * t2 * u_(0,5)) + lhs_(5,2,1) = (-(tmp22)) * ((-(c2)) * (u_(0,2) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,2) + lhs_(5,3,1) = (-(tmp22)) * ((-(c2)) * (u_(0,3) * u_(0,4)) + & * t2) - tmp11 * (c3c4 - c1345) * t2 * u_(0,3) + lhs_(5,4,1) = (-(tmp22)) * (c1 * (u_(0,5) * t1) - 0.50d+0 + &0 * c2 * ((u_(0,2) * u_(0,2) + u_(0,3) * u_(0,3) + 3.0d+00 * u_(0, + &4) * u_(0,4)) * t2)) - tmp11 * (con43 * c3c4 - c1345) * t2 * u_(0, + &4) + lhs_(5,5,1) = (-(tmp22)) * c1 * u_(0,4) * t1 - tmp11 * c1 + &345 * t1 - tmp11 * dz5 + lhs_(1,1,2) = 1.0d+00 + tmp11 * 2.0d+00 * dz1 + lhs_(1,2,2) = 0. + lhs_(1,3,2) = 0. + lhs_(1,4,2) = 0. + lhs_(1,5,2) = 0. + lhs_(2,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &2)) + lhs_(2,2,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dz2 + lhs_(2,3,2) = 0. + lhs_(2,4,2) = 0. + lhs_(2,5,2) = 0. + lhs_(3,1,2) = tmp11 * 2.0d+00 * ((-(c3c4)) * tmp2 * u_(1, + &3)) + lhs_(3,2,2) = 0. + lhs_(3,3,2) = 1.0d+00 + tmp11 * 2.0d+00 * c3c4 * tmp1 + t + &mp11 * 2.0d+00 * dz3 + lhs_(3,4,2) = 0. + lhs_(3,5,2) = 0. + lhs_(4,1,2) = tmp11 * 2.0d+00 * ((-(con43)) * c3c4 * tmp2 + & * u_(1,4)) + lhs_(4,2,2) = 0. + lhs_(4,3,2) = 0. + lhs_(4,4,2) = 1.0d+00 + tmp11 * 2.0d+00 * con43 * c3 * c4 + & * tmp1 + tmp11 * 2.0d+00 * dz4 + lhs_(4,5,2) = 0. + lhs_(5,1,2) = tmp11 * 2.0d+00 * ((-(c3c4 - c1345)) * tmp3 + & * u_(1,2)** 2 - (c3c4 - c1345) * tmp3 * u_(1,3)** 2 - (con43 * c3 + &c4 - c1345) * tmp3 * u_(1,4)** 2 - c1345 * tmp2 * u_(1,5)) + lhs_(5,2,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,2) + lhs_(5,3,2) = tmp11 * 2.0d+00 * (c3c4 - c1345) * tmp2 * u + &_(1,3) + lhs_(5,4,2) = tmp11 * 2.0d+00 * (con43 * c3c4 - c1345) * + &tmp2 * u_(1,4) + lhs_(5,5,2) = 1.0d+00 + tmp11 * 2.0d+00 * c1345 * tmp1 + + &tmp11 * 2.0d+00 * dz5 + if (k .ne. 1) then + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs + &_(1,j__1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3, + &j__1,3) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1 + &,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs + &_(1,j__1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3, + &j__1,3) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1 + &,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs + &_(1,j__1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3, + &j__1,3) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1 + &,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs + &_(1,j__1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3, + &j__1,3) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1 + &,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs + &_(1,j__1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3, + &j__1,3) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1 + &,3) + enddo + endif + lhs_(1,1,3) = (-(tmp11)) * dz1 + lhs_(1,2,3) = 0. + lhs_(1,3,3) = 0. + lhs_(1,4,3) = tmp22 + lhs_(1,5,3) = 0. + lhs_(2,1,3) = tmp22 * ((-(u_(2,2) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,2)) + lhs_(2,2,3) = tmp22 * u_(2,4) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dz2 + lhs_(2,3,3) = 0. + lhs_(2,4,3) = tmp22 * u_(2,2) * tm1 + lhs_(2,5,3) = 0. + lhs_(3,1,3) = tmp22 * ((-(u_(2,3) * u_(2,4))) * tm2) - tm + &p11 * ((-(c3c4)) * tm2 * u_(2,3)) + lhs_(3,2,3) = 0. + lhs_(3,3,3) = tmp22 * u_(2,4) * tm1 - tmp11 * c3c4 * tm1 + &- tmp11 * dz3 + lhs_(3,4,3) = tmp22 * u_(2,3) * tm1 + lhs_(3,5,3) = 0. + lhs_(4,1,3) = tmp22 * ((-(u_(2,4) * u_(2,4) * tm2)) + 0.5 + &0d+00 * c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + u_(2,4) * u + &_(2,4)) * tm2)) - tmp11 * ((-(con43)) * c3c4 * tm2 * u_(2,4)) + lhs_(4,2,3) = tmp22 * ((-(c2)) * u_(2,2) * tm1) + lhs_(4,3,3) = tmp22 * ((-(c2)) * u_(2,3) * tm1) + lhs_(4,4,3) = tmp22 * (2.0d+00 - c2) * u_(2,4) * tm1 - tm + &p11 * con43 * c3 * c4 * tm1 - tmp11 * dz4 + lhs_(4,5,3) = tmp22 * c2 + lhs_(5,1,3) = tmp22 * ((c2 * (u_(2,2) * u_(2,2) + u_(2,3) + & * u_(2,3) + u_(2,4) * u_(2,4)) * tm2 - c1 * (u_(2,5) * tm1)) * (u + &_(2,4) * tm1)) - tmp11 * ((-(c3c4 - c1345)) * tm3 * u_(2,2)** 2 - + &(c3c4 - c1345) * tm3 * u_(2,3)** 2 - (con43 * c3c4 - c1345) * tm3 + &* u_(2,4)** 2 - c1345 * tm2 * u_(2,5)) + lhs_(5,2,3) = tmp22 * ((-(c2)) * (u_(2,2) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,2) + lhs_(5,3,3) = tmp22 * ((-(c2)) * (u_(2,3) * u_(2,4)) * tm + &2) - tmp11 * (c3c4 - c1345) * tm2 * u_(2,3) + lhs_(5,4,3) = tmp22 * (c1 * (u_(2,5) * tm1) - 0.50d+00 * + &c2 * ((u_(2,2) * u_(2,2) + u_(2,3) * u_(2,3) + 3.0d+00 * u_(2,4) * + & u_(2,4)) * tm2)) - tmp11 * (con43 * c3c4 - c1345) * tm2 * u_(2,4) + lhs_(5,5,3) = tmp22 * c1 * u_(2,4) * tm1 - tmp11 * c1345 + &* tm1 - tmp11 * dz5 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j,k + & - 1) - lhs_(i__0,2,1) * rhs(2,i,j,k - 1) - lhs_(i__0,3,1) * rhs(3 + &,i,j,k - 1) - lhs_(i__0,4,1) * rhs(4,i,j,k - 1) - lhs_(i__0,5,1) * + & rhs(5,i,j,k - 1) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot + lhs_(1,3,2) = lhs_(1,3,2) * pivot + lhs_(1,4,2) = lhs_(1,4,2) * pivot + lhs_(1,5,2) = lhs_(1,5,2) * pivot + lhs_(1,1,3) = lhs_(1,1,3) * pivot + lhs_(1,2,3) = lhs_(1,2,3) * pivot + lhs_(1,3,3) = lhs_(1,3,3) * pivot + lhs_(1,4,3) = lhs_(1,4,3) * pivot + lhs_(1,5,3) = lhs_(1,5,3) * pivot + rhs_(1) = rhs_(1) * pivot + coeff = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(1,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(1,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(1,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(1,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(1,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(1,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(1) + coeff = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(1,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(1,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(1,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(1,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(1,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(1,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(1) + coeff = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(1,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(1,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(1,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(1,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(1,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(1,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(1) + coeff = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(1,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(1,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(1,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(1,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(1,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(1,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(1) + pivot = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot + lhs_(2,4,2) = lhs_(2,4,2) * pivot + lhs_(2,5,2) = lhs_(2,5,2) * pivot + lhs_(2,1,3) = lhs_(2,1,3) * pivot + lhs_(2,2,3) = lhs_(2,2,3) * pivot + lhs_(2,3,3) = lhs_(2,3,3) * pivot + lhs_(2,4,3) = lhs_(2,4,3) * pivot + lhs_(2,5,3) = lhs_(2,5,3) * pivot + rhs_(2) = rhs_(2) * pivot + coeff = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(2,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(2,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(2,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(2,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(2,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(2,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(2) + coeff = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(2,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(2,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(2,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(2,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(2,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(2,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(2) + coeff = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(2,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(2,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(2,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(2,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(2,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(2,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(2) + coeff = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(2,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(2,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(2,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(2,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(2,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(2,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(2) + pivot = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot + lhs_(3,5,2) = lhs_(3,5,2) * pivot + lhs_(3,1,3) = lhs_(3,1,3) * pivot + lhs_(3,2,3) = lhs_(3,2,3) * pivot + lhs_(3,3,3) = lhs_(3,3,3) * pivot + lhs_(3,4,3) = lhs_(3,4,3) * pivot + lhs_(3,5,3) = lhs_(3,5,3) * pivot + rhs_(3) = rhs_(3) * pivot + coeff = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(3,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(3,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(3,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(3,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(3,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(3,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(3) + coeff = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(3,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(3,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(3,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(3,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(3,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(3,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(3) + coeff = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff * lhs_(3,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(3,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(3,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(3,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(3,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(3,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(3) + coeff = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(3,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(3,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(3,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(3,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(3,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(3,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(3) + pivot = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot + lhs_(4,1,3) = lhs_(4,1,3) * pivot + lhs_(4,2,3) = lhs_(4,2,3) * pivot + lhs_(4,3,3) = lhs_(4,3,3) * pivot + lhs_(4,4,3) = lhs_(4,4,3) * pivot + lhs_(4,5,3) = lhs_(4,5,3) * pivot + rhs_(4) = rhs_(4) * pivot + coeff = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff * lhs_(4,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(4,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(4,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(4,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(4,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(4,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(4) + coeff = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff * lhs_(4,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(4,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(4,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(4,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(4,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(4,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(4) + coeff = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff * lhs_(4,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(4,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(4,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(4,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(4,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(4,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(4) + coeff = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff * lhs_(4,5,2) + lhs_(5,1,3) = lhs_(5,1,3) - coeff * lhs_(4,1,3) + lhs_(5,2,3) = lhs_(5,2,3) - coeff * lhs_(4,2,3) + lhs_(5,3,3) = lhs_(5,3,3) - coeff * lhs_(4,3,3) + lhs_(5,4,3) = lhs_(5,4,3) - coeff * lhs_(4,4,3) + lhs_(5,5,3) = lhs_(5,5,3) - coeff * lhs_(4,5,3) + rhs_(5) = rhs_(5) - coeff * rhs_(4) + pivot = 1.00d0 / lhs_(5,5,2) + lhs_(5,1,3) = lhs_(5,1,3) * pivot + lhs_(5,2,3) = lhs_(5,2,3) * pivot + lhs_(5,3,3) = lhs_(5,3,3) * pivot + lhs_(5,4,3) = lhs_(5,4,3) * pivot + lhs_(5,5,3) = lhs_(5,5,3) * pivot + rhs_(5) = rhs_(5) * pivot + coeff = lhs_(1,5,2) + lhs_(1,1,3) = lhs_(1,1,3) - coeff * lhs_(5,1,3) + lhs_(1,2,3) = lhs_(1,2,3) - coeff * lhs_(5,2,3) + lhs_(1,3,3) = lhs_(1,3,3) - coeff * lhs_(5,3,3) + lhs_(1,4,3) = lhs_(1,4,3) - coeff * lhs_(5,4,3) + lhs_(1,5,3) = lhs_(1,5,3) - coeff * lhs_(5,5,3) + rhs_(1) = rhs_(1) - coeff * rhs_(5) + coeff = lhs_(2,5,2) + lhs_(2,1,3) = lhs_(2,1,3) - coeff * lhs_(5,1,3) + lhs_(2,2,3) = lhs_(2,2,3) - coeff * lhs_(5,2,3) + lhs_(2,3,3) = lhs_(2,3,3) - coeff * lhs_(5,3,3) + lhs_(2,4,3) = lhs_(2,4,3) - coeff * lhs_(5,4,3) + lhs_(2,5,3) = lhs_(2,5,3) - coeff * lhs_(5,5,3) + rhs_(2) = rhs_(2) - coeff * rhs_(5) + coeff = lhs_(3,5,2) + lhs_(3,1,3) = lhs_(3,1,3) - coeff * lhs_(5,1,3) + lhs_(3,2,3) = lhs_(3,2,3) - coeff * lhs_(5,2,3) + lhs_(3,3,3) = lhs_(3,3,3) - coeff * lhs_(5,3,3) + lhs_(3,4,3) = lhs_(3,4,3) - coeff * lhs_(5,4,3) + lhs_(3,5,3) = lhs_(3,5,3) - coeff * lhs_(5,5,3) + rhs_(3) = rhs_(3) - coeff * rhs_(5) + coeff = lhs_(4,5,2) + lhs_(4,1,3) = lhs_(4,1,3) - coeff * lhs_(5,1,3) + lhs_(4,2,3) = lhs_(4,2,3) - coeff * lhs_(5,2,3) + lhs_(4,3,3) = lhs_(4,3,3) - coeff * lhs_(5,3,3) + lhs_(4,4,3) = lhs_(4,4,3) - coeff * lhs_(5,4,3) + lhs_(4,5,3) = lhs_(4,5,3) - coeff * lhs_(5,5,3) + rhs_(4) = rhs_(4) - coeff * rhs_(5) + do i__0 = 1,5 + lhs__(i__0,1,i,j,k) = lhs_(i__0,1,3) + lhs__(i__0,2,i,j,k) = lhs_(i__0,2,3) + lhs__(i__0,3,i,j,k) = lhs_(i__0,3,3) + lhs__(i__0,4,i,j,k) = lhs_(i__0,4,3) + lhs__(i__0,5,i,j,k) = lhs_(i__0,5,3) + enddo + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + + + else !! of big IF(k .ne. lastIter) + + do n = 1,5 + lhs_(1,n,1) = 0.0d0 + lhs_(1,n,2) = 0.0d0 + lhs_(1,n,3) = 0.0d0 + lhs_(2,n,1) = 0.0d0 + lhs_(2,n,2) = 0.0d0 + lhs_(2,n,3) = 0.0d0 + lhs_(3,n,1) = 0.0d0 + lhs_(3,n,2) = 0.0d0 + lhs_(3,n,3) = 0.0d0 + lhs_(4,n,1) = 0.0d0 + lhs_(4,n,2) = 0.0d0 + lhs_(4,n,3) = 0.0d0 + lhs_(5,n,1) = 0.0d0 + lhs_(5,n,2) = 0.0d0 + lhs_(5,n,3) = 0.0d0 + enddo + do m = 1,5 + lhs_(m,m,2) = 1.0d0 + enddo + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + enddo + do i__0 = 1,5 + rhs_(i__0) = rhs_(i__0) - lhs_(i__0,1,1) * rhs(1,i,j,ksiz + &e - 1) - lhs_(i__0,2,1) * rhs(2,i,j,ksize - 1) - lhs_(i__0,3,1) * + &rhs(3,i,j,ksize - 1) - lhs_(i__0,4,1) * rhs(4,i,j,ksize - 1) - lhs + &_(i__0,5,1) * rhs(5,i,j,ksize - 1) + enddo + do j__1 = 1,5 + lhs_(1,j__1,2) = lhs_(1,j__1,2) - lhs_(1,1,1) * lhs_(1,j_ + &_1,3) - lhs_(1,2,1) * lhs_(2,j__1,3) - lhs_(1,3,1) * lhs_(3,j__1,3 + &) - lhs_(1,4,1) * lhs_(4,j__1,3) - lhs_(1,5,1) * lhs_(5,j__1,3) + lhs_(2,j__1,2) = lhs_(2,j__1,2) - lhs_(2,1,1) * lhs_(1,j_ + &_1,3) - lhs_(2,2,1) * lhs_(2,j__1,3) - lhs_(2,3,1) * lhs_(3,j__1,3 + &) - lhs_(2,4,1) * lhs_(4,j__1,3) - lhs_(2,5,1) * lhs_(5,j__1,3) + lhs_(3,j__1,2) = lhs_(3,j__1,2) - lhs_(3,1,1) * lhs_(1,j_ + &_1,3) - lhs_(3,2,1) * lhs_(2,j__1,3) - lhs_(3,3,1) * lhs_(3,j__1,3 + &) - lhs_(3,4,1) * lhs_(4,j__1,3) - lhs_(3,5,1) * lhs_(5,j__1,3) + lhs_(4,j__1,2) = lhs_(4,j__1,2) - lhs_(4,1,1) * lhs_(1,j_ + &_1,3) - lhs_(4,2,1) * lhs_(2,j__1,3) - lhs_(4,3,1) * lhs_(3,j__1,3 + &) - lhs_(4,4,1) * lhs_(4,j__1,3) - lhs_(4,5,1) * lhs_(5,j__1,3) + lhs_(5,j__1,2) = lhs_(5,j__1,2) - lhs_(5,1,1) * lhs_(1,j_ + &_1,3) - lhs_(5,2,1) * lhs_(2,j__1,3) - lhs_(5,3,1) * lhs_(3,j__1,3 + &) - lhs_(5,4,1) * lhs_(4,j__1,3) - lhs_(5,5,1) * lhs_(5,j__1,3) + enddo + +!--------------------------------------------------------------------- +! +!--------------------------------------------------------------------- + pivot__3 = 1.00d0 / lhs_(1,1,2) + lhs_(1,2,2) = lhs_(1,2,2) * pivot__3 + lhs_(1,3,2) = lhs_(1,3,2) * pivot__3 + lhs_(1,4,2) = lhs_(1,4,2) * pivot__3 + lhs_(1,5,2) = lhs_(1,5,2) * pivot__3 + rhs_(1) = rhs_(1) * pivot__3 + coeff__2 = lhs_(2,1,2) + lhs_(2,2,2) = lhs_(2,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(2,3,2) = lhs_(2,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(1) + coeff__2 = lhs_(3,1,2) + lhs_(3,2,2) = lhs_(3,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(1) + coeff__2 = lhs_(4,1,2) + lhs_(4,2,2) = lhs_(4,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(1) + coeff__2 = lhs_(5,1,2) + lhs_(5,2,2) = lhs_(5,2,2) - coeff__2 * lhs_(1,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(1,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(1,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(1,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(1) + pivot__3 = 1.00d0 / lhs_(2,2,2) + lhs_(2,3,2) = lhs_(2,3,2) * pivot__3 + lhs_(2,4,2) = lhs_(2,4,2) * pivot__3 + lhs_(2,5,2) = lhs_(2,5,2) * pivot__3 + rhs_(2) = rhs_(2) * pivot__3 + coeff__2 = lhs_(1,2,2) + lhs_(1,3,2) = lhs_(1,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(2) + coeff__2 = lhs_(3,2,2) + lhs_(3,3,2) = lhs_(3,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(3,4,2) = lhs_(3,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(2) + coeff__2 = lhs_(4,2,2) + lhs_(4,3,2) = lhs_(4,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(2) + coeff__2 = lhs_(5,2,2) + lhs_(5,3,2) = lhs_(5,3,2) - coeff__2 * lhs_(2,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(2,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(2,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(2) + pivot__3 = 1.00d0 / lhs_(3,3,2) + lhs_(3,4,2) = lhs_(3,4,2) * pivot__3 + lhs_(3,5,2) = lhs_(3,5,2) * pivot__3 + rhs_(3) = rhs_(3) * pivot__3 + coeff__2 = lhs_(1,3,2) + lhs_(1,4,2) = lhs_(1,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(3) + coeff__2 = lhs_(2,3,2) + lhs_(2,4,2) = lhs_(2,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(3) + coeff__2 = lhs_(4,3,2) + lhs_(4,4,2) = lhs_(4,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(4,5,2) = lhs_(4,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(3) + coeff__2 = lhs_(5,3,2) + lhs_(5,4,2) = lhs_(5,4,2) - coeff__2 * lhs_(3,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(3,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(3) + pivot__3 = 1.00d0 / lhs_(4,4,2) + lhs_(4,5,2) = lhs_(4,5,2) * pivot__3 + rhs_(4) = rhs_(4) * pivot__3 + coeff__2 = lhs_(1,4,2) + lhs_(1,5,2) = lhs_(1,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(4) + coeff__2 = lhs_(2,4,2) + lhs_(2,5,2) = lhs_(2,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(4) + coeff__2 = lhs_(3,4,2) + lhs_(3,5,2) = lhs_(3,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(4) + coeff__2 = lhs_(5,4,2) + lhs_(5,5,2) = lhs_(5,5,2) - coeff__2 * lhs_(4,5,2) + rhs_(5) = rhs_(5) - coeff__2 * rhs_(4) + pivot__3 = 1.00d0 / lhs_(5,5,2) + rhs_(5) = rhs_(5) * pivot__3 + coeff__2 = lhs_(1,5,2) + rhs_(1) = rhs_(1) - coeff__2 * rhs_(5) + coeff__2 = lhs_(2,5,2) + rhs_(2) = rhs_(2) - coeff__2 * rhs_(5) + coeff__2 = lhs_(3,5,2) + rhs_(3) = rhs_(3) - coeff__2 * rhs_(5) + coeff__2 = lhs_(4,5,2) + rhs_(4) = rhs_(4) - coeff__2 * rhs_(5) + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + enddo + endif + + enddo + enddo + enddo + +!DVM$ PARALLEL (k,j,i) ON rhs(*,i,j,k), private(rhs_,rhsp_,m) +!DVM$& ,ACROSS(rhs(0:0,0:0,0:0,0:1)),stage(stage_n) + do k = problem_size-2, 1, (-(1)) + do j = 1,problem_size - 2 + do i = 1,problem_size - 2 + do m = 1,5 + rhs_(m) = rhs(m,i,j,k) + rhsp_(m) = rhs(m,i,j,k + 1) + enddo + + do m = 1,5 + rhs_(m) = rhs_(m) - lhs__(m,1,i,j,k) * rhsp_(1) + rhs_(m) = rhs_(m) - lhs__(m,2,i,j,k) * rhsp_(2) + rhs_(m) = rhs_(m) - lhs__(m,3,i,j,k) * rhsp_(3) + rhs_(m) = rhs_(m) - lhs__(m,4,i,j,k) * rhsp_(4) + rhs_(m) = rhs_(m) - lhs__(m,5,i,j,k) * rhsp_(5) + enddo + + do m = 1,5 + rhs(m,i,j,k) = rhs_(m) + u(m,i,j,k) = u(m,i,j,k) + rhs_(m) + enddo + enddo + enddo + enddo +!DVM$ end region + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/Makefile new file mode 100644 index 0000000..c594e0b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/Makefile @@ -0,0 +1,21 @@ +SHELL=/bin/sh +BENCHMARK=cg +BENCHMARKU=CG + +include ../config/make.def +include ../sys/make.common + +SOURCES = cg.fdv + +OBJS = ${SOURCES:.fdv=.o} + +${PROGRAM}: config $(OBJS) + ${FLINK} -o ${PROGRAM} ${OBJS} + +%.o: %.fdv npbparams.h globals.h + ${F77} ${FFLAGS} -dvmIrregAnalysis -c -o $@ $< + +clean: + rm -f npbparams.h + rm -f *.o *~ + rm -f *.cu *.cuf *.c diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/cg.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/cg.fdv new file mode 100644 index 0000000..f077345 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/cg.fdv @@ -0,0 +1,1008 @@ +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! S E R I A L V E R S I O N ! +! ! +! C G ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is a serial version of the NPB CG code. ! +! Refer to NAS Technical Reports 95-020 for details. ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 3.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 3.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/Software/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (650) 604-3957 ! +! ! +!-------------------------------------------------------------------------! + + +c--------------------------------------------------------------------- +c NPB CG serial version +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c Authors: M. Yarrow +c C. Kuszmaul +c A.S. Kolganov +c +c--------------------------------------------------------------------- + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + program cg +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + + implicit none + + include 'globals.h' + + + common / main_int_mem / colidx, rowstr, + > iv, arow, acol + integer colidx(nz), rowstr(na+1), + > iv(na), arow(na), acol(naz), + > bl_low, bl_high, blGen,gBL(2) + + + common / main_flt_mem / aelt, a, + > x, + > z, + > p, + > q, + > r + double precision aelt(naz), a(nz), + > x(na+1), + > z(na+1), + > p(na+1), + > q(na+1), + > r(na+1) + + + + +CDVM$ TEMPLATE ttt(na+2) +CDVM$ DISTRIBUTE ttt(BLOCK) +CDVM$ ALIGN z(I) WITH ttt(I) + +CDVM$ ALIGN x(I) WITH z(I) +CDVM$ ALIGN r(I) WITH z(I) +CDVM$ ALIGN p(I) WITH z(I) +CDVM$ ALIGN q(I) WITH z(I) + + + integer i, j, k, it, sumL + + double precision zeta, randlc + external randlc + double precision rnorm + double precision norm_temp1,norm_temp2 + + double precision t, mflops, tmax + character class + logical verified + double precision zeta_verify_value, epsilon, err + + integer fstatus + character t_names(t_last)*8 + + do i = 1, T_last + call timer_clear( i ) + end do + + open(unit=2, file='timer.flag', status='old', iostat=fstatus) + if (fstatus .eq. 0) then + timeron = .true. + t_names(t_init) = 'init' + t_names(t_bench) = 'benchmk' + t_names(t_conj_grad) = 'conjgd' + close(2) + else + timeron = .false. + endif + + call timer_start( T_init ) + + firstrow = 1 + lastrow = na + firstcol = 1 + lastcol = na + + + if( na .eq. 1400 .and. + & nonzer .eq. 7 .and. + & niter .eq. 15 .and. + & shift .eq. 10.d0 ) then + class = 'S' + zeta_verify_value = 8.5971775078648d0 + else if( na .eq. 7000 .and. + & nonzer .eq. 8 .and. + & niter .eq. 15 .and. + & shift .eq. 12.d0 ) then + class = 'W' + zeta_verify_value = 10.362595087124d0 + else if( na .eq. 14000 .and. + & nonzer .eq. 11 .and. + & niter .eq. 15 .and. + & shift .eq. 20.d0 ) then + class = 'A' + zeta_verify_value = 17.130235054029d0 + else if( na .eq. 75000 .and. + & nonzer .eq. 13 .and. + & niter .eq. 75 .and. + & shift .eq. 60.d0 ) then + class = 'B' + zeta_verify_value = 22.712745482631d0 + else if( na .eq. 150000 .and. + & nonzer .eq. 15 .and. + & niter .eq. 75 .and. + & shift .eq. 110.d0 ) then + class = 'C' + zeta_verify_value = 28.973605592845d0 + else if( na .eq. 1500000 .and. + & nonzer .eq. 21 .and. + & niter .eq. 100 .and. + & shift .eq. 500.d0 ) then + class = 'D' + zeta_verify_value = 52.514532105794d0 + else if( na .eq. 9000000 .and. + & nonzer .eq. 26 .and. + & niter .eq. 100 .and. + & shift .eq. 1.5d3 ) then + class = 'E' + zeta_verify_value = 77.522164599383d0 + else + class = 'U' + endif + + write( *,1000 ) + write( *,1001 ) na + write( *,1002 ) niter + write( *,* ) + 1000 format(//,' NAS Parallel Benchmarks (NPB3.3-DVMH)', + > ' - CG Benchmark', /) + 1001 format(' Size: ', i11 ) + 1002 format(' Iterations: ', i5 ) + + naa = na + nzz = nz + + +c--------------------------------------------------------------------- +c Inialize random number generator +c--------------------------------------------------------------------- + tran = 314159265.0D0 + amult = 1220703125.0D0 + zeta = randlc( tran, amult ) + +c--------------------------------------------------------------------- +c +c--------------------------------------------------------------------- + call makea(naa, nzz, a, colidx, rowstr, + > firstrow, lastrow, firstcol, lastcol, + > arow, acol, aelt, iv) + + + +c--------------------------------------------------------------------- +c Note: as a result of the above call to makea: +c values of j used in indexing rowstr go from 1 --> lastrow-firstrow+1 +c values of colidx which are col indexes go from firstcol --> lastcol +c So: +c Shift the col index vals from actual (firstcol --> lastcol ) +c to local, i.e., (1 --> lastcol-firstcol+1) +c--------------------------------------------------------------------- + do j=1,lastrow-firstrow+1 + do k=rowstr(j),rowstr(j+1)-1 + colidx(k) = colidx(k) - firstcol + 1 + enddo + enddo + +c--------------------------------------------------------------------- +c set starting vector to (1, 1, .... 1) +c--------------------------------------------------------------------- +CDVM$ region +CDVM$ parallel (i) on x(i) + do i = 1, na+1 + x(i) = 1.0D0 + enddo +CDVM$ parallel (j) on x(j) + do j=1, lastcol-firstcol+1 + q(j) = 0.0d0 + z(j) = 0.0d0 + r(j) = 0.0d0 + p(j) = 0.0d0 + enddo +CDVM$ end region + zeta = 0.0d0 + +c--------------------------------------------------------------------- +c----> +c Do one iteration untimed to init all code and data page tables +c----> (then reinit, start timing, to niter its) +c--------------------------------------------------------------------- + do it = 1, 1 + +c--------------------------------------------------------------------- +c The call to the conjugate gradient routine: +c--------------------------------------------------------------------- + call conj_grad ( colidx, + > rowstr, + > x, + > z, + > a, + > p, + > q, + > r, + > rnorm ) + +c--------------------------------------------------------------------- +c zeta = shift + 1/(x.z) +c So, first: (x.z) +c Also, find norm of z +c So, first: (z.z) +c--------------------------------------------------------------------- + norm_temp1 = 0.0d0 + norm_temp2 = 0.0d0 +CDVM$ region +CDVM$ parallel (j) on x(j),reduction(SUM(norm_temp1),SUM(norm_temp2)) + do j=1, lastcol-firstcol+1 + norm_temp1 = norm_temp1 + x(j)*z(j) + norm_temp2 = norm_temp2 + z(j)*z(j) + enddo +CDVM$ end region + norm_temp2 = 1.0d0 / sqrt( norm_temp2 ) + + +c--------------------------------------------------------------------- +c Normalize z to obtain x +c--------------------------------------------------------------------- +CDVM$ region +CDVM$ parallel (j) on x(j) + do j=1, lastcol-firstcol+1 + x(j) = norm_temp2*z(j) + enddo +CDVM$ end region + + enddo ! end of do one iteration untimed + + +c--------------------------------------------------------------------- +c set starting vector to (1, 1, .... 1) +c--------------------------------------------------------------------- +c +c +c +CDVM$ region +CDVM$ parallel (i) on x(i) + do i = 1, na+1 + x(i) = 1.0D0 + enddo +CDVM$ end region + zeta = 0.0d0 + + call timer_stop( T_init ) + + write (*, 2000) timer_read(T_init) + 2000 format(' Initialization time = ',f15.3,' seconds') + + call timer_start( T_bench ) + +c--------------------------------------------------------------------- +c----> +c Main Iteration for inverse power method +c----> +c--------------------------------------------------------------------- + do it = 1, niter + +c--------------------------------------------------------------------- +c The call to the conjugate gradient routine: +c--------------------------------------------------------------------- + if ( timeron ) call timer_start( T_conj_grad ) + call conj_grad ( colidx, + > rowstr, + > x, + > z, + > a, + > p, + > q, + > r, + > rnorm ) + if ( timeron ) call timer_stop( T_conj_grad ) + + +c--------------------------------------------------------------------- +c zeta = shift + 1/(x.z) +c So, first: (x.z) +c Also, find norm of z +c So, first: (z.z) +c--------------------------------------------------------------------- + norm_temp1 = 0.0d0 + norm_temp2 = 0.0d0 +CDVM$ region +CDVM$ parallel (j) on x(j),reduction(SUM(norm_temp1),SUM(norm_temp2)) + do j=1, lastcol-firstcol+1 + norm_temp1 = norm_temp1 + x(j)*z(j) + norm_temp2 = norm_temp2 + z(j)*z(j) + enddo +CDVM$ end region + norm_temp2 = 1.0d0 / sqrt( norm_temp2 ) + + + zeta = shift + 1.0d0 / norm_temp1 + if( it .eq. 1 ) write( *,9000 ) + write( *,9001 ) it, rnorm, zeta + + 9000 format( /,' iteration ||r|| zeta' ) + 9001 format( 4x, i5, 7x, e20.14, f20.13 ) + +c--------------------------------------------------------------------- +c Normalize z to obtain x +c--------------------------------------------------------------------- +CDVM$ region +CDVM$ parallel (j) on x(j) + do j=1, lastcol-firstcol+1 + x(j) = norm_temp2*z(j) + enddo +CDVM$ end region + + enddo ! end of main iter inv pow meth + + call timer_stop( T_bench ) + +c--------------------------------------------------------------------- +c End of timed section +c--------------------------------------------------------------------- + + t = timer_read( T_bench ) + + + write(*,100) + 100 format(' Benchmark completed ') + + epsilon = 1.d-10 + if (class .ne. 'U') then + +c err = abs( zeta - zeta_verify_value) + err = abs( zeta - zeta_verify_value )/zeta_verify_value + if( err .le. epsilon .and. ( .not. isnan(err))) then + verified = .TRUE. + write(*, 200) + write(*, 201) zeta + write(*, 202) err + 200 format(' VERIFICATION SUCCESSFUL ') + 201 format(' Zeta is ', E20.13) + 202 format(' Error is ', E20.13) + else + verified = .FALSE. + write(*, 300) + write(*, 301) zeta + write(*, 302) zeta_verify_value + 300 format(' VERIFICATION FAILED') + 301 format(' Zeta ', E20.13) + 302 format(' The correct zeta is ', E20.13) + endif + else + verified = .FALSE. + write (*, 400) + write (*, 401) + write (*, 201) zeta + 400 format(' Problem size unknown') + 401 format(' NO VERIFICATION PERFORMED') + endif + + + if( t .ne. 0. ) then + mflops = float( 2*niter*na ) + & * ( 3.+float( nonzer*(nonzer+1) ) + & + 25.*(5.+float( nonzer*(nonzer+1) )) + & + 3. ) / t / 1000000.0 + else + mflops = 0.0 + endif + + + call print_results('CG', class, na, 0, 0, + > niter, t, + > mflops, ' floating point', + > verified, npbversion, compiletime, + > cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + + + 600 format( i4, 2e19.12) + + +c--------------------------------------------------------------------- +c More timers +c--------------------------------------------------------------------- + if (.not.timeron) goto 999 + + tmax = timer_read(T_bench) + if (tmax .eq. 0.0) tmax = 1.0 + + write(*,800) + 800 format(' SECTION Time (secs)') + do i=1, t_last + t = timer_read(i) + if (i.eq.t_init) then + write(*,810) t_names(i), t + else + write(*,810) t_names(i), t, t*100./tmax + if (i.eq.t_conj_grad) then + t = tmax - t + write(*,820) 'rest', t, t*100./tmax + endif + endif + 810 format(2x,a8,':',f9.3:' (',f6.2,'%)') + 820 format(' --> ',a8,':',f9.3,' (',f6.2,'%)') + end do + + 999 continue + + + end ! end main + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + subroutine conj_grad ( colidx, + > rowstr, + > x, + > z, + > a, + > p, + > q, + > r, + > rnorm ) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Floaging point arrays here are named as in NPB1 spec discussion of +c CG algorithm +c--------------------------------------------------------------------- + + implicit none + + + include 'globals.h' + + + double precision x(*), + > z(*), + > a(nzz) + integer colidx(nzz), rowstr(naa+1) + + double precision p(*), + > q(*), + > r(*) + + + integer j, k + integer cgit, cgitmax, mlen,idx, idxl + + double precision d, sum, rho, rho0, alpha, beta, rnorm + + data cgitmax / 25 / +CDVM$ INHERIT x, z, r, p, q + + rho = 0.0d0 + +c--------------------------------------------------------------------- +c Initialize the CG algorithm: +c--------------------------------------------------------------------- + +CDVM$ region +CDVM$ parallel (j) on q(j), private(d) + do j=1,naa+1 + q(j) = 0.0d0 + z(j) = 0.0d0 + d = x(j) + r(j) = d + p(j) = d + enddo + + +c--------------------------------------------------------------------- +c rho = r.r +c Now, obtain the norm of r: First, sum squares of r elements locally... +c--------------------------------------------------------------------- + +CDVM$ parallel(j) on r(j), reduction(SUM(rho)) + do j=1, lastcol-firstcol+1 + rho = rho + r(j)*r(j) + enddo +! mlen = 128 +! DVM$ parallel(j) on r(j), reduction(MAX(mlen)) +! do j=1,lastrow-firstrow+1 +! mlen = max(mlen, rowstr(j+1) - rowstr(j)) +! enddo +CDVM$ end region +! write(*,*) 'maxlen = ', mlen +c--------------------------------------------------------------------- +c----> +c The conj grad iteration loop +c----> +c--------------------------------------------------------------------- + do cgit = 1, cgitmax + + d = 0.0d0 +CDVM$ region + +CDVM$ parallel (j) on p(j), private(sum,k), remote_access(p(:)) + do j=1,lastrow-firstrow+1 + sum = 0.d0 + do k=rowstr(j),rowstr(j+1)-1 + sum = sum + a(k)*p(colidx(k)) + enddo + q(j) = sum + enddo + +CDVM$ parallel (j) on q(j), reduction(SUM(d)) + do j=1, lastcol-firstcol+1 + d = d + p(j)*q(j) + enddo +CDVM$ end region + alpha = rho / d + rho0 = rho + + rho = 0.0d0 +CDVM$ region +CDVM$ parallel (j) on r(j), private(d), reduction(SUM(rho)) + do j=1, lastcol-firstcol+1 + z(j) = z(j) + alpha*p(j) + d = r(j) - alpha*q(j) + r(j) = d + rho = rho + d*d + enddo +CDVM$ end region + beta = rho / rho0 + +CDVM$ region +CDVM$ parallel (j) on r(j) + do j=1, lastcol-firstcol+1 + p(j) = r(j) + beta*p(j) + enddo +CDVM$ end region + + enddo ! end of do cgit=1,cgitmax + + +c--------------------------------------------------------------------- +c Compute residual norm explicitly: ||r|| = ||x - A.z|| +c First, form A.z +c The partition submatrix-vector multiply +c--------------------------------------------------------------------- + + sum = 0.0d0 +CDVM$ region +CDVM$ parallel (j) on r(j), private(d,k),remote_access(z(:)) + do j=1,lastrow-firstrow+1 + d = 0.d0 + do k=rowstr(j),rowstr(j+1)-1 + d = d + a(k)*z(colidx(k)) + enddo + r(j) = d + enddo + + +c--------------------------------------------------------------------- +c At this point, r contains A.z +c--------------------------------------------------------------------- +CDVM$ parallel (j) on r(j), private(d), reduction(SUM(sum)) + do j=1, lastcol-firstcol+1 + d = x(j) - r(j) + sum = sum + d*d + enddo +CDVM$ end region + rnorm = sqrt( sum ) + + + + return + end ! end of routine conj_grad + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + subroutine makea( n, nz, a, colidx, rowstr, + > firstrow, lastrow, firstcol, lastcol, + > arow, acol, aelt, iv ) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + include 'npbparams.h' + integer n, nz + integer firstrow, lastrow, firstcol, lastcol + integer colidx(nz), rowstr(n+1) + integer iv(n), arow(n), acol(nonzer+1,n) + double precision aelt(nonzer+1,n) + double precision a(nz) + +c--------------------------------------------------------------------- +c generate the test problem for benchmark 6 +c makea generates a sparse matrix with a +c prescribed sparsity distribution +c +c parameter type usage +c +c input +c +c n i number of cols/rows of matrix +c nz i nonzeros as declared array size +c rcond r*8 condition number +c shift r*8 main diagonal shift +c +c output +c +c a r*8 array for nonzeros +c colidx i col indices +c rowstr i row pointers +c +c workspace +c +c iv, arow, acol i +c aelt r*8 +c--------------------------------------------------------------------- + + integer i, iouter, ivelt, nzv, nn1 + integer ivc(nonzer+1) + double precision vc(nonzer+1) + +c--------------------------------------------------------------------- +c nonzer is approximately (int(sqrt(nnza /n))); +c--------------------------------------------------------------------- + + external sparse, sprnvc, vecset + +c--------------------------------------------------------------------- +c nn1 is the smallest power of two not less than n +c--------------------------------------------------------------------- + + nn1 = 1 + 50 continue + nn1 = 2 * nn1 + if (nn1 .lt. n) goto 50 + +c--------------------------------------------------------------------- +c Generate nonzero positions and save for the use in sparse. +c--------------------------------------------------------------------- + + do iouter = 1, n + nzv = nonzer + call sprnvc( n, nzv, nn1, vc, ivc ) + call vecset( n, vc, ivc, nzv, iouter, .5D0 ) + arow(iouter) = nzv + do ivelt = 1, nzv + acol(ivelt, iouter) = ivc(ivelt) + aelt(ivelt, iouter) = vc(ivelt) + enddo + enddo + +c--------------------------------------------------------------------- +c ... make the sparse matrix from list of elements with duplicates +c (iv is used as workspace) +c--------------------------------------------------------------------- + call sparse( a, colidx, rowstr, n, nz, nonzer, arow, acol, + > aelt, firstrow, lastrow, + > iv, rcond, shift ) + return + + end +c-------end of makea------------------------------ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + subroutine sparse( a, colidx, rowstr, n, nz, nonzer, arow, acol, + > aelt, firstrow, lastrow, + > nzloc, rcond, shift ) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer colidx(*), rowstr(*) + integer firstrow, lastrow + integer n, nz, nonzer, arow(*), acol(nonzer+1,*) + double precision a(*), aelt(nonzer+1,*), rcond, shift + +c--------------------------------------------------------------------- +c rows range from firstrow to lastrow +c the rowstr pointers are defined for nrows = lastrow-firstrow+1 values +c--------------------------------------------------------------------- + integer nzloc(n), nrows + +c--------------------------------------------------- +c generate a sparse matrix from a list of +c [col, row, element] tri +c--------------------------------------------------- + + integer i, j, j1, j2, nza, k, kk, nzrow, jcol + double precision xi, size, scale, ratio, va + +c--------------------------------------------------------------------- +c how many rows of result +c--------------------------------------------------------------------- + nrows = lastrow - firstrow + 1 + +c--------------------------------------------------------------------- +c ...count the number of triples in each row +c--------------------------------------------------------------------- + do j = 1, nrows+1 + rowstr(j) = 0 + enddo + + do i = 1, n + do nza = 1, arow(i) + j = acol(nza, i) + 1 + rowstr(j) = rowstr(j) + arow(i) + end do + end do + + rowstr(1) = 1 + do j = 2, nrows+1 + rowstr(j) = rowstr(j) + rowstr(j-1) + enddo + nza = rowstr(nrows+1) - 1 + +c--------------------------------------------------------------------- +c ... rowstr(j) now is the location of the first nonzero +c of row j of a +c--------------------------------------------------------------------- + + if (nza .gt. nz) then + write(*,*) 'Space for matrix elements exceeded in sparse' + write(*,*) 'nza, nzmax = ',nza, nz + stop + endif + + +c--------------------------------------------------------------------- +c ... preload data pages +c--------------------------------------------------------------------- + do j = 1, nrows + do k = rowstr(j), rowstr(j+1)-1 + a(k) = 0.d0 + colidx(k) = 0 + enddo + nzloc(j) = 0 + enddo + +c--------------------------------------------------------------------- +c ... generate actual values by summing duplicates +c--------------------------------------------------------------------- + + size = 1.0D0 + ratio = rcond ** (1.0D0 / dfloat(n)) + + do i = 1, n + do nza = 1, arow(i) + j = acol(nza, i) + + scale = size * aelt(nza, i) + do nzrow = 1, arow(i) + jcol = acol(nzrow, i) + va = aelt(nzrow, i) * scale + +c--------------------------------------------------------------------- +c ... add the identity * rcond to the generated matrix to bound +c the smallest eigenvalue from below by rcond +c--------------------------------------------------------------------- + if (jcol .eq. j .and. j .eq. i) then + va = va + rcond - shift + endif + + do k = rowstr(j), rowstr(j+1)-1 + if (colidx(k) .gt. jcol) then +c--------------------------------------------------------------------- +c ... insert colidx here orderly +c--------------------------------------------------------------------- + do kk = rowstr(j+1)-2, k, -1 + if (colidx(kk) .gt. 0) then + a(kk+1) = a(kk) + colidx(kk+1) = colidx(kk) + endif + enddo + colidx(k) = jcol + a(k) = 0.d0 + goto 40 + else if (colidx(k) .eq. 0) then + colidx(k) = jcol + goto 40 + else if (colidx(k) .eq. jcol) then +c--------------------------------------------------------------------- +c ... mark the duplicated entry +c--------------------------------------------------------------------- + nzloc(j) = nzloc(j) + 1 + goto 40 + endif + enddo + print *,'internal error in sparse: i=',i + stop + 40 continue + a(k) = a(k) + va + enddo + 60 continue + enddo + size = size * ratio + enddo + + +c--------------------------------------------------------------------- +c ... remove empty entries and generate final results +c--------------------------------------------------------------------- + do j = 2, nrows + nzloc(j) = nzloc(j) + nzloc(j-1) + enddo + + do j = 1, nrows + if (j .gt. 1) then + j1 = rowstr(j) - nzloc(j-1) + else + j1 = 1 + endif + j2 = rowstr(j+1) - nzloc(j) - 1 + nza = rowstr(j) + do k = j1, j2 + a(k) = a(nza) + colidx(k) = colidx(nza) + nza = nza + 1 + enddo + enddo + do j = 2, nrows+1 + rowstr(j) = rowstr(j) - nzloc(j-1) + enddo + nza = rowstr(nrows+1) - 1 + + +CC write (*, 11000) nza + return +11000 format ( //,'final nonzero count in sparse ', + 1 /,'number of nonzeros = ', i16 ) + end +c-------end of sparse----------------------------- + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + subroutine sprnvc( n, nz, nn1, v, iv ) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + double precision v(*) + integer n, nz, nn1, iv(*) + common /urando/ amult, tran + double precision amult, tran + + +c--------------------------------------------------------------------- +c generate a sparse n-vector (v, iv) +c having nzv nonzeros +c +c mark(i) is set to 1 if position i is nonzero. +c mark is all zero on entry and is reset to all zero before exit +c this corrects a performance bug found by John G. Lewis, caused by +c reinitialization of mark on every one of the n calls to sprnvc +c--------------------------------------------------------------------- + + integer nzv, ii, i, icnvrt + + external randlc, icnvrt + double precision randlc, vecelt, vecloc + + + nzv = 0 + +100 continue + if (nzv .ge. nz) goto 110 + + vecelt = randlc( tran, amult ) + +c--------------------------------------------------------------------- +c generate an integer between 1 and n in a portable manner +c--------------------------------------------------------------------- + vecloc = randlc(tran, amult) + i = icnvrt(vecloc, nn1) + 1 + if (i .gt. n) goto 100 + +c--------------------------------------------------------------------- +c was this integer generated already? +c--------------------------------------------------------------------- + do ii = 1, nzv + if (iv(ii) .eq. i) goto 100 + enddo + nzv = nzv + 1 + v(nzv) = vecelt + iv(nzv) = i + goto 100 +110 continue + + return + end +c-------end of sprnvc----------------------------- + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + function icnvrt(x, ipwr2) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + double precision x + integer ipwr2, icnvrt + +c--------------------------------------------------------------------- +c scale a double precision number x in (0,1) by a power of 2 and chop it +c--------------------------------------------------------------------- + icnvrt = int(ipwr2 * x) + + return + end +c-------end of icnvrt----------------------------- + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + subroutine vecset(n, v, iv, nzv, i, val) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n, iv(*), nzv, i, k + double precision v(*), val + +c--------------------------------------------------------------------- +c set ith element of sparse vector (v, iv) with +c nzv nonzeros to val +c--------------------------------------------------------------------- + + logical set + + set = .false. + do k = 1, nzv + if (iv(k) .eq. i) then + v(k) = val + set = .true. + endif + enddo + if (.not. set) then + nzv = nzv + 1 + v(nzv) = val + iv(nzv) = i + endif + return + end +c-------end of vecset----------------------------- + + include 'print_results.f' + include 'timers.f' + include 'randdp.f' + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/globals.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/globals.h new file mode 100644 index 0000000..469ed32 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/globals.h @@ -0,0 +1,105 @@ + include 'npbparams.h' + +c--------------------------------------------------------------------- +c Note: please observe that in the routine conj_grad three +c implementations of the sparse matrix-vector multiply have +c been supplied. The default matrix-vector multiply is not +c loop unrolled. The alternate implementations are unrolled +c to a depth of 2 and unrolled to a depth of 8. Please +c experiment with these to find the fastest for your particular +c architecture. If reporting timing results, any of these three may +c be used without penalty. +c--------------------------------------------------------------------- + + +c--------------------------------------------------------------------- +c Class specific parameters: +c It appears here for reference only. +c These are their values, however, this info is imported in the npbparams.h +c include file, which is written by the sys/setparams.c program. +c--------------------------------------------------------------------- + +C---------- +C Class S: +C---------- +CC parameter( na=1400, +CC > nonzer=7, +CC > shift=10., +CC > niter=15, +CC > rcond=1.0d-1 ) +C---------- +C Class W: +C---------- +CC parameter( na=7000, +CC > nonzer=8, +CC > shift=12., +CC > niter=15, +CC > rcond=1.0d-1 ) +C---------- +C Class A: +C---------- +CC parameter( na=14000, +CC > nonzer=11, +CC > shift=20., +CC > niter=15, +CC > rcond=1.0d-1 ) +C---------- +C Class B: +C---------- +CC parameter( na=75000, +CC > nonzer=13, +CC > shift=60., +CC > niter=75, +CC > rcond=1.0d-1 ) +C---------- +C Class C: +C---------- +CC parameter( na=150000, +CC > nonzer=15, +CC > shift=110., +CC > niter=75, +CC > rcond=1.0d-1 ) +C---------- +C Class D: +C---------- +CC parameter( na=1500000, +CC > nonzer=21, +CC > shift=500., +CC > niter=100, +CC > rcond=1.0d-1 ) +C---------- +C Class E: +C---------- +CC parameter( na=9000000, +CC > nonzer=26, +CC > shift=1500., +CC > niter=100, +CC > rcond=1.0d-1 ) + + + integer nz, naz + parameter( nz = na*(nonzer+1)*(nonzer+1) ) + parameter( naz = na*(nonzer+1) ) + + + common / partit_size / naa, nzz, + > firstrow, + > lastrow, + > firstcol, + > lastcol + integer naa, nzz, + > firstrow, + > lastrow, + > firstcol, + > lastcol + + common /urando/ amult, tran + double precision amult, tran + + external timer_read + double precision timer_read + + integer T_init, T_bench, T_conj_grad, T_last + parameter (T_init=1, T_bench=2, T_conj_grad=3, T_last=3) + logical timeron + common /timers/ timeron diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/make.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/make.bat new file mode 100644 index 0000000..dcc4b71 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/make.bat @@ -0,0 +1,12 @@ +@echo off + +set CLASS=%1 +set OPT=%2 + +CALL ..\sys\setparams CG %CLASS% +CALL %F77% %OPT% cg 1>out_%CLASS%.txt 2>err_%CLASS%.txt +if exist cg.exe ( + copy cg.exe %BIN%\cg.%CLASS%.x.exe + del cg.exe +) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/print_results.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/print_results.f new file mode 100644 index 0000000..d2fe91e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/print_results.f @@ -0,0 +1,111 @@ + + subroutine print_results(name, class, n1, n2, n3, niter, + > t, mops, optype, verified, npbversion, + > compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + implicit none + character name*(*) + character class*1 + integer n1, n2, n3, niter, j + double precision t, mops + character optype*24, size*15 + logical verified + character*(*) npbversion, compiletime, + > cs1, cs2, cs3, cs4, cs5, cs6, cs7 + + write (*, 2) name + 2 format(//, ' ', A, ' Benchmark Completed.') + + write (*, 3) Class + 3 format(' Class = ', 12x, a12) + +c If this is not a grid-based problem (EP, FT, CG), then +c we only print n1, which contains some measure of the +c problem size. In that case, n2 and n3 are both zero. +c Otherwise, we print the grid size n1xn2xn3 + + if ((n2 .eq. 0) .and. (n3 .eq. 0)) then + if (name(1:2) .eq. 'EP') then + write(size, '(f15.0)' ) 2.d0**n1 + j = 15 + if (size(j:j) .eq. '.') then + size(j:j) = ' ' + j = j - 1 + endif + write (*,42) size(1:j) + 42 format(' Size = ',9x, a15) + else + write (*,44) n1 + 44 format(' Size = ',12x, i12) + endif + else + write (*, 4) n1,n2,n3 + 4 format(' Size = ',9x, i4,'x',i4,'x',i4) + endif + + write (*, 5) niter + 5 format(' Iterations = ', 12x, i12) + + write (*, 6) t + 6 format(' Time in seconds = ',12x, f12.2) + + write (*,9) mops + 9 format(' Mop/s total = ',12x, f12.2) + + write(*, 11) optype + 11 format(' Operation type = ', a24) + + if (verified) then + write(*,12) ' SUCCESSFUL' + else + write(*,12) 'UNSUCCESSFUL' + endif + 12 format(' Verification = ', 12x, a) + + write(*,13) npbversion + 13 format(' Version = ', 12x, a12) + + write(*,14) compiletime + 14 format(' Compile date = ', 12x, a12) + + + write (*,121) cs1 + 121 format(/, ' Compile options:', /, + > ' F77 = ', A) + + write (*,122) cs2 + 122 format(' FLINK = ', A) + + write (*,123) cs3 + 123 format(' F_LIB = ', A) + + write (*,124) cs4 + 124 format(' F_INC = ', A) + + write (*,125) cs5 + 125 format(' FFLAGS = ', A) + + write (*,126) cs6 + 126 format(' FLINKFLAGS = ', A) + + write(*, 127) cs7 + 127 format(' RAND = ', A) + + write (*,130) + 130 format(//' Please send all errors/feedbacks to:'// + > ' NPB Development Team'/ + > ' npb@nas.nasa.gov'//) +c 130 format(//' Please send the results of this run to:'// +c > ' NPB Development Team '/ +c > ' Internet: npb@nas.nasa.gov'/ +c > ' '/ +c > ' If email is not available, send this to:'// +c > ' MS T27A-1'/ +c > ' NASA Ames Research Center'/ +c > ' Moffett Field, CA 94035-1000'// +c > ' Fax: 650-604-3957'//) + + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/randdp.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/randdp.f new file mode 100644 index 0000000..64860d9 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/randdp.f @@ -0,0 +1,137 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function randlc (x, a) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c This routine returns a uniform pseudorandom double precision number in the +c range (0, 1) by using the linear congruential generator +c +c x_{k+1} = a x_k (mod 2^46) +c +c where 0 < x_k < 2^46 and 0 < a < 2^46. This scheme generates 2^44 numbers +c before repeating. The argument A is the same as 'a' in the above formula, +c and X is the same as x_0. A and X must be odd double precision integers +c in the range (1, 2^46). The returned value RANDLC is normalized to be +c between 0 and 1, i.e. RANDLC = 2^(-46) * x_1. X is updated to contain +c the new seed x_1, so that subsequent calls to RANDLC using the same +c arguments will generate a continuous sequence. +c +c This routine should produce the same results on any computer with at least +c 48 mantissa bits in double precision floating point data. On 64 bit +c systems, double precision should be disabled. +c +c David H. Bailey October 26, 1990 +c +c--------------------------------------------------------------------- + + implicit none + + double precision r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + randlc = r46 * x + + return + end + + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine vranlc (n, x, a, y) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c This routine generates N uniform pseudorandom double precision numbers in +c the range (0, 1) by using the linear congruential generator +c +c x_{k+1} = a x_k (mod 2^46) +c +c where 0 < x_k < 2^46 and 0 < a < 2^46. This scheme generates 2^44 numbers +c before repeating. The argument A is the same as 'a' in the above formula, +c and X is the same as x_0. A and X must be odd double precision integers +c in the range (1, 2^46). The N results are placed in Y and are normalized +c to be between 0 and 1. X is updated to contain the new seed, so that +c subsequent calls to VRANLC using the same arguments will generate a +c continuous sequence. If N is zero, only initialization is performed, and +c the variables X, A and Y are ignored. +c +c This routine is the standard version designed for scalar or RISC systems. +c However, it should produce the same results on any single processor +c computer with at least 48 mantissa bits in double precision floating point +c data. On 64 bit systems, double precision should be disabled. +c +c--------------------------------------------------------------------- + + implicit none + + integer i,n + double precision y,r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + dimension y(*) + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Generate N results. This loop is not vectorizable. +c--------------------------------------------------------------------- + do i = 1, n + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + y(i) = r46 * x + enddo + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/timers.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/timers.f new file mode 100644 index 0000000..83c1a7f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/CG/timers.f @@ -0,0 +1,108 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_clear(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + elapsed(n) = 0.0 + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_start(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + start(n) = elapsed_time() + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_stop(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + double precision t, now + now = elapsed_time() + t = now - start(n) + elapsed(n) = elapsed(n) + t + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function timer_read(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + timer_read = elapsed(n) + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function elapsed_time() + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + + double precision dvtime + +c This function must measure wall clock time, not CPU time. +c Since there is no portable timer in Fortran (77) +c we call a routine compiled in C (though the C source may have +c to be tweaked). +! call wtime(t) +c The following is not ok for "official" results because it reports +c CPU time not wall clock time. It may be useful for developing/testing +c on timeshared Crays, though. +c call second(t) + + elapsed_time = dvtime() + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/Makefile new file mode 100644 index 0000000..501480e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/Makefile @@ -0,0 +1,21 @@ +SHELL=/bin/sh +BENCHMARK=ep +BENCHMARKU=EP + +include ../config/make.def +include ../sys/make.common + +SOURCES = ep.fdv + +OBJS = ${SOURCES:.fdv=.o} + +${PROGRAM}: config $(OBJS) + ${FLINK} -o ${PROGRAM} ${OBJS} + +%.o: %.fdv npbparams.h + ${F77} ${FFLAGS} -c -o $@ $< + +clean: + rm -f npbparams.h + rm -f *.o *~ + rm -f *.cu *.cuf *.c *.f diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/ep.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/ep.fdv new file mode 100644 index 0000000..a10a417 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/ep.fdv @@ -0,0 +1,565 @@ +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 2.3 ! +! ! +! D V M V E R S I O N S ! +! ! +! E P ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is DVM version of the NPB EP code. ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 2.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 2.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/NAS/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! Send bug reports to npb-bugs@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (415) 604-3957 ! +! ! +!-------------------------------------------------------------------------! + + +c--------------------------------------------------------------------- +c +c Author: P. O. Frederickson +c D. H. Bailey +c A. C. Woo +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- + program epdv +c--------------------------------------------------------------------- +C +c This is the serial version of the APP Benchmark 1, +c the "embarassingly parallel" benchmark. +c +c +c M is the Log_2 of the number of complex pairs of uniform (0, 1) random +c numbers. MK is the Log_2 of the size of each batch of uniform random +c numbers. MK can be set for convenience on a given system, since it does +c not affect the results. + + implicit none + + include 'npbparams.h' + +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + + double precision y,r23,r46,t23,t46,a1,a2,z,ah + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc + + double precision Mops, epsilon, a, s, t1, t2, t3, t4, x, x1, + > x2, q, sx, sy, tm, an, tt, gc, dum(3), + > timer_read + integer mk, mm, nn, nk, nq, np, ierr, node, no_nodes, + > i, ik, kk, l, k, nit, ierrcode, no_large_nodes, + > np_add, k_offset, j + logical verified, timers_enabled + parameter (timers_enabled = .false.) + external timer_read + double precision qq, t1h, t2h, y1, y2, xh + character*13 size + + parameter (mk = 16, mm = m - mk, nn = 2 ** mm, + > nk = 2 ** mk, nq = 10, epsilon=1.d-8, + > a = 1220703125.d0, s = 271828183.d0) + +c common/storage/ x(2*nk), q(0:nq-1), qq(10000) + common/storage/ x(2*nk), q(0:9), qq(10000) + +!DVM$ TEMPLATE TEM(nn) +!DVM$ DISTRIBUTE TEM (BLOCK) + data dum /1.d0, 1.d0, 1.d0/ + + +c Because the size of the problem is too large to store in a 32-bit +c integer for some classes, we put it into a string (for printing). +c Have to strip off the decimal point put in there by the floating +c point print statement (internal file) + + write(*, 1000) + write(size, '(f12.0)' ) 2.d0**(m+1) + do j =13,1,-1 + if (size(j:j) .eq. '.') size(j:j) = ' ' + end do + write (*,1001) size + + 1000 format(//,' NAS Parallel Benchmarks 3.3 - DVMH version', + > ' - EP Benchmark', /) + 1001 format(' Number of random numbers generated: ', a14) + 1003 format(' Number of active processes: ', i12, /) + + verified = .false. + +c Compute the number of "batches" of random number pairs generated +c per processor. Adjust if the number of processors does not evenly +c divide the total number + + np = nn + + +c Call the random number generator functions and initialize +c the x-array to reduce the effects of paging on the timings. +c Also, call all mathematical functions that are used. Make +c sure these initializations cannot be eliminated as dead code. + + call vranlc(0, dum(1), dum(2), dum(3)) + call randlc(dum(2), dum(3), dum(1)) + do 5 i = 1, 2*nk + x(i) = -1.d99 + 5 continue + Mops = log(sqrt(abs(max(1.d0,1.d0)))) + + + call timer_clear(1) + call timer_clear(2) + call timer_clear(3) + call timer_start(1) +!DVM$ INTERVAL 1 + call vranlc(0, t1, a, x) + +c Compute AN = A ^ (2 * NK) (mod 2^46). + + t1 = a + + do 100 i = 1, mk + 1 + call randlc(t1, t1, t2) + 100 continue + + an = t1 + tt = s + gc = 0.d0 + sx = 0.d0 + sy = 0.d0 + + do 110 i = 0, nq - 1 + q(i) = 0.d0 + 110 continue + +c Each instance of this loop may be performed independently. We compute +c the k offsets separately to take into account the fact that some nodes +c have more numbers to generate than others + + k_offset = -1 + +!DVM$ region +!DVM$ PARALLEL (k) ON TEM(k),REDUCTION(SUM(q),SUM(sx),SUM(sy)) +!DVM$*,private(xh,i,kk,ik,t1,t2,y1,y2,a1,a2,x1,x2 +!DVM$*,l,t3,t4),cuda_block(256) + do k = 1, np + kk = k_offset + k + t1 = s + t2 = an + +c Find starting seed t1 for this kk. + do i = 1, 100 + ik = kk / 2 + if (2 * ik .ne. kk) then + call randlc(t1, t2, t3) + endif + if (ik .eq. 0) exit + call randlc(t2, t2, t3) + kk = ik + enddo + + + xh = t1 + a1 = int (r23 * a) + a2 = a - t23 * a1 + + do i = 1, nk + call randNext (xh, y1, a1, a2) + call randNext (xh, y2, a1, a2) + + x1 = 2.d0 * y1 - 1.d0 + x2 = 2.d0 * y2 - 1.d0 + t1 = x1 * x1 + x2 * x2 + if (t1 .le. 1.d0) then + t2 = sqrt(-2.d0 * log(t1) / t1) + t3 = (x1 * t2) + t4 = (x2 * t2) + l = max(abs(t3), abs(t4)) + q(l) = q(l) + 1.d0 + sx = sx + t3 + sy = sy + t4 + endif + enddo + enddo +!DVM$ end region + + do 160 i = 0, nq - 1 + gc = gc + q(i) + 160 continue +!DVM$ END INTERVAL + call timer_stop(1) + tm = timer_read(1) + + nit=0 + if (m.eq.24) then + if((abs((sx- (-3.247834652034740D3))/sx).le.epsilon).and. + > (abs((sy- (-6.958407078382297D3))/sy).le.epsilon)) + > verified = .TRUE. + elseif (m.eq.25) then + if ((abs((sx- (-2.863319731645753D+03))/sx).le.epsilon).and. + > (abs((sy- (-6.320053679109499D+03))/sy).le.epsilon)) + > verified = .TRUE. + elseif (m.eq.28) then + if ((abs((sx- (-4.295875165629892D3))/sx).le.epsilon).and. + > (abs((sy- (-1.580732573678431D4))/sy).le.epsilon)) + > verified = .TRUE. + elseif (m.eq.30) then + if ((abs((sx- (4.033815542441498D4))/sx).le.epsilon).and. + > (abs((sy- (-2.660669192809235D4))/sy).le.epsilon)) + > verified = .true. + elseif (m.eq.32) then + if ((abs((sx- (4.764367927995374D+4))/sx).le.epsilon).and. + > (abs((sy- (-8.084072988043731D+4))/sy).le.epsilon)) + > verified = .true. + elseif (m.eq.36) then + if ((abs((sx- (1.982481200946593D+5))/sx).le.epsilon).and. + > (abs((sy- (-1.020596636361769D+5))/sy).le.epsilon)) + > verified = .true. + elseif (m.eq.40) then + if ((abs((sx- (-5.319717441530D+05))/sx).le.epsilon).and. + > (abs((sy- (-3.688834557731D+05))/sy).le.epsilon)) + > verified = .true. + else + verified = .false. + endif + Mops = 2.d0**(m+1)/tm/1000000.d0 + + write (6,11) tm, m, gc, sx, sy, (i, q(i), i = 0, nq - 1) + 11 format (' EP Benchmark Results:'//' CPU Time =',f10.4/' N = 2^', + > i5/' No. Gaussian Pairs =',f15.0/' Sums = ',1p,2d25.15/ + > ' Counts:'/(i3,0p,f15.0)) + + call print_results('EP', class, m+1, 0, 0, nit, + > tm, Mops, + > 'Random numbers generated', + > verified, npbversion) + + + if (timers_enabled) then + print *, 'Total time: ', timer_read(1) + print *, 'Gaussian pairs: ', timer_read(2) + print *, 'Random numbers: ', timer_read(3) + endif + + + end + + subroutine print_results(name, class, n1, n2, n3, niter, + > t, mops, optype, verified, npbversion) + + implicit none + character*2 name + character*1 class + integer n1, n2, n3, niter, j + double precision t, mops + character optype*24, size*13 + logical verified + character*(*) npbversion + + write (*, 2) name + 2 format(//, ' ', A2, ' Benchmark Completed.') + + write (*, 3) Class + 3 format(' Class = ', 12x, a12) + +c If this is not a grid-based problem (EP, FT, CG), then +c we only print n1, which contains some measure of the +c problem size. In that case, n2 and n3 are both zero. +c Otherwise, we print the grid size n1xn2xn3 + + if ((n2 .eq. 0) .and. (n3 .eq. 0)) then + if (name(1:2) .eq. 'EP') then + write(size, '(f12.0)' ) 2.d0**n1 + do j =13,1,-1 + if (size(j:j) .eq. '.') size(j:j) = ' ' + end do + write (*,42) size + 42 format(' Size = ',12x, a14) + else + write (*,44) n1 + 44 format(' Size = ',12x, i12) + endif + else + write (*, 4) n1,n2,n3 + 4 format(' Size = ',12x, i3,'x',i3,'x',i3) + endif + + write (*, 5) niter + 5 format(' Iterations = ', 12x, i12) + + write (*, 6) t + 6 format(' Time in seconds = ',12x, f12.2) + + write (*,9) mops + 9 format(' Mop/s total = ',12x, f12.2) + + write(*, 11) optype + 11 format(' Operation type = ', a24) + + if (verified) then + write(*,12) ' SUCCESSFUL' + else + write(*,12) 'UNSUCCESSFUL' + endif + 12 format(' Verification = ', 12x, a) + + write(*,13) npbversion + 13 format(' Version = ', 12x, a12) + + write (*,130) + 130 format(//' Please send the results of this run to:'// + > ' NPB Development Team '/ + > ' Internet: npb@nas.nasa.gov'/ + > ' '/ + > ' If email is not available, send this to:'// + > ' MS T27A-1'/ + > ' NASA Ames Research Center'/ + > ' Moffett Field, CA 94035-1000'// + > ' Fax: 415-604-3957'//) + + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + pure subroutine randlc (x, a, ret) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + implicit none + intent(in)::a + intent(inout)::x + intent(out)::ret + double precision r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + > ,ret + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + ret = r46 * x + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + pure subroutine randNext (x, ret, a1, a2) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + implicit none + intent(inout)::x + intent(in)::a1, a2 + intent(out)::ret + double precision r23,r46,t23,t46,x,t1,t2,t3,t4,a1,a2,x1,x2,z + > ,ret + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + ret = r46 * x + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine vranlc (n, x, a, y) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + + integer i,n + double precision y,r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + dimension y(*) + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Generate N results. This loop is not vectorizable. +c--------------------------------------------------------------------- + do i = 1, n + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + y(i) = r46 * x + enddo + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_clear(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + elapsed(n) = 0.0 + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_start(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed +!DVM$ BARRIER + start(n) = elapsed_time() + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_stop(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + double precision t, now + now = elapsed_time() + t = now - start(n) + elapsed(n) = elapsed(n) + t + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function timer_read(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + timer_read = elapsed(n) + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function elapsed_time() + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + implicit none + double precision t + double precision dvtime + data t/0.d0/ + elapsed_time = dvtime() + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/make.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/make.bat new file mode 100644 index 0000000..768cdf6 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/EP/make.bat @@ -0,0 +1,12 @@ +@echo off + +set CLASS=%1 +set OPT=%2 + +CALL ..\sys\setparams EP %CLASS% +CALL %F77% %OPT% ep 1>out_%CLASS%.txt 2>err_%CLASS%.txt +if exist ep.exe ( + copy ep.exe %BIN%\ep.%CLASS%.x.exe + del ep.exe +) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/Makefile new file mode 100644 index 0000000..70f9808 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/Makefile @@ -0,0 +1,21 @@ +SHELL=/bin/sh +BENCHMARK=ft +BENCHMARKU=FT + +include ../config/make.def +include ../sys/make.common + +SOURCES = ft.fdv + +OBJS = ${SOURCES:.fdv=.o} + +${PROGRAM}: config $(OBJS) + ${FLINK} -o ${PROGRAM} ${OBJS} + +%.o: %.fdv npbparams.h global.h + ${F77} ${FFLAGS} -f90 -c -o $@ $< + +clean: + rm -f npbparams.h + rm -f *.o *~ + rm -f *.cu *.cuf *.c *.f diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/dtime.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/dtime.h new file mode 100644 index 0000000..74fee83 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/dtime.h @@ -0,0 +1,3 @@ + integer dvm_debug + parameter (dvm_debug=0) + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/ft.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/ft.fdv new file mode 100644 index 0000000..bbe6e95 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/ft.fdv @@ -0,0 +1,1838 @@ +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! O p e n M P ->DVMH V E R S I O N ! +! ! +! F T ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is an OpenMP version of the NPB FT code. ! +! It is described in NAS Technical Report 99-011. ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 3.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 3.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/Software/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (650) 604-3957 ! +! ! +!-------------------------------------------------------------------------! + +!--------------------------------------------------------------------- +! +! Authors: D. Bailey +! W. Saphir +! H. Jin +! +!--------------------------------------------------------------------- +! OpenMP ->DVMH version Mihail Kuznetsov +!--------------------------------------------------------------------- + + + + +program ft + implicit none + include 'global.h' + + integer i, iter, niter + + double precision total_time, mflops + logical verified + character class + + + double complex sums(niter_default) + + call info(niter) + + do i = 1, t_max + call timer_clear(i) + end do + + if(more_memory) then + call init_ui + else + call init_ui_1 + endif + + + if (timers_enabled) call timer_start(T_total) + + + if (timers_enabled) call timer_start(T_setup) + + + call setup + + if(more_memory) call init_twiddle + call init_scratch + + + + if (timers_enabled) call timer_stop(T_setup) + + +! if (timers_enabled) call timer_start(T_fft) + call fft_p +! if (timers_enabled) call timer_stop(T_fft) + + + +!-----------------------------------------------------------------------> + do iter = 1, niter + + call timer_start(T_fft) + if (more_memory) then + call evolve_and_fft_n + else + call evolve_and_fft_n_1 + endif + call timer_stop(T_fft) + + if (timers_enabled) call timer_start(T_checksum) + call checksum(iter,sums) + if (timers_enabled) call timer_stop(T_checksum) + + end do +!-----------------------------------------------------------------------------------> + + + + + call verify(niter, verified, class,sums) + + call timer_stop(t_total) + total_time = timer_read(T_fft) + + if( total_time .ne. 0. ) then + mflops = 1.0d-6*float(ntotal)* (14.8157+7.19641*log(float(ntotal))+(5.23518+7.21113*log(float(ntotal)))*niter)/total_time + else + mflops = 0.0 + endif + + call print_results('FT', class, nx, ny, nz, niter,total_time, mflops, ' floating point', verified, npbversion, compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + if (timers_enabled) call print_timers() + +end + +!--------------------------------------------------------------------------------------------------> +subroutine timer_clear(n) + implicit none + integer n + + double precision start(64), elapsed(64) + common /tt/ start, elapsed + elapsed(n) = 0.0 + return +end + + +subroutine timer_start(n) + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + start(n) = elapsed_time() + + return +end + +subroutine timer_stop(n) + + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + double precision t, now + now = elapsed_time() + t = now - start(n) + elapsed(n) = elapsed(n) + t + + return +end + +double precision function timer_read(n) + + implicit none + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + + timer_read = elapsed(n) + return +end + + +double precision function elapsed_time() + implicit none + double precision t + double precision dvtime + + include 'dtime.h' + data t/0.d0/ + if(dvm_debug.ne.0) then + t=t+1.D0 + elapsed_time = t + else + elapsed_time = dvtime() + end if + return +end + + +!-------------------------------------------------------------------------------------> + + + + + +subroutine init_twiddle + implicit none + include 'global.h' + + integer i, j, k, kk, kk2, jj, kj2, ii + double precision ap + + ap = - 4.d0 * alpha * pi *pi + + + +!dvm$ region +!dvm$ parallel (k,j,i) on twiddle(i,j,k), private(kk, kk2, jj, kj2, ii) + do k = 1, nz + do j = 1, ny + do i = 1, nx + + kk = mod(k-1+nz/2, nz) - nz/2 + kk2 = kk*kk + + jj = mod(j-1+ny/2, ny) - ny/2 + kj2 = jj*jj+kk2 + + ii = mod(i-1+nx/2, nx) - nx/2 + twiddle(i,j,k) = dexp(ap*dble(ii*ii+kj2)) + end do + end do + enddo + +!dvm$ end region +! dvm$ get_actual(twiddle) + + + +end + + +subroutine init_scratch + + implicit none + include 'global.h' + + integer i, j,m,ku,ln + double precision t, ti + + m = ilog2(nx) + + + u(1) = m + + + ku = 2 + ln = 1 + + + do j = 1, m + t = pi / ln + +!dvm$ region +!dvm$ parallel (i) on u(i+ku), private (ti), cuda_block(256) + + do i = 0, ln - 1 + ti = i * t + u(i+ku) = dcmplx (cos (ti), sin(ti)) + enddo + +!dvm$ end region +! dvm$ get_actual(u) + ku = ku + ln + ln = 2 * ln + enddo + + + +end + + +!-------------------------------------------------------------------------------------> + +subroutine init_ui + + implicit none + + include 'global.h' + + integer i, j, k + + + do k = 1, nz + do j = 1, ny + do i = 1, nxp + u0(i,j,k) = 0.d0 + u1(i,j,k) = 0.d0 + twiddle(i,j,k) = 0.d0 + end do + end do + end do + + + return +end + +!-------------------------------------------------------------------------------------> + +subroutine init_ui_1 + + implicit none + + include 'global.h' + + integer i, j, k + + + do k = 1, nz + do j = 1, ny + do i = 1, nxp + u0(i,j,k) = 0.d0 + u1(i,j,k) = 0.d0 + end do + end do + end do + + + return +end + + + +subroutine setup + implicit none + include 'global.h' + + + integer j, k + double precision start, an, dummy + + double precision starts_k + + start = seed + + call ipow46(a, 0, an) + dummy = randlc(start, an) + call ipow46(a, 2*nx*ny, an) + + + do k = 1, nz + + starts_k = start + if (k .ge.2 ) dummy = randlc(start, an) + starts_k = start + + do j = 1, ny + call vranlc(2*nx, starts_k, a, u1(1, j, k)) + end do + + + end do + + + return +end +!-----------------------------------------------------------> + + + + + + + +subroutine ipow46(a, exponent, result) +!--------------------------------------------------------------------- +! compute a^exponent mod 2^46 +!--------------------------------------------------------------------- + + implicit none + double precision a, result, dummy, q, r + integer exponent, n, n2 + external randlc + double precision randlc +!--------------------------------------------------------------------- +! Use +! a^n = a^(n/2)*a^(n/2) if n even else +! a^n = a*a^(n-1) if n odd +!--------------------------------------------------------------------- + result = 1 + if (exponent .eq. 0) return + q = a + r = 1 + n = exponent + + do while (n .gt. 1) + n2 = n/2 + if (n2 * 2 .eq. n) then + dummy = randlc(q, q) + n = n2 + else + dummy = randlc(r, q) + n = n-1 + endif + end do + dummy = randlc(r, q) + result = r + return +end + + + + +subroutine info(niter) + implicit none + include 'global.h' + + integer niter + + write(*, 1000) + niter = niter_default + write(*, 1001) nx, ny, nz + write(*, 1002) niter + write(*, *) + +1000 format(//,' NAS Parallel Benchmarks 3.3- DVMH version - FT Benchmark', /) +1001 format(' Size : ', i4, 'x', i4, 'x', i4) +1002 format(' Iterations :', i7) + + + return +end + +subroutine print_timers() + + implicit none + include 'global.h' + + integer i + double precision t, t_m + character*25 tstrings(T_max) + data tstrings / 'total ', 'setup' , 'evolve+fft', 'checksum ', 'all' / + + t_m = timer_read(T_total) + if (t_m .le. 0.0d0) t_m = 1.0d0 + do i = 1, T_max + t = timer_read(i) + write(*, 100) i, tstrings(i), t, t*100.0/t_m + end do +100 format(' timer ', i2, '(', A16, ') :', F9.4, ' (',F6.2,'%)') + return +end + + +! fast fourier transform (positive direction) +subroutine fft_p + implicit none + include 'global.h' + + +!-------cffts1 variables------------------------------------------------------------------ + double complex uu1,x11,x21 + integer logd1 + integer i, j, k, jj, ic,jc ,kc,l,n1,n2,n3,li,lj,lk,ku,i11,i12,i21,i22 +!-------cffts2 variables------------------------------------------------------------------ + integer ii + integer logd2 +!------cffts3 variables------------------------------------------------------------------- + integer logd3 +!-------------------------------------------------------------------------- +!if0 + logd1 = ilog2(nx) + logd2 = ilog2(ny) + logd3 = ilog2(nz) + + n1 = nx / 2 + n2 = ny / 2 + n3 = nz / 2 + + + + +!dvm$ region + +!dvm$ parallel (k,j) on u1(*,j,k), private (y1,y2,i,jj,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(32,1) + + +! fftx + do k = 1, nz + do j = 1, ny +!--------------------------------------------------------------------------------> + + do i = 1, nx + y1(i) = u1(i,j,k) + enddo + + + do l = 1, logd1, 2 + + lk = 2 ** (l - 1) + li = 2 ** (logd1 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n1 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = u(ku+i) + + + do kc = 0, lk - 1 + + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + + enddo + + enddo + + if (l .eq. logd1) then + + do jj = 1, nx + y1(jj) = y2(jj) + enddo + + else + + lk = 2 ** (l) + li = 2 ** (logd1 - l-1) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n1 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = u(ku+i) + + + do kc = 0, lk - 1 + + x11 = y2(i11+kc) + x21 = y2(i12+kc) + + y1(i21+kc) = x11 + x21 + y1(i22+kc) = uu1 * (x11 - x21) + enddo + + enddo + + endif + + enddo + + + do i = 1, nx + u1(i,j,k) = y1(i) + enddo +!---------------------------------------------------------------------------> + + + enddo + enddo + + +! ffty + +!dvm$ parallel (k,ii) on u1(ii,*,k), private (y1,y2,i,j,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(32,1) + do k = 1, nz + do ii = 1, nx +!-------------------------------------------------------------------------------> + + do j = 1, ny + y1(j) = u1(ii,j,k) + enddo + + + do l = 1, logd2, 2 + lk = 2 ** (l - 1) + li = 2 ** (logd2 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n2 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = u(ku+i) + + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + + enddo + enddo + + if (l .eq. logd2) then + + do j = 1, ny + y1(j) = y2(j) + enddo + + else + + lk = 2 ** (l) + li = 2 ** (logd2 - l-1) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n2 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = u(ku+i) + + + do kc = 0, lk - 1 + x11 = y2(i11+kc) + x21 = y2(i12+kc) + + y1(i21+kc) = x11 + x21 + y1(i22+kc) = uu1 * (x11 - x21) + enddo + + + enddo + + + endif + + enddo + + + do j = 1, ny + u1(ii,j,k) = y1(j) + enddo + +!-------------------------------------------------------------------------------> + enddo + enddo + + + +! fftz + +!dvm$ parallel (j,ii) on u1(ii,j,*), private (y1,y2,i,k,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(32,1) + + do j = 1, ny + do ii = 1, nx +!----------------------------------------------------------------------------------> + + + do k = 1, nz + y1(k) = u1(ii,j,k) + enddo + + + + do l = 1, logd3, 2 + + lk = 2 ** (l - 1) + li = 2 ** (logd3 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n3 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = u(ku+i) + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + + enddo + enddo + + + if (l .eq. logd3) then + + do k = 1, nz + y1(k) = y2(k) + enddo + else + + + lk = 2 ** (l) + li = 2 ** (logd3 - l-1) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n3 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = u(ku+i) + + + do kc = 0, lk - 1 + x11 = y2(i11+kc) + x21 = y2(i12+kc) + + y1(i21+kc) = x11 + x21 + y1(i22+kc) = uu1 * (x11 - x21) + + enddo + enddo + endif + + enddo + + + do k = 1, nz + u0(ii,j,k) = y1(k) + enddo + +!----------------------------------------------------------------------------------> + enddo + enddo + +!dvm$ end region +! dvm$ get_actual(u0) + + + return +end + + +!-----------------------------------------------------------------> + + + +! evolde and fast fourier transform (negative direction) +subroutine evolve_and_fft_n + implicit none + include 'global.h' + +!------cfft s1 variables-------------------------------------------------------------- + double complex uu1,x11,x21 + integer logd1 + integer i, j, k, jj, ic,jc ,kc,l,n1,n2,n3,li,lj,lk,ku,i11,i12,i21,i22 + integer CB_x, CB_y +!------------------------------------------------------------------------------------- + +!------cfft2 variables------------------------------------------------------------------------------ + integer ii + integer logd2 +!-------------cfft3 variables----------------- + integer logd3 +!-cfft3--------------------------------- + n1 = nz / 2 + n2 = ny / 2 + n3 = nx / 2 + + logd1 = ilog2(nx) + logd2 = ilog2(ny) + logd3 = ilog2(nz) + CB_x = 256 + CB_y = 1 +!dvm$ region + + !evolve +!dvm$ parallel (k,j,i) on u0(i,j,k),cuda_block(256) + do k = 1, nz + do j = 1, ny + do i = 1, nx + u0(i,j,k) = u0(i,j,k) * twiddle(i,j,k) + u1(i,j,k) = u0(i,j,k) + end do + end do + end do + +! fftz + + +!dvm$ parallel (j,ii) on u1(ii,j,*), private (y1,y2,i,k,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(CB_x, CB_y) + + do j = 1, ny + do ii = 1, nx + +!-------------------------------------------------------------------> + + do k = 1, nz + y1(k) = u1(ii,j,k) + enddo + + + do l = 1, logd3, 2 + + + lk = 2 ** (l - 1) + li = 2 ** (logd3 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n1 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + enddo + enddo + + + if (l .eq. logd3) then + do k = 1, nz + y1(k) = y2(k) + enddo + else + + lk = 2 ** (l) + li = 2 ** (logd3 - l-1) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n1 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + do k = 0, lk - 1 + x11 = y2(i11+k) + x21 = y2(i12+k) + + y1(i21+k) = x11 + x21 + y1(i22+k) = uu1 * (x11 - x21) + + enddo + enddo + endif + + enddo + + do k = 1, nz + u1(ii,j,k) = y1(k) + enddo + +!-------------------------------------------------------------------> + + enddo + enddo + +! ffty + +!dvm$ parallel (k,ii) on u1(ii,*,k), private (y1,y2,i,j,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(CB_x, CB_y) + + do k = 1, nz + do ii = 1, nx +!-------------------------------------------------------------------------> + + + do j = 1, ny + y1(j) = u1(ii,j,k) + enddo + + + do l = 1, logd2, 2 + + lk = 2 ** (l - 1) + li = 2 ** (logd2 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n2 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + enddo + enddo + + + if (l .eq. logd2) then + + + do j = 1, ny + y1(j) = y2(j) + enddo + + else + + lk = 2 ** (l) + li = 2 ** (logd2 - l-1) + lj = 2 * lk + ku = li + 1 + + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n2 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y2(i11+kc) + x21 = y2(i12+kc) + + y1(i21+kc) = x11 + x21 + y1(i22+kc) = uu1 * (x11 - x21) + enddo + + + enddo + + + endif + + enddo + + + do j = 1, ny + u1(ii,j,k) = y1(j) + enddo + +!-------------------------------------------------------------------> + enddo + enddo + + + +! fftx + + + +!dvm$ parallel (k,j) on u1(*,j,k),private (y1,y2,i,jj,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(CB_x, CB_y) + + + do k = 1, nz + do j = 1, ny +!-----------------------------------------------------> + + + do i = 1, nx + y1(i) = u1(i,j,k) + enddo + + + do l = 1, logd1, 2 + + + lk = 2 ** (l - 1) + li = 2 ** (logd1 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n3 + i21 = i * lj + 1 + i22 = i21 + lk + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + enddo + + enddo + + if (l .eq. logd1) then + + + do jj = 1, nx + y1(jj) = y2(jj) + enddo + else + + lk = 2 ** (l) + li = 2 ** (logd1 - l-1) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n3 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + do kc = 0, lk - 1 + + x11 = y2(i11+kc) + x21 = y2(i12+kc) + + y1(i21+kc) = x11 + x21 + y1(i22+kc) = uu1 * (x11 - x21) + + enddo + enddo + + endif + + enddo + + + do i = 1, nx + u1(i,j,k) = y1(i) + enddo + +!--------------------------------------------------------------> + enddo + enddo + +!dvm$ end region +! dvm$ get_actual(u1) + + return +end + + +! evolde and fast fourier transform (negative direction) +subroutine evolve_and_fft_n_1 + implicit none + include 'global.h' + +!------cfft s1 variables-------------------------------------------------------------- + double complex uu1,x11,x21 + double precision ap + integer logd1 + integer i, j, k, jj, ic,jc ,kc,l,n1,n2,n3,li,lj,lk,ku,i11,i12,i21,i22, kk, kk2, kj2 + integer CB_x, CB_y +!------------------------------------------------------------------------------------- + +!------cfft2 variables------------------------------------------------------------------------------ + integer ii + integer logd2 +!-------------cfft3 variables----------------- + integer logd3 +!-cfft3--------------------------------- + n1 = nz / 2 + n2 = ny / 2 + n3 = nx / 2 + + logd1 = ilog2(nx) + logd2 = ilog2(ny) + logd3 = ilog2(nz) + CB_x = 256 + CB_y = 1 + ap = - 4.d0 * alpha * pi *pi +!dvm$ region + + !evolve +!dvm$ parallel (k,j,i) on u0(i,j,k),private(kk, jj, ii, kk2, kj2), cuda_block(256) + do k = 1, nz + do j = 1, ny + do i = 1, nx + + kk = mod(k-1+nz/2, nz) - nz/2 + kk2 = kk*kk + + jj = mod(j-1+ny/2, ny) - ny/2 + kj2 = jj*jj+kk2 + + ii = mod(i-1+nx/2, nx) - nx/2 + + u0(i,j,k) = u0(i,j,k) * dexp(ap*dble(ii*ii+kj2)) + u1(i,j,k) = u0(i,j,k) + end do + end do + end do + +! fftz + + +!dvm$ parallel (j,ii) on u1(ii,j,*), private (y1,y2,i,k,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(CB_x, CB_y) + + do j = 1, ny + do ii = 1, nx + +!-------------------------------------------------------------------> + + do k = 1, nz + y1(k) = u1(ii,j,k) + enddo + + + do l = 1, logd3, 2 + + + lk = 2 ** (l - 1) + li = 2 ** (logd3 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n1 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + enddo + enddo + + + if (l .eq. logd3) then + + + do k = 1, nz + y1(k) = y2(k) + enddo + else + + lk = 2 ** (l) + li = 2 ** (logd3 - l-1) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n1 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + do k = 0, lk - 1 + x11 = y2(i11+k) + x21 = y2(i12+k) + + y1(i21+k) = x11 + x21 + y1(i22+k) = uu1 * (x11 - x21) + + enddo + enddo + endif + + enddo + + do k = 1, nz + u1(ii,j,k) = y1(k) + enddo + +!-------------------------------------------------------------------> + + enddo + enddo + +! ffty + +!dvm$ parallel (k,ii) on u1(ii,*,k), private (y1,y2,i,j,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(CB_x, CB_y) + + do k = 1, nz + do ii = 1, nx +!-------------------------------------------------------------------------> + + + do j = 1, ny + y1(j) = u1(ii,j,k) + enddo + + + do l = 1, logd2, 2 + + lk = 2 ** (l - 1) + li = 2 ** (logd2 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n2 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + enddo + enddo + + + if (l .eq. logd2) then + + + do j = 1, ny + y1(j) = y2(j) + enddo + + else + + lk = 2 ** (l) + li = 2 ** (logd2 - l-1) + lj = 2 * lk + ku = li + 1 + + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n2 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y2(i11+kc) + x21 = y2(i12+kc) + + y1(i21+kc) = x11 + x21 + y1(i22+kc) = uu1 * (x11 - x21) + enddo + + + enddo + + + endif + + enddo + + + do j = 1, ny + u1(ii,j,k) = y1(j) + enddo + +!-------------------------------------------------------------------> + enddo + enddo + + + +! fftx + + + +!dvm$ parallel (k,j) on u1(*,j,k),private (y1,y2,i,jj,kc,l,li,lj,lk,ku,i11,i12,i21,i22,uu1,x11,x21), cuda_block(CB_x, CB_y) + + + do k = 1, nz + do j = 1, ny +!-----------------------------------------------------> + + + do i = 1, nx + y1(i) = u1(i,j,k) + enddo + + + do l = 1, logd1, 2 + + + lk = 2 ** (l - 1) + li = 2 ** (logd1 - l) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n3 + i21 = i * lj + 1 + i22 = i21 + lk + uu1 = dconjg (u(ku+i)) + + + + do kc = 0, lk - 1 + x11 = y1(i11+kc) + x21 = y1(i12+kc) + + y2(i21+kc) = x11 + x21 + y2(i22+kc) = uu1 * (x11 - x21) + enddo + + enddo + + if (l .eq. logd1) then + + + do jj = 1, nx + y1(jj) = y2(jj) + enddo + else + + lk = 2 ** (l) + li = 2 ** (logd1 - l-1) + lj = 2 * lk + ku = li + 1 + + + do i = 0, li - 1 + i11 = i * lk + 1 + i12 = i11 + n3 + i21 = i * lj + 1 + i22 = i21 + lk + + uu1 = dconjg (u(ku+i)) + + + do kc = 0, lk - 1 + + x11 = y2(i11+kc) + x21 = y2(i12+kc) + + y1(i21+kc) = x11 + x21 + y1(i22+kc) = uu1 * (x11 - x21) + + enddo + enddo + + endif + + enddo + + + do i = 1, nx + u1(i,j,k) = y1(i) + enddo + +!--------------------------------------------------------------> + enddo + enddo + +!dvm$ end region +! dvm$ get_actual(u1) + + return +end + +integer function ilog2(n) + implicit none + integer n, nn, lg + if (n .eq. 1) then + ilog2=0 + return + endif + + lg = 1 + nn = 2 + do while (nn .lt. n) + nn = nn*2 + lg = lg+1 + end do + ilog2 = lg + return +end + +subroutine checksum(i,sums) + implicit none + include 'global.h' + + + + double complex sums(niter_default) + + integer i,j, q,r,s + double complex chk + chk = (0.0,0.0) + + + + +!dvm$ region + +!dvm$ parallel (s) ON u1(s,*,*), reduction (sum(chk)),private(q,j,r) + + + do s = 1, nz + + + do j=1,1024 + if ( s .eq. mod(5*j,nz)+1 ) then + q = mod(j, nx)+1 + r = mod(3*j,ny)+1 + + + chk=chk+u1(q,r,s) + endif + end do + enddo + + +!dvm$ end region + + + + chk = chk/dble(ntotal) + + write (*, 30) i, chk +30 format (' T =',I5,5X,'Checksum =',1P2D22.12) + sums(i) = chk + return +end + + +subroutine verify (nt, verified, class,sums) + implicit none + include 'global.h' + integer nt + character class + logical verified + integer i + double precision err, epsilon + + double complex sums(niter_default) +!--------------------------------------------------------------------- +! Reference checksums +!--------------------------------------------------------------------- + double complex csum_ref(25) + class = 'U' + epsilon = 1.0d-12 + verified = .FALSE. + + if (nx .eq. 64 .and. ny .eq. 64 .and. nz .eq. 64 .and. nt .eq. 6) then +!--------------------------------------------------------------------- +! Sample size reference checksums +!--------------------------------------------------------------------- + class = 'S' + csum_ref(1) = dcmplx(5.546087004964D+02, 4.845363331978D+02) + csum_ref(2) = dcmplx(5.546385409189D+02, 4.865304269511D+02) + csum_ref(3) = dcmplx(5.546148406171D+02, 4.883910722336D+02) + csum_ref(4) = dcmplx(5.545423607415D+02, 4.901273169046D+02) + csum_ref(5) = dcmplx(5.544255039624D+02, 4.917475857993D+02) + csum_ref(6) = dcmplx(5.542683411902D+02, 4.932597244941D+02) + else if (nx .eq. 128 .and. ny .eq. 128 .and. nz .eq. 32 .and. nt .eq. 6) then +!--------------------------------------------------------------------- +! Class W size reference checksums +!--------------------------------------------------------------------- + class = 'W' + csum_ref(1) = dcmplx(5.673612178944D+02, 5.293246849175D+02) + csum_ref(2) = dcmplx(5.631436885271D+02, 5.282149986629D+02) + csum_ref(3) = dcmplx(5.594024089970D+02, 5.270996558037D+02) + csum_ref(4) = dcmplx(5.560698047020D+02, 5.260027904925D+02) + csum_ref(5) = dcmplx(5.530898991250D+02, 5.249400845633D+02) + csum_ref(6) = dcmplx(5.504159734538D+02, 5.239212247086D+02) + else if (nx .eq. 256 .and. ny .eq. 256 .and. nz .eq. 128 .and. nt .eq. 6) then +!--------------------------------------------------------------------- +! Class A size reference checksums +!--------------------------------------------------------------------- + class = 'A' + csum_ref(1) = dcmplx(5.046735008193D+02, 5.114047905510D+02) + csum_ref(2) = dcmplx(5.059412319734D+02, 5.098809666433D+02) + csum_ref(3) = dcmplx(5.069376896287D+02, 5.098144042213D+02) + csum_ref(4) = dcmplx(5.077892868474D+02, 5.101336130759D+02) + csum_ref(5) = dcmplx(5.085233095391D+02, 5.104914655194D+02) + csum_ref(6) = dcmplx(5.091487099959D+02, 5.107917842803D+02) + + else if (nx .eq. 512 .and. ny .eq. 256 .and. nz .eq. 256 .and. nt .eq. 20) then +!--------------------------------------------------------------------- +! Class B size reference checksums +!--------------------------------------------------------------------- + class = 'B' + csum_ref(1) = dcmplx(5.177643571579D+02, 5.077803458597D+02) + csum_ref(2) = dcmplx(5.154521291263D+02, 5.088249431599D+02) + csum_ref(3) = dcmplx(5.146409228649D+02, 5.096208912659D+02) + csum_ref(4) = dcmplx(5.142378756213D+02, 5.101023387619D+02) + csum_ref(5) = dcmplx(5.139626667737D+02, 5.103976610617D+02) + csum_ref(6) = dcmplx(5.137423460082D+02, 5.105948019802D+02) + csum_ref(7) = dcmplx(5.135547056878D+02, 5.107404165783D+02) + csum_ref(8) = dcmplx(5.133910925466D+02, 5.108576573661D+02) + csum_ref(9) = dcmplx(5.132470705390D+02, 5.109577278523D+02) + csum_ref(10) = dcmplx(5.131197729984D+02, 5.110460304483D+02) + csum_ref(11) = dcmplx(5.130070319283D+02, 5.111252433800D+02) + csum_ref(12) = dcmplx(5.129070537032D+02, 5.111968077718D+02) + csum_ref(13) = dcmplx(5.128182883502D+02, 5.112616233064D+02) + csum_ref(14) = dcmplx(5.127393733383D+02, 5.113203605551D+02) + csum_ref(15) = dcmplx(5.126691062020D+02, 5.113735928093D+02) + csum_ref(16) = dcmplx(5.126064276004D+02, 5.114218460548D+02) + csum_ref(17) = dcmplx(5.125504076570D+02, 5.114656139760D+02) + csum_ref(18) = dcmplx(5.125002331720D+02, 5.115053595966D+02) + csum_ref(19) = dcmplx(5.124551951846D+02, 5.115415130407D+02) + csum_ref(20) = dcmplx(5.124146770029D+02, 5.115744692211D+02) + + else if (nx .eq. 512 .and. ny .eq. 512 .and. nz .eq. 512 .and. nt .eq. 20) then +!--------------------------------------------------------------------- +! Class C size reference checksums +!--------------------------------------------------------------------- + class = 'C' + csum_ref(1) = dcmplx(5.195078707457D+02, 5.149019699238D+02) + csum_ref(2) = dcmplx(5.155422171134D+02, 5.127578201997D+02) + csum_ref(3) = dcmplx(5.144678022222D+02, 5.122251847514D+02) + csum_ref(4) = dcmplx(5.140150594328D+02, 5.121090289018D+02) + csum_ref(5) = dcmplx(5.137550426810D+02, 5.121143685824D+02) + csum_ref(6) = dcmplx(5.135811056728D+02, 5.121496764568D+02) + csum_ref(7) = dcmplx(5.134569343165D+02, 5.121870921893D+02) + csum_ref(8) = dcmplx(5.133651975661D+02, 5.122193250322D+02) + csum_ref(9) = dcmplx(5.132955192805D+02, 5.122454735794D+02) + csum_ref(10) = dcmplx(5.132410471738D+02, 5.122663649603D+02) + csum_ref(11) = dcmplx(5.131971141679D+02, 5.122830879827D+02) + csum_ref(12) = dcmplx(5.131605205716D+02, 5.122965869718D+02) + csum_ref(13) = dcmplx(5.131290734194D+02, 5.123075927445D+02) + csum_ref(14) = dcmplx(5.131012720314D+02, 5.123166486553D+02) + csum_ref(15) = dcmplx(5.130760908195D+02, 5.123241541685D+02) + csum_ref(16) = dcmplx(5.130528295923D+02, 5.123304037599D+02) + csum_ref(17) = dcmplx(5.130310107773D+02, 5.123356167976D+02) + csum_ref(18) = dcmplx(5.130103090133D+02, 5.123399592211D+02) + csum_ref(19) = dcmplx(5.129905029333D+02, 5.123435588985D+02) + csum_ref(20) = dcmplx(5.129714421109D+02, 5.123465164008D+02) + + else if (nx .eq. 2048 .and. ny .eq. 1024 .and. nz .eq. 1024 .and. nt .eq. 25) then +!--------------------------------------------------------------------- +! Class D size reference checksums +!--------------------------------------------------------------------- + class = 'D' + csum_ref(1) = dcmplx(5.122230065252D+02, 5.118534037109D+02) + csum_ref(2) = dcmplx(5.120463975765D+02, 5.117061181082D+02) + csum_ref(3) = dcmplx(5.119865766760D+02, 5.117096364601D+02) + csum_ref(4) = dcmplx(5.119518799488D+02, 5.117373863950D+02) + csum_ref(5) = dcmplx(5.119269088223D+02, 5.117680347632D+02) + csum_ref(6) = dcmplx(5.119082416858D+02, 5.117967875532D+02) + csum_ref(7) = dcmplx(5.118943814638D+02, 5.118225281841D+02) + csum_ref(8) = dcmplx(5.118842385057D+02, 5.118451629348D+02) + csum_ref(9) = dcmplx(5.118769435632D+02, 5.118649119387D+02) + csum_ref(10) = dcmplx(5.118718203448D+02, 5.118820803844D+02) + csum_ref(11) = dcmplx(5.118683569061D+02, 5.118969781011D+02) + csum_ref(12) = dcmplx(5.118661708593D+02, 5.119098918835D+02) + csum_ref(13) = dcmplx(5.118649768950D+02, 5.119210777066D+02) + csum_ref(14) = dcmplx(5.118645605626D+02, 5.119307604484D+02) + csum_ref(15) = dcmplx(5.118647586618D+02, 5.119391362671D+02) + csum_ref(16) = dcmplx(5.118654451572D+02, 5.119463757241D+02) + csum_ref(17) = dcmplx(5.118665212451D+02, 5.119526269238D+02) + csum_ref(18) = dcmplx(5.118679083821D+02, 5.119580184108D+02) + csum_ref(19) = dcmplx(5.118695433664D+02, 5.119626617538D+02) + csum_ref(20) = dcmplx(5.118713748264D+02, 5.119666538138D+02) + csum_ref(21) = dcmplx(5.118733606701D+02, 5.119700787219D+02) + csum_ref(22) = dcmplx(5.118754661974D+02, 5.119730095953D+02) + csum_ref(23) = dcmplx(5.118776626738D+02, 5.119755100241D+02) + csum_ref(24) = dcmplx(5.118799262314D+02, 5.119776353561D+02) + csum_ref(25) = dcmplx(5.118822370068D+02, 5.119794338060D+02) + else if (nx .eq. 4096 .and. ny .eq. 2048 .and. nz .eq. 2048 .and. nt .eq. 25) then +!--------------------------------------------------------------------- +! Class E size reference checksums +!--------------------------------------------------------------------- + class = 'E' + csum_ref(1) = dcmplx(5.121601045346D+02, 5.117395998266D+02) + csum_ref(2) = dcmplx(5.120905403678D+02, 5.118614716182D+02) + csum_ref(3) = dcmplx(5.120623229306D+02, 5.119074203747D+02) + csum_ref(4) = dcmplx(5.120438418997D+02, 5.119345900733D+02) + csum_ref(5) = dcmplx(5.120311521872D+02, 5.119551325550D+02) + csum_ref(6) = dcmplx(5.120226088809D+02, 5.119720179919D+02) + csum_ref(7) = dcmplx(5.120169296534D+02, 5.119861371665D+02) + csum_ref(8) = dcmplx(5.120131225172D+02, 5.119979364402D+02) + csum_ref(9) = dcmplx(5.120104767108D+02, 5.120077674092D+02) + csum_ref(10) = dcmplx(5.120085127969D+02, 5.120159443121D+02) + csum_ref(11) = dcmplx(5.120069224127D+02, 5.120227453670D+02) + csum_ref(12) = dcmplx(5.120055158164D+02, 5.120284096041D+02) + csum_ref(13) = dcmplx(5.120041820159D+02, 5.120331373793D+02) + csum_ref(14) = dcmplx(5.120028605402D+02, 5.120370938679D+02) + csum_ref(15) = dcmplx(5.120015223011D+02, 5.120404138831D+02) + csum_ref(16) = dcmplx(5.120001570022D+02, 5.120432068837D+02) + csum_ref(17) = dcmplx(5.119987650555D+02, 5.120455615860D+02) + csum_ref(18) = dcmplx(5.119973525091D+02, 5.120475499442D+02) + csum_ref(19) = dcmplx(5.119959279472D+02, 5.120492304629D+02) + csum_ref(20) = dcmplx(5.119945006558D+02, 5.120506508902D+02) + csum_ref(21) = dcmplx(5.119930795911D+02, 5.120518503782D+02) + csum_ref(22) = dcmplx(5.119916728462D+02, 5.120528612016D+02) + csum_ref(23) = dcmplx(5.119902874185D+02, 5.120537101195D+02) + csum_ref(24) = dcmplx(5.119889291565D+02, 5.120544194514D+02) + csum_ref(25) = dcmplx(5.119876028049D+02, 5.120550079284D+02) + endif + + if (class .ne. 'U') then + do i = 1, nt + err = abs( (sums(i) - csum_ref(i)) / csum_ref(i) ) + if (.not.(err .le. epsilon) .or. isnan(err)) goto 100 + end do + verified = .TRUE. +100 continue + + endif + + + if (class .ne. 'U') then + if (verified) then + write(*,2000) +2000 format(' Result verification successful') + else + write(*,2001) +2001 format(' Result verification failed') + endif + endif + print *, 'class = ', class + + return +end + + +subroutine print_results(name, class, n1, n2, n3, niter, t, mops, optype, verified, npbversion, compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + implicit none + character name*(*) + character class*1 + integer n1, n2, n3, niter, j + double precision t, mops + character optype*24, size*15 + logical verified + character*(*) npbversion, compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7 + integer num_threads, max_threads, i + + max_threads = 1 + num_threads = 1 + + write (*, 2) name + 2 format(//, ' ', A, ' Benchmark Completed.') + + write (*, 3) Class + 3 format(' Class = ', 12x, a12) + +! If this is not a grid-based problem (EP, FT, CG), then +! we only print n1, which contains some measure of the +! problem size. In that case, n2 and n3 are both zero. +! Otherwise, we print the grid size n1xn2xn3 + + if ((n2 .eq. 0) .and. (n3 .eq. 0)) then + if (name(1:2) .eq. 'EP') then + write(size, '(f15.0)' ) 2.d0**n1 + j = 15 + if (size(j:j) .eq. '.') j = j - 1 + write (*,42) size(1:j) + 42 format(' Size = ',9x, a15) + else + write (*,44) n1 + 44 format(' Size = ',12x, i12) + endif + else + write (*, 4) n1,n2,n3 + 4 format(' Size = ',9x, i4,'x',i4,'x',i4) + endif + + write (*, 5) niter + 5 format(' Iterations = ', 12x, i12) + + write (*, 6) t + 6 format(' Time in seconds = ',12x, f12.2) + + + + write (*,9) mops + 9 format(' Mop/s total = ',12x, f12.2) + + + write(*, 11) optype + 11 format(' Operation type = ', a24) + + if (verified) then + write(*,12) ' SUCCESSFUL' + else + write(*,12) 'UNSUCCESSFUL' + endif + 12 format(' Verification = ', 12x, a) + + write(*,13) npbversion + 13 format(' Version = ', 12x, a12) + + write(*,14) compiletime + 14 format(' Compile date = ', 12x, a12) + + + write (*,121) cs1 + 121 format(/, ' Compile options:', /, ' F77 = ', A) + + write (*,122) cs2 + 122 format(' FLINK = ', A) + + write (*,123) cs3 + 123 format(' F_LIB = ', A) + + write (*,124) cs4 + 124 format(' F_INC = ', A) + + write (*,125) cs5 + 125 format(' FFLAGS = ', A) + + write (*,126) cs6 + 126 format(' FLINKFLAGS = ', A) + + write(*, 127) cs7 + 127 format(' RAND = ', A) + + write (*,130) + 130 format(//' Please send all errors/feedbacks to:'// ' NPB Development Team'/ ' npb@nas.nasa.gov'//) + + + + return + end + + + + double precision function randlc(x, a) + + + implicit none + double precision x, a + integer*8 i246m1, Lx, La + double precision d2m46 + + parameter(d2m46=0.5d0**46) + + save i246m1 + data i246m1/X'00003FFFFFFFFFFF'/ + + Lx = X + La = A + + Lx = iand(Lx*La,i246m1) + randlc = d2m46*dble(Lx) + x = dble(Lx) + return +end + + +subroutine vranlc (N, X, A, Y) + + implicit none + integer n, i + double precision x, a, y(*) + integer*8 i246m1, Lx, La + double precision d2m46 + + + parameter(d2m46=0.5d0**46) + save i246m1 + data i246m1/X'00003FFFFFFFFFFF'/ + + Lx = X + La = A + do i = 1, N + Lx = iand(Lx*La,i246m1) + y(i) = d2m46*dble(Lx) + end do + x = dble(Lx) + + return + end + + + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/global.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/global.h new file mode 100644 index 0000000..f94133f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/global.h @@ -0,0 +1,80 @@ +include 'npbparams.h' + + +! If processor array is 1x1 -> 0D grid decomposition + + +! Cache blocking params. These values are good for most +! RISC processors. +! FFT parameters: +! fftblock controls how many ffts are done at a time. +! The default is appropriate for most cache-based machines +! On vector machines, the FFT can be vectorized with vector +! length equal to the block size, so the block size should +! be as large as possible. This is the size of the smallest +! dimension of the problem: 128 for class A, 256 for class B and +! 512 for class C. + + +! we need a bunch of logic to keep track of how +! arrays are laid out. + + +! Note: this serial version is the derived from the parallel 0D case +! of the ft NPB. +! The computation proceeds logically as + +! set up initial conditions +! fftx(1) +! transpose (1->2) +! ffty(2) +! transpose (2->3) +! fftz(3) +! time evolution +! fftz(3) +! transpose (3->2) +! ffty(2) +! transpose (2->1) +! fftx(1) +! compute residual(1) + +! for the 0D, 1D, 2D strategies, the layouts look like xxx +! +! 0D 1D 2D +! 1: xyz xyz xyz + + + +integer T_total, T_setup, T_fft, T_evolve, T_checksum, T_fftx, T_ffty, T_fftz, T_max +parameter (T_total = 1, T_setup = 2, T_fft = 3, T_evolve = 4, T_checksum = 5, T_max = 5) + +logical timers_enabled +parameter (timers_enabled = .FALSE.) +logical more_memory +parameter (more_memory = .FALSE.) + +external timer_read +double precision timer_read +external ilog2 +integer ilog2 + +external randlc +double precision randlc + + + +double precision seed, a, pi, alpha +parameter (seed = 314159265.d0, a = 1220703125.d0, pi = 3.141592653589793238d0, alpha=1.0d-6) + +double complex u0(nxp,ny,nz), u1(nxp,ny,nz) +double precision twiddle(nxp,ny,nz) +double complex u(nxp) +double complex y1(maxdim),y2(maxdim) +common /arrays/ u,u0,u1,twiddle,y1,y2 + +!dvm$ distribute (*,*,*) :: twiddle +!dvm$ distribute (*,*,*) :: u0 +!dvm$ distribute (*,*,*) :: u1 +!dvm$ distribute (*) :: u + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/make.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/make.bat new file mode 100644 index 0000000..2bb2118 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/FT/make.bat @@ -0,0 +1,12 @@ +@echo off + +set CLASS=%1 +set OPT=%2 + +CALL ..\sys\setparams FT %CLASS% +CALL %F77% %OPT% ft 1>out_%CLASS%.txt 2>err_%CLASS%.txt +if exist ft.exe ( + copy ft.exe %BIN%\ft.%CLASS%.x.exe + del ft.exe +) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/Makefile new file mode 100644 index 0000000..1d20d7d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/Makefile @@ -0,0 +1,44 @@ +SHELL=/bin/sh +BENCHMARK=lu +BENCHMARKU=LU + +include ../config/make.def +include ../sys/make.common + +OBJS = lu.o read_input.o \ + domain.o setcoeff.o setbv.o exact.o setiv.o \ + erhs.o ssor.o rhs.o l2norm.o error.o \ + pintgr.o verify.o print_results.o timers.o + + + +${PROGRAM}: config + ${MAKE} exec + +exec: $(OBJS) + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM} ${OBJS} ${F_LIB} + +.f.o : + ${F77} ${FFLAGS} -c -o $@ $< + +lu.o: lu.f applu.incl npbparams.h +erhs.o: erhs.f applu.incl npbparams.h +error.o: error.f applu.incl npbparams.h +exact.o: exact.f applu.incl npbparams.h +l2norm.o: l2norm.f +pintgr.o: pintgr.f applu.incl npbparams.h +read_input.o: read_input.f applu.incl npbparams.h +rhs.o: rhs.f applu.incl npbparams.h +setbv.o: setbv.f applu.incl npbparams.h +setiv.o: setiv.f applu.incl npbparams.h +setcoeff.o: setcoeff.f applu.incl npbparams.h +ssor.o: ssor.f applu.incl npbparams.h +domain.o: domain.f applu.incl npbparams.h +verify.o: verify.f applu.incl npbparams.h +print_results.o: print_results.f +timers.o: timers.f + +clean: + - /bin/rm -f npbparams.h + - /bin/rm -f *.o *DVMH* *~ + - /bin/rm -f *.cu *.cuf diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/applu.incl b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/applu.incl new file mode 100644 index 0000000..d07a663 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/applu.incl @@ -0,0 +1,185 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- +c--- applu.incl +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c npbparams.h defines parameters that depend on the class and +c number of nodes +c--------------------------------------------------------------------- + + include 'npbparams.h' + +c--------------------------------------------------------------------- +c parameters which can be overridden in runtime config file +c isiz1,isiz2,isiz3 give the maximum size +c ipr = 1 to print out verbose information +c omega = 2.0 is correct for all classes +c tolrsd is tolerance levels for steady state residuals +c--------------------------------------------------------------------- + integer ipr_default,iS,jS,kS + parameter (ipr_default = 1) + double precision omega_default + parameter (omega_default = 1.2d0) + double precision tolrsd1_def, tolrsd2_def, tolrsd3_def, + > tolrsd4_def, tolrsd5_def + parameter (tolrsd1_def=1.0e-08, + > tolrsd2_def=1.0e-08, tolrsd3_def=1.0e-08, + > tolrsd4_def=1.0e-08, tolrsd5_def=1.0e-08) + + double precision c1, c2, c3, c4, c5 + parameter( c1 = 1.40d+00, c2 = 0.40d+00, + > c3 = 1.00d-01, c4 = 1.00d+00, + > c5 = 1.40d+00, + > iS =isiz1/2*2+1,jS= isiz2/2*2+1, kS=isiz3 ) + +c--------------------------------------------------------------------- +c grid +c--------------------------------------------------------------------- + integer nx, ny, nz + integer nx0, ny0, nz0 + integer ist, iend + integer jst, jend + integer ii1, ii2 + integer ji1, ji2 + integer ki1, ki2 + double precision dxi, deta, dzeta + double precision tx1, tx2, tx3 + double precision ty1, ty2, ty3 + double precision tz1, tz2, tz3 + + common/cgcon/ dxi, deta, dzeta, + > tx1, tx2, tx3, + > ty1, ty2, ty3, + > tz1, tz2, tz3, + > nx, ny, nz, + > nx0, ny0, nz0, + > ist, iend, + > jst, jend, + > ii1, ii2, + > ji1, ji2, + > ki1, ki2 + +c--------------------------------------------------------------------- +c dissipation +c--------------------------------------------------------------------- + double precision dx1, dx2, dx3, dx4, dx5 + double precision dy1, dy2, dy3, dy4, dy5 + double precision dz1, dz2, dz3, dz4, dz5 + double precision dssp + + common/disp/ dx1,dx2,dx3,dx4,dx5, + > dy1,dy2,dy3,dy4,dy5, + > dz1,dz2,dz3,dz4,dz5, + > dssp + +c--------------------------------------------------------------------- +c field variables and residuals +c to improve cache performance, second two dimensions padded by 1 +c for even number sizes only. +c note: corresponding array (called "v") in routines blts, buts, +c and l2norm are similarly padded +c--------------------------------------------------------------------- +!DVM$ ALIGN frct(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX2,iEX3,iE +!DVM$&X4) +!DVM$ ALIGN qs(iEX1,iEX2,iEX3) WITH dvmh_temp0(*,iEX1,iEX2,iEX3) +!DVM$ ALIGN rho_i(iEX1,iEX2,iEX3) WITH dvmh_temp0(*,iEX1,iEX2,iEX3) +!DVM$ ALIGN rsd(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX2,iEX3,iEX +!DVM$&4) +!DVM$ ALIGN u(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX2,iEX3,iEX4) +!DVM$ DYNAMIC u,rsd,frct,qs,rho_i +!DVM$ SHADOW qs(1:1,1:1,1:1) +!DVM$ SHADOW rho_i(1:1,1:1,1:1) +!DVM$ SHADOW rsd(0:0,2:2,2:2,2:2) +!DVM$ SHADOW frct(0:0,2:2,2:2,2:2) +!DVM$ SHADOW u(0:0,2:2,2:2,2:2) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0(1:6,0:iS+1,0:jS+1,0:kS+1) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r1(1:6,0:iS+1,0:jS+1,0:kS+1) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r2(1:6,0:iS+1,0:jS+1,0:kS+1) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r3(1:6,0:iS+1,0:jS+1,0:kS+1) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r0(1:6,0:iS+1,0:jS+1,0:kS+1) +!DVM$ DISTRIBUTE dvmh_temp0(*,BLOCK,BLOCK,BLOCK) +!DVM$ DISTRIBUTE dvmh_temp0_r1(*,BLOCK,BLOCK,*) +!DVM$ DISTRIBUTE dvmh_temp0_r2(*,BLOCK,*,BLOCK) +!DVM$ DISTRIBUTE dvmh_temp0_r3(*,*,BLOCK,BLOCK) +!DVM$ DISTRIBUTE dvmh_temp0_r0(*,*,*,BLOCK) + +!DVM$ DYNAMIC dvmh_temp0, dvmh_temp0_r1, dvmh_temp0_r2, dvmh_temp0_r3, +!DVM$&dvmh_temp0_r0 + double precision u(5,isiz1/2*2+1, + > isiz2/2*2+1, + > isiz3), + > rsd(5,isiz1/2*2+1, + > isiz2/2*2+1, + > isiz3), + > frct(5,isiz1/2*2+1, + > isiz2/2*2+1, + > isiz3), + > flux(5,isiz1), + > qs(isiz1,isiz2,isiz3), + > rho_i(isiz1/2*2+1,isiz2/2*2+1,isiz3) + + common/cvar/ u, rsd, frct, flux, + > qs, rho_i + + +c--------------------------------------------------------------------- +c output control parameters +c--------------------------------------------------------------------- + integer ipr, inorm + + common/cprcon/ ipr, inorm + +c--------------------------------------------------------------------- +c newton-raphson iteration control parameters +c--------------------------------------------------------------------- + integer itmax, invert + double precision dt, omega, tolrsd(5), + > rsdnm(5), errnm(5), frc, ttotal + + common/ctscon/ dt, omega, tolrsd, + > rsdnm, errnm, frc, ttotal, + > itmax, invert + + double precision a(5,5,isiz1/2*2+1,isiz2), + > b(5,5,isiz1/2*2+1,isiz2), + > c(5,5,isiz1/2*2+1,isiz2), + > d(5,5,isiz1/2*2+1,isiz2) + + common/cjac/ a, b, c, d + +c--------------------------------------------------------------------- +c coefficients of the exact solution +c--------------------------------------------------------------------- + double precision ce(5,13) + + common/cexact/ ce + +c--------------------------------------------------------------------- +c timers +c--------------------------------------------------------------------- + integer t_rhsx,t_rhsy,t_rhsz,t_rhs,t_jacld,t_blts, + > t_jacu,t_buts,t_add,t_l2norm,t_last,t_total + parameter (t_total = 1) + parameter (t_rhsx = 2) + parameter (t_rhsy = 3) + parameter (t_rhsz = 4) + parameter (t_rhs = 5) + parameter (t_jacld = 6) + parameter (t_blts = 7) + parameter (t_jacu = 8) + parameter (t_buts = 9) + parameter (t_add = 10) + parameter (t_l2norm = 11) + parameter (t_last = 11) + logical timeron + double precision maxtime + + common/timer/maxtime,timeron + + +c--------------------------------------------------------------------- +c end of include file +c--------------------------------------------------------------------- diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/domain.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/domain.f new file mode 100644 index 0000000..7e38f64 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/domain.f @@ -0,0 +1,79 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine domain () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + nx = nx0 + ny = ny0 + nz = nz0 + +!--------------------------------------------------------------------- +! check the sub-domain size +!--------------------------------------------------------------------- + if (nx .lt. 4 .or. ny .lt. 4 .or. nz .lt. 4) then + write (unit = *,fmt = 2001) nx,ny,nz +2001 format (5x,'SUBDOMAIN SIZE IS TOO SMALL - ', /5x,' + &ADJUST PROBLEM SIZE OR NUMBER OF PROCESSORS', /5x,'SO THAT + &NX, NY AND NZ ARE GREATER THAN OR EQUAL', /5x,'TO 4 THEY AR + &E CURRENTLY', 3I3) + stop + endif + if (nx .gt. isiz1 .or. ny .gt. isiz2 .or. nz .gt. isiz3) then + write (unit = *,fmt = 2002) nx,ny,nz +2002 format (5x,'SUBDOMAIN SIZE IS TOO LARGE - ', /5x,' + &ADJUST PROBLEM SIZE OR NUMBER OF PROCESSORS', /5x,'SO THAT + &NX, NY AND NZ ARE LESS THAN OR EQUAL TO ', /5x,'ISIZ1, ISIZ + &2 AND ISIZ3 RESPECTIVELY. THEY ARE', /5x,'CURRENTLY', 3I4) + stop + endif + +!--------------------------------------------------------------------- +! set up the start and end in i and j extents for all processors +!--------------------------------------------------------------------- + ist = 2 + iend = nx - 1 + jst = 2 + jend = ny - 1 + ii1 = 2 + ii2 = nx0 - 1 + ji1 = 2 + ji2 = ny0 - 2 + ki1 = 3 + ki2 = nz0 - 1 + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/erhs.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/erhs.f new file mode 100644 index 0000000..d69a102 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/erhs.f @@ -0,0 +1,369 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine erhs () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! +! compute the right hand side based on exact solution +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer i,j,k,m + double precision xi,eta,zeta + double precision q + double precision u21,u31,u41 + double precision tmp + double precision u21i,u31i,u41i,u51i + double precision u21j,u31j,u41j,u51j + double precision u21k,u31k,u41k,u51k + double precision u21im1,u31im1,u41im1,u51im1 + double precision u21jm1,u31jm1,u41jm1,u51jm1 + double precision u21km1,u31km1,u41km1,u51km1 +!DVM$ PARALLEL (k,j,i,m) ON frct(m,i,j,k), PRIVATE (m,i,j,k) + do k = 1,nz + do j = 1,ny + do i = 1,nx + do m = 1,5 + frct(m,i,j,k) = 0.0d+00 + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,i) ON rsd(*,i,j,k), PRIVATE (m,i,j,k,xi,zeta,eta) + do k = 1,nz + do j = 1,ny + do i = 1,nx + zeta = dble (k - 1) / (nz - 1) + eta = dble (j - 1) / (ny0 - 1) + xi = dble (i - 1) / (nx0 - 1) + do m = 1,5 + rsd(m,i,j,k) = ce(m,1) + (ce(m,2) + (ce(m,5) + (ce(m,8 + &) + ce(m,11) * xi) * xi) * xi) * xi + (ce(m,3) + (ce(m,6) + (ce(m, + &9) + ce(m,12) * eta) * eta) * eta) * eta + (ce(m,4) + (ce(m,7) + ( + &ce(m,10) + ce(m,13) * zeta) * zeta) * zeta) * zeta + enddo + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! xi-direction flux differences +!--------------------------------------------------------------------- +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r3(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: rsd +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r3(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: frct +!DVM$ PARALLEL (k,j) ON frct(*,*,j,k), PRIVATE (m,i,j,q,tmp,k,flux,u31i, +!DVM$&u41i,u51i,u21i,u21,u31im1,u41im1,u21im1,u51im1) + do k = 2,nz - 1 + do j = jst,jend + do i = 1,nx + flux(1,i) = rsd(2,i,j,k) + u21 = rsd(2,i,j,k) / rsd(1,i,j,k) + q = 0.50d+00 * (rsd(2,i,j,k) * rsd(2,i,j,k) + rsd(3,i,j,k + &) * rsd(3,i,j,k) + rsd(4,i,j,k) * rsd(4,i,j,k)) / rsd(1,i,j,k) + flux(2,i) = rsd(2,i,j,k) * u21 + c2 * (rsd(5,i,j,k) - q) + flux(3,i) = rsd(3,i,j,k) * u21 + flux(4,i) = rsd(4,i,j,k) * u21 + flux(5,i) = (c1 * rsd(5,i,j,k) - c2 * q) * u21 + enddo + do i = ist,iend + do m = 1,5 + frct(m,i,j,k) = frct(m,i,j,k) - tx2 * (flux(m,i + 1) - + & flux(m,i - 1)) + enddo + enddo + do i = ist,nx + tmp = 1.0d+00 / rsd(1,i,j,k) + u21i = tmp * rsd(2,i,j,k) + u31i = tmp * rsd(3,i,j,k) + u41i = tmp * rsd(4,i,j,k) + u51i = tmp * rsd(5,i,j,k) + tmp = 1.0d+00 / rsd(1,i - 1,j,k) + u21im1 = tmp * rsd(2,i - 1,j,k) + u31im1 = tmp * rsd(3,i - 1,j,k) + u41im1 = tmp * rsd(4,i - 1,j,k) + u51im1 = tmp * rsd(5,i - 1,j,k) + flux(2,i) = 4.0d+00 / 3.0d+00 * tx3 * (u21i - u21im1) + flux(3,i) = tx3 * (u31i - u31im1) + flux(4,i) = tx3 * (u41i - u41im1) + flux(5,i) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 * (u21i* + &* 2 + u31i** 2 + u41i** 2 - (u21im1** 2 + u31im1** 2 + u41im1** 2) + &) + 1.0d+00 / 6.0d+00 * tx3 * (u21i** 2 - u21im1** 2) + c1 * c5 * + &tx3 * (u51i - u51im1) + enddo + do i = ist,iend + frct(1,i,j,k) = frct(1,i,j,k) + dx1 * tx1 * (rsd(1,i - 1, + &j,k) - 2.0d+00 * rsd(1,i,j,k) + rsd(1,i + 1,j,k)) + frct(2,i,j,k) = frct(2,i,j,k) + tx3 * c3 * c4 * (flux(2,i + & + 1) - flux(2,i)) + dx2 * tx1 * (rsd(2,i - 1,j,k) - 2.0d+00 * rsd + &(2,i,j,k) + rsd(2,i + 1,j,k)) + frct(3,i,j,k) = frct(3,i,j,k) + tx3 * c3 * c4 * (flux(3,i + & + 1) - flux(3,i)) + dx3 * tx1 * (rsd(3,i - 1,j,k) - 2.0d+00 * rsd + &(3,i,j,k) + rsd(3,i + 1,j,k)) + frct(4,i,j,k) = frct(4,i,j,k) + tx3 * c3 * c4 * (flux(4,i + & + 1) - flux(4,i)) + dx4 * tx1 * (rsd(4,i - 1,j,k) - 2.0d+00 * rsd + &(4,i,j,k) + rsd(4,i + 1,j,k)) + frct(5,i,j,k) = frct(5,i,j,k) + tx3 * c3 * c4 * (flux(5,i + & + 1) - flux(5,i)) + dx5 * tx1 * (rsd(5,i - 1,j,k) - 2.0d+00 * rsd + &(5,i,j,k) + rsd(5,i + 1,j,k)) + enddo + +!--------------------------------------------------------------------- +! Fourth-order dissipation +!--------------------------------------------------------------------- + do m = 1,5 + frct(m,2,j,k) = frct(m,2,j,k) - dssp * ((+(5.0d+00)) * rs + &d(m,2,j,k) - 4.0d+00 * rsd(m,3,j,k) + rsd(m,4,j,k)) + frct(m,3,j,k) = frct(m,3,j,k) - dssp * ((-(4.0d+00)) * rs + &d(m,2,j,k) + 6.0d+00 * rsd(m,3,j,k) - 4.0d+00 * rsd(m,4,j,k) + rsd + &(m,5,j,k)) + enddo + do i = 4,nx - 3 + do m = 1,5 + frct(m,i,j,k) = frct(m,i,j,k) - dssp * (rsd(m,i - 2,j, + &k) - 4.0d+00 * rsd(m,i - 1,j,k) + 6.0d+00 * rsd(m,i,j,k) - 4.0d+00 + & * rsd(m,i + 1,j,k) + rsd(m,i + 2,j,k)) + enddo + enddo + do m = 1,5 + frct(m,nx - 2,j,k) = frct(m,nx - 2,j,k) - dssp * (rsd(m,n + &x - 4,j,k) - 4.0d+00 * rsd(m,nx - 3,j,k) + 6.0d+00 * rsd(m,nx - 2, + &j,k) - 4.0d+00 * rsd(m,nx - 1,j,k)) + frct(m,nx - 1,j,k) = frct(m,nx - 1,j,k) - dssp * (rsd(m,n + &x - 3,j,k) - 4.0d+00 * rsd(m,nx - 2,j,k) + 5.0d+00 * rsd(m,nx - 1, + &j,k)) + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! eta-direction flux differences +!--------------------------------------------------------------------- +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: rsd +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: frct +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r2(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: rsd +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r2(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: frct +!DVM$ PARALLEL (k,i) ON frct(*,i,*,k), PRIVATE (m,i,u31,j,q,tmp,u31j,u41 +!DVM$&j,u41jm1,u51jm1,u21j,u31jm1,k,u21jm1,u51j,flux) + do k = 2,nz - 1 + do i = ist,iend + do j = 1,ny + flux(1,j) = rsd(3,i,j,k) + u31 = rsd(3,i,j,k) / rsd(1,i,j,k) + q = 0.50d+00 * (rsd(2,i,j,k) * rsd(2,i,j,k) + rsd(3,i,j,k + &) * rsd(3,i,j,k) + rsd(4,i,j,k) * rsd(4,i,j,k)) / rsd(1,i,j,k) + flux(2,j) = rsd(2,i,j,k) * u31 + flux(3,j) = rsd(3,i,j,k) * u31 + c2 * (rsd(5,i,j,k) - q) + flux(4,j) = rsd(4,i,j,k) * u31 + flux(5,j) = (c1 * rsd(5,i,j,k) - c2 * q) * u31 + enddo + do j = jst,jend + do m = 1,5 + frct(m,i,j,k) = frct(m,i,j,k) - ty2 * (flux(m,j + 1) - + & flux(m,j - 1)) + enddo + enddo + do j = jst,ny + tmp = 1.0d+00 / rsd(1,i,j,k) + u21j = tmp * rsd(2,i,j,k) + u31j = tmp * rsd(3,i,j,k) + u41j = tmp * rsd(4,i,j,k) + u51j = tmp * rsd(5,i,j,k) + tmp = 1.0d+00 / rsd(1,i,j - 1,k) + u21jm1 = tmp * rsd(2,i,j - 1,k) + u31jm1 = tmp * rsd(3,i,j - 1,k) + u41jm1 = tmp * rsd(4,i,j - 1,k) + u51jm1 = tmp * rsd(5,i,j - 1,k) + flux(2,j) = ty3 * (u21j - u21jm1) + flux(3,j) = 4.0d+00 / 3.0d+00 * ty3 * (u31j - u31jm1) + flux(4,j) = ty3 * (u41j - u41jm1) + flux(5,j) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 * (u21j* + &* 2 + u31j** 2 + u41j** 2 - (u21jm1** 2 + u31jm1** 2 + u41jm1** 2) + &) + 1.0d+00 / 6.0d+00 * ty3 * (u31j** 2 - u31jm1** 2) + c1 * c5 * + &ty3 * (u51j - u51jm1) + enddo + do j = jst,jend + frct(1,i,j,k) = frct(1,i,j,k) + dy1 * ty1 * (rsd(1,i,j - + &1,k) - 2.0d+00 * rsd(1,i,j,k) + rsd(1,i,j + 1,k)) + frct(2,i,j,k) = frct(2,i,j,k) + ty3 * c3 * c4 * (flux(2,j + & + 1) - flux(2,j)) + dy2 * ty1 * (rsd(2,i,j - 1,k) - 2.0d+00 * rsd + &(2,i,j,k) + rsd(2,i,j + 1,k)) + frct(3,i,j,k) = frct(3,i,j,k) + ty3 * c3 * c4 * (flux(3,j + & + 1) - flux(3,j)) + dy3 * ty1 * (rsd(3,i,j - 1,k) - 2.0d+00 * rsd + &(3,i,j,k) + rsd(3,i,j + 1,k)) + frct(4,i,j,k) = frct(4,i,j,k) + ty3 * c3 * c4 * (flux(4,j + & + 1) - flux(4,j)) + dy4 * ty1 * (rsd(4,i,j - 1,k) - 2.0d+00 * rsd + &(4,i,j,k) + rsd(4,i,j + 1,k)) + frct(5,i,j,k) = frct(5,i,j,k) + ty3 * c3 * c4 * (flux(5,j + & + 1) - flux(5,j)) + dy5 * ty1 * (rsd(5,i,j - 1,k) - 2.0d+00 * rsd + &(5,i,j,k) + rsd(5,i,j + 1,k)) + enddo + +!--------------------------------------------------------------------- +! fourth-order dissipation +!--------------------------------------------------------------------- + do m = 1,5 + frct(m,i,2,k) = frct(m,i,2,k) - dssp * ((+(5.0d+00)) * rs + &d(m,i,2,k) - 4.0d+00 * rsd(m,i,3,k) + rsd(m,i,4,k)) + frct(m,i,3,k) = frct(m,i,3,k) - dssp * ((-(4.0d+00)) * rs + &d(m,i,2,k) + 6.0d+00 * rsd(m,i,3,k) - 4.0d+00 * rsd(m,i,4,k) + rsd + &(m,i,5,k)) + enddo + do j = 4,ny - 3 + do m = 1,5 + frct(m,i,j,k) = frct(m,i,j,k) - dssp * (rsd(m,i,j - 2, + &k) - 4.0d+00 * rsd(m,i,j - 1,k) + 6.0d+00 * rsd(m,i,j,k) - 4.0d+00 + & * rsd(m,i,j + 1,k) + rsd(m,i,j + 2,k)) + enddo + enddo + do m = 1,5 + frct(m,i,ny - 2,k) = frct(m,i,ny - 2,k) - dssp * (rsd(m,i + &,ny - 4,k) - 4.0d+00 * rsd(m,i,ny - 3,k) + 6.0d+00 * rsd(m,i,ny - + &2,k) - 4.0d+00 * rsd(m,i,ny - 1,k)) + frct(m,i,ny - 1,k) = frct(m,i,ny - 1,k) - dssp * (rsd(m,i + &,ny - 3,k) - 4.0d+00 * rsd(m,i,ny - 2,k) + 5.0d+00 * rsd(m,i,ny - + &1,k)) + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! zeta-direction flux differences +!--------------------------------------------------------------------- +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: rsd +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: frct +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r1(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: rsd +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r1(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: frct +!DVM$ PARALLEL (j,i) ON frct(*,i,j,*), PRIVATE (m,i,j,q,tmp,u41,k,u51k,u +!DVM$&31km1,u21k,u21km1,u41k,u31k,u51km1,u41km1,flux) + do j = jst,jend + do i = ist,iend + do k = 1,nz + flux(1,k) = rsd(4,i,j,k) + u41 = rsd(4,i,j,k) / rsd(1,i,j,k) + q = 0.50d+00 * (rsd(2,i,j,k) * rsd(2,i,j,k) + rsd(3,i,j,k + &) * rsd(3,i,j,k) + rsd(4,i,j,k) * rsd(4,i,j,k)) / rsd(1,i,j,k) + flux(2,k) = rsd(2,i,j,k) * u41 + flux(3,k) = rsd(3,i,j,k) * u41 + flux(4,k) = rsd(4,i,j,k) * u41 + c2 * (rsd(5,i,j,k) - q) + flux(5,k) = (c1 * rsd(5,i,j,k) - c2 * q) * u41 + enddo + do k = 2,nz - 1 + do m = 1,5 + frct(m,i,j,k) = frct(m,i,j,k) - tz2 * (flux(m,k + 1) - + & flux(m,k - 1)) + enddo + enddo + do k = 2,nz + tmp = 1.0d+00 / rsd(1,i,j,k) + u21k = tmp * rsd(2,i,j,k) + u31k = tmp * rsd(3,i,j,k) + u41k = tmp * rsd(4,i,j,k) + u51k = tmp * rsd(5,i,j,k) + tmp = 1.0d+00 / rsd(1,i,j,k - 1) + u21km1 = tmp * rsd(2,i,j,k - 1) + u31km1 = tmp * rsd(3,i,j,k - 1) + u41km1 = tmp * rsd(4,i,j,k - 1) + u51km1 = tmp * rsd(5,i,j,k - 1) + flux(2,k) = tz3 * (u21k - u21km1) + flux(3,k) = tz3 * (u31k - u31km1) + flux(4,k) = 4.0d+00 / 3.0d+00 * tz3 * (u41k - u41km1) + flux(5,k) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 * (u21k* + &* 2 + u31k** 2 + u41k** 2 - (u21km1** 2 + u31km1** 2 + u41km1** 2) + &) + 1.0d+00 / 6.0d+00 * tz3 * (u41k** 2 - u41km1** 2) + c1 * c5 * + &tz3 * (u51k - u51km1) + enddo + do k = 2,nz - 1 + frct(1,i,j,k) = frct(1,i,j,k) + dz1 * tz1 * (rsd(1,i,j,k + &+ 1) - 2.0d+00 * rsd(1,i,j,k) + rsd(1,i,j,k - 1)) + frct(2,i,j,k) = frct(2,i,j,k) + tz3 * c3 * c4 * (flux(2,k + & + 1) - flux(2,k)) + dz2 * tz1 * (rsd(2,i,j,k + 1) - 2.0d+00 * rsd + &(2,i,j,k) + rsd(2,i,j,k - 1)) + frct(3,i,j,k) = frct(3,i,j,k) + tz3 * c3 * c4 * (flux(3,k + & + 1) - flux(3,k)) + dz3 * tz1 * (rsd(3,i,j,k + 1) - 2.0d+00 * rsd + &(3,i,j,k) + rsd(3,i,j,k - 1)) + frct(4,i,j,k) = frct(4,i,j,k) + tz3 * c3 * c4 * (flux(4,k + & + 1) - flux(4,k)) + dz4 * tz1 * (rsd(4,i,j,k + 1) - 2.0d+00 * rsd + &(4,i,j,k) + rsd(4,i,j,k - 1)) + frct(5,i,j,k) = frct(5,i,j,k) + tz3 * c3 * c4 * (flux(5,k + & + 1) - flux(5,k)) + dz5 * tz1 * (rsd(5,i,j,k + 1) - 2.0d+00 * rsd + &(5,i,j,k) + rsd(5,i,j,k - 1)) + enddo + +!--------------------------------------------------------------------- +! fourth-order dissipation +!--------------------------------------------------------------------- + do m = 1,5 + frct(m,i,j,2) = frct(m,i,j,2) - dssp * ((+(5.0d+00)) * rs + &d(m,i,j,2) - 4.0d+00 * rsd(m,i,j,3) + rsd(m,i,j,4)) + frct(m,i,j,3) = frct(m,i,j,3) - dssp * ((-(4.0d+00)) * rs + &d(m,i,j,2) + 6.0d+00 * rsd(m,i,j,3) - 4.0d+00 * rsd(m,i,j,4) + rsd + &(m,i,j,5)) + enddo + do k = 4,nz - 3 + do m = 1,5 + frct(m,i,j,k) = frct(m,i,j,k) - dssp * (rsd(m,i,j,k - + &2) - 4.0d+00 * rsd(m,i,j,k - 1) + 6.0d+00 * rsd(m,i,j,k) - 4.0d+00 + & * rsd(m,i,j,k + 1) + rsd(m,i,j,k + 2)) + enddo + enddo + do m = 1,5 + frct(m,i,j,nz - 2) = frct(m,i,j,nz - 2) - dssp * (rsd(m,i + &,j,nz - 4) - 4.0d+00 * rsd(m,i,j,nz - 3) + 6.0d+00 * rsd(m,i,j,nz + &- 2) - 4.0d+00 * rsd(m,i,j,nz - 1)) + frct(m,i,j,nz - 1) = frct(m,i,j,nz - 1) - dssp * (rsd(m,i + &,j,nz - 3) - 4.0d+00 * rsd(m,i,j,nz - 2) + 5.0d+00 * rsd(m,i,j,nz + &- 1)) + enddo + enddo + enddo +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: rsd +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: frct + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/error.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/error.f new file mode 100644 index 0000000..98a427a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/error.f @@ -0,0 +1,77 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine error () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! +! compute the solution error +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer i,j,k,m + double precision tmp + double precision u000ijk(5) + do m = 1,5 + errnm(m) = 0.0d+00 + enddo +!DVM$ PARALLEL (k,j,i) ON u(*,i,j,k), PRIVATE (tmp,m,k,u000ijk,i,j),REDU +!DVM$&CTION (sum (errnm)) + do k = 2,nz - 1 + do j = jst,jend + do i = ist,iend + call exact(i,j,k,u000ijk) + do m = 1,5 + tmp = u000ijk(m) - u(m,i,j,k) + errnm(m) = errnm(m) + tmp** 2 + enddo + enddo + enddo + enddo + do m = 1,5 + errnm(m) = sqrt (errnm(m) / ((nx0 - 2) * (ny0 - 2) * (nz0 - 2)) + &) + enddo + +! write (*,1002) ( errnm(m), m = 1, 5 ) +1002 format (1x/1x,'RMS-norm of error in soln. to ', 'first pde = ',1p + &e12.5/, 1x,'RMS-norm of error in soln. to ', 'second pde = ',1pe12 + &.5/, 1x,'RMS-norm of error in soln. to ', 'third pde = ',1pe12.5/ + &, 1x,'RMS-norm of error in soln. to ', 'fourth pde = ',1pe12.5/, 1 + &x,'RMS-norm of error in soln. to ', 'fifth pde = ',1pe12.5) + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/exact.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/exact.f new file mode 100644 index 0000000..6270604 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/exact.f @@ -0,0 +1,64 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine exact (i, j, k, u000ijk) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! +! compute the exact solution at (i,j,k) +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! input parameters +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer i,j,k + double precision u000ijk(*) + +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- + integer m + double precision xi,eta,zeta + xi = dble (i - 1) / (nx0 - 1) + eta = dble (j - 1) / (ny0 - 1) + zeta = dble (k - 1) / (nz - 1) + do m = 1,5 + u000ijk(m) = ce(m,1) + (ce(m,2) + (ce(m,5) + (ce(m,8) + ce(m,11 + &) * xi) * xi) * xi) * xi + (ce(m,3) + (ce(m,6) + (ce(m,9) + ce(m,1 + &2) * eta) * eta) * eta) * eta + (ce(m,4) + (ce(m,7) + (ce(m,10) + + &ce(m,13) * zeta) * zeta) * zeta) * zeta + enddo + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/l2norm.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/l2norm.f new file mode 100644 index 0000000..83a380f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/l2norm.f @@ -0,0 +1,69 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine l2norm (ldx, ldy, ldz, nx0, ny0, nz0, ist, iend, jst, j + &end, v, sum) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! to compute the l2-norm of vector v. +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! input parameters +!--------------------------------------------------------------------- + integer ldx,ldy,ldz + integer nx0,ny0,nz0 + integer ist,iend + integer jst,jend +!DVM$ INHERIT v +!DVM$ DYNAMIC v + +!--------------------------------------------------------------------- +! To improve cache performance, second two dimensions padded by 1 +! for even number sizes only. Only needed in v. +!--------------------------------------------------------------------- +!DVM$ TEMPLATE, COMMON :: dvmh_temp0(1:6,0:163,0:163,-1:163) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r1(1:6,0:163,0:163,-1:163) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r2(1:6,0:163,0:163,-1:163) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r3(1:6,0:163,0:163,-1:163) +!DVM$ TEMPLATE, COMMON :: dvmh_temp0_r0(1:6,0:163,0:163,-1:163) +!DVM$ DISTRIBUTE dvmh_temp0(*,BLOCK,BLOCK,BLOCK) +!DVM$ DISTRIBUTE dvmh_temp0_r1(*,BLOCK,BLOCK,*) +!DVM$ DISTRIBUTE dvmh_temp0_r2(*,BLOCK,*,BLOCK) +!DVM$ DISTRIBUTE dvmh_temp0_r3(*,*,BLOCK,BLOCK) +!DVM$ DISTRIBUTE dvmh_temp0_r0(*,*,*,BLOCK) +!DVM$ DYNAMIC dvmh_temp0, dvmh_temp0_r1, dvmh_temp0_r2, dvmh_temp0_r3, +!DVM$&dvmh_temp0_r0 + double precision v(5,ldx / 2 * 2 + 1,ldy / 2 * 2 + 1,*),sum(5) + +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- + integer i,j,k,m + do m = 1,5 + sum(m) = 0.0d+00 + enddo +!DVM$ region +!DVM$ PARALLEL (k,j,i,m) ON v(m,i,j,k), PRIVATE (m,j,i,k),REDUCTION (sum +!DVM$& (sum)) + do k = 2,nz0 - 1 + do j = jst,jend + do i = ist,iend + do m = 1,5 + sum(m) = sum(m) + v(m,i,j,k) * v(m,i,j,k) + enddo + enddo + enddo + enddo +!DVM$ end region + do m = 1,5 + sum(m) = sqrt (sum(m) / ((nx0 - 2) * (ny0 - 2) * (nz0 - 2))) + enddo + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/lu.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/lu.f new file mode 100644 index 0000000..6050948 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/lu.f @@ -0,0 +1,212 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! S E R I A L V E R S I O N ! +! ! +! L U ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is a serial version of the NPB LU code. ! +! Refer to NAS Technical Reports 95-020 for details. ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 3.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 3.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/Software/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (650) 604-3957 ! +! ! +!-------------------------------------------------------------------------! +!--------------------------------------------------------------------- +! +! Authors: S. Weeratunga +! V. Venkatakrishnan +! E. Barszcz +! M. Yarrow +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + program applu + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! +! driver for the performance evaluation of the solver for +! five coupled parabolic/elliptic partial differential equations. +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + character class + logical verified + double precision mflops + double precision t,tmax,timer_read,trecs(t_last) + external timer_read + integer i,fstatus + character t_names(t_last)*8 + +!--------------------------------------------------------------------- +! Setup info for timers +!--------------------------------------------------------------------- + open (unit = 2,file = 'timer.flag',status = 'old',iostat = fstatus + &) + if (fstatus .eq. 0) then + timeron = .TRUE. + t_names(t_total) = 'total' + t_names(t_rhsx) = 'rhsx' + t_names(t_rhsy) = 'rhsy' + t_names(t_rhsz) = 'rhsz' + t_names(t_rhs) = 'rhs' + t_names(t_jacld) = 'jacld' + t_names(t_blts) = 'blts' + t_names(t_jacu) = 'jacu' + t_names(t_buts) = 'buts' + t_names(t_add) = 'add' + t_names(t_l2norm) = 'l2norm' + close (unit = 2) + else + timeron = .FALSE. + endif + +!--------------------------------------------------------------------- +! read input data +!--------------------------------------------------------------------- + call read_input() + +!--------------------------------------------------------------------- +! set up domain sizes +!--------------------------------------------------------------------- + call domain() + +!--------------------------------------------------------------------- +! set up coefficients +!--------------------------------------------------------------------- + call setcoeff() + +!--------------------------------------------------------------------- +! set the boundary values for dependent variables +!--------------------------------------------------------------------- + call setbv() + +!--------------------------------------------------------------------- +! set the initial values for dependent variables +!--------------------------------------------------------------------- + call setiv() + +!--------------------------------------------------------------------- +! compute the forcing term based on prescribed exact solution +!--------------------------------------------------------------------- + call erhs() + +!--------------------------------------------------------------------- +! perform one SSOR iteration to touch all pages +!--------------------------------------------------------------------- +!DVM$ actual() + call ssor(1) +!DVM$ get_actual() +!--------------------------------------------------------------------- +! reset the boundary and initial values +!--------------------------------------------------------------------- + call setbv() + call setiv() + +!--------------------------------------------------------------------- +! perform the SSOR iterations +!-------------------------------------------------------------------- +!DVM$ interval 1 +!DVM$ actual() + call ssor(itmax) +!DVM$ get_actual() +!DVM$ end interval +!--------------------------------------------------------------------- +! compute the solution error +!--------------------------------------------------------------------- + call error() + +!--------------------------------------------------------------------- +! compute the surface integral +!--------------------------------------------------------------------- + call pintgr() + +!--------------------------------------------------------------------- +! verification test +!--------------------------------------------------------------------- + call verify(rsdnm,errnm,frc,class,verified) + mflops = float (itmax) * (1984.77 * float (nx0) * float (ny0) * fl + &oat (nz0) - 10923.3 * (float (nx0 + ny0 + nz0) / 3.)** 2 + 27770.9 + & * float (nx0 + ny0 + nz0) / 3. - 144010.) / (maxtime * 1000000.) + call print_results('LU',class,nx0,ny0,nz0,itmax,maxtime,mflops,' + & floating point',verified,npbversion,compiletime,cs1,cs2,cs + &3,cs4,cs5,cs6,'(none)') + +!--------------------------------------------------------------------- +! More timers +!--------------------------------------------------------------------- + if (.not.(timeron)) goto 999 + do i = 1,t_last + trecs(i) = timer_read (i) + enddo + tmax = maxtime + if (tmax .eq. 0.) tmax = 1.0 + write (unit = *,fmt = 800) +800 format(' SECTION Time (secs)') + do i = 1,t_last + write (unit = *,fmt = 810) t_names(i),trecs(i),trecs(i) * 100. + &/ tmax + if (i .eq. t_rhs) then + t = trecs(t_rhsx) + trecs(t_rhsy) + trecs(t_rhsz) + write (unit = *,fmt = 820) 'sub-rhs',t,t * 100. / tmax + t = trecs(i) - t + write (unit = *,fmt = 820) 'rest-rhs',t,t * 100. / tmax + endif +810 format(2x,a8,':',f9.3,' (',f6.2,'%)') +820 format(5x,'--> ',a8,':',f9.3,' (',f6.2,'%)') + enddo +999 continue + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/makeTODO.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/makeTODO.bat new file mode 100644 index 0000000..5e7171a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/makeTODO.bat @@ -0,0 +1,12 @@ +@echo off + +set CLASS=%1 +set OPT=%2 + +CALL ..\sys\setparams LU %CLASS% +CALL %F77% %OPT% -f90 lu 1>out_%CLASS%.txt 2>err_%CLASS%.txt +if exist lu.exe ( + copy lu.exe %BIN%\lu.%CLASS%.x.exe + del lu.exe +) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/old/lu.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/old/lu.fdv new file mode 100644 index 0000000..24b00cc --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/old/lu.fdv @@ -0,0 +1,2993 @@ + +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! D V M H V E R S I O N S ! +! ! +! L U ! +! ! +!-------------------------------------------------------------------------! +!-------------------------------------------------------------------------! +!-------------------------------------------------------------------------! +! +! Authors: +! Original: +! S. Weeratunga +! V. Venkatakrishnan +! E. Barszcz +! M. Yarrow +! Optimize for DVMH: +! Kolganov A.S. +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + program ludv2 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + + include 'npbparams.h' + integer ipr_default + parameter (ipr_default = 1) + double precision omega_default + parameter (omega_default = 1.2d0) + double precision tolrsd1_def,tolrsd2_def,tolrsd3_def,tolrsd4_def,tolrsd5_def + parameter (tolrsd1_def = 1.0e-08,tolrsd2_def = 1.0e-08,tolrsd3_def = 1.0e-08,tolrsd4_def = 1.0e-08,tolrsd5_def = 1.0e-08) + double precision c1,c2,c3,c4,c5 + parameter (c1 = 1.40d+00,c2 = 0.40d+00,c3 = 1.00d-01,c4 = 1.00d+00,c5 = 1.40d+00) + +!--------------------------------------------------------------------- +! grid +!--------------------------------------------------------------------- + integer nx,ny,nz + integer nx0,ny0,nz0 + integer ist,iend + integer jst,jend + integer ii1,ii2 + integer ji1,ji2 + integer ki1,ki2 + integer stage_n + double precision dxi,deta,dzeta + double precision tx1,tx2,tx3 + double precision ty1,ty2,ty3 + double precision tz1,tz2,tz3 + common /cgcon/dxi,deta,dzeta,tx1,tx2,tx3,ty1,ty2,ty3,tz1,tz2,tz3,nx,ny,nz,nx0,ny0,nz0,ist,iend,jst,jend,ii1,ii2,ji1,ji2,ki1,ki& + &2 + +!--------------------------------------------------------------------- +! dissipation +!--------------------------------------------------------------------- + double precision dx1,dx2,dx3,dx4,dx5 + double precision dy1,dy2,dy3,dy4,dy5 + double precision dz1,dz2,dz3,dz4,dz5 + double precision dssp + common /disp/dx1,dx2,dx3,dx4,dx5,dy1,dy2,dy3,dy4,dy5,dz1,dz2,dz3,dz4,dz5,dssp + +!--------------------------------------------------------------------- +! field variables and residuals +! to improve cache performance, second two dimensions padded by 1 +! for even number sizes only. +! Note: corresponding array (called "v") in routines blts, buts, +! and l2norm are similarly padded +!--------------------------------------------------------------------- + double precision u(isiz1 / 2 * 2 + 1,isiz2 / 2 * 2 + 1,isiz3,5),rsd(isiz1 / 2 * 2 + 1,isiz2 / 2 * 2 + 1,isiz3,5),frct(isiz1 /& + & 2 * 2 + 1,isiz2 / 2 * 2 + 1,isiz3,5) + common /cvar/u,rsd,frct + +!--------------------------------------------------------------------- +! output control parameters +!--------------------------------------------------------------------- + integer ipr,inorm + common /cprcon/ipr,inorm + +!--------------------------------------------------------------------- +! newton-raphson iteration control parameters +!--------------------------------------------------------------------- + integer itmax,invert + double precision dt,omega,tolrsd(5),rsdnm(5),errnm(5),frc,ttotal + common /ctscon/dt,omega,tolrsd,rsdnm,errnm,frc,ttotal,itmax,invert + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! coefficients of the exact solution +!--------------------------------------------------------------------- + double precision ce(5,13) + common /cexact/ce + +!--------------------------------------------------------------------- +! multi-processor common blocks +!--------------------------------------------------------------------- + integer id,ndim,num,xdim,ydim,row,col + common /dim/id,ndim,num,xdim,ydim,row,col + integer north,south,east,west + common /neigh/north,south,east,west + integer from_s,from_n,from_e,from_w + parameter (from_s = 1,from_n = 2,from_e = 3,from_w = 4) + integer npmax + parameter (npmax = isiz1 + isiz2) + logical icommn(npmax + 1),icomms(npmax + 1),icomme(npmax + 1),icommw(npmax + 1) + +! double precision buf(5,2*isiz2*isiz3), +! > buf1(5,2*isiz2*isiz3) + common /comm/icommn,icomms,icomme,icommw + double precision maxtime + common /timer/maxtime + +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- + character class + logical verified + double precision mflops + character*24 print_results_142_arg9_7 + character*2 print_results_142_arg1_6 + real float_141_5 + real float_141_4 + real float_141_3 + real float_141_2 + real float_141_1 + real float_141_0 + integer fstatus + double precision max_486_8 + double precision dvtime + integer m + integer k + integer j + double precision rsd_(5) + integer i + integer jglob + integer iglob + integer k__9 + integer j__10 + integer i__11 + double precision dble_739_14 + double precision dble_739_13 + double precision dble_739_12 + double precision zeta + double precision eta + double precision xi + integer m__15 + double precision r1,r2,r3,r4,r5 + double precision dble_739_18,flux_(10),flux__(15) + double precision dble_739_17 + double precision dble_739_16 + double precision ue_ijnz(5) + double precision ue_ij1(5) + double precision ue_iny0k(5) + double precision ue_i1k(5) + double precision ue_nx0jk(5) + double precision ue_1jk(5) + double precision pzeta + double precision peta + double precision pxi + double precision zeta__19 + double precision eta__20 + double precision xi__21 + integer jglob__22 + integer iglob__23 + integer m__24 + integer k__25 + integer j__26 + integer i__27 + double precision dble_739_30 + double precision dble_739_29 + double precision dble_739_28 + double precision u51km1 + double precision u41km1 + double precision u31km1 + double precision u21km1 + double precision u51jm1 + double precision u41jm1 + double precision u31jm1 + double precision u21jm1 + double precision u51im1 + double precision u41im1 + double precision u31im1 + double precision u21im1 + double precision u51k + double precision u41k + double precision u31k + double precision u21k + double precision u51j + double precision u41j + double precision u31j + double precision u21j + double precision u51i + double precision u41i + double precision u31i + double precision u21i + double precision tmp + double precision u41 + double precision u31 + double precision u21 + double precision q + double precision zeta__31 + double precision eta__32 + double precision xi__33 + double precision dsspm + integer jend1 + integer jst1 + integer iend1 + integer ist1 + integer l2 + integer l1 + integer jglob__34 + integer iglob__35 + integer m__36 + integer k__37 + integer j__38 + integer i__39 + integer mod_1150_42 + integer mod_1150_41 + integer mod_1150_40 + double precision delunm(5) + double precision tmp__43 + integer istep + integer l + integer m__44 + integer k__45 + integer j__46 + integer i__47 + double precision u51km1__48 + double precision u41km1__49 + double precision u31km1__50 + double precision u21km1__51 + double precision u51jm1__52 + double precision u41jm1__53 + double precision u31jm1__54 + double precision u21jm1__55 + double precision u51im1__56 + double precision u41im1__57 + double precision u31im1__58 + double precision u21im1__59 + double precision u51k__60 + double precision u41k__61 + double precision u31k__62 + double precision u21k__63 + double precision u51j__64 + double precision u41j__65 + double precision u31j__66 + double precision u21j__67 + double precision u51i__68 + double precision u41i__69 + double precision u31i__70 + double precision u21i__71 + double precision tmp__72 + double precision u41__73 + double precision u31__74 + double precision u21__75 + double precision q__76 + integer jend1__77 + integer jst1__78 + integer iend1__79 + integer ist1__80 + integer l2__81 + integer l1__82 + integer m__83 + integer k__84 + integer j__85 + integer i__86 + integer v_1573_88 + integer v_1573_87 + integer m__89 + integer k__90 + integer j__91 + integer i__92 + double precision start(64) + double precision elapsed(64) + common /tt/start,elapsed + double precision t + real tarray(2) + double precision tmat(5,5) + double precision tv(5) + double precision tmp__93 + integer m__94 + integer j__95 + integer i__96 + double precision tmp3 + double precision tmp2 + double precision tmp1 + double precision tmp_3 + double precision tmp_2 + double precision tmp_1 + double precision c34 + double precision c1345 + double precision r43 + integer k__97 + double precision tmat__98(5,5) + double precision tmp__99 + integer m__100 + integer j__101 + integer i__102 + double precision tmp3__103 + double precision tmp2__104 + double precision tmp1__105 + double precision c34__106 + double precision c1345__107 + double precision r43__108 + integer k__109 + double precision now + double precision t__110 + double precision u000ijk(5) + double precision tmp__111 + integer jglob__112 + integer iglob__113 + integer m__114 + integer k__115 + integer j__116 + integer i__117 + double precision s2 + double precision s1 + double precision frc3 + double precision frc2 + double precision frc1 + integer ind2 + integer ind1 + integer jglob2 + integer jglob1 + integer jglob__118 + integer iglob2 + integer iglob1 + integer iglob__119 + integer jfin1 + integer jfin + integer jbeg + integer ifin1 + integer ifin + integer ibeg + integer k__120 + integer j__121 + integer i__122 + double precision dabs_1966_123 + integer m__124 + double precision dtref + double precision epsilon + double precision xcidif + double precision xcedif(5) + double precision xcrdif(5) + double precision xciref + double precision xceref(5) + double precision xcrref(5) + character*13 size + integer j__125 + integer touch +130 format(//' Please send the results of this run to:'// ' NPB Development Team '/ ' Internet: npb@nas.nasa& + &.gov'/ ' '/ ' If email is not available, send this to:'// ' MS T27A-1'/ ' NASA Ame& + &s Research Center'/ ' Moffett Field, CA 94035-1000'// ' Fax: 415-604-3957'//) +13 format(' Version = ', 12x, a12) +12 format(' Verification = ', 12x, a) +11 format(' Operation type = ', a24) +9 format(' Mop/s total = ',12x, f12.2) +6 format(' Time in seconds = ',12x, f12.2) +5 format(' Iterations = ', 12x, i12) +4 format(' Size = ',12x, i3,'x',i3,'x',i3) +44 format(' Size = ',12x, i12) +42 format(' Size = ',12x, a14) +3 format(' Class = ', 12x, a12) +2 format(//, ' ', A2, ' Benchmark Completed.') +2021 format(' Verification failed') +2020 format(' Verification Successful') +2023 format(' No verification performed') +2022 format(' No reference values provided') +2032 format(' ', 4x, E20.13, E20.13, E20.13) +2031 format(' FAILURE: ', 4x, E20.13, E20.13, E20.13) +2030 format(' ', 4x, E20.13) +2026 format(' Surface integral') +2025 format(' Comparison of surface integral') +2015 format(' ', i2, 2x, E20.13) +2011 format(' ', i2, 2x, E20.13, E20.13, E20.13) +2010 format(' FAILURE: ', i2, 2x, E20.13, E20.13, E20.13) +2006 format(' RMS-norms of solution error') +2062 format(' Comparison of RMS-norms of solution error') +2005 format(' RMS-norms of residual') +2061 format(' Comparison of RMS-norms of residual') +1995 format(' Unknown class') +2060 format(' DT does not match the reference value of ', E15.8) +2000 format(' Accuracy setting for epsilon = ', E20.13) +1990 format(/, ' Verification being performed for class ', a) + +! write (*,1001) frc +2058 format (//5x,'surface integral = ',1pe12.5//) + +! write (*,1002) ( errnm(m), m = 1, 5 ) +2056 format (1x/1x,'RMS-norm of error in soln. to ', 'first pde = ',1pe12.5/, 1x,'RMS-norm of error in soln. to ', 'second pde = '& + &,1pe12.5/, 1x,'RMS-norm of error in soln. to ', 'third pde = ',1pe12.5/, 1x,'RMS-norm of error in soln. to ', 'fourth pde = '& + &,1pe12.5/, 1x,'RMS-norm of error in soln. to ', 'fifth pde = ',1pe12.5) +1007 format (1x/1x,'RMS-norm of steady-state residual for ', 'first pde = ',1pe12.5/, 1x,'RMS-norm of steady-state residual for ',& + & 'second pde = ',1pe12.5/, 1x,'RMS-norm of steady-state residual for ', 'third pde = ',1pe12.5/, 1x,'RMS-norm of steady-state& + & residual for ', 'fourth pde = ',1pe12.5/, 1x,'RMS-norm of steady-state residual for ', 'fifth pde = ',1pe12.5) +1006 format (1x/1x,'RMS-norm of SSOR-iteration correction ', 'for first pde = ',1pe12.5/, 1x,'RMS-norm of SSOR-iteration correctio& + &n ', 'for second pde = ',1pe12.5/, 1x,'RMS-norm of SSOR-iteration correction ', 'for third pde = ',1pe12.5/, 1x,'RMS-norm of & + &SSOR-iteration correction ', 'for fourth pde = ',1pe12.5/, 1x,'RMS-norm of SSOR-iteration correction ', 'for fifth pde = ',1p& + &e12.5) +1004 format (1x/1x,'convergence was achieved after ',i4, ' pseudo-time steps' ) +2044 format (1x/5x,'pseudo-time SSOR iteration no.=',i4/) +200 format(' Time step ', i4) +201 format(' stage step ', E20.13, ' stage = ', i4) +2036 format (5x,'SUBDOMAIN SIZE IS TOO LARGE - ', /5x,'ADJUST PROBLEM SIZE OR NUMBER OF PROCESSORS', /5x,'SO THAT NX,& + & NY AND NZ ARE LESS THAN OR EQUAL TO ', /5x,'ISIZ1, ISIZ2 AND ISIZ3 RESPECTIVELY. THEY ARE', /5x,'CURRENTLY', 3& + &I4) +2035 format (5x,'SUBDOMAIN SIZE IS TOO SMALL - ', /5x,'ADJUST PROBLEM SIZE OR NUMBER OF PROCESSORS', /5x,'SO THAT NX,& + & NY AND NZ ARE GREATER THAN OR EQUAL', /5x,'TO 4 THEY ARE CURRENTLY', 3I3) +1003 format(' Number of processes: ', i5, /) +1002 format(' Iterations: ', i3) +1001 format(' Size: ', i3, 'x', i3, 'x', i3) +1000 format(//,' NAS Parallel Benchmarks 3.3- DVMH version', ' - LU Benchmark', /) +2002 format (5x,'PROBLEM SIZE IS TOO LARGE - ', /5x,'NX, NY AND NZ SHOULD BE EQUAL TO ', /5x,'ISIZ1, ISIZ2 AND & + &ISIZ3 RESPECTIVELY') +2001 format (5x,'PROBLEM SIZE IS TOO SMALL - ', /5x,'SET EACH OF NX, NY AND NZ AT LEAST EQUAL TO 5') +!DVM$ DISTRIBUTE ( BLOCK , BLOCK , BLOCK ,*):: rsd +!DVM$ ALIGN (i__96,j__95,k__97,m__36) WITH rsd(i__96,j__95,k__97,m__36) :: frct +!DVM$ ALIGN (i__96,j__95,k__97,m__83) WITH rsd(i__96,j__95,k__97,m__83) :: u +!DVM$ SHADOW rsd( 2:2,2:2,2:2,1:1 ) +!DVM$ SHADOW frct( 2:2,2:2,2:2,1:1 ) +!DVM$ SHADOW u( 2:2,2:2,2:2,1:1 ) + write (unit = *,fmt = 1000) + open (unit = 3,file = 'inputlu.data',status = 'old',access = 'sequential',form = 'formatted',iostat = fstatus) + if (fstatus .eq. 0) then + write (unit = *,fmt = *) ' Reading from input file inputlu.data' + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) ipr,inorm + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) itmax + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) dt + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) omega + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) tolrsd(1),tolrsd(2),tolrsd(3),tolrsd(4),tolrsd(5) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) nx0,ny0,nz0 + close (unit = 3) + else + ipr = ipr_default + inorm = inorm_default + itmax = itmax_default + dt = dt_default + omega = omega_default + tolrsd(1) = tolrsd1_def + tolrsd(2) = tolrsd2_def + tolrsd(3) = tolrsd3_def + tolrsd(4) = tolrsd4_def + tolrsd(5) = tolrsd5_def + nx0 = isiz1 + ny0 = isiz2 + nz0 = isiz3 + endif + if (nx0 .lt. 4 .or. ny0 .lt. 4 .or. nz0 .lt. 4) then + write (unit = *,fmt = 2001) + stop + endif + if (nx0 .gt. isiz1 .or. ny0 .gt. isiz2 .or. nz0 .gt. isiz3) then + write (unit = *,fmt = 2002) + stop + endif + write (unit = *,fmt = 1001) nx0,ny0,nz0 + write (unit = *,fmt = 1002) itmax + nx = nx0 + ny = ny0 + nz = nz0 + if (nx .lt. 4 .or. ny .lt. 4 .or. nz .lt. 4) then + write (unit = *,fmt = 2035) nx,ny,nz + stop + endif + if (nx .gt. isiz1 .or. ny .gt. isiz2 .or. nz .gt. isiz3) then + write (unit = *,fmt = 2036) nx,ny,nz + stop + endif + touch = 1 + ist = 2 + iend = nx - 1 + jst = 2 + jend = ny - 1 + dxi = 1.0d+00 / (nx0 - 1) + deta = 1.0d+00 / (ny0 - 1) + dzeta = 1.0d+00 / (nz0 - 1) + tx1 = 1.0d+00 / (dxi * dxi) + tx2 = 1.0d+00 / (2.0d+00 * dxi) + tx3 = 1.0d+00 / dxi + ty1 = 1.0d+00 / (deta * deta) + ty2 = 1.0d+00 / (2.0d+00 * deta) + ty3 = 1.0d+00 / deta + tz1 = 1.0d+00 / (dzeta * dzeta) + tz2 = 1.0d+00 / (2.0d+00 * dzeta) + tz3 = 1.0d+00 / dzeta + ii1 = 2 + ii2 = nx0 - 1 + ji1 = 2 + ji2 = ny0 - 2 + ki1 = 3 + ki2 = nz0 - 1 + dx1 = 0.75d+00 + dx2 = dx1 + dx3 = dx1 + dx4 = dx1 + dx5 = dx1 + dy1 = 0.75d+00 + dy2 = dy1 + dy3 = dy1 + dy4 = dy1 + dy5 = dy1 + dz1 = 1.00d+00 + dz2 = dz1 + dz3 = dz1 + dz4 = dz1 + dz5 = dz1 + max_486_8 = max (dx1,dy1,dz1) + dssp = max_486_8 / 4.0d+00 +10001 ce(1,1) = 2.0d+00 + ce(1,2) = 0.0d+00 + ce(1,3) = 0.0d+00 + ce(1,4) = 4.0d+00 + ce(1,5) = 5.0d+00 + ce(1,6) = 3.0d+00 + ce(1,7) = 5.0d-01 + ce(1,8) = 2.0d-02 + ce(1,9) = 1.0d-02 + ce(1,10) = 3.0d-02 + ce(1,11) = 5.0d-01 + ce(1,12) = 4.0d-01 + ce(1,13) = 3.0d-01 + ce(2,1) = 1.0d+00 + ce(2,2) = 0.0d+00 + ce(2,3) = 0.0d+00 + ce(2,4) = 0.0d+00 + ce(2,5) = 1.0d+00 + ce(2,6) = 2.0d+00 + ce(2,7) = 3.0d+00 + ce(2,8) = 1.0d-02 + ce(2,9) = 3.0d-02 + ce(2,10) = 2.0d-02 + ce(2,11) = 4.0d-01 + ce(2,12) = 3.0d-01 + ce(2,13) = 5.0d-01 + ce(3,1) = 2.0d+00 + ce(3,2) = 2.0d+00 + ce(3,3) = 0.0d+00 + ce(3,4) = 0.0d+00 + ce(3,5) = 0.0d+00 + ce(3,6) = 2.0d+00 + ce(3,7) = 3.0d+00 + ce(3,8) = 4.0d-02 + ce(3,9) = 3.0d-02 + ce(3,10) = 5.0d-02 + ce(3,11) = 3.0d-01 + ce(3,12) = 5.0d-01 + ce(3,13) = 4.0d-01 + ce(4,1) = 2.0d+00 + ce(4,2) = 2.0d+00 + ce(4,3) = 0.0d+00 + ce(4,4) = 0.0d+00 + ce(4,5) = 0.0d+00 + ce(4,6) = 2.0d+00 + ce(4,7) = 3.0d+00 + ce(4,8) = 3.0d-02 + ce(4,9) = 5.0d-02 + ce(4,10) = 4.0d-02 + ce(4,11) = 2.0d-01 + ce(4,12) = 1.0d-01 + ce(4,13) = 3.0d-01 + ce(5,1) = 5.0d+00 + ce(5,2) = 4.0d+00 + ce(5,3) = 3.0d+00 + ce(5,4) = 2.0d+00 + ce(5,5) = 1.0d-01 + ce(5,6) = 4.0d-01 + ce(5,7) = 3.0d-01 + ce(5,8) = 5.0d-02 + ce(5,9) = 4.0d-02 + ce(5,10) = 3.0d-02 + ce(5,11) = 1.0d-01 + ce(5,12) = 3.0d-01 + ce(5,13) = 2.0d-01 +!DVM$ REGION +!DVM$ PARALLEL (k,j,i) ON u(i,j,k,*),PRIVATE (m) + do k = 1,isiz3 + do j = 1,isiz2 / 2 * 2 + 1 + do i = 1,isiz1 / 2 * 2 + 1 + do m = 1,5 + u(i,j,k,m) = 0.d0 + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__9,j__10,i__11) ON u(i__11,j__10,k__9,*),PRIVATE (m__15,jglob,iglob,dble_739_12,dble_739_13,dble_739_14,xi,eta,zet& +!DVM$&a) + do k__9 = 1,1 + do j__10 = 1,ny + do i__11 = 1,nx + jglob = j__10 + iglob = i__11 + dble_739_12 = dble (iglob - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (1 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + u(i__11,j__10,k__9,m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) & + &* xi * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta +& + & ce(m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * & + &zeta * zeta * zeta * zeta + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__9,j__10,i__11) ON u(i__11,j__10,k__9,*),PRIVATE (m__15,jglob,iglob,dble_739_12,dble_739_13,dble_739_14,xi,eta,zet& +!DVM$&a) + do k__9 = nz,nz + do j__10 = 1,ny + do i__11 = 1,nx + jglob = j__10 + iglob = i__11 + dble_739_12 = dble (iglob - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (nz - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + u(i__11,j__10,k__9,m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) & + &* xi * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta +& + & ce(m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * & + &zeta * zeta * zeta * zeta + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__9,j__10,i__11) ON u(i__11,j__10,k__9,*),PRIVATE (m__15,iglob,dble_739_12,dble_739_13,dble_739_14,xi,eta,zeta) + do k__9 = 1,nz + do j__10 = 1,1 + do i__11 = 1,nx + iglob = i__11 + dble_739_12 = dble (iglob - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (1 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__9 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + u(i__11,j__10,k__9,m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) & + &* xi * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta +& + & ce(m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * & + &zeta * zeta * zeta * zeta + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__9,j__10,i__11) ON u(i__11,j__10,k__9,*),PRIVATE (m__15,iglob,dble_739_12,dble_739_13,dble_739_14,xi,eta,zeta) + do k__9 = 1,nz + do j__10 = ny,ny + do i__11 = 1,nx + iglob = i__11 + dble_739_12 = dble (iglob - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (ny0 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__9 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + u(i__11,j__10,k__9,m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) & + &* xi * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta +& + & ce(m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * & + &zeta * zeta * zeta * zeta + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__9,j__10,i__11) ON u(i__11,j__10,k__9,*),PRIVATE (m__15,jglob,dble_739_12,dble_739_13,dble_739_14,xi,eta,zeta) + do k__9 = 1,nz + do j__10 = 1,ny + do i__11 = 1,1 + jglob = j__10 + dble_739_12 = dble (1 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__9 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + u(i__11,j__10,k__9,m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) & + &* xi * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta +& + & ce(m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * & + &zeta * zeta * zeta * zeta + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__9,j__10,i__11) ON u(i__11,j__10,k__9,*),PRIVATE (m__15,jglob,dble_739_12,dble_739_13,dble_739_14,xi,eta,zeta) + do k__9 = 1,nz + do j__10 = 1,ny + do i__11 = nx,nx + jglob = j__10 + dble_739_12 = dble (nx0 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__9 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + u(i__11,j__10,k__9,m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) & + &* xi * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta +& + & ce(m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * & + &zeta * zeta * zeta * zeta + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__25,j__26,i__27) ON u(i__27,j__26,k__25,*),PRIVATE (m__24,m__15,ue_ij1,ue_iny0k,ue_i1k,ue_nx0jk,ue_1jk,ue_ijnz,eta& +!DVM$&__20,pxi,peta,pzeta,xi__21,zeta__19,iglob__23,jglob__22,dble_739_16,dble_739_17,dble_739_18,dble_739_12,dble_739_13,dble_739_1& +!DVM$&4,xi,eta,zeta) + do k__25 = 2,nz - 1 + do j__26 = 1,ny + do i__27 = 1,nx + jglob__22 = j__26 + dble_739_16 = dble (k__25 - 1) + zeta__19 = dble_739_16 / (nz - 1) + if (jglob__22 .ne. 1 .and. jglob__22 .ne. ny0) then + dble_739_17 = dble (jglob__22 - 1) + eta__20 = dble_739_17 / (ny0 - 1) + iglob__23 = i__27 + if (iglob__23 .ne. 1 .and. iglob__23 .ne. nx0) then + dble_739_18 = dble (iglob__23 - 1) + xi__21 = dble_739_18 / (nx0 - 1) + dble_739_12 = dble (1 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob__22 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__25 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + ue_1jk(m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) * xi *& + & xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta + ce(m_& + &_15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * zeta *& + & zeta * zeta * zeta + enddo + dble_739_12 = dble (nx0 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob__22 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__25 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + ue_nx0jk(m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) * xi& + & * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta + ce(& + &m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * zeta& + & * zeta * zeta * zeta + enddo + dble_739_12 = dble (iglob__23 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (1 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__25 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + ue_i1k(m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) * xi *& + & xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta + ce(m_& + &_15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * zeta *& + & zeta * zeta * zeta + enddo + dble_739_12 = dble (iglob__23 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (ny0 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__25 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + ue_iny0k(m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) * xi& + & * xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta + ce(& + &m__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * zeta& + & * zeta * zeta * zeta + enddo + dble_739_12 = dble (iglob__23 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob__22 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (1 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + ue_ij1(m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) * xi *& + & xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta + ce(m_& + &_15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * zeta *& + & zeta * zeta * zeta + enddo + dble_739_12 = dble (iglob__23 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob__22 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (nz - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + ue_ijnz(m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) * xi & + &* xi + ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta + ce(m& + &__15,10) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * zeta & + &* zeta * zeta * zeta + enddo + do m__24 = 1,5 + pxi = (1.0d+00 - xi__21) * ue_1jk(m__24) + xi__21 * ue_nx0jk(m__24) + peta = (1.0d+00 - eta__20) * ue_i1k(m__24) + eta__20 * ue_iny0k(m__24) + pzeta = (1.0d+00 - zeta__19) * ue_ij1(m__24) + zeta__19 * ue_ijnz(m__24) + u(i__27,j__26,k__25,m__24) = pxi + peta + pzeta - pxi * peta - peta * pzeta - pzeta * pxi + pxi * peta * pze& + &ta + enddo + endif + endif + enddo + enddo + enddo +!DVM$ END REGION + dsspm = dssp +!DVM$ REGION +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + do k__37 = 1,nz + do j__38 = 1,ny + do i__39 = 1,nx + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = 0.0d+00 + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON rsd(i__39,j__38,k__37,*),PRIVATE (jglob__34,iglob__35,dble_739_28,dble_739_29,dble_739_30,eta_& +!DVM$&_32,zeta__31,xi__33,m__36) + do k__37 = 1,nz + do j__38 = 1,ny + do i__39 = 1,nx + jglob__34 = j__38 + dble_739_28 = dble (jglob__34 - 1) + eta__32 = dble_739_28 / (ny0 - 1) + dble_739_29 = dble (k__37 - 1) + zeta__31 = dble_739_29 / (nz - 1) + iglob__35 = i__39 + dble_739_30 = dble (iglob__35 - 1) + xi__33 = dble_739_30 / (nx0 - 1) + do m__36 = 1,5 + rsd(i__39,j__38,k__37,m__36) = ce(m__36,1) + ce(m__36,2) * xi__33 + ce(m__36,3) * eta__32 + ce(m__36,4) * zeta__31& + & + ce(m__36,5) * xi__33 * xi__33 + ce(m__36,6) * eta__32 * eta__32 + ce(m__36,7) * zeta__31 * zeta__31 + ce(m__36,8) * xi__33 & + &* xi__33 * xi__33 + ce(m__36,9) * eta__32 * eta__32 * eta__32 + ce(m__36,10) * zeta__31 * zeta__31 * zeta__31 + ce(m__36,11) *& + & xi__33 * xi__33 * xi__33 * xi__33 + ce(m__36,12) * eta__32 * eta__32 * eta__32 * eta__32 + ce(m__36,13) * zeta__31 * zeta__31& + & * zeta__31 * zeta__31 + enddo + enddo + enddo + enddo +!DVM$ END REGION + l1 = 1 + l2 = nx +!DVM$ REGION +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36,flux_,u21,q),SHADOW_RENEW (rsd(1:1,0:0,0:0,0:0)) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = ist,iend + flux_(1) = rsd(i__39 + 1,j__38,k__37,2) + u21 = rsd(i__39 + 1,j__38,k__37,2) / rsd(i__39 + 1,j__38,k__37,1) + q = 0.50d+00 * (rsd(i__39 + 1,j__38,k__37,2) * rsd(i__39 + 1,j__38,k__37,2) + rsd(i__39 + 1,j__38,k__37,3) * rsd(i__3& + &9 + 1,j__38,k__37,3) + rsd(i__39 + 1,j__38,k__37,4) * rsd(i__39 + 1,j__38,k__37,4)) / rsd(i__39 + 1,j__38,k__37,1) + flux_(2) = rsd(i__39 + 1,j__38,k__37,2) * u21 + c2 * (rsd(i__39 + 1,j__38,k__37,5) - q) + flux_(3) = rsd(i__39 + 1,j__38,k__37,3) * u21 + flux_(4) = rsd(i__39 + 1,j__38,k__37,4) * u21 + flux_(5) = (c1 * rsd(i__39 + 1,j__38,k__37,5) - c2 * q) * u21 + flux_(6) = rsd(i__39 - 1,j__38,k__37,2) + u21 = rsd(i__39 - 1,j__38,k__37,2) / rsd(i__39 - 1,j__38,k__37,1) + q = 0.50d+00 * (rsd(i__39 - 1,j__38,k__37,2) * rsd(i__39 - 1,j__38,k__37,2) + rsd(i__39 - 1,j__38,k__37,3) * rsd(i__3& + &9 - 1,j__38,k__37,3) + rsd(i__39 - 1,j__38,k__37,4) * rsd(i__39 - 1,j__38,k__37,4)) / rsd(i__39 - 1,j__38,k__37,1) + flux_(7) = rsd(i__39 - 1,j__38,k__37,2) * u21 + c2 * (rsd(i__39 - 1,j__38,k__37,5) - q) + flux_(8) = rsd(i__39 - 1,j__38,k__37,3) * u21 + flux_(9) = rsd(i__39 - 1,j__38,k__37,4) * u21 + flux_(10) = (c1 * rsd(i__39 - 1,j__38,k__37,5) - c2 * q) * u21 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - tx2 * (flux_(m__36) - flux_(m__36 + 5)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (tmp,u21i,u31i,u41i,u51i,u21im1,u31im1,u41im1,u51im1,flux_),& +!DVM$&SHADOW_RENEW (rsd(2:2,0:0,0:0,0:0)) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = ist,iend + tmp = 1.0d+00 / rsd(i__39,j__38,k__37,1) + u21i = tmp * rsd(i__39,j__38,k__37,2) + u31i = tmp * rsd(i__39,j__38,k__37,3) + u41i = tmp * rsd(i__39,j__38,k__37,4) + u51i = tmp * rsd(i__39,j__38,k__37,5) + tmp = 1.0d+00 / rsd(i__39 - 1,j__38,k__37,1) + u21im1 = tmp * rsd(i__39 - 1,j__38,k__37,2) + u31im1 = tmp * rsd(i__39 - 1,j__38,k__37,3) + u41im1 = tmp * rsd(i__39 - 1,j__38,k__37,4) + u51im1 = tmp * rsd(i__39 - 1,j__38,k__37,5) + flux_(2) = 4.0d+00 / 3.0d+00 * tx3 * (u21i - u21im1) + flux_(3) = tx3 * (u31i - u31im1) + flux_(4) = tx3 * (u41i - u41im1) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 * (u21i** 2 + u31i** 2 + u41i** 2 - (u21im1** 2 + u31im1** 2 + u41im1& + &** 2)) + 1.0d+00 / 6.0d+00 * tx3 * (u21i** 2 - u21im1** 2) + c1 * c5 * tx3 * (u51i - u51im1) + tmp = 1.0d+00 / rsd(i__39 + 1,j__38,k__37,1) + u21i = tmp * rsd(i__39 + 1,j__38,k__37,2) + u31i = tmp * rsd(i__39 + 1,j__38,k__37,3) + u41i = tmp * rsd(i__39 + 1,j__38,k__37,4) + u51i = tmp * rsd(i__39 + 1,j__38,k__37,5) + tmp = 1.0d+00 / rsd(i__39,j__38,k__37,1) + u21im1 = tmp * rsd(i__39,j__38,k__37,2) + u31im1 = tmp * rsd(i__39,j__38,k__37,3) + u41im1 = tmp * rsd(i__39,j__38,k__37,4) + u51im1 = tmp * rsd(i__39,j__38,k__37,5) + flux_(5 + 2) = 4.0d+00 / 3.0d+00 * tx3 * (u21i - u21im1) + flux_(5 + 3) = tx3 * (u31i - u31im1) + flux_(5 + 4) = tx3 * (u41i - u41im1) + flux_(5 + 5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 * (u21i** 2 + u31i** 2 + u41i** 2 - (u21im1** 2 + u31im1** 2 + u4& + &1im1** 2)) + 1.0d+00 / 6.0d+00 * tx3 * (u21i** 2 - u21im1** 2) + c1 * c5 * tx3 * (u51i - u51im1) + frct(i__39,j__38,k__37,1) = frct(i__39,j__38,k__37,1) + dx1 * tx1 * (rsd(i__39 - 1,j__38,k__37,1) - 2.0d+00 * rsd(i__& + &39,j__38,k__37,1) + rsd(i__39 + 1,j__38,k__37,1)) + frct(i__39,j__38,k__37,2) = frct(i__39,j__38,k__37,2) + tx3 * c3 * c4 * (flux_(5 + 2) - flux_(2)) + dx2 * tx1 * (rsd(& + &i__39 - 1,j__38,k__37,2) - 2.0d+00 * rsd(i__39,j__38,k__37,2) + rsd(i__39 + 1,j__38,k__37,2)) + frct(i__39,j__38,k__37,3) = frct(i__39,j__38,k__37,3) + tx3 * c3 * c4 * (flux_(5 + 3) - flux_(3)) + dx3 * tx1 * (rsd(& + &i__39 - 1,j__38,k__37,3) - 2.0d+00 * rsd(i__39,j__38,k__37,3) + rsd(i__39 + 1,j__38,k__37,3)) + frct(i__39,j__38,k__37,4) = frct(i__39,j__38,k__37,4) + tx3 * c3 * c4 * (flux_(5 + 4) - flux_(4)) + dx4 * tx1 * (rsd(& + &i__39 - 1,j__38,k__37,4) - 2.0d+00 * rsd(i__39,j__38,k__37,4) + rsd(i__39 + 1,j__38,k__37,4)) + frct(i__39,j__38,k__37,5) = frct(i__39,j__38,k__37,5) + tx3 * c3 * c4 * (flux_(5 + 5) - flux_(5)) + dx5 * tx1 * (rsd(& + &i__39 - 1,j__38,k__37,5) - 2.0d+00 * rsd(i__39,j__38,k__37,5) + rsd(i__39 + 1,j__38,k__37,5)) + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = 2,2 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * ((+(5.0d+00)) * rsd(i__39,j__38,k__37,m__3& + &6) - 4.0d+00 * rsd(i__39 + 1,j__38,k__37,m__36) + rsd(i__39 + 2,j__38,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = 3,3 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * ((-(4.0d+00)) * rsd(i__39 - 1,j__38,k__37,& + &m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39 + 1,j__38,k__37,m__36) + rsd(i__39 + 2,j__38,k__37,m__36& + &)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + ist1 = 4 + iend1 = nx - 3 +!DVM$ REGION +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = ist1,iend1 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39 - 2,j__38,k__37,m__36) - 4.0d+0& + &0 * rsd(i__39 - 1,j__38,k__37,m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39 + 1,j__38,k__37,m__36) + r& + &sd(i__39 + 2,j__38,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = nx - 2,nx - 2 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39 - 2,j__38,k__37,m__36) - 4.0d+0& + &0 * rsd(i__39 - 1,j__38,k__37,m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39 + 1,j__38,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = nx - 1,nx - 1 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39 - 2,j__38,k__37,m__36) - 4.0d+0& + &0 * rsd(i__39 - 1,j__38,k__37,m__36) + 5.0d+00 * rsd(i__39,j__38,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + l1 = 1 + l2 = ny +!DVM$ REGION +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),SHADOW_RENEW (rsd(0:0,1:1,0:0,0:0)),PRIVATE (m__36,u31,q,flux_) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = ist,iend + flux_(1) = rsd(i__39,j__38 + 1,k__37,3) + u31 = rsd(i__39,j__38 + 1,k__37,3) / rsd(i__39,j__38 + 1,k__37,1) + q = 0.50d+00 * (rsd(i__39,j__38 + 1,k__37,2) * rsd(i__39,j__38 + 1,k__37,2) + rsd(i__39,j__38 + 1,k__37,3) * rsd(i__3& + &9,j__38 + 1,k__37,3) + rsd(i__39,j__38 + 1,k__37,4) * rsd(i__39,j__38 + 1,k__37,4)) / rsd(i__39,j__38 + 1,k__37,1) + flux_(2) = rsd(i__39,j__38 + 1,k__37,2) * u31 + flux_(3) = rsd(i__39,j__38 + 1,k__37,3) * u31 + c2 * (rsd(i__39,j__38 + 1,k__37,5) - q) + flux_(4) = rsd(i__39,j__38 + 1,k__37,4) * u31 + flux_(5) = (c1 * rsd(i__39,j__38 + 1,k__37,5) - c2 * q) * u31 + flux_(6) = rsd(i__39,j__38 - 1,k__37,3) + u31 = rsd(i__39,j__38 - 1,k__37,3) / rsd(i__39,j__38 - 1,k__37,1) + q = 0.50d+00 * (rsd(i__39,j__38 - 1,k__37,2) * rsd(i__39,j__38 - 1,k__37,2) + rsd(i__39,j__38 - 1,k__37,3) * rsd(i__3& + &9,j__38 - 1,k__37,3) + rsd(i__39,j__38 - 1,k__37,4) * rsd(i__39,j__38 - 1,k__37,4)) / rsd(i__39,j__38 - 1,k__37,1) + flux_(7) = rsd(i__39,j__38 - 1,k__37,2) * u31 + flux_(8) = rsd(i__39,j__38 - 1,k__37,3) * u31 + c2 * (rsd(i__39,j__38 - 1,k__37,5) - q) + flux_(9) = rsd(i__39,j__38 - 1,k__37,4) * u31 + flux_(10) = (c1 * rsd(i__39,j__38 - 1,k__37,5) - c2 * q) * u31 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - ty2 * (flux_(m__36) - flux_(5 + m__36)) + enddo + enddo + enddo + enddo + +!shadow renew all dimentions of rsd +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (tmp,u21j,u31j,u41j,u51j,u21jm1,u31jm1,u41jm1,u51jm1,flux_),& +!DVM$&SHADOW_RENEW (rsd(0:0,2:2,2:2,0:0)) + +!SHADOW_RENEW (rsd(0:0,1:1,0:0,0:0) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = ist,iend + tmp = 1.0d+00 / rsd(i__39,j__38,k__37,1) + u21j = tmp * rsd(i__39,j__38,k__37,2) + u31j = tmp * rsd(i__39,j__38,k__37,3) + u41j = tmp * rsd(i__39,j__38,k__37,4) + u51j = tmp * rsd(i__39,j__38,k__37,5) + tmp = 1.0d+00 / rsd(i__39,j__38 - 1,k__37,1) + u21jm1 = tmp * rsd(i__39,j__38 - 1,k__37,2) + u31jm1 = tmp * rsd(i__39,j__38 - 1,k__37,3) + u41jm1 = tmp * rsd(i__39,j__38 - 1,k__37,4) + u51jm1 = tmp * rsd(i__39,j__38 - 1,k__37,5) + flux_(2) = ty3 * (u21j - u21jm1) + flux_(3) = 4.0d+00 / 3.0d+00 * ty3 * (u31j - u31jm1) + flux_(4) = ty3 * (u41j - u41jm1) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 * (u21j** 2 + u31j** 2 + u41j** 2 - (u21jm1** 2 + u31jm1** 2 + u41jm1& + &** 2)) + 1.0d+00 / 6.0d+00 * ty3 * (u31j** 2 - u31jm1** 2) + c1 * c5 * ty3 * (u51j - u51jm1) + tmp = 1.0d+00 / rsd(i__39,j__38 + 1,k__37,1) + u21j = tmp * rsd(i__39,j__38 + 1,k__37,2) + u31j = tmp * rsd(i__39,j__38 + 1,k__37,3) + u41j = tmp * rsd(i__39,j__38 + 1,k__37,4) + u51j = tmp * rsd(i__39,j__38 + 1,k__37,5) + tmp = 1.0d+00 / rsd(i__39,j__38,k__37,1) + u21jm1 = tmp * rsd(i__39,j__38,k__37,2) + u31jm1 = tmp * rsd(i__39,j__38,k__37,3) + u41jm1 = tmp * rsd(i__39,j__38,k__37,4) + u51jm1 = tmp * rsd(i__39,j__38,k__37,5) + flux_(5 + 2) = ty3 * (u21j - u21jm1) + flux_(5 + 3) = 4.0d+00 / 3.0d+00 * ty3 * (u31j - u31jm1) + flux_(5 + 4) = ty3 * (u41j - u41jm1) + flux_(5 + 5) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 * (u21j** 2 + u31j** 2 + u41j** 2 - (u21jm1** 2 + u31jm1** 2 + u4& + &1jm1** 2)) + 1.0d+00 / 6.0d+00 * ty3 * (u31j** 2 - u31jm1** 2) + c1 * c5 * ty3 * (u51j - u51jm1) + frct(i__39,j__38,k__37,1) = frct(i__39,j__38,k__37,1) + dy1 * ty1 * (rsd(i__39,j__38 - 1,k__37,1) - 2.0d+00 * rsd(i__& + &39,j__38,k__37,1) + rsd(i__39,j__38 + 1,k__37,1)) + frct(i__39,j__38,k__37,2) = frct(i__39,j__38,k__37,2) + ty3 * c3 * c4 * (flux_(5 + 2) - flux_(2)) + dy2 * ty1 * (rsd(& + &i__39,j__38 - 1,k__37,2) - 2.0d+00 * rsd(i__39,j__38,k__37,2) + rsd(i__39,j__38 + 1,k__37,2)) + frct(i__39,j__38,k__37,3) = frct(i__39,j__38,k__37,3) + ty3 * c3 * c4 * (flux_(5 + 3) - flux_(3)) + dy3 * ty1 * (rsd(& + &i__39,j__38 - 1,k__37,3) - 2.0d+00 * rsd(i__39,j__38,k__37,3) + rsd(i__39,j__38 + 1,k__37,3)) + frct(i__39,j__38,k__37,4) = frct(i__39,j__38,k__37,4) + ty3 * c3 * c4 * (flux_(5 + 4) - flux_(4)) + dy4 * ty1 * (rsd(& + &i__39,j__38 - 1,k__37,4) - 2.0d+00 * rsd(i__39,j__38,k__37,4) + rsd(i__39,j__38 + 1,k__37,4)) + frct(i__39,j__38,k__37,5) = frct(i__39,j__38,k__37,5) + ty3 * c3 * c4 * (flux_(5 + 5) - flux_(5)) + dy5 * ty1 * (rsd(& + &i__39,j__38 - 1,k__37,5) - 2.0d+00 * rsd(i__39,j__38,k__37,5) + rsd(i__39,j__38 + 1,k__37,5)) + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!SHADOW_RENEW (rsd(0:0,0:2,0:0,0:0)) + do k__37 = 2,nz - 1 + do j__38 = 2,2 + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * ((+(5.0d+00)) * rsd(i__39,j__38,k__37,m__3& + &6) - 4.0d+00 * rsd(i__39,j__38 + 1,k__37,m__36) + rsd(i__39,j__38 + 2,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!SHADOW_RENEW (rsd(0:0,1:2,0:0,0:0)), + do k__37 = 2,nz - 1 + do j__38 = 3,3 + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * ((-(4.0d+00)) * rsd(i__39,j__38 - 1,k__37,& + &m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39,j__38 + 1,k__37,m__36) + rsd(i__39,j__38 + 2,k__37,m__36& + &)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + jst1 = 4 + jend1 = ny - 3 +!DVM$ REGION +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!SHADOW_RENEW (rsd(0:0,2:2,0:0,0:0)) + do k__37 = 2,nz - 1 + do j__38 = jst1,jend1 + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39,j__38 - 2,k__37,m__36) - 4.0d+0& + &0 * rsd(i__39,j__38 - 1,k__37,m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39,j__38 + 1,k__37,m__36) + r& + &sd(i__39,j__38 + 2,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!SHADOW_RENEW (rsd(0:0,2:1,0:0,0:0)) + do k__37 = 2,nz - 1 + do j__38 = ny - 2,ny - 2 + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39,j__38 - 2,k__37,m__36) - 4.0d+0& + &0 * rsd(i__39,j__38 - 1,k__37,m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39,j__38 + 1,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!SHADOW_RENEW (rsd(0:0,2:0,0:0,0:0)) + do k__37 = 2,nz - 1 + do j__38 = ny - 1,ny - 1 + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39,j__38 - 2,k__37,m__36) - 4.0d+0& + &0 * rsd(i__39,j__38 - 1,k__37,m__36) + 5.0d+00 * rsd(i__39,j__38,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36,u41,q,flux_) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = ist,iend + flux_(1) = rsd(i__39,j__38,k__37 + 1,4) + u41 = rsd(i__39,j__38,k__37 + 1,4) / rsd(i__39,j__38,k__37 + 1,1) + q = 0.50d+00 * (rsd(i__39,j__38,k__37 + 1,2) * rsd(i__39,j__38,k__37 + 1,2) + rsd(i__39,j__38,k__37 + 1,3) * rsd(i__3& + &9,j__38,k__37 + 1,3) + rsd(i__39,j__38,k__37 + 1,4) * rsd(i__39,j__38,k__37 + 1,4)) / rsd(i__39,j__38,k__37 + 1,1) + flux_(2) = rsd(i__39,j__38,k__37 + 1,2) * u41 + flux_(3) = rsd(i__39,j__38,k__37 + 1,3) * u41 + flux_(4) = rsd(i__39,j__38,k__37 + 1,4) * u41 + c2 * (rsd(i__39,j__38,k__37 + 1,5) - q) + flux_(5) = (c1 * rsd(i__39,j__38,k__37 + 1,5) - c2 * q) * u41 + flux_(6) = rsd(i__39,j__38,k__37 - 1,4) + u41 = rsd(i__39,j__38,k__37 - 1,4) / rsd(i__39,j__38,k__37 - 1,1) + q = 0.50d+00 * (rsd(i__39,j__38,k__37 - 1,2) * rsd(i__39,j__38,k__37 - 1,2) + rsd(i__39,j__38,k__37 - 1,3) * rsd(i__3& + &9,j__38,k__37 - 1,3) + rsd(i__39,j__38,k__37 - 1,4) * rsd(i__39,j__38,k__37 - 1,4)) / rsd(i__39,j__38,k__37 - 1,1) + flux_(7) = rsd(i__39,j__38,k__37 - 1,2) * u41 + flux_(8) = rsd(i__39,j__38,k__37 - 1,3) * u41 + flux_(9) = rsd(i__39,j__38,k__37 - 1,4) * u41 + c2 * (rsd(i__39,j__38,k__37 - 1,5) - q) + flux_(10) = (c1 * rsd(i__39,j__38,k__37 - 1,5) - c2 * q) * u41 + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - tz2 * (flux_(m__36) - flux_(5 + m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (tmp,u21k,u31k,u41k,u51k,u21km1,u31km1,u41km1,u51km1,flux_) + +!SHADOW_RENEW (rsd(0:0,0:0,1:1,0:0)) + do k__37 = 2,nz - 1 + do j__38 = jst,jend + do i__39 = ist,iend + tmp = 1.0d+00 / rsd(i__39,j__38,k__37,1) + u21k = tmp * rsd(i__39,j__38,k__37,2) + u31k = tmp * rsd(i__39,j__38,k__37,3) + u41k = tmp * rsd(i__39,j__38,k__37,4) + u51k = tmp * rsd(i__39,j__38,k__37,5) + tmp = 1.0d+00 / rsd(i__39,j__38,k__37 - 1,1) + u21km1 = tmp * rsd(i__39,j__38,k__37 - 1,2) + u31km1 = tmp * rsd(i__39,j__38,k__37 - 1,3) + u41km1 = tmp * rsd(i__39,j__38,k__37 - 1,4) + u51km1 = tmp * rsd(i__39,j__38,k__37 - 1,5) + flux_(2) = tz3 * (u21k - u21km1) + flux_(3) = tz3 * (u31k - u31km1) + flux_(4) = 4.0d+00 / 3.0d+00 * tz3 * (u41k - u41km1) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 * (u21k** 2 + u31k** 2 + u41k** 2 - (u21km1** 2 + u31km1** 2 + u41km1& + &** 2)) + 1.0d+00 / 6.0d+00 * tz3 * (u41k** 2 - u41km1** 2) + c1 * c5 * tz3 * (u51k - u51km1) + tmp = 1.0d+00 / rsd(i__39,j__38,k__37 + 1,1) + u21k = tmp * rsd(i__39,j__38,k__37 + 1,2) + u31k = tmp * rsd(i__39,j__38,k__37 + 1,3) + u41k = tmp * rsd(i__39,j__38,k__37 + 1,4) + u51k = tmp * rsd(i__39,j__38,k__37 + 1,5) + tmp = 1.0d+00 / rsd(i__39,j__38,k__37,1) + u21km1 = tmp * rsd(i__39,j__38,k__37,2) + u31km1 = tmp * rsd(i__39,j__38,k__37,3) + u41km1 = tmp * rsd(i__39,j__38,k__37,4) + u51km1 = tmp * rsd(i__39,j__38,k__37,5) + flux_(5 + 2) = tz3 * (u21k - u21km1) + flux_(5 + 3) = tz3 * (u31k - u31km1) + flux_(5 + 4) = 4.0d+00 / 3.0d+00 * tz3 * (u41k - u41km1) + flux_(5 + 5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 * (u21k** 2 + u31k** 2 + u41k** 2 - (u21km1** 2 + u31km1** 2 + u4& + &1km1** 2)) + 1.0d+00 / 6.0d+00 * tz3 * (u41k** 2 - u41km1** 2) + c1 * c5 * tz3 * (u51k - u51km1) + frct(i__39,j__38,k__37,1) = frct(i__39,j__38,k__37,1) + dz1 * tz1 * (rsd(i__39,j__38,k__37 + 1,1) - 2.0d+00 * rsd(i__& + &39,j__38,k__37,1) + rsd(i__39,j__38,k__37 - 1,1)) + frct(i__39,j__38,k__37,2) = frct(i__39,j__38,k__37,2) + tz3 * c3 * c4 * (flux_(5 + 2) - flux_(2)) + dz2 * tz1 * (rsd(& + &i__39,j__38,k__37 + 1,2) - 2.0d+00 * rsd(i__39,j__38,k__37,2) + rsd(i__39,j__38,k__37 - 1,2)) + frct(i__39,j__38,k__37,3) = frct(i__39,j__38,k__37,3) + tz3 * c3 * c4 * (flux_(5 + 3) - flux_(3)) + dz3 * tz1 * (rsd(& + &i__39,j__38,k__37 + 1,3) - 2.0d+00 * rsd(i__39,j__38,k__37,3) + rsd(i__39,j__38,k__37 - 1,3)) + frct(i__39,j__38,k__37,4) = frct(i__39,j__38,k__37,4) + tz3 * c3 * c4 * (flux_(5 + 4) - flux_(4)) + dz4 * tz1 * (rsd(& + &i__39,j__38,k__37 + 1,4) - 2.0d+00 * rsd(i__39,j__38,k__37,4) + rsd(i__39,j__38,k__37 - 1,4)) + frct(i__39,j__38,k__37,5) = frct(i__39,j__38,k__37,5) + tz3 * c3 * c4 * (flux_(5 + 5) - flux_(5)) + dz5 * tz1 * (rsd(& + &i__39,j__38,k__37 + 1,5) - 2.0d+00 * rsd(i__39,j__38,k__37,5) + rsd(i__39,j__38,k__37 - 1,5)) + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!, SHADOW_RENEW (rsd(0:0,0:0,0:2,0:0)) + do k__37 = 2,2 + do j__38 = jst,jend + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * ((+(5.0d+00)) * rsd(i__39,j__38,k__37,m__3& + &6) - 4.0d+00 * rsd(i__39,j__38,k__37 + 1,m__36) + rsd(i__39,j__38,k__37 + 2,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!, SHADOW_RENEW (rsd(0:0,0:0,1:2,0:0)) + do k__37 = 3,3 + do j__38 = jst,jend + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * ((-(4.0d+00)) * rsd(i__39,j__38,k__37 - 1,& + &m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39,j__38,k__37 + 1,m__36) + rsd(i__39,j__38,k__37 + 2,m__36& + &)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!, SHADOW_RENEW (rsd(0:0,0:0,2:2,0:0)) + do k__37 = 4,nz - 3 + do j__38 = jst,jend + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39,j__38,k__37 - 2,m__36) - 4.0d+0& + &0 * rsd(i__39,j__38,k__37 - 1,m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39,j__38,k__37 + 1,m__36) + r& + &sd(i__39,j__38,k__37 + 2,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!, SHADOW_RENEW (rsd(0:0,0:0,2:1,0:0)) + do k__37 = nz - 2,nz - 2 + do j__38 = jst,jend + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39,j__38,k__37 - 2,m__36) - 4.0d+0& + &0 * rsd(i__39,j__38,k__37 - 1,m__36) + 6.0d+00 * rsd(i__39,j__38,k__37,m__36) - 4.0d+00 * rsd(i__39,j__38,k__37 + 1,m__36)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__37,j__38,i__39) ON frct(i__39,j__38,k__37,*),PRIVATE (m__36) + +!, SHADOW_RENEW (rsd(0:0,0:0,2:0,0:0)) + do k__37 = nz - 1,nz - 1 + do j__38 = jst,jend + do i__39 = ist,iend + do m__36 = 1,5 + frct(i__39,j__38,k__37,m__36) = frct(i__39,j__38,k__37,m__36) - dsspm * (rsd(i__39,j__38,k__37 - 2,m__36) - 4.0d+0& + &0 * rsd(i__39,j__38,k__37 - 1,m__36) + 5.0d+00 * rsd(i__39,j__38,k__37,m__36)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + tmp__43 = 1.0d+00 / (omega * (2.0d+00 - omega)) +!DVM$ REGION +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + do k__84 = 1,nz + do j__85 = 1,ny + do i__86 = 1,nx + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = (-(frct(i__86,j__85,k__84,m__83))) + enddo + enddo + enddo + enddo +!DVM$ END REGION + l1__82 = 1 + l2__81 = nx +!DVM$ REGION +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83,u21__75,q__76,flux_),SHADOW_RENEW (u(1:1,0:0,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = ist,iend + flux_(1) = u(i__86 + 1,j__85,k__84,2) + u21__75 = u(i__86 + 1,j__85,k__84,2) / u(i__86 + 1,j__85,k__84,1) + q__76 = 0.50d+00 * (u(i__86 + 1,j__85,k__84,2) * u(i__86 + 1,j__85,k__84,2) + u(i__86 + 1,j__85,k__84,3) * u(i__86 + & + &1,j__85,k__84,3) + u(i__86 + 1,j__85,k__84,4) * u(i__86 + 1,j__85,k__84,4)) / u(i__86 + 1,j__85,k__84,1) + flux_(2) = u(i__86 + 1,j__85,k__84,2) * u21__75 + c2 * (u(i__86 + 1,j__85,k__84,5) - q__76) + flux_(3) = u(i__86 + 1,j__85,k__84,3) * u21__75 + flux_(4) = u(i__86 + 1,j__85,k__84,4) * u21__75 + flux_(5) = (c1 * u(i__86 + 1,j__85,k__84,5) - c2 * q__76) * u21__75 + flux_(6) = u(i__86 - 1,j__85,k__84,2) + u21__75 = u(i__86 - 1,j__85,k__84,2) / u(i__86 - 1,j__85,k__84,1) + q__76 = 0.50d+00 * (u(i__86 - 1,j__85,k__84,2) * u(i__86 - 1,j__85,k__84,2) + u(i__86 - 1,j__85,k__84,3) * u(i__86 - & + &1,j__85,k__84,3) + u(i__86 - 1,j__85,k__84,4) * u(i__86 - 1,j__85,k__84,4)) / u(i__86 - 1,j__85,k__84,1) + flux_(7) = u(i__86 - 1,j__85,k__84,2) * u21__75 + c2 * (u(i__86 - 1,j__85,k__84,5) - q__76) + flux_(8) = u(i__86 - 1,j__85,k__84,3) * u21__75 + flux_(9) = u(i__86 - 1,j__85,k__84,4) * u21__75 + flux_(10) = (c1 * u(i__86 - 1,j__85,k__84,5) - c2 * q__76) * u21__75 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - tx2 * (flux_(m__83) - flux_(5 + m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (u21i__71,u31i__70,u41i__69,u51i__68,tmp__72,u21im1__59,u31im& +!DVM$&1__58,u41im1__57,u51im1__56,flux_),SHADOW_RENEW (u(2:2,0:0,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = ist,iend + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21i__71 = tmp__72 * u(i__86,j__85,k__84,2) + u31i__70 = tmp__72 * u(i__86,j__85,k__84,3) + u41i__69 = tmp__72 * u(i__86,j__85,k__84,4) + u51i__68 = tmp__72 * u(i__86,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86 - 1,j__85,k__84,1) + u21im1__59 = tmp__72 * u(i__86 - 1,j__85,k__84,2) + u31im1__58 = tmp__72 * u(i__86 - 1,j__85,k__84,3) + u41im1__57 = tmp__72 * u(i__86 - 1,j__85,k__84,4) + u51im1__56 = tmp__72 * u(i__86 - 1,j__85,k__84,5) + flux_(2) = 4.0d+00 / 3.0d+00 * tx3 * (u21i__71 - u21im1__59) + flux_(3) = tx3 * (u31i__70 - u31im1__58) + flux_(4) = tx3 * (u41i__69 - u41im1__57) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 * (u21i__71** 2 + u31i__70** 2 + u41i__69** 2 - (u21im1__59** 2 + u31& + &im1__58** 2 + u41im1__57** 2)) + 1.0d+00 / 6.0d+00 * tx3 * (u21i__71** 2 - u21im1__59** 2) + c1 * c5 * tx3 * (u51i__68 - u51im& + &1__56) + tmp__72 = 1.0d+00 / u(i__86 + 1,j__85,k__84,1) + u21i__71 = tmp__72 * u(i__86 + 1,j__85,k__84,2) + u31i__70 = tmp__72 * u(i__86 + 1,j__85,k__84,3) + u41i__69 = tmp__72 * u(i__86 + 1,j__85,k__84,4) + u51i__68 = tmp__72 * u(i__86 + 1,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21im1__59 = tmp__72 * u(i__86,j__85,k__84,2) + u31im1__58 = tmp__72 * u(i__86,j__85,k__84,3) + u41im1__57 = tmp__72 * u(i__86,j__85,k__84,4) + u51im1__56 = tmp__72 * u(i__86,j__85,k__84,5) + flux_(5 + 2) = 4.0d+00 / 3.0d+00 * tx3 * (u21i__71 - u21im1__59) + flux_(5 + 3) = tx3 * (u31i__70 - u31im1__58) + flux_(5 + 4) = tx3 * (u41i__69 - u41im1__57) + flux_(5 + 5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 * (u21i__71** 2 + u31i__70** 2 + u41i__69** 2 - (u21im1__59** 2 +& + & u31im1__58** 2 + u41im1__57** 2)) + 1.0d+00 / 6.0d+00 * tx3 * (u21i__71** 2 - u21im1__59** 2) + c1 * c5 * tx3 * (u51i__68 - u& + &51im1__56) + rsd(i__86,j__85,k__84,1) = rsd(i__86,j__85,k__84,1) + dx1 * tx1 * (u(i__86 - 1,j__85,k__84,1) - 2.0d+00 * u(i__86,j__& + &85,k__84,1) + u(i__86 + 1,j__85,k__84,1)) + rsd(i__86,j__85,k__84,2) = rsd(i__86,j__85,k__84,2) + tx3 * c3 * c4 * (flux_(5 + 2) - flux_(2)) + dx2 * tx1 * (u(i__8& + &6 - 1,j__85,k__84,2) - 2.0d+00 * u(i__86,j__85,k__84,2) + u(i__86 + 1,j__85,k__84,2)) + rsd(i__86,j__85,k__84,3) = rsd(i__86,j__85,k__84,3) + tx3 * c3 * c4 * (flux_(5 + 3) - flux_(3)) + dx3 * tx1 * (u(i__8& + &6 - 1,j__85,k__84,3) - 2.0d+00 * u(i__86,j__85,k__84,3) + u(i__86 + 1,j__85,k__84,3)) + rsd(i__86,j__85,k__84,4) = rsd(i__86,j__85,k__84,4) + tx3 * c3 * c4 * (flux_(5 + 4) - flux_(4)) + dx4 * tx1 * (u(i__8& + &6 - 1,j__85,k__84,4) - 2.0d+00 * u(i__86,j__85,k__84,4) + u(i__86 + 1,j__85,k__84,4)) + rsd(i__86,j__85,k__84,5) = rsd(i__86,j__85,k__84,5) + tx3 * c3 * c4 * (flux_(5 + 5) - flux_(5)) + dx5 * tx1 * (u(i__8& + &6 - 1,j__85,k__84,5) - 2.0d+00 * u(i__86,j__85,k__84,5) + u(i__86 + 1,j__85,k__84,5)) + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = 2,2 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * ((+(5.0d+00)) * u(i__86,j__85,k__84,m__83) - & + &4.0d+00 * u(i__86 + 1,j__85,k__84,m__83) + u(i__86 + 2,j__85,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = 3,3 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * ((-(4.0d+00)) * u(i__86 - 1,j__85,k__84,m__83& + &) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86 + 1,j__85,k__84,m__83) + u(i__86 + 2,j__85,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + ist1__80 = 4 + iend1__79 = nx - 3 +!DVM$ REGION +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = ist1__80,iend1__79 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86 - 2,j__85,k__84,m__83) - 4.0d+00 * u& + &(i__86 - 1,j__85,k__84,m__83) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86 + 1,j__85,k__84,m__83) + u(i__86 + 2,& + &j__85,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = nx - 2,nx - 2 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86 - 2,j__85,k__84,m__83) - 4.0d+00 * u& + &(i__86 - 1,j__85,k__84,m__83) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86 + 1,j__85,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = nx - 1,nx - 1 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86 - 2,j__85,k__84,m__83) - 4.0d+00 * u& + &(i__86 - 1,j__85,k__84,m__83) + 5.0d+00 * u(i__86,j__85,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + l1__82 = 1 + l2__81 = ny +!DVM$ REGION +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83,u31__74,q__76,flux_),SHADOW_RENEW (u(0:0,1:1,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = ist,iend + flux_(1) = u(i__86,j__85 + 1,k__84,3) + u31__74 = u(i__86,j__85 + 1,k__84,3) / u(i__86,j__85 + 1,k__84,1) + q__76 = 0.50d+00 * (u(i__86,j__85 + 1,k__84,2) * u(i__86,j__85 + 1,k__84,2) + u(i__86,j__85 + 1,k__84,3) * u(i__86,j_& + &_85 + 1,k__84,3) + u(i__86,j__85 + 1,k__84,4) * u(i__86,j__85 + 1,k__84,4)) / u(i__86,j__85 + 1,k__84,1) + flux_(2) = u(i__86,j__85 + 1,k__84,2) * u31__74 + flux_(3) = u(i__86,j__85 + 1,k__84,3) * u31__74 + c2 * (u(i__86,j__85 + 1,k__84,5) - q__76) + flux_(4) = u(i__86,j__85 + 1,k__84,4) * u31__74 + flux_(5) = (c1 * u(i__86,j__85 + 1,k__84,5) - c2 * q__76) * u31__74 + flux_(6) = u(i__86,j__85 - 1,k__84,3) + u31__74 = u(i__86,j__85 - 1,k__84,3) / u(i__86,j__85 - 1,k__84,1) + q__76 = 0.50d+00 * (u(i__86,j__85 - 1,k__84,2) * u(i__86,j__85 - 1,k__84,2) + u(i__86,j__85 - 1,k__84,3) * u(i__86,j_& + &_85 - 1,k__84,3) + u(i__86,j__85 - 1,k__84,4) * u(i__86,j__85 - 1,k__84,4)) / u(i__86,j__85 - 1,k__84,1) + flux_(7) = u(i__86,j__85 - 1,k__84,2) * u31__74 + flux_(8) = u(i__86,j__85 - 1,k__84,3) * u31__74 + c2 * (u(i__86,j__85 - 1,k__84,5) - q__76) + flux_(9) = u(i__86,j__85 - 1,k__84,4) * u31__74 + flux_(10) = (c1 * u(i__86,j__85 - 1,k__84,5) - c2 * q__76) * u31__74 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - ty2 * (flux_(m__83) - flux_(5 + m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (tmp__72,u21j__67,u31j__66,u41j__65,u51j__64,u21jm1__55,u31jm& +!DVM$&1__54,u41jm1__53,u51jm1__52,flux_),SHADOW_RENEW (u(0:0,2:2,2:2,0:0)) + +!SHADOW_RENEW (u(0:0,1:1,0:0,0:0) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = ist,iend + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21j__67 = tmp__72 * u(i__86,j__85,k__84,2) + u31j__66 = tmp__72 * u(i__86,j__85,k__84,3) + u41j__65 = tmp__72 * u(i__86,j__85,k__84,4) + u51j__64 = tmp__72 * u(i__86,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85 - 1,k__84,1) + u21jm1__55 = tmp__72 * u(i__86,j__85 - 1,k__84,2) + u31jm1__54 = tmp__72 * u(i__86,j__85 - 1,k__84,3) + u41jm1__53 = tmp__72 * u(i__86,j__85 - 1,k__84,4) + u51jm1__52 = tmp__72 * u(i__86,j__85 - 1,k__84,5) + flux_(2) = ty3 * (u21j__67 - u21jm1__55) + flux_(3) = 4.0d+00 / 3.0d+00 * ty3 * (u31j__66 - u31jm1__54) + flux_(4) = ty3 * (u41j__65 - u41jm1__53) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 * (u21j__67** 2 + u31j__66** 2 + u41j__65** 2 - (u21jm1__55** 2 + u31& + &jm1__54** 2 + u41jm1__53** 2)) + 1.0d+00 / 6.0d+00 * ty3 * (u31j__66** 2 - u31jm1__54** 2) + c1 * c5 * ty3 * (u51j__64 - u51jm& + &1__52) + tmp__72 = 1.0d+00 / u(i__86,j__85 + 1,k__84,1) + u21j__67 = tmp__72 * u(i__86,j__85 + 1,k__84,2) + u31j__66 = tmp__72 * u(i__86,j__85 + 1,k__84,3) + u41j__65 = tmp__72 * u(i__86,j__85 + 1,k__84,4) + u51j__64 = tmp__72 * u(i__86,j__85 + 1,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21jm1__55 = tmp__72 * u(i__86,j__85,k__84,2) + u31jm1__54 = tmp__72 * u(i__86,j__85,k__84,3) + u41jm1__53 = tmp__72 * u(i__86,j__85,k__84,4) + u51jm1__52 = tmp__72 * u(i__86,j__85,k__84,5) + flux_(5 + 2) = ty3 * (u21j__67 - u21jm1__55) + flux_(5 + 3) = 4.0d+00 / 3.0d+00 * ty3 * (u31j__66 - u31jm1__54) + flux_(5 + 4) = ty3 * (u41j__65 - u41jm1__53) + flux_(5 + 5) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 * (u21j__67** 2 + u31j__66** 2 + u41j__65** 2 - (u21jm1__55** 2 +& + & u31jm1__54** 2 + u41jm1__53** 2)) + 1.0d+00 / 6.0d+00 * ty3 * (u31j__66** 2 - u31jm1__54** 2) + c1 * c5 * ty3 * (u51j__64 - u& + &51jm1__52) + rsd(i__86,j__85,k__84,1) = rsd(i__86,j__85,k__84,1) + dy1 * ty1 * (u(i__86,j__85 - 1,k__84,1) - 2.0d+00 * u(i__86,j__& + &85,k__84,1) + u(i__86,j__85 + 1,k__84,1)) + rsd(i__86,j__85,k__84,2) = rsd(i__86,j__85,k__84,2) + ty3 * c3 * c4 * (flux_(5 + 2) - flux_(2)) + dy2 * ty1 * (u(i__8& + &6,j__85 - 1,k__84,2) - 2.0d+00 * u(i__86,j__85,k__84,2) + u(i__86,j__85 + 1,k__84,2)) + rsd(i__86,j__85,k__84,3) = rsd(i__86,j__85,k__84,3) + ty3 * c3 * c4 * (flux_(5 + 3) - flux_(3)) + dy3 * ty1 * (u(i__8& + &6,j__85 - 1,k__84,3) - 2.0d+00 * u(i__86,j__85,k__84,3) + u(i__86,j__85 + 1,k__84,3)) + rsd(i__86,j__85,k__84,4) = rsd(i__86,j__85,k__84,4) + ty3 * c3 * c4 * (flux_(5 + 4) - flux_(4)) + dy4 * ty1 * (u(i__8& + &6,j__85 - 1,k__84,4) - 2.0d+00 * u(i__86,j__85,k__84,4) + u(i__86,j__85 + 1,k__84,4)) + rsd(i__86,j__85,k__84,5) = rsd(i__86,j__85,k__84,5) + ty3 * c3 * c4 * (flux_(5 + 5) - flux_(5)) + dy5 * ty1 * (u(i__8& + &6,j__85 - 1,k__84,5) - 2.0d+00 * u(i__86,j__85,k__84,5) + u(i__86,j__85 + 1,k__84,5)) + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!SHADOW_RENEW (u(0:0,0:2,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = 2,2 + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * ((+(5.0d+00)) * u(i__86,j__85,k__84,m__83) - & + &4.0d+00 * u(i__86,j__85 + 1,k__84,m__83) + u(i__86,j__85 + 2,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!SHADOW_RENEW (u(0:0,1:2,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = 3,3 + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * ((-(4.0d+00)) * u(i__86,j__85 - 1,k__84,m__83& + &) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85 + 1,k__84,m__83) + u(i__86,j__85 + 2,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + jst1__78 = 4 + jend1__77 = ny - 3 +!DVM$ REGION +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!SHADOW_RENEW (u(0:0,2:2,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = jst1__78,jend1__77 + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86,j__85 - 2,k__84,m__83) - 4.0d+00 * u& + &(i__86,j__85 - 1,k__84,m__83) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85 + 1,k__84,m__83) + u(i__86,j__8& + &5 + 2,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!SHADOW_RENEW (u(0:0,2:1,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = ny - 2,ny - 2 + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86,j__85 - 2,k__84,m__83) - 4.0d+00 * u& + &(i__86,j__85 - 1,k__84,m__83) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85 + 1,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!SHADOW_RENEW (u(0:0,2:0,0:0,0:0)) + do k__84 = 2,nz - 1 + do j__85 = ny - 1,ny - 1 + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86,j__85 - 2,k__84,m__83) - 4.0d+00 * u& + &(i__86,j__85 - 1,k__84,m__83) + 5.0d+00 * u(i__86,j__85,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83,u41__73,q__76,flux_),SHADOW_RENEW (u(0:0,0:0,1:1,0:0)) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = ist,iend + flux_(1) = u(i__86,j__85,k__84 + 1,4) + u41__73 = u(i__86,j__85,k__84 + 1,4) / u(i__86,j__85,k__84 + 1,1) + q__76 = 0.50d+00 * (u(i__86,j__85,k__84 + 1,2) * u(i__86,j__85,k__84 + 1,2) + u(i__86,j__85,k__84 + 1,3) * u(i__86,j_& + &_85,k__84 + 1,3) + u(i__86,j__85,k__84 + 1,4) * u(i__86,j__85,k__84 + 1,4)) / u(i__86,j__85,k__84 + 1,1) + flux_(2) = u(i__86,j__85,k__84 + 1,2) * u41__73 + flux_(3) = u(i__86,j__85,k__84 + 1,3) * u41__73 + flux_(4) = u(i__86,j__85,k__84 + 1,4) * u41__73 + c2 * (u(i__86,j__85,k__84 + 1,5) - q__76) + flux_(5) = (c1 * u(i__86,j__85,k__84 + 1,5) - c2 * q__76) * u41__73 + flux_(6) = u(i__86,j__85,k__84 - 1,4) + u41__73 = u(i__86,j__85,k__84 - 1,4) / u(i__86,j__85,k__84 - 1,1) + q__76 = 0.50d+00 * (u(i__86,j__85,k__84 - 1,2) * u(i__86,j__85,k__84 - 1,2) + u(i__86,j__85,k__84 - 1,3) * u(i__86,j_& + &_85,k__84 - 1,3) + u(i__86,j__85,k__84 - 1,4) * u(i__86,j__85,k__84 - 1,4)) / u(i__86,j__85,k__84 - 1,1) + flux_(7) = u(i__86,j__85,k__84 - 1,2) * u41__73 + flux_(8) = u(i__86,j__85,k__84 - 1,3) * u41__73 + flux_(9) = u(i__86,j__85,k__84 - 1,4) * u41__73 + c2 * (u(i__86,j__85,k__84 - 1,5) - q__76) + flux_(10) = (c1 * u(i__86,j__85,k__84 - 1,5) - c2 * q__76) * u41__73 + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - tz2 * (flux_(m__83) - flux_(5 + m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (tmp__72,u21k__63,u31k__62,u41k__61,u51k__60,u21km1__51,u31km& +!DVM$&1__50,u41km1__49,u51km1__48,flux_) + +!SHADOW_RENEW (u(0:0,0:0,1:1,0:0) + do k__84 = 2,nz - 1 + do j__85 = jst,jend + do i__86 = ist,iend + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21k__63 = tmp__72 * u(i__86,j__85,k__84,2) + u31k__62 = tmp__72 * u(i__86,j__85,k__84,3) + u41k__61 = tmp__72 * u(i__86,j__85,k__84,4) + u51k__60 = tmp__72 * u(i__86,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84 - 1,1) + u21km1__51 = tmp__72 * u(i__86,j__85,k__84 - 1,2) + u31km1__50 = tmp__72 * u(i__86,j__85,k__84 - 1,3) + u41km1__49 = tmp__72 * u(i__86,j__85,k__84 - 1,4) + u51km1__48 = tmp__72 * u(i__86,j__85,k__84 - 1,5) + flux_(2) = tz3 * (u21k__63 - u21km1__51) + flux_(3) = tz3 * (u31k__62 - u31km1__50) + flux_(4) = 4.0d+00 / 3.0d+00 * tz3 * (u41k__61 - u41km1__49) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 * (u21k__63** 2 + u31k__62** 2 + u41k__61** 2 - (u21km1__51** 2 + u31& + &km1__50** 2 + u41km1__49** 2)) + 1.0d+00 / 6.0d+00 * tz3 * (u41k__61** 2 - u41km1__49** 2) + c1 * c5 * tz3 * (u51k__60 - u51km& + &1__48) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84 + 1,1) + u21k__63 = tmp__72 * u(i__86,j__85,k__84 + 1,2) + u31k__62 = tmp__72 * u(i__86,j__85,k__84 + 1,3) + u41k__61 = tmp__72 * u(i__86,j__85,k__84 + 1,4) + u51k__60 = tmp__72 * u(i__86,j__85,k__84 + 1,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21km1__51 = tmp__72 * u(i__86,j__85,k__84,2) + u31km1__50 = tmp__72 * u(i__86,j__85,k__84,3) + u41km1__49 = tmp__72 * u(i__86,j__85,k__84,4) + u51km1__48 = tmp__72 * u(i__86,j__85,k__84,5) + flux_(5 + 2) = tz3 * (u21k__63 - u21km1__51) + flux_(5 + 3) = tz3 * (u31k__62 - u31km1__50) + flux_(5 + 4) = 4.0d+00 / 3.0d+00 * tz3 * (u41k__61 - u41km1__49) + flux_(5 + 5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 * (u21k__63** 2 + u31k__62** 2 + u41k__61** 2 - (u21km1__51** 2 +& + & u31km1__50** 2 + u41km1__49** 2)) + 1.0d+00 / 6.0d+00 * tz3 * (u41k__61** 2 - u41km1__49** 2) + c1 * c5 * tz3 * (u51k__60 - u& + &51km1__48) + rsd(i__86,j__85,k__84,1) = rsd(i__86,j__85,k__84,1) + dz1 * tz1 * (u(i__86,j__85,k__84 - 1,1) - 2.0d+00 * u(i__86,j__& + &85,k__84,1) + u(i__86,j__85,k__84 + 1,1)) + rsd(i__86,j__85,k__84,2) = rsd(i__86,j__85,k__84,2) + tz3 * c3 * c4 * (flux_(5 + 2) - flux_(2)) + dz2 * tz1 * (u(i__8& + &6,j__85,k__84 - 1,2) - 2.0d+00 * u(i__86,j__85,k__84,2) + u(i__86,j__85,k__84 + 1,2)) + rsd(i__86,j__85,k__84,3) = rsd(i__86,j__85,k__84,3) + tz3 * c3 * c4 * (flux_(5 + 3) - flux_(3)) + dz3 * tz1 * (u(i__8& + &6,j__85,k__84 - 1,3) - 2.0d+00 * u(i__86,j__85,k__84,3) + u(i__86,j__85,k__84 + 1,3)) + rsd(i__86,j__85,k__84,4) = rsd(i__86,j__85,k__84,4) + tz3 * c3 * c4 * (flux_(5 + 4) - flux_(4)) + dz4 * tz1 * (u(i__8& + &6,j__85,k__84 - 1,4) - 2.0d+00 * u(i__86,j__85,k__84,4) + u(i__86,j__85,k__84 + 1,4)) + rsd(i__86,j__85,k__84,5) = rsd(i__86,j__85,k__84,5) + tz3 * c3 * c4 * (flux_(5 + 5) - flux_(5)) + dz5 * tz1 * (u(i__8& + &6,j__85,k__84 - 1,5) - 2.0d+00 * u(i__86,j__85,k__84,5) + u(i__86,j__85,k__84 + 1,5)) + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!, SHADOW_RENEW (u(0:0,0:0,0:2,0:0)) + do k__84 = 2,2 + do j__85 = jst,jend + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * ((+(5.0d+00)) * u(i__86,j__85,k__84,m__83) - & + &4.0d+00 * u(i__86,j__85,k__84 + 1,m__83) + u(i__86,j__85,k__84 + 2,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!, SHADOW_RENEW (u(0:0,0:0,1:2,0:0)) + do k__84 = 3,3 + do j__85 = jst,jend + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * ((-(4.0d+00)) * u(i__86,j__85,k__84 - 1,m__83& + &) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85,k__84 + 1,m__83) + u(i__86,j__85,k__84 + 2,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!, SHADOW_RENEW (u(0:0,0:0,2:2,0:0)) + do k__84 = 4,nz - 3 + do j__85 = jst,jend + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86,j__85,k__84 - 2,m__83) - 4.0d+00 * u& + &(i__86,j__85,k__84 - 1,m__83) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85,k__84 + 1,m__83) + u(i__86,j__8& + &5,k__84 + 2,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!, SHADOW_RENEW (u(0:0,0:0,2:1,0:0)) + do k__84 = nz - 2,nz - 2 + do j__85 = jst,jend + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86,j__85,k__84 - 2,m__83) - 4.0d+00 * u& + &(i__86,j__85,k__84 - 1,m__83) + 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85,k__84 + 1,m__83)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83) + +!, SHADOW_RENEW (u(0:0,0:0,2:0,0:0)) + do k__84 = nz - 1,nz - 1 + do j__85 = jst,jend + do i__86 = ist,iend + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd(i__86,j__85,k__84,m__83) - dssp * (u(i__86,j__85,k__84 - 2,m__83) - 4.0d+00 * u& + &(i__86,j__85,k__84 - 1,m__83) + 5.0d+00 * u(i__86,j__85,k__84,m__83)) + enddo + enddo + enddo + enddo +!DVM$ END REGION + v_1573_88 = isiz1 / 2 * 2 + 1 + v_1573_87 = isiz2 / 2 * 2 + 1 + do m__89 = 1,5 + rsdnm(m__89) = 0.0d+00 + enddo + r1 = 0.0d0 + r2 = 0.0d0 + r3 = 0.0d0 + r4 = 0.0d0 + r5 = 0.0d0 +!DVM$ REGION +!DVM$ PARALLEL (k__90,j__91,i__92) ON rsd(i__92,j__91,k__90,*),REDUCTION (sum(r1),sum(r2),sum(r3),sum(r4),sum(r5)),CUDA_BLOCK (32,4) + do k__90 = 2,nz0 - 1 + do j__91 = jst,jend + do i__92 = ist,iend + r1 = r1 + rsd(i__92,j__91,k__90,1) * rsd(i__92,j__91,k__90,1) + r2 = r2 + rsd(i__92,j__91,k__90,2) * rsd(i__92,j__91,k__90,2) + r3 = r3 + rsd(i__92,j__91,k__90,3) * rsd(i__92,j__91,k__90,3) + r4 = r4 + rsd(i__92,j__91,k__90,4) * rsd(i__92,j__91,k__90,4) + r5 = r5 + rsd(i__92,j__91,k__90,5) * rsd(i__92,j__91,k__90,5) + enddo + enddo + enddo +!DVM$ END REGION + rsdnm(1) = r1 + rsdnm(2) = r2 + rsdnm(3) = r3 + rsdnm(4) = r4 + rsdnm(5) = r5 + do m__89 = 1,5 + rsdnm(m__89) = sqrt (rsdnm(m__89) / ((nx0 - 2) * (ny0 - 2) * (nz0 - 2))) + enddo + elapsed(1) = 0.0 + +! call etime(tarray) + t = dvtime () + start(1) = t + if (touch .eq. 1) then + istep = 2 + else + istep = 1 + endif +2045 mod_1150_40 = mod (istep,20) + if (mod_1150_40 .eq. 0 .or. istep .eq. itmax .or. istep .eq. 1) then + write (unit = *,fmt = 200) istep + endif + r43 = 4.0d+00 / 3.0d+00 + c1345 = c1 * c3 * c4 * c5 + c34 = c3 * c4 +!DVM$ REGION +!DVM$ PARALLEL (k__97,j__95,i__96) ON rsd(i__96,j__95,k__97,*),PRIVATE (rsd_,tmat,tmp1,tmp__93,tmp2,tmp3,tmp_1,tmp_2,tmp_3),ACROSS (& +!DVM$&rsd(1:0,1:0,1:0,0:0)),CUDA_BLOCK (16,16) + do k__97 = 2,nz - 1 + do j__95 = jst,jend + do i__96 = ist,iend + tmp1 = 1.0d+00 / u(i__96,j__95,k__97 - 1,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + tmp_1 = 1.0d+00 / u(i__96 - 1,j__95,k__97,1) + tmp_2 = tmp_1 * tmp_1 + tmp_3 = tmp_1 * tmp_2 + rsd_(1) = rsd(i__96,j__95,k__97,1) * dt + rsd_(2) = rsd(i__96,j__95,k__97,2) * dt + rsd_(3) = rsd(i__96,j__95,k__97,3) * dt + rsd_(4) = rsd(i__96,j__95,k__97,4) * dt + rsd_(5) = rsd(i__96,j__95,k__97,5) * dt + rsd_(1) = rsd_(1) - omega * ((-(dt)) * tz1 * dz1 * rsd(i__96,j__95,k__97 - 1,1) + (-(dt)) * tz2 * rsd(i__96,j__95,k__& + &97 - 1,4)) + rsd_(2) = rsd_(2) - omega * (((-(dt)) * tz2 * ((-(u(i__96,j__95,k__97 - 1,2) * u(i__96,j__95,k__97 - 1,4))) * tmp2) -& + & dt * tz1 * ((-(c34)) * tmp2 * u(i__96,j__95,k__97 - 1,2))) * rsd(i__96,j__95,k__97 - 1,1) + ((-(dt)) * tz2 * (u(i__96,j__95,k& + &__97 - 1,4) * tmp1) - dt * tz1 * c34 * tmp1 - dt * tz1 * dz2) * rsd(i__96,j__95,k__97 - 1,2) + (-(dt)) * tz2 * (u(i__96,j__95,& + &k__97 - 1,2) * tmp1) * rsd(i__96,j__95,k__97 - 1,4)) + rsd_(3) = rsd_(3) - omega * (((-(dt)) * tz2 * ((-(u(i__96,j__95,k__97 - 1,3) * u(i__96,j__95,k__97 - 1,4))) * tmp2) -& + & dt * tz1 * ((-(c34)) * tmp2 * u(i__96,j__95,k__97 - 1,3))) * rsd(i__96,j__95,k__97 - 1,1) + ((-(dt)) * tz2 * (u(i__96,j__95,k& + &__97 - 1,4) * tmp1) - dt * tz1 * (c34 * tmp1) - dt * tz1 * dz3) * rsd(i__96,j__95,k__97 - 1,3) + (-(dt)) * tz2 * (u(i__96,j__9& + &5,k__97 - 1,3) * tmp1) * rsd(i__96,j__95,k__97 - 1,4)) + rsd_(4) = rsd_(4) - omega * (((-(dt)) * tz2 * ((-((u(i__96,j__95,k__97 - 1,4) * tmp1)** 2)) + 0.50d+00 * c2 * ((u(i__& + &96,j__95,k__97 - 1,2) * u(i__96,j__95,k__97 - 1,2) + u(i__96,j__95,k__97 - 1,3) * u(i__96,j__95,k__97 - 1,3) + u(i__96,j__95,k& + &__97 - 1,4) * u(i__96,j__95,k__97 - 1,4)) * tmp2)) - dt * tz1 * ((-(r43)) * c34 * tmp2 * u(i__96,j__95,k__97 - 1,4))) * rsd(i_& + &_96,j__95,k__97 - 1,1) + (-(dt)) * tz2 * ((-(c2)) * (u(i__96,j__95,k__97 - 1,2) * tmp1)) * rsd(i__96,j__95,k__97 - 1,2) + (-(d& + &t)) * tz2 * ((-(c2)) * (u(i__96,j__95,k__97 - 1,3) * tmp1)) * rsd(i__96,j__95,k__97 - 1,3) + ((-(dt)) * tz2 * (2.0d+00 - c2) *& + & (u(i__96,j__95,k__97 - 1,4) * tmp1) - dt * tz1 * (r43 * c34 * tmp1) - dt * tz1 * dz4) * rsd(i__96,j__95,k__97 - 1,4) + (-(dt)& + &) * tz2 * c2 * rsd(i__96,j__95,k__97 - 1,5)) + rsd_(5) = rsd_(5) - omega * (((-(dt)) * tz2 * ((c2 * (u(i__96,j__95,k__97 - 1,2) * u(i__96,j__95,k__97 - 1,2) + u(i__& + &96,j__95,k__97 - 1,3) * u(i__96,j__95,k__97 - 1,3) + u(i__96,j__95,k__97 - 1,4) * u(i__96,j__95,k__97 - 1,4)) * tmp2 - c1 * (u& + &(i__96,j__95,k__97 - 1,5) * tmp1)) * (u(i__96,j__95,k__97 - 1,4) * tmp1)) - dt * tz1 * ((-(c34 - c1345)) * tmp3 * u(i__96,j__9& + &5,k__97 - 1,2)** 2 - (c34 - c1345) * tmp3 * u(i__96,j__95,k__97 - 1,3)** 2 - (r43 * c34 - c1345) * tmp3 * u(i__96,j__95,k__97 & + &- 1,4)** 2 - c1345 * tmp2 * u(i__96,j__95,k__97 - 1,5))) * rsd(i__96,j__95,k__97 - 1,1) + ((-(dt)) * tz2 * ((-(c2)) * (u(i__96& + &,j__95,k__97 - 1,2) * u(i__96,j__95,k__97 - 1,4)) * tmp2) - dt * tz1 * (c34 - c1345) * tmp2 * u(i__96,j__95,k__97 - 1,2)) * rs& + &d(i__96,j__95,k__97 - 1,2) + ((-(dt)) * tz2 * ((-(c2)) * (u(i__96,j__95,k__97 - 1,3) * u(i__96,j__95,k__97 - 1,4)) * tmp2) - d& + &t * tz1 * (c34 - c1345) * tmp2 * u(i__96,j__95,k__97 - 1,3)) * rsd(i__96,j__95,k__97 - 1,3) + ((-(dt)) * tz2 * (c1 * (u(i__96,& + &j__95,k__97 - 1,5) * tmp1) - 0.50d+00 * c2 * ((u(i__96,j__95,k__97 - 1,2) * u(i__96,j__95,k__97 - 1,2) + u(i__96,j__95,k__97 -& + & 1,3) * u(i__96,j__95,k__97 - 1,3) + 3.0d+00 * u(i__96,j__95,k__97 - 1,4) * u(i__96,j__95,k__97 - 1,4)) * tmp2)) - dt * tz1 * & + &(r43 * c34 - c1345) * tmp2 * u(i__96,j__95,k__97 - 1,4)) * rsd(i__96,j__95,k__97 - 1,4) + ((-(dt)) * tz2 * (c1 * (u(i__96,j__9& + &5,k__97 - 1,4) * tmp1)) - dt * tz1 * c1345 * tmp1 - dt * tz1 * dz5) * rsd(i__96,j__95,k__97 - 1,5)) + tmp1 = 1.0d+00 / u(i__96,j__95 - 1,k__97,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + rsd_(1) = rsd_(1) - omega * ((-(dt)) * ty1 * dy1 * rsd(i__96,j__95 - 1,k__97,1) + (-(dt)) * tx1 * dx1 * rsd(i__96 - 1& + &,j__95,k__97,1) + (-(dt)) * tx2 * rsd(i__96 - 1,j__95,k__97,2) + (-(dt)) * ty2 * rsd(i__96,j__95 - 1,k__97,3)) + rsd_(2) = rsd_(2) - omega * (((-(dt)) * ty2 * ((-(u(i__96,j__95 - 1,k__97,2) * u(i__96,j__95 - 1,k__97,3))) * tmp2) -& + & dt * ty1 * ((-(c34)) * tmp2 * u(i__96,j__95 - 1,k__97,2))) * rsd(i__96,j__95 - 1,k__97,1) + ((-(dt)) * tx2 * ((-((u(i__96 - 1& + &,j__95,k__97,2) * tmp_1)** 2)) + c2 * 0.50d+00 * (u(i__96 - 1,j__95,k__97,2) * u(i__96 - 1,j__95,k__97,2) + u(i__96 - 1,j__95,& + &k__97,3) * u(i__96 - 1,j__95,k__97,3) + u(i__96 - 1,j__95,k__97,4) * u(i__96 - 1,j__95,k__97,4)) * tmp_2) - dt * tx1 * ((-(r43& + &)) * c34 * tmp_2 * u(i__96 - 1,j__95,k__97,2))) * rsd(i__96 - 1,j__95,k__97,1) + ((-(dt)) * ty2 * (u(i__96,j__95 - 1,k__97,3) & + &* tmp1) - dt * ty1 * (c34 * tmp1) - dt * ty1 * dy2) * rsd(i__96,j__95 - 1,k__97,2) + ((-(dt)) * tx2 * ((2.0d+00 - c2) * (u(i__& + &96 - 1,j__95,k__97,2) * tmp_1)) - dt * tx1 * (r43 * c34 * tmp_1) - dt * tx1 * dx2) * rsd(i__96 - 1,j__95,k__97,2) + (-(dt)) * & + &ty2 * (u(i__96,j__95 - 1,k__97,2) * tmp1) * rsd(i__96,j__95 - 1,k__97,3) + (-(dt)) * tx2 * ((-(c2)) * (u(i__96 - 1,j__95,k__97& + &,3) * tmp_1)) * rsd(i__96 - 1,j__95,k__97,3) + (-(dt)) * tx2 * ((-(c2)) * (u(i__96 - 1,j__95,k__97,4) * tmp_1)) * rsd(i__96 - & + &1,j__95,k__97,4) + (-(dt)) * tx2 * c2 * rsd(i__96 - 1,j__95,k__97,5)) + rsd_(3) = rsd_(3) - omega * (((-(dt)) * ty2 * ((-((u(i__96,j__95 - 1,k__97,3) * tmp1)** 2)) + 0.50d+00 * c2 * ((u(i__& + &96,j__95 - 1,k__97,2) * u(i__96,j__95 - 1,k__97,2) + u(i__96,j__95 - 1,k__97,3) * u(i__96,j__95 - 1,k__97,3) + u(i__96,j__95 -& + & 1,k__97,4) * u(i__96,j__95 - 1,k__97,4)) * tmp2)) - dt * ty1 * ((-(r43)) * c34 * tmp2 * u(i__96,j__95 - 1,k__97,3))) * rsd(i_& + &_96,j__95 - 1,k__97,1) + ((-(dt)) * tx2 * ((-(u(i__96 - 1,j__95,k__97,2) * u(i__96 - 1,j__95,k__97,3))) * tmp_2) - dt * tx1 * & + &((-(c34)) * tmp_2 * u(i__96 - 1,j__95,k__97,3))) * rsd(i__96 - 1,j__95,k__97,1) + (-(dt)) * ty2 * ((-(c2)) * (u(i__96,j__95 - & + &1,k__97,2) * tmp1)) * rsd(i__96,j__95 - 1,k__97,2) + (-(dt)) * tx2 * (u(i__96 - 1,j__95,k__97,3) * tmp_1) * rsd(i__96 - 1,j__9& + &5,k__97,2) + ((-(dt)) * ty2 * ((2.0d+00 - c2) * (u(i__96,j__95 - 1,k__97,3) * tmp1)) - dt * ty1 * (r43 * c34 * tmp1) - dt * ty& + &1 * dy3) * rsd(i__96,j__95 - 1,k__97,3) + ((-(dt)) * tx2 * (u(i__96 - 1,j__95,k__97,2) * tmp_1) - dt * tx1 * (c34 * tmp_1) - d& + &t * tx1 * dx3) * rsd(i__96 - 1,j__95,k__97,3) + (-(dt)) * ty2 * ((-(c2)) * (u(i__96,j__95 - 1,k__97,4) * tmp1)) * rsd(i__96,j_& + &_95 - 1,k__97,4) + (-(dt)) * ty2 * c2 * rsd(i__96,j__95 - 1,k__97,5)) + rsd_(4) = rsd_(4) - omega * (((-(dt)) * ty2 * ((-(u(i__96,j__95 - 1,k__97,3) * u(i__96,j__95 - 1,k__97,4))) * tmp2) -& + & dt * ty1 * ((-(c34)) * tmp2 * u(i__96,j__95 - 1,k__97,4))) * rsd(i__96,j__95 - 1,k__97,1) + ((-(dt)) * tx2 * ((-(u(i__96 - 1,& + &j__95,k__97,2) * u(i__96 - 1,j__95,k__97,4))) * tmp_2) - dt * tx1 * ((-(c34)) * tmp_2 * u(i__96 - 1,j__95,k__97,4))) * rsd(i__& + &96 - 1,j__95,k__97,1) + (-(dt)) * tx2 * (u(i__96 - 1,j__95,k__97,4) * tmp_1) * rsd(i__96 - 1,j__95,k__97,2) + (-(dt)) * ty2 * & + &(u(i__96,j__95 - 1,k__97,4) * tmp1) * rsd(i__96,j__95 - 1,k__97,3) + ((-(dt)) * ty2 * (u(i__96,j__95 - 1,k__97,3) * tmp1) - dt& + & * ty1 * (c34 * tmp1) - dt * ty1 * dy4) * rsd(i__96,j__95 - 1,k__97,4) + ((-(dt)) * tx2 * (u(i__96 - 1,j__95,k__97,2) * tmp_1)& + & - dt * tx1 * (c34 * tmp_1) - dt * tx1 * dx4) * rsd(i__96 - 1,j__95,k__97,4)) + rsd_(5) = rsd_(5) - omega * (((-(dt)) * ty2 * ((c2 * (u(i__96,j__95 - 1,k__97,2) * u(i__96,j__95 - 1,k__97,2) + u(i__& + &96,j__95 - 1,k__97,3) * u(i__96,j__95 - 1,k__97,3) + u(i__96,j__95 - 1,k__97,4) * u(i__96,j__95 - 1,k__97,4)) * tmp2 - c1 * (u& + &(i__96,j__95 - 1,k__97,5) * tmp1)) * (u(i__96,j__95 - 1,k__97,3) * tmp1)) - dt * ty1 * ((-(c34 - c1345)) * tmp3 * u(i__96,j__9& + &5 - 1,k__97,2)** 2 - (r43 * c34 - c1345) * tmp3 * u(i__96,j__95 - 1,k__97,3)** 2 - (c34 - c1345) * tmp3 * u(i__96,j__95 - 1,k_& + &_97,4)** 2 - c1345 * tmp2 * u(i__96,j__95 - 1,k__97,5))) * rsd(i__96,j__95 - 1,k__97,1) + ((-(dt)) * tx2 * ((c2 * (u(i__96 - 1& + &,j__95,k__97,2) * u(i__96 - 1,j__95,k__97,2) + u(i__96 - 1,j__95,k__97,3) * u(i__96 - 1,j__95,k__97,3) + u(i__96 - 1,j__95,k__& + &97,4) * u(i__96 - 1,j__95,k__97,4)) * tmp_2 - c1 * (u(i__96 - 1,j__95,k__97,5) * tmp_1)) * (u(i__96 - 1,j__95,k__97,2) * tmp_1& + &)) - dt * tx1 * ((-(r43 * c34 - c1345)) * tmp_3 * u(i__96 - 1,j__95,k__97,2)** 2 - (c34 - c1345) * tmp_3 * u(i__96 - 1,j__95,k& + &__97,3)** 2 - (c34 - c1345) * tmp_3 * u(i__96 - 1,j__95,k__97,4)** 2 - c1345 * tmp_2 * u(i__96 - 1,j__95,k__97,5))) * rsd(i__9& + &6 - 1,j__95,k__97,1) + ((-(dt)) * ty2 * ((-(c2)) * (u(i__96,j__95 - 1,k__97,2) * u(i__96,j__95 - 1,k__97,3)) * tmp2) - dt * ty& + &1 * (c34 - c1345) * tmp2 * u(i__96,j__95 - 1,k__97,2)) * rsd(i__96,j__95 - 1,k__97,2) + ((-(dt)) * tx2 * (c1 * (u(i__96 - 1,j_& + &_95,k__97,5) * tmp_1) - 0.50d+00 * c2 * ((3.0d+00 * u(i__96 - 1,j__95,k__97,2) * u(i__96 - 1,j__95,k__97,2) + u(i__96 - 1,j__9& + &5,k__97,3) * u(i__96 - 1,j__95,k__97,3) + u(i__96 - 1,j__95,k__97,4) * u(i__96 - 1,j__95,k__97,4)) * tmp_2)) - dt * tx1 * (r43& + & * c34 - c1345) * tmp_2 * u(i__96 - 1,j__95,k__97,2)) * rsd(i__96 - 1,j__95,k__97,2) + ((-(dt)) * ty2 * (c1 * (u(i__96,j__95 -& + & 1,k__97,5) * tmp1) - 0.50d+00 * c2 * ((u(i__96,j__95 - 1,k__97,2) * u(i__96,j__95 - 1,k__97,2) + 3.0d+00 * u(i__96,j__95 - 1,& + &k__97,3) * u(i__96,j__95 - 1,k__97,3) + u(i__96,j__95 - 1,k__97,4) * u(i__96,j__95 - 1,k__97,4)) * tmp2)) - dt * ty1 * (r43 * & + &c34 - c1345) * tmp2 * u(i__96,j__95 - 1,k__97,3)) * rsd(i__96,j__95 - 1,k__97,3) + ((-(dt)) * tx2 * ((-(c2)) * (u(i__96 - 1,j_& + &_95,k__97,3) * u(i__96 - 1,j__95,k__97,2)) * tmp_2) - dt * tx1 * (c34 - c1345) * tmp_2 * u(i__96 - 1,j__95,k__97,3)) * rsd(i__& + &96 - 1,j__95,k__97,3) + ((-(dt)) * ty2 * ((-(c2)) * (u(i__96,j__95 - 1,k__97,3) * u(i__96,j__95 - 1,k__97,4)) * tmp2) - dt * t& + &y1 * (c34 - c1345) * tmp2 * u(i__96,j__95 - 1,k__97,4)) * rsd(i__96,j__95 - 1,k__97,4) + ((-(dt)) * tx2 * ((-(c2)) * (u(i__96 & + &- 1,j__95,k__97,4) * u(i__96 - 1,j__95,k__97,2)) * tmp_2) - dt * tx1 * (c34 - c1345) * tmp_2 * u(i__96 - 1,j__95,k__97,4)) * r& + &sd(i__96 - 1,j__95,k__97,4) + ((-(dt)) * ty2 * (c1 * (u(i__96,j__95 - 1,k__97,3) * tmp1)) - dt * ty1 * c1345 * tmp1 - dt * ty1& + & * dy5) * rsd(i__96,j__95 - 1,k__97,5) + ((-(dt)) * tx2 * (c1 * (u(i__96 - 1,j__95,k__97,2) * tmp_1)) - dt * tx1 * c1345 * tmp& + &_1 - dt * tx1 * dx5) * rsd(i__96 - 1,j__95,k__97,5)) + tmp1 = 1.0d+00 / u(i__96,j__95,k__97,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + tmat(1,1) = 1.0d+00 + dt * 2.0d+00 * (tx1 * dx1 + ty1 * dy1 + tz1 * dz1) + tmat(1,2) = 0.0d+00 + tmat(1,3) = 0.0d+00 + tmat(1,4) = 0.0d+00 + tmat(1,5) = 0.0d+00 + tmat(2,1) = dt * 2.0d+00 * (tx1 * ((-(r43)) * c34 * tmp2 * u(i__96,j__95,k__97,2)) + ty1 * ((-(c34)) * tmp2 * u(i__96& + &,j__95,k__97,2)) + tz1 * ((-(c34)) * tmp2 * u(i__96,j__95,k__97,2))) + tmat(2,2) = 1.0d+00 + dt * 2.0d+00 * (tx1 * r43 * c34 * tmp1 + ty1 * c34 * tmp1 + tz1 * c34 * tmp1) + dt * 2.0d+00 * & + &(tx1 * dx2 + ty1 * dy2 + tz1 * dz2) + tmat(2,3) = 0.0d+00 + tmat(2,4) = 0.0d+00 + tmat(2,5) = 0.0d+00 + tmat(3,1) = dt * 2.0d+00 * (tx1 * ((-(c34)) * tmp2 * u(i__96,j__95,k__97,3)) + ty1 * ((-(r43)) * c34 * tmp2 * u(i__96& + &,j__95,k__97,3)) + tz1 * ((-(c34)) * tmp2 * u(i__96,j__95,k__97,3))) + tmat(3,2) = 0.0d+00 + tmat(3,3) = 1.0d+00 + dt * 2.0d+00 * (tx1 * c34 * tmp1 + ty1 * r43 * c34 * tmp1 + tz1 * c34 * tmp1) + dt * 2.0d+00 * & + &(tx1 * dx3 + ty1 * dy3 + tz1 * dz3) + tmat(3,4) = 0.0d+00 + tmat(3,5) = 0.0d+00 + tmat(4,1) = dt * 2.0d+00 * (tx1 * ((-(c34)) * tmp2 * u(i__96,j__95,k__97,4)) + ty1 * ((-(c34)) * tmp2 * u(i__96,j__95& + &,k__97,4)) + tz1 * ((-(r43)) * c34 * tmp2 * u(i__96,j__95,k__97,4))) + tmat(4,2) = 0.0d+00 + tmat(4,3) = 0.0d+00 + tmat(4,4) = 1.0d+00 + dt * 2.0d+00 * (tx1 * c34 * tmp1 + ty1 * c34 * tmp1 + tz1 * r43 * c34 * tmp1) + dt * 2.0d+00 * & + &(tx1 * dx4 + ty1 * dy4 + tz1 * dz4) + tmat(4,5) = 0.0d+00 + tmat(5,1) = dt * 2.0d+00 * (tx1 * ((-(r43 * c34 - c1345)) * tmp3 * u(i__96,j__95,k__97,2)** 2 - (c34 - c1345) * tmp3 & + &* u(i__96,j__95,k__97,3)** 2 - (c34 - c1345) * tmp3 * u(i__96,j__95,k__97,4)** 2 - c1345 * tmp2 * u(i__96,j__95,k__97,5)) + ty& + &1 * ((-(c34 - c1345)) * tmp3 * u(i__96,j__95,k__97,2)** 2 - (r43 * c34 - c1345) * tmp3 * u(i__96,j__95,k__97,3)** 2 - (c34 - c& + &1345) * tmp3 * u(i__96,j__95,k__97,4)** 2 - c1345 * tmp2 * u(i__96,j__95,k__97,5)) + tz1 * ((-(c34 - c1345)) * tmp3 * u(i__96,& + &j__95,k__97,2)** 2 - (c34 - c1345) * tmp3 * u(i__96,j__95,k__97,3)** 2 - (r43 * c34 - c1345) * tmp3 * u(i__96,j__95,k__97,4)**& + & 2 - c1345 * tmp2 * u(i__96,j__95,k__97,5))) + tmat(5,2) = dt * 2.0d+00 * (tx1 * (r43 * c34 - c1345) * tmp2 * u(i__96,j__95,k__97,2) + ty1 * (c34 - c1345) * tmp2 * & + &u(i__96,j__95,k__97,2) + tz1 * (c34 - c1345) * tmp2 * u(i__96,j__95,k__97,2)) + tmat(5,3) = dt * 2.0d+00 * (tx1 * (c34 - c1345) * tmp2 * u(i__96,j__95,k__97,3) + ty1 * (r43 * c34 - c1345) * tmp2 * & + &u(i__96,j__95,k__97,3) + tz1 * (c34 - c1345) * tmp2 * u(i__96,j__95,k__97,3)) + tmat(5,4) = dt * 2.0d+00 * (tx1 * (c34 - c1345) * tmp2 * u(i__96,j__95,k__97,4) + ty1 * (c34 - c1345) * tmp2 * u(i__9& + &6,j__95,k__97,4) + tz1 * (r43 * c34 - c1345) * tmp2 * u(i__96,j__95,k__97,4)) + tmat(5,5) = 1.0d+00 + dt * 2.0d+00 * (tx1 * c1345 * tmp1 + ty1 * c1345 * tmp1 + tz1 * c1345 * tmp1) + dt * 2.0d+00 * & + &(tx1 * dx5 + ty1 * dy5 + tz1 * dz5) + tmp1 = 1.0d+00 / tmat(1,1) + tmp__93 = tmp1 * tmat(2,1) + tmat(2,2) = tmat(2,2) - tmp__93 * tmat(1,2) + tmat(2,3) = tmat(2,3) - tmp__93 * tmat(1,3) + tmat(2,4) = tmat(2,4) - tmp__93 * tmat(1,4) + tmat(2,5) = tmat(2,5) - tmp__93 * tmat(1,5) + rsd_(2) = rsd_(2) - rsd_(1) * tmp__93 + tmp__93 = tmp1 * tmat(3,1) + tmat(3,2) = tmat(3,2) - tmp__93 * tmat(1,2) + tmat(3,3) = tmat(3,3) - tmp__93 * tmat(1,3) + tmat(3,4) = tmat(3,4) - tmp__93 * tmat(1,4) + tmat(3,5) = tmat(3,5) - tmp__93 * tmat(1,5) + rsd_(3) = rsd_(3) - rsd_(1) * tmp__93 + tmp__93 = tmp1 * tmat(4,1) + tmat(4,2) = tmat(4,2) - tmp__93 * tmat(1,2) + tmat(4,3) = tmat(4,3) - tmp__93 * tmat(1,3) + tmat(4,4) = tmat(4,4) - tmp__93 * tmat(1,4) + tmat(4,5) = tmat(4,5) - tmp__93 * tmat(1,5) + rsd_(4) = rsd_(4) - rsd_(1) * tmp__93 + tmp__93 = tmp1 * tmat(5,1) + tmat(5,2) = tmat(5,2) - tmp__93 * tmat(1,2) + tmat(5,3) = tmat(5,3) - tmp__93 * tmat(1,3) + tmat(5,4) = tmat(5,4) - tmp__93 * tmat(1,4) + tmat(5,5) = tmat(5,5) - tmp__93 * tmat(1,5) + rsd_(5) = rsd_(5) - rsd_(1) * tmp__93 + tmp1 = 1.0d+00 / tmat(2,2) + tmp__93 = tmp1 * tmat(3,2) + tmat(3,3) = tmat(3,3) - tmp__93 * tmat(2,3) + tmat(3,4) = tmat(3,4) - tmp__93 * tmat(2,4) + tmat(3,5) = tmat(3,5) - tmp__93 * tmat(2,5) + rsd_(3) = rsd_(3) - rsd_(2) * tmp__93 + tmp__93 = tmp1 * tmat(4,2) + tmat(4,3) = tmat(4,3) - tmp__93 * tmat(2,3) + tmat(4,4) = tmat(4,4) - tmp__93 * tmat(2,4) + tmat(4,5) = tmat(4,5) - tmp__93 * tmat(2,5) + rsd_(4) = rsd_(4) - rsd_(2) * tmp__93 + tmp__93 = tmp1 * tmat(5,2) + tmat(5,3) = tmat(5,3) - tmp__93 * tmat(2,3) + tmat(5,4) = tmat(5,4) - tmp__93 * tmat(2,4) + tmat(5,5) = tmat(5,5) - tmp__93 * tmat(2,5) + rsd_(5) = rsd_(5) - rsd_(2) * tmp__93 + tmp1 = 1.0d+00 / tmat(3,3) + tmp__93 = tmp1 * tmat(4,3) + tmat(4,4) = tmat(4,4) - tmp__93 * tmat(3,4) + tmat(4,5) = tmat(4,5) - tmp__93 * tmat(3,5) + rsd_(4) = rsd_(4) - rsd_(3) * tmp__93 + tmp__93 = tmp1 * tmat(5,3) + tmat(5,4) = tmat(5,4) - tmp__93 * tmat(3,4) + tmat(5,5) = tmat(5,5) - tmp__93 * tmat(3,5) + rsd_(5) = rsd_(5) - rsd_(3) * tmp__93 + tmp1 = 1.0d+00 / tmat(4,4) + tmp__93 = tmp1 * tmat(5,4) + tmat(5,5) = tmat(5,5) - tmp__93 * tmat(4,5) + rsd_(5) = rsd_(5) - rsd_(4) * tmp__93 + rsd_(5) = rsd_(5) / tmat(5,5) + rsd_(4) = rsd_(4) - tmat(4,5) * rsd_(5) + rsd_(4) = rsd_(4) / tmat(4,4) + rsd_(3) = rsd_(3) - tmat(3,4) * rsd_(4) - tmat(3,5) * rsd_(5) + rsd_(3) = rsd_(3) / tmat(3,3) + rsd_(2) = rsd_(2) - tmat(2,3) * rsd_(3) - tmat(2,4) * rsd_(4) - tmat(2,5) * rsd_(5) + rsd_(2) = rsd_(2) / tmat(2,2) + rsd_(1) = rsd_(1) - tmat(1,2) * rsd_(2) - tmat(1,3) * rsd_(3) - tmat(1,4) * rsd_(4) - tmat(1,5) * rsd_(5) + rsd_(1) = rsd_(1) / tmat(1,1) + rsd(i__96,j__95,k__97,1) = rsd_(1) + rsd(i__96,j__95,k__97,2) = rsd_(2) + rsd(i__96,j__95,k__97,3) = rsd_(3) + rsd(i__96,j__95,k__97,4) = rsd_(4) + rsd(i__96,j__95,k__97,5) = rsd_(5) + enddo + enddo + enddo +!DVM$ END REGION + r43__108 = 4.0d+00 / 3.0d+00 + c1345__107 = c1 * c3 * c4 * c5 + c34__106 = c3 * c4 +!DVM$ REGION +!DVM$ PARALLEL (k__109,j__101,i__102) ON rsd(i__102,j__101,k__109,*),PRIVATE (tmat__98,tmp1__105,tmp__99,tmp2__104,tmp3__103,tmp1,tm& +!DVM$&p2,tmp3,tv),ACROSS (rsd(0:1,0:1,0:1,0:0)),CUDA_BLOCK (16,16) + do k__109 = nz - 1,2,(-(1)) + do j__101 = jend,jst,(-(1)) + do i__102 = iend,ist,(-(1)) + tmp1__105 = 1.0d+00 / u(i__102,j__101,k__109 + 1,1) + tmp2__104 = tmp1__105 * tmp1__105 + tmp3__103 = tmp1__105 * tmp2__104 + tv(1) = omega * ((-(dt)) * tz1 * dz1 * rsd(i__102,j__101,k__109 + 1,1) + dt * tz2 * rsd(i__102,j__101,k__109 + 1,4)) + tv(2) = omega * ((dt * tz2 * ((-(u(i__102,j__101,k__109 + 1,2) * u(i__102,j__101,k__109 + 1,4))) * tmp2__104) - dt * & + &tz1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101,k__109 + 1,2))) * rsd(i__102,j__101,k__109 + 1,1) + (dt * tz2 * (u(i__102,j& + &__101,k__109 + 1,4) * tmp1__105) - dt * tz1 * c34__106 * tmp1__105 - dt * tz1 * dz2) * rsd(i__102,j__101,k__109 + 1,2) + dt * & + &tz2 * (u(i__102,j__101,k__109 + 1,2) * tmp1__105) * rsd(i__102,j__101,k__109 + 1,4)) + tv(3) = omega * ((dt * tz2 * ((-(u(i__102,j__101,k__109 + 1,3) * u(i__102,j__101,k__109 + 1,4))) * tmp2__104) - dt * & + &tz1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101,k__109 + 1,3))) * rsd(i__102,j__101,k__109 + 1,1) + (dt * tz2 * (u(i__102,j& + &__101,k__109 + 1,4) * tmp1__105) - dt * tz1 * (c34__106 * tmp1__105) - dt * tz1 * dz3) * rsd(i__102,j__101,k__109 + 1,3) + dt & + &* tz2 * (u(i__102,j__101,k__109 + 1,3) * tmp1__105) * rsd(i__102,j__101,k__109 + 1,4)) + tv(4) = omega * ((dt * tz2 * ((-((u(i__102,j__101,k__109 + 1,4) * tmp1__105)** 2)) + 0.50d+00 * c2 * ((u(i__102,j__10& + &1,k__109 + 1,2) * u(i__102,j__101,k__109 + 1,2) + u(i__102,j__101,k__109 + 1,3) * u(i__102,j__101,k__109 + 1,3) + u(i__102,j__& + &101,k__109 + 1,4) * u(i__102,j__101,k__109 + 1,4)) * tmp2__104)) - dt * tz1 * ((-(r43__108)) * c34__106 * tmp2__104 * u(i__102& + &,j__101,k__109 + 1,4))) * rsd(i__102,j__101,k__109 + 1,1) + dt * tz2 * ((-(c2)) * (u(i__102,j__101,k__109 + 1,2) * tmp1__105))& + & * rsd(i__102,j__101,k__109 + 1,2) + dt * tz2 * ((-(c2)) * (u(i__102,j__101,k__109 + 1,3) * tmp1__105)) * rsd(i__102,j__101,k_& + &_109 + 1,3) + (dt * tz2 * (2.0d+00 - c2) * (u(i__102,j__101,k__109 + 1,4) * tmp1__105) - dt * tz1 * (r43__108 * c34__106 * tmp& + &1__105) - dt * tz1 * dz4) * rsd(i__102,j__101,k__109 + 1,4) + dt * tz2 * c2 * rsd(i__102,j__101,k__109 + 1,5)) + tv(5) = omega * ((dt * tz2 * ((c2 * (u(i__102,j__101,k__109 + 1,2) * u(i__102,j__101,k__109 + 1,2) + u(i__102,j__101,& + &k__109 + 1,3) * u(i__102,j__101,k__109 + 1,3) + u(i__102,j__101,k__109 + 1,4) * u(i__102,j__101,k__109 + 1,4)) * tmp2__104 - c& + &1 * (u(i__102,j__101,k__109 + 1,5) * tmp1__105)) * (u(i__102,j__101,k__109 + 1,4) * tmp1__105)) - dt * tz1 * ((-(c34__106 - c1& + &345__107)) * tmp3__103 * u(i__102,j__101,k__109 + 1,2)** 2 - (c34__106 - c1345__107) * tmp3__103 * u(i__102,j__101,k__109 + 1,& + &3)** 2 - (r43__108 * c34__106 - c1345__107) * tmp3__103 * u(i__102,j__101,k__109 + 1,4)** 2 - c1345__107 * tmp2__104 * u(i__10& + &2,j__101,k__109 + 1,5))) * rsd(i__102,j__101,k__109 + 1,1) + (dt * tz2 * ((-(c2)) * (u(i__102,j__101,k__109 + 1,2) * u(i__102,& + &j__101,k__109 + 1,4)) * tmp2__104) - dt * tz1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109 + 1,2)) * rsd(i__& + &102,j__101,k__109 + 1,2) + (dt * tz2 * ((-(c2)) * (u(i__102,j__101,k__109 + 1,3) * u(i__102,j__101,k__109 + 1,4)) * tmp2__104)& + & - dt * tz1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109 + 1,3)) * rsd(i__102,j__101,k__109 + 1,3) + (dt * t& + &z2 * (c1 * (u(i__102,j__101,k__109 + 1,5) * tmp1__105) - 0.50d+00 * c2 * ((u(i__102,j__101,k__109 + 1,2) * u(i__102,j__101,k__& + &109 + 1,2) + u(i__102,j__101,k__109 + 1,3) * u(i__102,j__101,k__109 + 1,3) + 3.0d+00 * u(i__102,j__101,k__109 + 1,4) * u(i__10& + &2,j__101,k__109 + 1,4)) * tmp2__104)) - dt * tz1 * (r43__108 * c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109 + 1& + &,4)) * rsd(i__102,j__101,k__109 + 1,4) + (dt * tz2 * (c1 * (u(i__102,j__101,k__109 + 1,4) * tmp1__105)) - dt * tz1 * c1345__10& + &7 * tmp1__105 - dt * tz1 * dz5) * rsd(i__102,j__101,k__109 + 1,5)) + tmp1 = 1.0d+00 / u(i__102 + 1,j__101,k__109,1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + tmp1__105 = 1.0d+00 / u(i__102,j__101 + 1,k__109,1) + tmp2__104 = tmp1__105 * tmp1__105 + tmp3__103 = tmp1__105 * tmp2__104 + tv(1) = tv(1) + omega * ((-(dt)) * ty1 * dy1 * rsd(i__102,j__101 + 1,k__109,1) + (-(dt)) * tx1 * dx1 * rsd(i__102 + 1& + &,j__101,k__109,1) + dt * tx2 * rsd(i__102 + 1,j__101,k__109,2) + dt * ty2 * rsd(i__102,j__101 + 1,k__109,3)) + tv(2) = tv(2) + omega * ((dt * ty2 * ((-(u(i__102,j__101 + 1,k__109,2) * u(i__102,j__101 + 1,k__109,3))) * tmp2__104)& + & - dt * ty1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101 + 1,k__109,2))) * rsd(i__102,j__101 + 1,k__109,1) + (dt * tx2 * ((-& + &((u(i__102 + 1,j__101,k__109,2) * tmp1)** 2)) + c2 * 0.50d+00 * (u(i__102 + 1,j__101,k__109,2) * u(i__102 + 1,j__101,k__109,2)& + & + u(i__102 + 1,j__101,k__109,3) * u(i__102 + 1,j__101,k__109,3) + u(i__102 + 1,j__101,k__109,4) * u(i__102 + 1,j__101,k__109,& + &4)) * tmp2) - dt * tx1 * ((-(r43__108)) * c34__106 * tmp2 * u(i__102 + 1,j__101,k__109,2))) * rsd(i__102 + 1,j__101,k__109,1) & + &+ (dt * ty2 * (u(i__102,j__101 + 1,k__109,3) * tmp1__105) - dt * ty1 * (c34__106 * tmp1__105) - dt * ty1 * dy2) * rsd(i__102,j& + &__101 + 1,k__109,2) + (dt * tx2 * ((2.0d+00 - c2) * (u(i__102 + 1,j__101,k__109,2) * tmp1)) - dt * tx1 * (r43__108 * c34__106 & + &* tmp1) - dt * tx1 * dx2) * rsd(i__102 + 1,j__101,k__109,2) + dt * ty2 * (u(i__102,j__101 + 1,k__109,2) * tmp1__105) * rsd(i__& + &102,j__101 + 1,k__109,3) + dt * tx2 * ((-(c2)) * (u(i__102 + 1,j__101,k__109,3) * tmp1)) * rsd(i__102 + 1,j__101,k__109,3) + d& + &t * tx2 * ((-(c2)) * (u(i__102 + 1,j__101,k__109,4) * tmp1)) * rsd(i__102 + 1,j__101,k__109,4) + dt * tx2 * c2 * rsd(i__102 + & + &1,j__101,k__109,5)) + tv(3) = tv(3) + omega * ((dt * ty2 * ((-((u(i__102,j__101 + 1,k__109,3) * tmp1__105)** 2)) + 0.50d+00 * c2 * ((u(i__1& + &02,j__101 + 1,k__109,2) * u(i__102,j__101 + 1,k__109,2) + u(i__102,j__101 + 1,k__109,3) * u(i__102,j__101 + 1,k__109,3) + u(i_& + &_102,j__101 + 1,k__109,4) * u(i__102,j__101 + 1,k__109,4)) * tmp2__104)) - dt * ty1 * ((-(r43__108)) * c34__106 * tmp2__104 * & + &u(i__102,j__101 + 1,k__109,3))) * rsd(i__102,j__101 + 1,k__109,1) + (dt * tx2 * ((-(u(i__102 + 1,j__101,k__109,2) * u(i__102 +& + & 1,j__101,k__109,3))) * tmp2) - dt * tx1 * ((-(c34__106)) * tmp2 * u(i__102 + 1,j__101,k__109,3))) * rsd(i__102 + 1,j__101,k__& + &109,1) + dt * ty2 * ((-(c2)) * (u(i__102,j__101 + 1,k__109,2) * tmp1__105)) * rsd(i__102,j__101 + 1,k__109,2) + dt * tx2 * (u(& + &i__102 + 1,j__101,k__109,3) * tmp1) * rsd(i__102 + 1,j__101,k__109,2) + (dt * ty2 * ((2.0d+00 - c2) * (u(i__102,j__101 + 1,k__& + &109,3) * tmp1__105)) - dt * ty1 * (r43__108 * c34__106 * tmp1__105) - dt * ty1 * dy3) * rsd(i__102,j__101 + 1,k__109,3) + (dt & + &* tx2 * (u(i__102 + 1,j__101,k__109,2) * tmp1) - dt * tx1 * (c34__106 * tmp1) - dt * tx1 * dx3) * rsd(i__102 + 1,j__101,k__109& + &,3) + dt * ty2 * ((-(c2)) * (u(i__102,j__101 + 1,k__109,4) * tmp1__105)) * rsd(i__102,j__101 + 1,k__109,4) + dt * ty2 * c2 * r& + &sd(i__102,j__101 + 1,k__109,5)) + tv(4) = tv(4) + omega * ((dt * ty2 * ((-(u(i__102,j__101 + 1,k__109,3) * u(i__102,j__101 + 1,k__109,4))) * tmp2__104)& + & - dt * ty1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101 + 1,k__109,4))) * rsd(i__102,j__101 + 1,k__109,1) + (dt * tx2 * ((-& + &(u(i__102 + 1,j__101,k__109,2) * u(i__102 + 1,j__101,k__109,4))) * tmp2) - dt * tx1 * ((-(c34__106)) * tmp2 * u(i__102 + 1,j__& + &101,k__109,4))) * rsd(i__102 + 1,j__101,k__109,1) + dt * tx2 * (u(i__102 + 1,j__101,k__109,4) * tmp1) * rsd(i__102 + 1,j__101,& + &k__109,2) + dt * ty2 * (u(i__102,j__101 + 1,k__109,4) * tmp1__105) * rsd(i__102,j__101 + 1,k__109,3) + (dt * ty2 * (u(i__102,j& + &__101 + 1,k__109,3) * tmp1__105) - dt * ty1 * (c34__106 * tmp1__105) - dt * ty1 * dy4) * rsd(i__102,j__101 + 1,k__109,4) + (dt& + & * tx2 * (u(i__102 + 1,j__101,k__109,2) * tmp1) - dt * tx1 * (c34__106 * tmp1) - dt * tx1 * dx4) * rsd(i__102 + 1,j__101,k__10& + &9,4)) + tv(5) = tv(5) + omega * ((dt * ty2 * ((c2 * (u(i__102,j__101 + 1,k__109,2) * u(i__102,j__101 + 1,k__109,2) + u(i__102& + &,j__101 + 1,k__109,3) * u(i__102,j__101 + 1,k__109,3) + u(i__102,j__101 + 1,k__109,4) * u(i__102,j__101 + 1,k__109,4)) * tmp2_& + &_104 - c1 * (u(i__102,j__101 + 1,k__109,5) * tmp1__105)) * (u(i__102,j__101 + 1,k__109,3) * tmp1__105)) - dt * ty1 * ((-(c34__& + &106 - c1345__107)) * tmp3__103 * u(i__102,j__101 + 1,k__109,2)** 2 - (r43__108 * c34__106 - c1345__107) * tmp3__103 * u(i__102& + &,j__101 + 1,k__109,3)** 2 - (c34__106 - c1345__107) * tmp3__103 * u(i__102,j__101 + 1,k__109,4)** 2 - c1345__107 * tmp2__104 *& + & u(i__102,j__101 + 1,k__109,5))) * rsd(i__102,j__101 + 1,k__109,1) + (dt * tx2 * ((c2 * (u(i__102 + 1,j__101,k__109,2) * u(i__& + &102 + 1,j__101,k__109,2) + u(i__102 + 1,j__101,k__109,3) * u(i__102 + 1,j__101,k__109,3) + u(i__102 + 1,j__101,k__109,4) * u(i& + &__102 + 1,j__101,k__109,4)) * tmp2 - c1 * (u(i__102 + 1,j__101,k__109,5) * tmp1)) * (u(i__102 + 1,j__101,k__109,2) * tmp1)) - & + &dt * tx1 * ((-(r43__108 * c34__106 - c1345__107)) * tmp3 * u(i__102 + 1,j__101,k__109,2)** 2 - (c34__106 - c1345__107) * tmp3 & + &* u(i__102 + 1,j__101,k__109,3)** 2 - (c34__106 - c1345__107) * tmp3 * u(i__102 + 1,j__101,k__109,4)** 2 - c1345__107 * tmp2 *& + & u(i__102 + 1,j__101,k__109,5))) * rsd(i__102 + 1,j__101,k__109,1) + (dt * ty2 * ((-(c2)) * (u(i__102,j__101 + 1,k__109,2) * u& + &(i__102,j__101 + 1,k__109,3)) * tmp2__104) - dt * ty1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101 + 1,k__109,2)) *& + & rsd(i__102,j__101 + 1,k__109,2) + (dt * tx2 * (c1 * (u(i__102 + 1,j__101,k__109,5) * tmp1) - 0.50d+00 * c2 * ((3.0d+00 * u(i_& + &_102 + 1,j__101,k__109,2) * u(i__102 + 1,j__101,k__109,2) + u(i__102 + 1,j__101,k__109,3) * u(i__102 + 1,j__101,k__109,3) + u(& + &i__102 + 1,j__101,k__109,4) * u(i__102 + 1,j__101,k__109,4)) * tmp2)) - dt * tx1 * (r43__108 * c34__106 - c1345__107) * tmp2 *& + & u(i__102 + 1,j__101,k__109,2)) * rsd(i__102 + 1,j__101,k__109,2) + (dt * ty2 * (c1 * (u(i__102,j__101 + 1,k__109,5) * tmp1__1& + &05) - 0.50d+00 * c2 * ((u(i__102,j__101 + 1,k__109,2) * u(i__102,j__101 + 1,k__109,2) + 3.0d+00 * u(i__102,j__101 + 1,k__109,3& + &) * u(i__102,j__101 + 1,k__109,3) + u(i__102,j__101 + 1,k__109,4) * u(i__102,j__101 + 1,k__109,4)) * tmp2__104)) - dt * ty1 * & + &(r43__108 * c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101 + 1,k__109,3)) * rsd(i__102,j__101 + 1,k__109,3) + (dt * tx2 & + &* ((-(c2)) * (u(i__102 + 1,j__101,k__109,3) * u(i__102 + 1,j__101,k__109,2)) * tmp2) - dt * tx1 * (c34__106 - c1345__107) * tm& + &p2 * u(i__102 + 1,j__101,k__109,3)) * rsd(i__102 + 1,j__101,k__109,3) + (dt * ty2 * ((-(c2)) * (u(i__102,j__101 + 1,k__109,3) & + &* u(i__102,j__101 + 1,k__109,4)) * tmp2__104) - dt * ty1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101 + 1,k__109,4)& + &) * rsd(i__102,j__101 + 1,k__109,4) + (dt * tx2 * ((-(c2)) * (u(i__102 + 1,j__101,k__109,4) * u(i__102 + 1,j__101,k__109,2)) *& + & tmp2) - dt * tx1 * (c34__106 - c1345__107) * tmp2 * u(i__102 + 1,j__101,k__109,4)) * rsd(i__102 + 1,j__101,k__109,4) + (dt * & + &ty2 * (c1 * (u(i__102,j__101 + 1,k__109,3) * tmp1__105)) - dt * ty1 * c1345__107 * tmp1__105 - dt * ty1 * dy5) * rsd(i__102,j_& + &_101 + 1,k__109,5) + (dt * tx2 * (c1 * (u(i__102 + 1,j__101,k__109,2) * tmp1)) - dt * tx1 * c1345__107 * tmp1 - dt * tx1 * dx5& + &) * rsd(i__102 + 1,j__101,k__109,5)) + tmp1__105 = 1.0d+00 / u(i__102,j__101,k__109,1) + tmp2__104 = tmp1__105 * tmp1__105 + tmp3__103 = tmp1__105 * tmp2__104 + tmat__98(1,1) = 1.0d+00 + dt * 2.0d+00 * (tx1 * dx1 + ty1 * dy1 + tz1 * dz1) + tmat__98(1,2) = 0.0d+00 + tmat__98(1,3) = 0.0d+00 + tmat__98(1,4) = 0.0d+00 + tmat__98(1,5) = 0.0d+00 + tmat__98(2,1) = dt * 2.0d+00 * (tx1 * ((-(r43__108)) * c34__106 * tmp2__104 * u(i__102,j__101,k__109,2)) + ty1 * ((-(& + &c34__106)) * tmp2__104 * u(i__102,j__101,k__109,2)) + tz1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101,k__109,2))) + tmat__98(2,2) = 1.0d+00 + dt * 2.0d+00 * (tx1 * r43__108 * c34__106 * tmp1__105 + ty1 * c34__106 * tmp1__105 + tz1 * & + &c34__106 * tmp1__105) + dt * 2.0d+00 * (tx1 * dx2 + ty1 * dy2 + tz1 * dz2) + tmat__98(2,3) = 0.0d+00 + tmat__98(2,4) = 0.0d+00 + tmat__98(2,5) = 0.0d+00 + tmat__98(3,1) = dt * 2.0d+00 * (tx1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101,k__109,3)) + ty1 * ((-(r43__108)) & + &* c34__106 * tmp2__104 * u(i__102,j__101,k__109,3)) + tz1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101,k__109,3))) + tmat__98(3,2) = 0.0d+00 + tmat__98(3,3) = 1.0d+00 + dt * 2.0d+00 * (tx1 * c34__106 * tmp1__105 + ty1 * r43__108 * c34__106 * tmp1__105 + tz1 * & + &c34__106 * tmp1__105) + dt * 2.0d+00 * (tx1 * dx3 + ty1 * dy3 + tz1 * dz3) + tmat__98(3,4) = 0.0d+00 + tmat__98(3,5) = 0.0d+00 + tmat__98(4,1) = dt * 2.0d+00 * (tx1 * ((-(c34__106)) * tmp2__104 * u(i__102,j__101,k__109,4)) + ty1 * ((-(c34__106)) & + &* tmp2__104 * u(i__102,j__101,k__109,4)) + tz1 * ((-(r43__108)) * c34__106 * tmp2__104 * u(i__102,j__101,k__109,4))) + tmat__98(4,2) = 0.0d+00 + tmat__98(4,3) = 0.0d+00 + tmat__98(4,4) = 1.0d+00 + dt * 2.0d+00 * (tx1 * c34__106 * tmp1__105 + ty1 * c34__106 * tmp1__105 + tz1 * r43__108 * & + &c34__106 * tmp1__105) + dt * 2.0d+00 * (tx1 * dx4 + ty1 * dy4 + tz1 * dz4) + tmat__98(4,5) = 0.0d+00 + tmat__98(5,1) = dt * 2.0d+00 * (tx1 * ((-(r43__108 * c34__106 - c1345__107)) * tmp3__103 * u(i__102,j__101,k__109,2)*& + &* 2 - (c34__106 - c1345__107) * tmp3__103 * u(i__102,j__101,k__109,3)** 2 - (c34__106 - c1345__107) * tmp3__103 * u(i__102,j__& + &101,k__109,4)** 2 - c1345__107 * tmp2__104 * u(i__102,j__101,k__109,5)) + ty1 * ((-(c34__106 - c1345__107)) * tmp3__103 * u(i_& + &_102,j__101,k__109,2)** 2 - (r43__108 * c34__106 - c1345__107) * tmp3__103 * u(i__102,j__101,k__109,3)** 2 - (c34__106 - c1345& + &__107) * tmp3__103 * u(i__102,j__101,k__109,4)** 2 - c1345__107 * tmp2__104 * u(i__102,j__101,k__109,5)) + tz1 * ((-(c34__106 & + &- c1345__107)) * tmp3__103 * u(i__102,j__101,k__109,2)** 2 - (c34__106 - c1345__107) * tmp3__103 * u(i__102,j__101,k__109,3)**& + & 2 - (r43__108 * c34__106 - c1345__107) * tmp3__103 * u(i__102,j__101,k__109,4)** 2 - c1345__107 * tmp2__104 * u(i__102,j__101& + &,k__109,5))) + tmat__98(5,2) = dt * 2.0d+00 * (tx1 * (r43__108 * c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109,2) + ty& + &1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109,2) + tz1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__& + &101,k__109,2)) + tmat__98(5,3) = dt * 2.0d+00 * (tx1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109,3) + ty1 * (r43__1& + &08 * c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109,3) + tz1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__& + &101,k__109,3)) + tmat__98(5,4) = dt * 2.0d+00 * (tx1 * (c34__106 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109,4) + ty1 * (c34__1& + &06 - c1345__107) * tmp2__104 * u(i__102,j__101,k__109,4) + tz1 * (r43__108 * c34__106 - c1345__107) * tmp2__104 * u(i__102,j__& + &101,k__109,4)) + tmat__98(5,5) = 1.0d+00 + dt * 2.0d+00 * (tx1 * c1345__107 * tmp1__105 + ty1 * c1345__107 * tmp1__105 + tz1 * c1345__& + &107 * tmp1__105) + dt * 2.0d+00 * (tx1 * dx5 + ty1 * dy5 + tz1 * dz5) + tmp1__105 = 1.0d+00 / tmat__98(1,1) + tmp__99 = tmp1__105 * tmat__98(2,1) + tmat__98(2,2) = tmat__98(2,2) - tmp__99 * tmat__98(1,2) + tmat__98(2,3) = tmat__98(2,3) - tmp__99 * tmat__98(1,3) + tmat__98(2,4) = tmat__98(2,4) - tmp__99 * tmat__98(1,4) + tmat__98(2,5) = tmat__98(2,5) - tmp__99 * tmat__98(1,5) + tv(2) = tv(2) - tv(1) * tmp__99 + tmp__99 = tmp1__105 * tmat__98(3,1) + tmat__98(3,2) = tmat__98(3,2) - tmp__99 * tmat__98(1,2) + tmat__98(3,3) = tmat__98(3,3) - tmp__99 * tmat__98(1,3) + tmat__98(3,4) = tmat__98(3,4) - tmp__99 * tmat__98(1,4) + tmat__98(3,5) = tmat__98(3,5) - tmp__99 * tmat__98(1,5) + tv(3) = tv(3) - tv(1) * tmp__99 + tmp__99 = tmp1__105 * tmat__98(4,1) + tmat__98(4,2) = tmat__98(4,2) - tmp__99 * tmat__98(1,2) + tmat__98(4,3) = tmat__98(4,3) - tmp__99 * tmat__98(1,3) + tmat__98(4,4) = tmat__98(4,4) - tmp__99 * tmat__98(1,4) + tmat__98(4,5) = tmat__98(4,5) - tmp__99 * tmat__98(1,5) + tv(4) = tv(4) - tv(1) * tmp__99 + tmp__99 = tmp1__105 * tmat__98(5,1) + tmat__98(5,2) = tmat__98(5,2) - tmp__99 * tmat__98(1,2) + tmat__98(5,3) = tmat__98(5,3) - tmp__99 * tmat__98(1,3) + tmat__98(5,4) = tmat__98(5,4) - tmp__99 * tmat__98(1,4) + tmat__98(5,5) = tmat__98(5,5) - tmp__99 * tmat__98(1,5) + tv(5) = tv(5) - tv(1) * tmp__99 + tmp1__105 = 1.0d+00 / tmat__98(2,2) + tmp__99 = tmp1__105 * tmat__98(3,2) + tmat__98(3,3) = tmat__98(3,3) - tmp__99 * tmat__98(2,3) + tmat__98(3,4) = tmat__98(3,4) - tmp__99 * tmat__98(2,4) + tmat__98(3,5) = tmat__98(3,5) - tmp__99 * tmat__98(2,5) + tv(3) = tv(3) - tv(2) * tmp__99 + tmp__99 = tmp1__105 * tmat__98(4,2) + tmat__98(4,3) = tmat__98(4,3) - tmp__99 * tmat__98(2,3) + tmat__98(4,4) = tmat__98(4,4) - tmp__99 * tmat__98(2,4) + tmat__98(4,5) = tmat__98(4,5) - tmp__99 * tmat__98(2,5) + tv(4) = tv(4) - tv(2) * tmp__99 + tmp__99 = tmp1__105 * tmat__98(5,2) + tmat__98(5,3) = tmat__98(5,3) - tmp__99 * tmat__98(2,3) + tmat__98(5,4) = tmat__98(5,4) - tmp__99 * tmat__98(2,4) + tmat__98(5,5) = tmat__98(5,5) - tmp__99 * tmat__98(2,5) + tv(5) = tv(5) - tv(2) * tmp__99 + tmp1__105 = 1.0d+00 / tmat__98(3,3) + tmp__99 = tmp1__105 * tmat__98(4,3) + tmat__98(4,4) = tmat__98(4,4) - tmp__99 * tmat__98(3,4) + tmat__98(4,5) = tmat__98(4,5) - tmp__99 * tmat__98(3,5) + tv(4) = tv(4) - tv(3) * tmp__99 + tmp__99 = tmp1__105 * tmat__98(5,3) + tmat__98(5,4) = tmat__98(5,4) - tmp__99 * tmat__98(3,4) + tmat__98(5,5) = tmat__98(5,5) - tmp__99 * tmat__98(3,5) + tv(5) = tv(5) - tv(3) * tmp__99 + tmp1__105 = 1.0d+00 / tmat__98(4,4) + tmp__99 = tmp1__105 * tmat__98(5,4) + tmat__98(5,5) = tmat__98(5,5) - tmp__99 * tmat__98(4,5) + tv(5) = tv(5) - tv(4) * tmp__99 + tv(5) = tv(5) / tmat__98(5,5) + tv(4) = tv(4) - tmat__98(4,5) * tv(5) + tv(4) = tv(4) / tmat__98(4,4) + tv(3) = tv(3) - tmat__98(3,4) * tv(4) - tmat__98(3,5) * tv(5) + tv(3) = tv(3) / tmat__98(3,3) + tv(2) = tv(2) - tmat__98(2,3) * tv(3) - tmat__98(2,4) * tv(4) - tmat__98(2,5) * tv(5) + tv(2) = tv(2) / tmat__98(2,2) + tv(1) = tv(1) - tmat__98(1,2) * tv(2) - tmat__98(1,3) * tv(3) - tmat__98(1,4) * tv(4) - tmat__98(1,5) * tv(5) + tv(1) = tv(1) / tmat__98(1,1) + rsd(i__102,j__101,k__109,1) = rsd(i__102,j__101,k__109,1) - tv(1) + rsd(i__102,j__101,k__109,2) = rsd(i__102,j__101,k__109,2) - tv(2) + rsd(i__102,j__101,k__109,3) = rsd(i__102,j__101,k__109,3) - tv(3) + rsd(i__102,j__101,k__109,4) = rsd(i__102,j__101,k__109,4) - tv(4) + rsd(i__102,j__101,k__109,5) = rsd(i__102,j__101,k__109,5) - tv(5) + enddo + enddo + enddo +!DVM$ END REGION +!DVM$ REGION +!DVM$ PARALLEL (k__45,j__46,i__47) ON u(i__47,j__46,k__45,*),PRIVATE (m__44) + do k__45 = 2,nz - 1 + do j__46 = jst,jend + do i__47 = ist,iend + do m__44 = 1,5 + u(i__47,j__46,k__45,m__44) = u(i__47,j__46,k__45,m__44) + tmp__43 * rsd(i__47,j__46,k__45,m__44) + enddo + enddo + enddo + enddo +!DVM$ END REGION +!DVM$ REGION +!DVM$ PARALLEL (k__84,j__85,i__86) ON rsd(i__86,j__85,k__84,*),PRIVATE (m__83,rsd_,flux_,u21__75,q__76,tmp__72,u21i__71,u31i__70,u41& +!DVM$&i__69,u51i__68,u21im1__59,u31im1__58,u41im1__57,u51im1__56,u31__74,u21j__67,u31j__66,u41j__65,u51j__64,u21jm1__55,u31jm1__54,u& +!DVM$&41jm1__53,u51jm1__52,u41__73,u21k__63,u31k__62,u41k__61,u51k__60,u21km1__51,u31km1__50,u41km1__49,u51km1__48),SHADOW_RENEW (u) + do k__84 = 2,nz - 1 + do j__85 = 2,ny - 1 + do i__86 = 2,nx - 1 + flux_(1) = u(i__86 - 1,j__85,k__84,2) + u21__75 = u(i__86 - 1,j__85,k__84,2) / u(i__86 - 1,j__85,k__84,1) + q__76 = 0.50d+00 * (u(i__86 - 1,j__85,k__84,2) * u(i__86 - 1,j__85,k__84,2) + u(i__86 - 1,j__85,k__84,3) * u(i__86 - & + &1,j__85,k__84,3) + u(i__86 - 1,j__85,k__84,4) * u(i__86 - 1,j__85,k__84,4)) / u(i__86 - 1,j__85,k__84,1) + flux_(2) = u(i__86 - 1,j__85,k__84,2) * u21__75 + c2 * (u(i__86 - 1,j__85,k__84,5) - q__76) + flux_(3) = u(i__86 - 1,j__85,k__84,3) * u21__75 + flux_(4) = u(i__86 - 1,j__85,k__84,4) * u21__75 + flux_(5) = (c1 * u(i__86 - 1,j__85,k__84,5) - c2 * q__76) * u21__75 + flux_(6) = u(i__86 + 1,j__85,k__84,2) + u21__75 = u(i__86 + 1,j__85,k__84,2) / u(i__86 + 1,j__85,k__84,1) + q__76 = 0.50d+00 * (u(i__86 + 1,j__85,k__84,2) * u(i__86 + 1,j__85,k__84,2) + u(i__86 + 1,j__85,k__84,3) * u(i__86 + & + &1,j__85,k__84,3) + u(i__86 + 1,j__85,k__84,4) * u(i__86 + 1,j__85,k__84,4)) / u(i__86 + 1,j__85,k__84,1) + flux_(7) = u(i__86 + 1,j__85,k__84,2) * u21__75 + c2 * (u(i__86 + 1,j__85,k__84,5) - q__76) + flux_(8) = u(i__86 + 1,j__85,k__84,3) * u21__75 + flux_(9) = u(i__86 + 1,j__85,k__84,4) * u21__75 + flux_(10) = (c1 * u(i__86 + 1,j__85,k__84,5) - c2 * q__76) * u21__75 + do m__83 = 1,5 + rsd_(m__83) = (-(frct(i__86,j__85,k__84,m__83))) - tx2 * (flux_(m__83 + 5) - flux_(m__83)) + enddo + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21i__71 = tmp__72 * u(i__86,j__85,k__84,2) + u31i__70 = tmp__72 * u(i__86,j__85,k__84,3) + u41i__69 = tmp__72 * u(i__86,j__85,k__84,4) + u51i__68 = tmp__72 * u(i__86,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86 - 1,j__85,k__84,1) + u21im1__59 = tmp__72 * u(i__86 - 1,j__85,k__84,2) + u31im1__58 = tmp__72 * u(i__86 - 1,j__85,k__84,3) + u41im1__57 = tmp__72 * u(i__86 - 1,j__85,k__84,4) + u51im1__56 = tmp__72 * u(i__86 - 1,j__85,k__84,5) + flux_(2) = 4.0d+00 / 3.0d+00 * tx3 * (u21i__71 - u21im1__59) + flux_(3) = tx3 * (u31i__70 - u31im1__58) + flux_(4) = tx3 * (u41i__69 - u41im1__57) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 * (u21i__71** 2 + u31i__70** 2 + u41i__69** 2 - (u21im1__59** 2 + u31& + &im1__58** 2 + u41im1__57** 2)) + 1.0d+00 / 6.0d+00 * tx3 * (u21i__71** 2 - u21im1__59** 2) + c1 * c5 * tx3 * (u51i__68 - u51im& + &1__56) + tmp__72 = 1.0d+00 / u(i__86 + 1,j__85,k__84,1) + u21i__71 = tmp__72 * u(i__86 + 1,j__85,k__84,2) + u31i__70 = tmp__72 * u(i__86 + 1,j__85,k__84,3) + u41i__69 = tmp__72 * u(i__86 + 1,j__85,k__84,4) + u51i__68 = tmp__72 * u(i__86 + 1,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21im1__59 = tmp__72 * u(i__86,j__85,k__84,2) + u31im1__58 = tmp__72 * u(i__86,j__85,k__84,3) + u41im1__57 = tmp__72 * u(i__86,j__85,k__84,4) + u51im1__56 = tmp__72 * u(i__86,j__85,k__84,5) + flux_(7) = 4.0d+00 / 3.0d+00 * tx3 * (u21i__71 - u21im1__59) + flux_(8) = tx3 * (u31i__70 - u31im1__58) + flux_(9) = tx3 * (u41i__69 - u41im1__57) + flux_(10) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 * (u21i__71** 2 + u31i__70** 2 + u41i__69** 2 - (u21im1__59** 2 + u3& + &1im1__58** 2 + u41im1__57** 2)) + 1.0d+00 / 6.0d+00 * tx3 * (u21i__71** 2 - u21im1__59** 2) + c1 * c5 * tx3 * (u51i__68 - u51i& + &m1__56) + rsd_(1) = rsd_(1) + dx1 * tx1 * (u(i__86 - 1,j__85,k__84,1) - 2.0d+00 * u(i__86,j__85,k__84,1) + u(i__86 + 1,j__85,k_& + &_84,1)) + rsd_(2) = rsd_(2) + tx3 * c3 * c4 * (flux_(2 + 5) - flux_(2)) + dx2 * tx1 * (u(i__86 - 1,j__85,k__84,2) - 2.0d+00 * u& + &(i__86,j__85,k__84,2) + u(i__86 + 1,j__85,k__84,2)) + rsd_(3) = rsd_(3) + tx3 * c3 * c4 * (flux_(3 + 5) - flux_(3)) + dx3 * tx1 * (u(i__86 - 1,j__85,k__84,3) - 2.0d+00 * u& + &(i__86,j__85,k__84,3) + u(i__86 + 1,j__85,k__84,3)) + rsd_(4) = rsd_(4) + tx3 * c3 * c4 * (flux_(4 + 5) - flux_(4)) + dx4 * tx1 * (u(i__86 - 1,j__85,k__84,4) - 2.0d+00 * u& + &(i__86,j__85,k__84,4) + u(i__86 + 1,j__85,k__84,4)) + rsd_(5) = rsd_(5) + tx3 * c3 * c4 * (flux_(5 + 5) - flux_(5)) + dx5 * tx1 * (u(i__86 - 1,j__85,k__84,5) - 2.0d+00 * u& + &(i__86,j__85,k__84,5) + u(i__86 + 1,j__85,k__84,5)) + if (i__86 .eq. 2) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * ((+(5.0d+00)) * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86 + 1,j__85,k__& + &84,m__83) + u(i__86 + 2,j__85,k__84,m__83)) + enddo + else if (i__86 .eq. 3) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * ((-(4.0d+00)) * u(i__86 - 1,j__85,k__84,m__83) + 6.0d+00 * u(i__86,j__85,k__& + &84,m__83) - 4.0d+00 * u(i__86 + 1,j__85,k__84,m__83) + u(i__86 + 2,j__85,k__84,m__83)) + enddo + else if (i__86 .ge. 4 .and. i__86 .le. nx - 3) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86 - 2,j__85,k__84,m__83) - 4.0d+00 * u(i__86 - 1,j__85,k__84,m__83) +& + & 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86 + 1,j__85,k__84,m__83) + u(i__86 + 2,j__85,k__84,m__83)) + enddo + else if (i__86 .eq. nx - 2) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86 - 2,j__85,k__84,m__83) - 4.0d+00 * u(i__86 - 1,j__85,k__84,m__83) +& + & 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86 + 1,j__85,k__84,m__83)) + enddo + else if (i__86 .eq. nx - 1) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86 - 2,j__85,k__84,m__83) - 4.0d+00 * u(i__86 - 1,j__85,k__84,m__83) +& + & 5.0d+00 * u(i__86,j__85,k__84,m__83)) + enddo + endif + flux_(1) = u(i__86,j__85 - 1,k__84,3) + u31__74 = u(i__86,j__85 - 1,k__84,3) / u(i__86,j__85 - 1,k__84,1) + q__76 = 0.50d+00 * (u(i__86,j__85 - 1,k__84,2) * u(i__86,j__85 - 1,k__84,2) + u(i__86,j__85 - 1,k__84,3) * u(i__86,j_& + &_85 - 1,k__84,3) + u(i__86,j__85 - 1,k__84,4) * u(i__86,j__85 - 1,k__84,4)) / u(i__86,j__85 - 1,k__84,1) + flux_(2) = u(i__86,j__85 - 1,k__84,2) * u31__74 + flux_(3) = u(i__86,j__85 - 1,k__84,3) * u31__74 + c2 * (u(i__86,j__85 - 1,k__84,5) - q__76) + flux_(4) = u(i__86,j__85 - 1,k__84,4) * u31__74 + flux_(5) = (c1 * u(i__86,j__85 - 1,k__84,5) - c2 * q__76) * u31__74 + flux_(6) = u(i__86,j__85 + 1,k__84,3) + u31__74 = u(i__86,j__85 + 1,k__84,3) / u(i__86,j__85 + 1,k__84,1) + q__76 = 0.50d+00 * (u(i__86,j__85 + 1,k__84,2) * u(i__86,j__85 + 1,k__84,2) + u(i__86,j__85 + 1,k__84,3) * u(i__86,j_& + &_85 + 1,k__84,3) + u(i__86,j__85 + 1,k__84,4) * u(i__86,j__85 + 1,k__84,4)) / u(i__86,j__85 + 1,k__84,1) + flux_(7) = u(i__86,j__85 + 1,k__84,2) * u31__74 + flux_(8) = u(i__86,j__85 + 1,k__84,3) * u31__74 + c2 * (u(i__86,j__85 + 1,k__84,5) - q__76) + flux_(9) = u(i__86,j__85 + 1,k__84,4) * u31__74 + flux_(10) = (c1 * u(i__86,j__85 + 1,k__84,5) - c2 * q__76) * u31__74 + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - ty2 * (flux_(m__83 + 5) - flux_(m__83)) + enddo + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21j__67 = tmp__72 * u(i__86,j__85,k__84,2) + u31j__66 = tmp__72 * u(i__86,j__85,k__84,3) + u41j__65 = tmp__72 * u(i__86,j__85,k__84,4) + u51j__64 = tmp__72 * u(i__86,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85 - 1,k__84,1) + u21jm1__55 = tmp__72 * u(i__86,j__85 - 1,k__84,2) + u31jm1__54 = tmp__72 * u(i__86,j__85 - 1,k__84,3) + u41jm1__53 = tmp__72 * u(i__86,j__85 - 1,k__84,4) + u51jm1__52 = tmp__72 * u(i__86,j__85 - 1,k__84,5) + flux_(2) = ty3 * (u21j__67 - u21jm1__55) + flux_(3) = 4.0d+00 / 3.0d+00 * ty3 * (u31j__66 - u31jm1__54) + flux_(4) = ty3 * (u41j__65 - u41jm1__53) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 * (u21j__67** 2 + u31j__66** 2 + u41j__65** 2 - (u21jm1__55** 2 + u31& + &jm1__54** 2 + u41jm1__53** 2)) + 1.0d+00 / 6.0d+00 * ty3 * (u31j__66** 2 - u31jm1__54** 2) + c1 * c5 * ty3 * (u51j__64 - u51jm& + &1__52) + tmp__72 = 1.0d+00 / u(i__86,j__85 + 1,k__84,1) + u21j__67 = tmp__72 * u(i__86,j__85 + 1,k__84,2) + u31j__66 = tmp__72 * u(i__86,j__85 + 1,k__84,3) + u41j__65 = tmp__72 * u(i__86,j__85 + 1,k__84,4) + u51j__64 = tmp__72 * u(i__86,j__85 + 1,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21jm1__55 = tmp__72 * u(i__86,j__85,k__84,2) + u31jm1__54 = tmp__72 * u(i__86,j__85,k__84,3) + u41jm1__53 = tmp__72 * u(i__86,j__85,k__84,4) + u51jm1__52 = tmp__72 * u(i__86,j__85,k__84,5) + flux_(7) = ty3 * (u21j__67 - u21jm1__55) + flux_(8) = 4.0d+00 / 3.0d+00 * ty3 * (u31j__66 - u31jm1__54) + flux_(9) = ty3 * (u41j__65 - u41jm1__53) + flux_(10) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 * (u21j__67** 2 + u31j__66** 2 + u41j__65** 2 - (u21jm1__55** 2 + u3& + &1jm1__54** 2 + u41jm1__53** 2)) + 1.0d+00 / 6.0d+00 * ty3 * (u31j__66** 2 - u31jm1__54** 2) + c1 * c5 * ty3 * (u51j__64 - u51j& + &m1__52) + rsd_(1) = rsd_(1) + dy1 * ty1 * (u(i__86,j__85 - 1,k__84,1) - 2.0d+00 * u(i__86,j__85,k__84,1) + u(i__86,j__85 + 1,k_& + &_84,1)) + rsd_(2) = rsd_(2) + ty3 * c3 * c4 * (flux_(7) - flux_(2)) + dy2 * ty1 * (u(i__86,j__85 - 1,k__84,2) - 2.0d+00 * u(i__& + &86,j__85,k__84,2) + u(i__86,j__85 + 1,k__84,2)) + rsd_(3) = rsd_(3) + ty3 * c3 * c4 * (flux_(8) - flux_(3)) + dy3 * ty1 * (u(i__86,j__85 - 1,k__84,3) - 2.0d+00 * u(i__& + &86,j__85,k__84,3) + u(i__86,j__85 + 1,k__84,3)) + rsd_(4) = rsd_(4) + ty3 * c3 * c4 * (flux_(9) - flux_(4)) + dy4 * ty1 * (u(i__86,j__85 - 1,k__84,4) - 2.0d+00 * u(i__& + &86,j__85,k__84,4) + u(i__86,j__85 + 1,k__84,4)) + rsd_(5) = rsd_(5) + ty3 * c3 * c4 * (flux_(10) - flux_(5)) + dy5 * ty1 * (u(i__86,j__85 - 1,k__84,5) - 2.0d+00 * u(i_& + &_86,j__85,k__84,5) + u(i__86,j__85 + 1,k__84,5)) + if (j__85 .eq. 2) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * ((+(5.0d+00)) * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85 + 1,k__& + &84,m__83) + u(i__86,j__85 + 2,k__84,m__83)) + enddo + else if (j__85 .eq. 3) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * ((-(4.0d+00)) * u(i__86,j__85 - 1,k__84,m__83) + 6.0d+00 * u(i__86,j__85,k__& + &84,m__83) - 4.0d+00 * u(i__86,j__85 + 1,k__84,m__83) + u(i__86,j__85 + 2,k__84,m__83)) + enddo + else if (j__85 .ge. 4 .and. j__85 .le. ny - 3) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86,j__85 - 2,k__84,m__83) - 4.0d+00 * u(i__86,j__85 - 1,k__84,m__83) +& + & 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85 + 1,k__84,m__83) + u(i__86,j__85 + 2,k__84,m__83)) + enddo + else if (j__85 .eq. ny - 2) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86,j__85 - 2,k__84,m__83) - 4.0d+00 * u(i__86,j__85 - 1,k__84,m__83) +& + & 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85 + 1,k__84,m__83)) + enddo + else if (j__85 .eq. ny - 1) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86,j__85 - 2,k__84,m__83) - 4.0d+00 * u(i__86,j__85 - 1,k__84,m__83) +& + & 5.0d+00 * u(i__86,j__85,k__84,m__83)) + enddo + endif + flux_(1) = u(i__86,j__85,k__84 - 1,4) + u41__73 = u(i__86,j__85,k__84 - 1,4) / u(i__86,j__85,k__84 - 1,1) + q__76 = 0.50d+00 * (u(i__86,j__85,k__84 - 1,2) * u(i__86,j__85,k__84 - 1,2) + u(i__86,j__85,k__84 - 1,3) * u(i__86,j_& + &_85,k__84 - 1,3) + u(i__86,j__85,k__84 - 1,4) * u(i__86,j__85,k__84 - 1,4)) / u(i__86,j__85,k__84 - 1,1) + flux_(2) = u(i__86,j__85,k__84 - 1,2) * u41__73 + flux_(3) = u(i__86,j__85,k__84 - 1,3) * u41__73 + flux_(4) = u(i__86,j__85,k__84 - 1,4) * u41__73 + c2 * (u(i__86,j__85,k__84 - 1,5) - q__76) + flux_(5) = (c1 * u(i__86,j__85,k__84 - 1,5) - c2 * q__76) * u41__73 + flux_(6) = u(i__86,j__85,k__84 + 1,4) + u41__73 = u(i__86,j__85,k__84 + 1,4) / u(i__86,j__85,k__84 + 1,1) + q__76 = 0.50d+00 * (u(i__86,j__85,k__84 + 1,2) * u(i__86,j__85,k__84 + 1,2) + u(i__86,j__85,k__84 + 1,3) * u(i__86,j_& + &_85,k__84 + 1,3) + u(i__86,j__85,k__84 + 1,4) * u(i__86,j__85,k__84 + 1,4)) / u(i__86,j__85,k__84 + 1,1) + flux_(7) = u(i__86,j__85,k__84 + 1,2) * u41__73 + flux_(8) = u(i__86,j__85,k__84 + 1,3) * u41__73 + flux_(9) = u(i__86,j__85,k__84 + 1,4) * u41__73 + c2 * (u(i__86,j__85,k__84 + 1,5) - q__76) + flux_(10) = (c1 * u(i__86,j__85,k__84 + 1,5) - c2 * q__76) * u41__73 + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - tz2 * (flux_(m__83 + 5) - flux_(m__83)) + enddo + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21k__63 = tmp__72 * u(i__86,j__85,k__84,2) + u31k__62 = tmp__72 * u(i__86,j__85,k__84,3) + u41k__61 = tmp__72 * u(i__86,j__85,k__84,4) + u51k__60 = tmp__72 * u(i__86,j__85,k__84,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84 - 1,1) + u21km1__51 = tmp__72 * u(i__86,j__85,k__84 - 1,2) + u31km1__50 = tmp__72 * u(i__86,j__85,k__84 - 1,3) + u41km1__49 = tmp__72 * u(i__86,j__85,k__84 - 1,4) + u51km1__48 = tmp__72 * u(i__86,j__85,k__84 - 1,5) + flux_(2) = tz3 * (u21k__63 - u21km1__51) + flux_(3) = tz3 * (u31k__62 - u31km1__50) + flux_(4) = 4.0d+00 / 3.0d+00 * tz3 * (u41k__61 - u41km1__49) + flux_(5) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 * (u21k__63** 2 + u31k__62** 2 + u41k__61** 2 - (u21km1__51** 2 + u31& + &km1__50** 2 + u41km1__49** 2)) + 1.0d+00 / 6.0d+00 * tz3 * (u41k__61** 2 - u41km1__49** 2) + c1 * c5 * tz3 * (u51k__60 - u51km& + &1__48) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84 + 1,1) + u21k__63 = tmp__72 * u(i__86,j__85,k__84 + 1,2) + u31k__62 = tmp__72 * u(i__86,j__85,k__84 + 1,3) + u41k__61 = tmp__72 * u(i__86,j__85,k__84 + 1,4) + u51k__60 = tmp__72 * u(i__86,j__85,k__84 + 1,5) + tmp__72 = 1.0d+00 / u(i__86,j__85,k__84,1) + u21km1__51 = tmp__72 * u(i__86,j__85,k__84,2) + u31km1__50 = tmp__72 * u(i__86,j__85,k__84,3) + u41km1__49 = tmp__72 * u(i__86,j__85,k__84,4) + u51km1__48 = tmp__72 * u(i__86,j__85,k__84,5) + flux_(7) = tz3 * (u21k__63 - u21km1__51) + flux_(8) = tz3 * (u31k__62 - u31km1__50) + flux_(9) = 4.0d+00 / 3.0d+00 * tz3 * (u41k__61 - u41km1__49) + flux_(10) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 * (u21k__63** 2 + u31k__62** 2 + u41k__61** 2 - (u21km1__51** 2 + u3& + &1km1__50** 2 + u41km1__49** 2)) + 1.0d+00 / 6.0d+00 * tz3 * (u41k__61** 2 - u41km1__49** 2) + c1 * c5 * tz3 * (u51k__60 - u51k& + &m1__48) + rsd_(1) = rsd_(1) + dz1 * tz1 * (u(i__86,j__85,k__84 - 1,1) - 2.0d+00 * u(i__86,j__85,k__84,1) + u(i__86,j__85,k__84 & + &+ 1,1)) + rsd_(2) = rsd_(2) + tz3 * c3 * c4 * (flux_(7) - flux_(2)) + dz2 * tz1 * (u(i__86,j__85,k__84 - 1,2) - 2.0d+00 * u(i__& + &86,j__85,k__84,2) + u(i__86,j__85,k__84 + 1,2)) + rsd_(3) = rsd_(3) + tz3 * c3 * c4 * (flux_(8) - flux_(3)) + dz3 * tz1 * (u(i__86,j__85,k__84 - 1,3) - 2.0d+00 * u(i__& + &86,j__85,k__84,3) + u(i__86,j__85,k__84 + 1,3)) + rsd_(4) = rsd_(4) + tz3 * c3 * c4 * (flux_(9) - flux_(4)) + dz4 * tz1 * (u(i__86,j__85,k__84 - 1,4) - 2.0d+00 * u(i__& + &86,j__85,k__84,4) + u(i__86,j__85,k__84 + 1,4)) + rsd_(5) = rsd_(5) + tz3 * c3 * c4 * (flux_(10) - flux_(5)) + dz5 * tz1 * (u(i__86,j__85,k__84 - 1,5) - 2.0d+00 * u(i_& + &_86,j__85,k__84,5) + u(i__86,j__85,k__84 + 1,5)) + if (k__84 .eq. 2) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * ((+(5.0d+00)) * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85,k__84 +& + & 1,m__83) + u(i__86,j__85,k__84 + 2,m__83)) + enddo + else if (k__84 .eq. 3) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * ((-(4.0d+00)) * u(i__86,j__85,k__84 - 1,m__83) + 6.0d+00 * u(i__86,j__85,k__& + &84,m__83) - 4.0d+00 * u(i__86,j__85,k__84 + 1,m__83) + u(i__86,j__85,k__84 + 2,m__83)) + enddo + else if (k__84 .ge. 4 .and. k__84 .le. nz - 3) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86,j__85,k__84 - 2,m__83) - 4.0d+00 * u(i__86,j__85,k__84 - 1,m__83) +& + & 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85,k__84 + 1,m__83) + u(i__86,j__85,k__84 + 2,m__83)) + enddo + else if (k__84 .eq. nz - 2) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86,j__85,k__84 - 2,m__83) - 4.0d+00 * u(i__86,j__85,k__84 - 1,m__83) +& + & 6.0d+00 * u(i__86,j__85,k__84,m__83) - 4.0d+00 * u(i__86,j__85,k__84 + 1,m__83)) + enddo + else if (k__84 .eq. nz - 1) then + do m__83 = 1,5 + rsd_(m__83) = rsd_(m__83) - dssp * (u(i__86,j__85,k__84 - 2,m__83) - 4.0d+00 * u(i__86,j__85,k__84 - 1,m__83) +& + & 5.0d+00 * u(i__86,j__85,k__84,m__83)) + enddo + endif + do m__83 = 1,5 + rsd(i__86,j__85,k__84,m__83) = rsd_(m__83) + enddo + enddo + enddo + enddo +!DVM$ END REGION + mod_1150_42 = mod (istep,inorm) + if (mod_1150_42 .eq. 0 .or. istep .eq. itmax) then + v_1573_88 = isiz1 / 2 * 2 + 1 + v_1573_87 = isiz2 / 2 * 2 + 1 + do m__89 = 1,5 + rsdnm(m__89) = 0.0d+00 + enddo + r1 = 0.0d0 + r2 = 0.0d0 + r3 = 0.0d0 + r4 = 0.0d0 + r5 = 0.0d0 +!DVM$ REGION +!DVM$ PARALLEL (k__90,j__91,i__92) ON rsd(i__92,j__91,k__90,*),REDUCTION (sum(r1),sum(r2),sum(r3),sum(r4),sum(r5)),CUDA_BLOCK (32& +!DVM$&,4) + do k__90 = 2,nz0 - 1 + do j__91 = jst,jend + do i__92 = ist,iend + r1 = r1 + rsd(i__92,j__91,k__90,1) * rsd(i__92,j__91,k__90,1) + r2 = r2 + rsd(i__92,j__91,k__90,2) * rsd(i__92,j__91,k__90,2) + r3 = r3 + rsd(i__92,j__91,k__90,3) * rsd(i__92,j__91,k__90,3) + r4 = r4 + rsd(i__92,j__91,k__90,4) * rsd(i__92,j__91,k__90,4) + r5 = r5 + rsd(i__92,j__91,k__90,5) * rsd(i__92,j__91,k__90,5) + enddo + enddo + enddo +!DVM$ END REGION + rsdnm(1) = r1 + rsdnm(2) = r2 + rsdnm(3) = r3 + rsdnm(4) = r4 + rsdnm(5) = r5 + do m__89 = 1,5 + rsdnm(m__89) = sqrt (rsdnm(m__89) / ((nx0 - 2) * (ny0 - 2) * (nz0 - 2))) + enddo + endif + if (rsdnm(1) .lt. tolrsd(1) .and. rsdnm(2) .lt. tolrsd(2) .and. rsdnm(3) .lt. tolrsd(3) .and. rsdnm(4) .lt. tolrsd(4) .and. rs& + &dnm(5) .lt. tolrsd(5)) then + goto 2047 + endif + istep = istep + 1 + if (touch .eq. 1) then + touch = 0 + goto 10001 + endif + if (istep .gt. itmax) goto 2046 + goto 2045 +2046 t = dvtime () + +!call etime(tarray) +! t = tarray(1) + now = t + t__110 = now - start(1) + elapsed(1) = elapsed(1) + t__110 + maxtime = elapsed(1) +2047 continue + do m__114 = 1,5 + errnm(m__114) = 0.0d+00 + enddo +!DVM$ GET_ACTUAL (u) +!DVM$ PARALLEL (k__115,j__116,i__117) ON u(i__117,j__116,k__115,*),REDUCTION (sum(errnm)),PRIVATE (jglob__112,iglob__113,dble_739_12& +!DVM$&,xi,dble_739_13,eta,dble_739_14,zeta,m__15,m__114,tmp__111,u000ijk) + do k__115 = 2,nz - 1 + do j__116 = jst,jend + do i__117 = ist,iend + jglob__112 = j__116 + iglob__113 = i__117 + dble_739_12 = dble (iglob__113 - 1) + xi = dble_739_12 / (nx0 - 1) + dble_739_13 = dble (jglob__112 - 1) + eta = dble_739_13 / (ny0 - 1) + dble_739_14 = dble (k__115 - 1) + zeta = dble_739_14 / (nz - 1) + do m__15 = 1,5 + u000ijk(m__15) = ce(m__15,1) + ce(m__15,2) * xi + ce(m__15,3) * eta + ce(m__15,4) * zeta + ce(m__15,5) * xi * xi +& + & ce(m__15,6) * eta * eta + ce(m__15,7) * zeta * zeta + ce(m__15,8) * xi * xi * xi + ce(m__15,9) * eta * eta * eta + ce(m__15,1& + &0) * zeta * zeta * zeta + ce(m__15,11) * xi * xi * xi * xi + ce(m__15,12) * eta * eta * eta * eta + ce(m__15,13) * zeta * zeta& + & * zeta * zeta + enddo + do m__114 = 1,5 + tmp__111 = u000ijk(m__114) - u(i__117,j__116,k__115,m__114) + errnm(m__114) = errnm(m__114) + tmp__111** 2 + enddo + enddo + enddo + enddo + do m__114 = 1,5 + errnm(m__114) = sqrt (errnm(m__114) / ((nx0 - 2) * (ny0 - 2) * (nz0 - 2))) + enddo + ibeg = nx + 1 + ifin = 0 + iglob1 = 1 + iglob2 = nx + if (iglob1 .ge. ii1 .and. iglob2 .lt. ii2 + nx) ibeg = 1 + if (iglob1 .gt. ii1 - nx .and. iglob2 .le. ii2) ifin = nx + if (ii1 .ge. iglob1 .and. ii1 .le. iglob2) ibeg = ii1 + if (ii2 .ge. iglob1 .and. ii2 .le. iglob2) ifin = ii2 + jbeg = ny + 1 + jfin = 0 + jglob1 = 1 + jglob2 = ny + if (jglob1 .ge. ji1 .and. jglob2 .lt. ji2 + ny) jbeg = 1 + if (jglob1 .gt. ji1 - ny .and. jglob2 .le. ji2) jfin = ny + if (ji1 .ge. jglob1 .and. ji1 .le. jglob2) jbeg = ji1 + if (ji2 .ge. jglob1 .and. ji2 .le. jglob2) jfin = ji2 + ifin1 = ifin + jfin1 = jfin + if (ifin1 .eq. ii2) ifin1 = ifin - 1 + if (jfin1 .eq. ji2) jfin1 = jfin - 1 + s1 = 0. + s2 = 0. +!DVM$ PARALLEL (k__120,j__121,i__122) ON u(i__122,j__121,k__120,*),REDUCTION (sum(s1)),SHADOW_RENEW (u(0:1,0:1,0:0,0:0)(corner)),PRI& +!DVM$&VATE (jglob__118,iglob__119) + do k__120 = ki1,ki1 + do j__121 = jbeg,jfin1 + do i__122 = ibeg,ifin1 + jglob__118 = j__121 + iglob__119 = i__122 + s1 = s1 + c2 * (u(i__122,j__121,k__120,5) - 0.50d+00 * (u(i__122,j__121,k__120,2)** 2 + u(i__122,j__121,k__120,3)** 2& + & + u(i__122,j__121,k__120,4)** 2) / u(i__122,j__121,k__120,1)) + c2 * (u(i__122 + 1,j__121,k__120,5) - 0.50d+00 * (u(i__122 + & + &1,j__121,k__120,2)** 2 + u(i__122 + 1,j__121,k__120,3)** 2 + u(i__122 + 1,j__121,k__120,4)** 2) / u(i__122 + 1,j__121,k__120,1& + &)) + s1 = s1 + c2 * (u(i__122,j__121 + 1,k__120,5) - 0.50d+00 * (u(i__122,j__121 + 1,k__120,2)** 2 + u(i__122,j__121 + 1,k& + &__120,3)** 2 + u(i__122,j__121 + 1,k__120,4)** 2) / u(i__122,j__121 + 1,k__120,1)) + c2 * (u(i__122 + 1,j__121 + 1,k__120,5) -& + & 0.50d+00 * (u(i__122 + 1,j__121 + 1,k__120,2)** 2 + u(i__122 + 1,j__121 + 1,k__120,3)** 2 + u(i__122 + 1,j__121 + 1,k__120,4)& + &** 2) / u(i__122 + 1,j__121 + 1,k__120,1)) + enddo + enddo + enddo +!DVM$ PARALLEL (k__120,j__121,i__122) ON u(i__122,j__121,k__120,*),REDUCTION (sum(s2)),SHADOW_RENEW (u(0:1,0:1,0:0,0:0)(corner)),PRI& +!DVM$&VATE (jglob__118,iglob__119) + do k__120 = ki2,ki2 + do j__121 = jbeg,jfin1 + do i__122 = ibeg,ifin1 + jglob__118 = j__121 + iglob__119 = i__122 + s2 = s2 + c2 * (u(i__122,j__121,k__120,5) - 0.50d+00 * (u(i__122,j__121,k__120,2)** 2 + u(i__122,j__121,k__120,3)** 2& + & + u(i__122,j__121,k__120,4)** 2) / u(i__122,j__121,k__120,1)) + c2 * (u(i__122 + 1,j__121,k__120,5) - 0.50d+00 * (u(i__122 + & + &1,j__121,k__120,2)** 2 + u(i__122 + 1,j__121,k__120,3)** 2 + u(i__122 + 1,j__121,k__120,4)** 2) / u(i__122 + 1,j__121,k__120,1& + &)) + s2 = s2 + c2 * (u(i__122,j__121 + 1,k__120,5) - 0.50d+00 * (u(i__122,j__121 + 1,k__120,2)** 2 + u(i__122,j__121 + 1,k& + &__120,3)** 2 + u(i__122,j__121 + 1,k__120,4)** 2) / u(i__122,j__121 + 1,k__120,1)) + c2 * (u(i__122 + 1,j__121 + 1,k__120,5) -& + & 0.50d+00 * (u(i__122 + 1,j__121 + 1,k__120,2)** 2 + u(i__122 + 1,j__121 + 1,k__120,3)** 2 + u(i__122 + 1,j__121 + 1,k__120,4)& + &** 2) / u(i__122 + 1,j__121 + 1,k__120,1)) + enddo + enddo + enddo + frc1 = dxi * deta * (s1 + s2) + s1 = 0. + jglob__118 = jbeg + ind1 = 0 + if (jglob__118 .eq. ji1) then + ind1 = 1 +!DVM$ PARALLEL (k__120,j__121,i__122) ON u(i__122,j__121,k__120,*),REDUCTION (sum(s1)),SHADOW_RENEW (u(0:1,0:0,0:1,0:0)(corner)),& +!DVM$&PRIVATE (iglob__119) + do k__120 = ki1,ki2 - 1 + do j__121 = jbeg,jbeg + do i__122 = ibeg,ifin1 + iglob__119 = i__122 + s1 = s1 + c2 * (u(i__122,j__121,k__120,5) - 0.50d+00 * (u(i__122,j__121,k__120,2)** 2 + u(i__122,j__121,k__120,3)*& + &* 2 + u(i__122,j__121,k__120,4)** 2) / u(i__122,j__121,k__120,1)) + c2 * (u(i__122 + 1,j__121,k__120,5) - 0.50d+00 * (u(i__122& + & + 1,j__121,k__120,2)** 2 + u(i__122 + 1,j__121,k__120,3)** 2 + u(i__122 + 1,j__121,k__120,4)** 2) / u(i__122 + 1,j__121,k__12& + &0,1)) + s1 = s1 + c2 * (u(i__122,j__121,k__120 + 1,5) - 0.50d+00 * (u(i__122,j__121,k__120 + 1,2)** 2 + u(i__122,j__121,k_& + &_120 + 1,3)** 2 + u(i__122,j__121,k__120 + 1,4)** 2) / u(i__122,j__121,k__120 + 1,1)) + c2 * (u(i__122 + 1,j__121,k__120 + 1,5& + &) - 0.50d+00 * (u(i__122 + 1,j__121,k__120 + 1,2)** 2 + u(i__122 + 1,j__121,k__120 + 1,3)** 2 + u(i__122 + 1,j__121,k__120 + 1& + &,4)** 2) / u(i__122 + 1,j__121,k__120 + 1,1)) + enddo + enddo + enddo + endif + s2 = 0. + jglob__118 = jfin + ind2 = 0 + if (jglob__118 .eq. ji2) then + ind2 = 1 +!DVM$ PARALLEL (k__120,j__121,i__122) ON u(i__122,j__121,k__120,*),REDUCTION (sum(s2)),SHADOW_RENEW (u(0:1,0:0,0:1,0:0)(corner)),& +!DVM$&PRIVATE (iglob__119) + do k__120 = ki1,ki2 - 1 + do j__121 = jfin,jfin + do i__122 = ibeg,ifin1 + iglob__119 = i__122 + s2 = s2 + c2 * (u(i__122,j__121,k__120,5) - 0.50d+00 * (u(i__122,j__121,k__120,2)** 2 + u(i__122,j__121,k__120,3)*& + &* 2 + u(i__122,j__121,k__120,4)** 2) / u(i__122,j__121,k__120,1)) + c2 * (u(i__122 + 1,j__121,k__120,5) - 0.50d+00 * (u(i__122& + & + 1,j__121,k__120,2)** 2 + u(i__122 + 1,j__121,k__120,3)** 2 + u(i__122 + 1,j__121,k__120,4)** 2) / u(i__122 + 1,j__121,k__12& + &0,1)) + s2 = s2 + c2 * (u(i__122,j__121,k__120 + 1,5) - 0.50d+00 * (u(i__122,j__121,k__120 + 1,2)** 2 + u(i__122,j__121,k_& + &_120 + 1,3)** 2 + u(i__122,j__121,k__120 + 1,4)** 2) / u(i__122,j__121,k__120 + 1,1)) + c2 * (u(i__122 + 1,j__121,k__120 + 1,5& + &) - 0.50d+00 * (u(i__122 + 1,j__121,k__120 + 1,2)** 2 + u(i__122 + 1,j__121,k__120 + 1,3)** 2 + u(i__122 + 1,j__121,k__120 + 1& + &,4)** 2) / u(i__122 + 1,j__121,k__120 + 1,1)) + enddo + enddo + enddo + endif + frc2 = dxi * dzeta * (s1 + s2) + s1 = 0. + s2 = 0. + iglob__119 = ibeg + ind1 = 0 + if (iglob__119 .eq. ii1) then + ind1 = 1 +!DVM$ PARALLEL (k__120,j__121,i__122) ON u(i__122,j__121,k__120,*),REDUCTION (sum(s1)),SHADOW_RENEW (u(0:0,0:1,0:1,0:0)(corner)),& +!DVM$&PRIVATE (jglob__118) + do k__120 = ki1,ki2 - 1 + do j__121 = jbeg,jfin1 + do i__122 = ibeg,ibeg + jglob__118 = j__121 + s1 = s1 + c2 * (u(i__122,j__121,k__120,5) - 0.50d+00 * (u(i__122,j__121,k__120,2)** 2 + u(i__122,j__121,k__120,3)*& + &* 2 + u(i__122,j__121,k__120,4)** 2) / u(i__122,j__121,k__120,1)) + c2 * (u(i__122,j__121 + 1,k__120,5) - 0.50d+00 * (u(i__122& + &,j__121 + 1,k__120,2)** 2 + u(i__122,j__121 + 1,k__120,3)** 2 + u(i__122,j__121 + 1,k__120,4)** 2) / u(i__122,j__121 + 1,k__12& + &0,1)) + s1 = s1 + c2 * (u(i__122,j__121,k__120 + 1,5) - 0.50d+00 * (u(i__122,j__121,k__120 + 1,2)** 2 + u(i__122,j__121,k_& + &_120 + 1,3)** 2 + u(i__122,j__121,k__120 + 1,4)** 2) / u(i__122,j__121,k__120 + 1,1)) + c2 * (u(i__122,j__121 + 1,k__120 + 1,5& + &) - 0.50d+00 * (u(i__122,j__121 + 1,k__120 + 1,2)** 2 + u(i__122,j__121 + 1,k__120 + 1,3)** 2 + u(i__122,j__121 + 1,k__120 + 1& + &,4)** 2) / u(i__122,j__121 + 1,k__120 + 1,1)) + enddo + enddo + enddo + endif + iglob__119 = ifin + ind2 = 0 + if (iglob__119 .eq. ii2) then + ind2 = 1 +!DVM$ PARALLEL (k__120,j__121,i__122) ON u(i__122,j__121,k__120,*),REDUCTION (sum(s2)),SHADOW_RENEW (u(0:0,0:1,0:1,0:0)(corner)),& +!DVM$&PRIVATE (jglob__118) + do k__120 = ki1,ki2 - 1 + do j__121 = jbeg,jfin1 + do i__122 = ifin,ifin + jglob__118 = j__121 + s2 = s2 + c2 * (u(i__122,j__121,k__120,5) - 0.50d+00 * (u(i__122,j__121,k__120,2)** 2 + u(i__122,j__121,k__120,3)*& + &* 2 + u(i__122,j__121,k__120,4)** 2) / u(i__122,j__121,k__120,1)) + c2 * (u(i__122,j__121 + 1,k__120,5) - 0.50d+00 * (u(i__122& + &,j__121 + 1,k__120,2)** 2 + u(i__122,j__121 + 1,k__120,3)** 2 + u(i__122,j__121 + 1,k__120,4)** 2) / u(i__122,j__121 + 1,k__12& + &0,1)) + s2 = s2 + c2 * (u(i__122,j__121,k__120 + 1,5) - 0.50d+00 * (u(i__122,j__121,k__120 + 1,2)** 2 + u(i__122,j__121,k_& + &_120 + 1,3)** 2 + u(i__122,j__121,k__120 + 1,4)** 2) / u(i__122,j__121,k__120 + 1,1)) + c2 * (u(i__122,j__121 + 1,k__120 + 1,5& + &) - 0.50d+00 * (u(i__122,j__121 + 1,k__120 + 1,2)** 2 + u(i__122,j__121 + 1,k__120 + 1,3)** 2 + u(i__122,j__121 + 1,k__120 + 1& + &,4)** 2) / u(i__122,j__121 + 1,k__120 + 1,1)) + enddo + enddo + enddo + endif + frc3 = deta * dzeta * (s1 + s2) + frc = 0.25d+00 * (frc1 + frc2 + frc3) + epsilon = 1.0d-08 + class = 'U' + verified = .TRUE. + do m__124 = 1,5 + xcrref(m__124) = 1.0 + xceref(m__124) = 1.0 + enddo + xciref = 1.0 + if (nx0 .eq. 12 .and. ny0 .eq. 12 .and. nz0 .eq. 12 .and. itmax .eq. 50) then + class = 'S' + dtref = 5.0d-1 + xcrref(1) = 1.6196343210976702d-02 + xcrref(2) = 2.1976745164821318d-03 + xcrref(3) = 1.5179927653399185d-03 + xcrref(4) = 1.5029584435994323d-03 + xcrref(5) = 3.4264073155896461d-02 + xceref(1) = 6.4223319957960924d-04 + xceref(2) = 8.4144342047347926d-05 + xceref(3) = 5.8588269616485186d-05 + xceref(4) = 5.8474222595157350d-05 + xceref(5) = 1.3103347914111294d-03 + xciref = 7.8418928865937083d+00 + else if (nx0 .eq. 33 .and. ny0 .eq. 33 .and. nz0 .eq. 33 .and. itmax .eq. 300) then + class = 'W' + dtref = 1.5d-3 + xcrref(1) = 0.1236511638192d+02 + xcrref(2) = 0.1317228477799d+01 + xcrref(3) = 0.2550120713095d+01 + xcrref(4) = 0.2326187750252d+01 + xcrref(5) = 0.2826799444189d+02 + xceref(1) = 0.4867877144216d+00 + xceref(2) = 0.5064652880982d-01 + xceref(3) = 0.9281818101960d-01 + xceref(4) = 0.8570126542733d-01 + xceref(5) = 0.1084277417792d+01 + xciref = 0.1161399311023d+02 + else if (nx0 .eq. 64 .and. ny0 .eq. 64 .and. nz0 .eq. 64 .and. itmax .eq. 250) then + class = 'A' + dtref = 2.0d+0 + xcrref(1) = 7.7902107606689367d+02 + xcrref(2) = 6.3402765259692870d+01 + xcrref(3) = 1.9499249727292479d+02 + xcrref(4) = 1.7845301160418537d+02 + xcrref(5) = 1.8384760349464247d+03 + xceref(1) = 2.9964085685471943d+01 + xceref(2) = 2.8194576365003349d+00 + xceref(3) = 7.3473412698774742d+00 + xceref(4) = 6.7139225687777051d+00 + xceref(5) = 7.0715315688392578d+01 + xciref = 2.6030925604886277d+01 + else if (nx0 .eq. 102 .and. ny0 .eq. 102 .and. nz0 .eq. 102 .and. itmax .eq. 250) then + class = 'B' + dtref = 2.0d+0 + xcrref(1) = 3.5532672969982736d+03 + xcrref(2) = 2.6214750795310692d+02 + xcrref(3) = 8.8333721850952190d+02 + xcrref(4) = 7.7812774739425265d+02 + xcrref(5) = 7.3087969592545314d+03 + xceref(1) = 1.1401176380212709d+02 + xceref(2) = 8.1098963655421574d+00 + xceref(3) = 2.8480597317698308d+01 + xceref(4) = 2.5905394567832939d+01 + xceref(5) = 2.6054907504857413d+02 + xciref = 4.7887162703308227d+01 + else if (nx0 .eq. 162 .and. ny0 .eq. 162 .and. nz0 .eq. 162 .and. itmax .eq. 250) then + class = 'C' + dtref = 2.0d+0 + xcrref(1) = 1.03766980323537846d+04 + xcrref(2) = 8.92212458801008552d+02 + xcrref(3) = 2.56238814582660871d+03 + xcrref(4) = 2.19194343857831427d+03 + xcrref(5) = 1.78078057261061185d+04 + xceref(1) = 2.15986399716949279d+02 + xceref(2) = 1.55789559239863600d+01 + xceref(3) = 5.41318863077207766d+01 + xceref(4) = 4.82262643154045421d+01 + xceref(5) = 4.55902910043250358d+02 + xciref = 6.66404553572181300d+01 + else if (nx0 .eq. 408 .and. ny0 .eq. 408 .and. nz0 .eq. 408 .and. itmax .eq. 300) then + class = 'D' + dtref = 1.0d+0 + xcrref(1) = 0.4868417937025d+05 + xcrref(2) = 0.4696371050071d+04 + xcrref(3) = 0.1218114549776d+05 + xcrref(4) = 0.1033801493461d+05 + xcrref(5) = 0.7142398413817d+05 + xceref(1) = 0.3752393004482d+03 + xceref(2) = 0.3084128893659d+02 + xceref(3) = 0.9434276905469d+02 + xceref(4) = 0.8230686681928d+02 + xceref(5) = 0.7002620636210d+03 + xciref = 0.8334101392503d+02 + else if (nx0 .eq. 1020 .and. ny0 .eq. 1020 .and. nz0 .eq. 1020 .and. itmax .eq. 300) then + class = 'E' + dtref = 0.5d+0 + xcrref(1) = 0.2099641687874d+06 + xcrref(2) = 0.2130403143165d+05 + xcrref(3) = 0.5319228789371d+05 + xcrref(4) = 0.4509761639833d+05 + xcrref(5) = 0.2932360006590d+06 + xceref(1) = 0.4800572578333d+03 + xceref(2) = 0.4221993400184d+02 + xceref(3) = 0.1210851906824d+03 + xceref(4) = 0.1047888986770d+03 + xceref(5) = 0.8363028257389d+03 + xciref = 0.9512163272273d+02 + else + verified = .FALSE. + endif + do m__124 = 1,5 + xcrdif(m__124) = dabs ((rsdnm(m__124) - xcrref(m__124)) / xcrref(m__124)) + xcedif(m__124) = dabs ((errnm(m__124) - xceref(m__124)) / xceref(m__124)) + enddo + xcidif = dabs ((frc - xciref) / xciref) + if (class .ne. 'U') then + write (unit = *,fmt = 1990) class + write (unit = *,fmt = 2000) epsilon + dabs_1966_123 = dabs (dt - dtref) + if (dabs_1966_123 .gt. epsilon) then + verified = .FALSE. + class = 'U' + write (unit = *,fmt = 2060) dtref + endif + else + write (unit = *,fmt = 1995) + endif + if (class .ne. 'U') then + write (unit = *,fmt = 2061) + else + write (unit = *,fmt = 2005) + endif + do m__124 = 1,5 + if (class .eq. 'U') then + write (unit = *,fmt = 2015) m__124,rsdnm(m__124) + else if (xcrdif(m__124) .gt. epsilon .or. isnan (xcrdif(m__124))) then + verified = .FALSE. + write (unit = *,fmt = 2010) m__124,rsdnm(m__124),xcrref(m__124),xcrdif(m__124) + else + write (unit = *,fmt = 2011) m__124,rsdnm(m__124),xcrref(m__124),xcrdif(m__124) + endif + enddo + if (class .ne. 'U') then + write (unit = *,fmt = 2062) + else + write (unit = *,fmt = 2006) + endif + do m__124 = 1,5 + if (class .eq. 'U') then + write (unit = *,fmt = 2015) m__124,errnm(m__124) + else if (xcedif(m__124) .gt. epsilon .or. isnan (xcedif(m__124))) then + verified = .FALSE. + write (unit = *,fmt = 2010) m__124,errnm(m__124),xceref(m__124),xcedif(m__124) + else + write (unit = *,fmt = 2011) m__124,errnm(m__124),xceref(m__124),xcedif(m__124) + endif + enddo + if (class .ne. 'U') then + write (unit = *,fmt = 2025) + else + write (unit = *,fmt = 2026) + endif + if (class .eq. 'U') then + write (unit = *,fmt = 2030) frc + else if (xcidif .gt. epsilon .or. isnan (xcidif)) then + verified = .FALSE. + write (unit = *,fmt = 2031) frc,xciref,xcidif + else + write (unit = *,fmt = 2032) frc,xciref,xcidif + endif + if (class .eq. 'U') then + write (unit = *,fmt = 2022) + write (unit = *,fmt = 2023) + else if (verified) then + write (unit = *,fmt = 2020) + else + write (unit = *,fmt = 2021) + endif + float_141_0 = float (itmax) + float_141_1 = float (nx0) + float_141_2 = float (ny0) + float_141_3 = float (nz0) + float_141_4 = float (nx0 + ny0 + nz0) + float_141_5 = float (nx0 + ny0 + nz0) + mflops = float_141_0 * (1984.77 * float_141_1 * float_141_2 * float_141_3 - 10923.3 * (float_141_4 / 3.)** 2 + 27770.9 * float& + &_141_5 / 3. - 144010.) / (maxtime * 1000000.) + print_results_142_arg1_6 = 'LU' + print_results_142_arg9_7 = ' floating point' + write (unit = *,fmt = 2) print_results_142_arg1_6 + write (unit = *,fmt = 3) class + if (ny0 .eq. 0 .and. nz0 .eq. 0) then + if (print_results_142_arg1_6(1:2) .eq. 'EP') then + write (unit = size,fmt = '(f12.0)') 2.d0** nx0 + do j__125 = 13,1,(-(1)) + if (size(j__125:j__125) .eq. '.') size(j__125:j__125) = ' ' + enddo + write (unit = *,fmt = 42) size + else + write (unit = *,fmt = 44) nx0 + endif + else + write (unit = *,fmt = 4) nx0,ny0,nz0 + endif + write (unit = *,fmt = 5) itmax + write (unit = *,fmt = 6) maxtime + write (unit = *,fmt = 9) mflops + write (unit = *,fmt = 11) print_results_142_arg9_7 + if (verified) then + write (unit = *,fmt = 12) ' SUCCESSFUL' + else + write (unit = *,fmt = 12) 'UNSUCCESSFUL' + endif + write (unit = *,fmt = 13) npbversion + write (unit = *,fmt = 130) + +! , compiletime, cs1, cs2, cs3, cs4, cs5, cs6, '(none)') + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/pintgr.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/pintgr.f new file mode 100644 index 0000000..ea12392 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/pintgr.f @@ -0,0 +1,187 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine pintgr () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer i,j,k + integer ibeg,ifin,ifin1 + integer jbeg,jfin,jfin1 + +!DVM$ ALIGN phi1(iEX1,iEX2) WITH dvmh_temp0(*,iEX1,*,iEX2) +!DVM$ ALIGN phi2(iEX1,iEX2) WITH dvmh_temp0(*,iEX1,*,iEX2) +!DVM$ DYNAMIC phi1,phi2 + double precision phi1(0:isiz2 + 1,0:isiz3 + 1),phi2(0:isiz2 + 1,0 + &:isiz3 + 1) +!DVM$ SHADOW phi2( 0:1,0:1 ) +!DVM$ SHADOW phi1( 0:1,0:1 ) + double precision frc1,frc2,frc3 + +!--------------------------------------------------------------------- +! set up the sub-domains for integeration in each processor +!--------------------------------------------------------------------- + ibeg = ii1 + ifin = ii2 + jbeg = ji1 + jfin = ji2 + ifin1 = ifin - 1 + jfin1 = jfin - 1 + +!--------------------------------------------------------------------- +! initialize +!--------------------------------------------------------------------- +!DVM$ PARALLEL (i,k) ON phi1(i,k), PRIVATE (k,i) + do i = 0,isiz2 + 1 + do k = 0,isiz3 + 1 + phi1(i,k) = 0. + phi2(i,k) = 0. + enddo + enddo +!DVM$ PARALLEL (j,i) ON phi1(i,j), REMOTE_ACCESS (u(:,:,:,:)),PRIVATE (k +!DVM$&,j,i) + do j = jbeg,jfin + do i = ibeg,ifin + k = ki1 + phi1(i,j) = c2 * (u(5,i,j,k) - 0.50d+00 * (u(2,i,j,k)** 2 + + &u(3,i,j,k)** 2 + u(4,i,j,k)** 2) / u(1,i,j,k)) + k = ki2 + phi2(i,j) = c2 * (u(5,i,j,k) - 0.50d+00 * (u(2,i,j,k)** 2 + + &u(3,i,j,k)** 2 + u(4,i,j,k)** 2) / u(1,i,j,k)) + enddo + enddo + frc1 = 0.0d+00 +!DVM$ PARALLEL (j,i) ON phi1(i,j), PRIVATE (j,i),SHADOW_RENEW (phi1(CORN +!DVM$&ER),phi2(CORNER)),REDUCTION (sum (frc1)) + do j = jbeg,jfin1 + do i = ibeg,ifin1 + frc1 = frc1 + (phi1(i,j) + phi1(i + 1,j) + phi1(i,j + 1) + p + &hi1(i + 1,j + 1) + phi2(i,j) + phi2(i + 1,j) + phi2(i,j + 1) + phi + &2(i + 1,j + 1)) + enddo + enddo + frc1 = dxi * deta * frc1 + +!--------------------------------------------------------------------- +! initialize +!--------------------------------------------------------------------- +!DVM$ PARALLEL (i,k) ON phi1(i,k), PRIVATE (k,i) + do i = 0,isiz2 + 1 + do k = 0,isiz3 + 1 + phi1(i,k) = 0. + phi2(i,k) = 0. + enddo + enddo + if (jbeg .eq. ji1) then +!DVM$ PARALLEL (k,i) ON phi1(i,k), REMOTE_ACCESS (u(:,:,:,:)),PRIVATE +!DVM$& (k,i) + do k = ki1,ki2 + do i = ibeg,ifin + phi1(i,k) = c2 * (u(5,i,jbeg,k) - 0.50d+00 * (u(2,i,jbeg, + &k)** 2 + u(3,i,jbeg,k)** 2 + u(4,i,jbeg,k)** 2) / u(1,i,jbeg,k)) + enddo + enddo + endif + if (jfin .eq. ji2) then +!DVM$ PARALLEL (k,i) ON phi2(i,k), REMOTE_ACCESS (u(:,:,:,:)),PRIVATE +!DVM$& (k,i) + do k = ki1,ki2 + do i = ibeg,ifin + phi2(i,k) = c2 * (u(5,i,jfin,k) - 0.50d+00 * (u(2,i,jfin, + &k)** 2 + u(3,i,jfin,k)** 2 + u(4,i,jfin,k)** 2) / u(1,i,jfin,k)) + enddo + enddo + endif + frc2 = 0.0d+00 +!DVM$ PARALLEL (k,i) ON phi1(i,k), PRIVATE (k,i),SHADOW_RENEW (phi1(CORN +!DVM$&ER),phi2(CORNER)),REDUCTION (sum (frc2)) + do k = ki1,ki2 - 1 + do i = ibeg,ifin1 + frc2 = frc2 + (phi1(i,k) + phi1(i + 1,k) + phi1(i,k + 1) + p + &hi1(i + 1,k + 1) + phi2(i,k) + phi2(i + 1,k) + phi2(i,k + 1) + phi + &2(i + 1,k + 1)) + enddo + enddo + frc2 = dxi * dzeta * frc2 + +!--------------------------------------------------------------------- +! initialize +!--------------------------------------------------------------------- +!DVM$ PARALLEL (i,k) ON phi1(i,k), PRIVATE (k,i) + do i = 0,isiz2 + 1 + do k = 0,isiz3 + 1 + phi1(i,k) = 0. + phi2(i,k) = 0. + enddo + enddo + if (ibeg .eq. ii1) then +!DVM$ PARALLEL (k,j) ON phi1(j,k), REMOTE_ACCESS (u(:,:,:,:)),PRIVATE +!DVM$& (k,j) + do k = ki1,ki2 + do j = jbeg,jfin + phi1(j,k) = c2 * (u(5,ibeg,j,k) - 0.50d+00 * (u(2,ibeg,j, + &k)** 2 + u(3,ibeg,j,k)** 2 + u(4,ibeg,j,k)** 2) / u(1,ibeg,j,k)) + enddo + enddo + endif + if (ifin .eq. ii2) then +!DVM$ PARALLEL (k,j) ON phi2(j,k), REMOTE_ACCESS (u(:,:,:,:)),PRIVATE +!DVM$& (k,j) + do k = ki1,ki2 + do j = jbeg,jfin + phi2(j,k) = c2 * (u(5,ifin,j,k) - 0.50d+00 * (u(2,ifin,j, + &k)** 2 + u(3,ifin,j,k)** 2 + u(4,ifin,j,k)** 2) / u(1,ifin,j,k)) + enddo + enddo + endif + frc3 = 0.0d+00 +!DVM$ PARALLEL (k,j) ON phi1(j,k), PRIVATE (k,j),SHADOW_RENEW (phi1(CORN +!DVM$&ER),phi2(CORNER)),REDUCTION (sum (frc3)) + do k = ki1,ki2 - 1 + do j = jbeg,jfin1 + frc3 = frc3 + (phi1(j,k) + phi1(j + 1,k) + phi1(j,k + 1) + p + &hi1(j + 1,k + 1) + phi2(j,k) + phi2(j + 1,k) + phi2(j,k + 1) + phi + &2(j + 1,k + 1)) + enddo + enddo + frc3 = deta * dzeta * frc3 + frc = 0.25d+00 * (frc1 + frc2 + frc3) + +! write (*,1001) frc + return + +! 1001 format (//5x,'surface integral = ',1pe12.5//) + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/print_results.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/print_results.f new file mode 100644 index 0000000..d2fe91e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/print_results.f @@ -0,0 +1,111 @@ + + subroutine print_results(name, class, n1, n2, n3, niter, + > t, mops, optype, verified, npbversion, + > compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + implicit none + character name*(*) + character class*1 + integer n1, n2, n3, niter, j + double precision t, mops + character optype*24, size*15 + logical verified + character*(*) npbversion, compiletime, + > cs1, cs2, cs3, cs4, cs5, cs6, cs7 + + write (*, 2) name + 2 format(//, ' ', A, ' Benchmark Completed.') + + write (*, 3) Class + 3 format(' Class = ', 12x, a12) + +c If this is not a grid-based problem (EP, FT, CG), then +c we only print n1, which contains some measure of the +c problem size. In that case, n2 and n3 are both zero. +c Otherwise, we print the grid size n1xn2xn3 + + if ((n2 .eq. 0) .and. (n3 .eq. 0)) then + if (name(1:2) .eq. 'EP') then + write(size, '(f15.0)' ) 2.d0**n1 + j = 15 + if (size(j:j) .eq. '.') then + size(j:j) = ' ' + j = j - 1 + endif + write (*,42) size(1:j) + 42 format(' Size = ',9x, a15) + else + write (*,44) n1 + 44 format(' Size = ',12x, i12) + endif + else + write (*, 4) n1,n2,n3 + 4 format(' Size = ',9x, i4,'x',i4,'x',i4) + endif + + write (*, 5) niter + 5 format(' Iterations = ', 12x, i12) + + write (*, 6) t + 6 format(' Time in seconds = ',12x, f12.2) + + write (*,9) mops + 9 format(' Mop/s total = ',12x, f12.2) + + write(*, 11) optype + 11 format(' Operation type = ', a24) + + if (verified) then + write(*,12) ' SUCCESSFUL' + else + write(*,12) 'UNSUCCESSFUL' + endif + 12 format(' Verification = ', 12x, a) + + write(*,13) npbversion + 13 format(' Version = ', 12x, a12) + + write(*,14) compiletime + 14 format(' Compile date = ', 12x, a12) + + + write (*,121) cs1 + 121 format(/, ' Compile options:', /, + > ' F77 = ', A) + + write (*,122) cs2 + 122 format(' FLINK = ', A) + + write (*,123) cs3 + 123 format(' F_LIB = ', A) + + write (*,124) cs4 + 124 format(' F_INC = ', A) + + write (*,125) cs5 + 125 format(' FFLAGS = ', A) + + write (*,126) cs6 + 126 format(' FLINKFLAGS = ', A) + + write(*, 127) cs7 + 127 format(' RAND = ', A) + + write (*,130) + 130 format(//' Please send all errors/feedbacks to:'// + > ' NPB Development Team'/ + > ' npb@nas.nasa.gov'//) +c 130 format(//' Please send the results of this run to:'// +c > ' NPB Development Team '/ +c > ' Internet: npb@nas.nasa.gov'/ +c > ' '/ +c > ' If email is not available, send this to:'// +c > ' MS T27A-1'/ +c > ' NASA Ames Research Center'/ +c > ' Moffett Field, CA 94035-1000'// +c > ' Fax: 650-604-3957'//) + + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/read_input.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/read_input.f new file mode 100644 index 0000000..c1716d0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/read_input.f @@ -0,0 +1,115 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine read_input () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer fstatus + +!--------------------------------------------------------------------- +! if input file does not exist, it uses defaults +! ipr = 1 for detailed progress output +! inorm = how often the norm is printed (once every inorm iterations) +! itmax = number of pseudo time steps +! dt = time step +! omega 1 over-relaxation factor for SSOR +! tolrsd = steady state residual tolerance levels +! nx, ny, nz = number of grid points in x, y, z directions +!--------------------------------------------------------------------- + write (unit = *,fmt = 1000) + open (unit = 3,file = 'inputlu.data',status = 'old',access = 'sequ + &ential',form = 'formatted',iostat = fstatus) + if (fstatus .eq. 0) then + write (unit = *,fmt = *) 'Reading from input file inputlu.data' + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) ipr,inorm + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) itmax + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) dt + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) omega + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) tolrsd(1),tolrsd(2),tolrsd(3),tolrsd(4) + &,tolrsd(5) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) + read (unit = 3,fmt = *) nx0,ny0,nz0 + close (unit = 3) + else + ipr = ipr_default + inorm = inorm_default + itmax = itmax_default + dt = dt_default + omega = omega_default + tolrsd(1) = tolrsd1_def + tolrsd(2) = tolrsd2_def + tolrsd(3) = tolrsd3_def + tolrsd(4) = tolrsd4_def + tolrsd(5) = tolrsd5_def + nx0 = isiz1 + ny0 = isiz2 + nz0 = isiz3 + endif + +!--------------------------------------------------------------------- +! check problem size +!--------------------------------------------------------------------- + if (nx0 .lt. 4 .or. ny0 .lt. 4 .or. nz0 .lt. 4) then + write (unit = *,fmt = 2001) +2001 format (5x,'PROBLEM SIZE IS TOO SMALL - ', / + &5x,'SET EACH OF NX, NY AND NZ AT LEAST EQUAL TO 5') + stop + endif + if (nx0 .gt. isiz1 .or. ny0 .gt. isiz2 .or. nz0 .gt. isiz3) then + write (unit = *,fmt = 2002) +2002 format (5x,'PROBLEM SIZE IS TOO LARGE - ', / + &5x,'NX, NY AND NZ SHOULD BE EQUAL TO ', /5x,'ISIZ1, ISIZ + &2 AND ISIZ3 RESPECTIVELY') + stop + endif + write (unit = *,fmt = 1001) nx0,ny0,nz0 + write (unit = *,fmt = 1002) itmax + write (unit = *,fmt = *) +1000 format(//,' NAS Parallel Benchmarks (NPB3.3-SER)', ' - LU + & Benchmark', /) +1001 format(' Size: ', i4, 'x', i4, 'x', i4) +1002 format(' Iterations: ', i4) + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f new file mode 100644 index 0000000..23ff003 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f @@ -0,0 +1,420 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine rhs + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c compute the right hand sides +c--------------------------------------------------------------------- + + implicit none + + include 'applu.incl' + +c--------------------------------------------------------------------- +c local variables +c--------------------------------------------------------------------- + integer i, j, k, m, p + double precision q + double precision tmp, utmp(6,isiz3), rtmp(5,isiz3) + double precision u21, u31, u41 + double precision u21i, u31i, u41i, u51i + double precision u21j, u31j, u41j, u51j + double precision u21k, u31k, u41k, u51k + double precision u21im1, u31im1, u41im1, u51im1 + double precision u21jm1, u31jm1, u41jm1, u51jm1 + double precision u21km1, u31km1, u41km1, u51km1 + double precision flu(5,-1:1) + + + if (timeron) call timer_start(t_rhs) +!DVM$ region +!DVM$ PARALLEL (k,j,i) ON qs(i,j,k), PRIVATE (j,i,tmp,k,m) +!DVM$&,SHADOW_COMPUTE,SHADOW_RENEW (u) + do k = 1, nz + do j = 1, ny + do i = 1, nx + do m = 1, 5 + rsd(m,i,j,k) = - frct(m,i,j,k) + end do + tmp = 1.0d+00 / u(1,i,j,k) + qs(i,j,k) = 0.50d+00 * ( u(2,i,j,k) * u(2,i,j,k) + > + u(3,i,j,k) * u(3,i,j,k) + > + u(4,i,j,k) * u(4,i,j,k) ) + > * tmp + end do + end do + end do + +! if (timeron) call timer_start(t_rhsx) +!DVM$ PARALLEL (k,j,i) on rsd(*,i,j,k), +!DVM$&PRIVATE(p, u21, q, m, tmp, u21i, u31i, u41i, u51i, u21im1, +!DVM$&u31im1, u41im1, u51im1, u31, u21j, u31j, u41j, u51j, u21jm1, +!DVM$&u41jm1, u51jm1, u41, u21k, u31k, u41k, u51k, u21km1, u31km1, +!DVM$&u51km1, u31jm1,u41km1,flu), cuda_block (32,4) + do k = 2, nz - 1 + do j = jst, jend + do i = ist, iend + do p = -1, 1, 2 + flu(1,p) = u(2,i+p,j,k) + u21 = u(2,i+p,j,k) / u(1,i+p,j,k) + + q = qs(i+p,j,k) + + flu(2,p) = u(2,i+p,j,k) * u21 + c2 * + > ( u(5,i+p,j,k) - q ) + flu(3,p) = u(3,i+p,j,k) * u21 + flu(4,p) = u(4,i+p,j,k) * u21 + flu(5,p) = ( c1 * u(5,i+p,j,k) - c2 * q ) * u21 + end do + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - tx2 * ( flu(m,1) - flu(m,-1) ) + end do + + do p = 0, 1 + tmp = 1.0d+00/ u(1,i+p,j,k) + + u21i = tmp * u(2,i+p,j,k) + u31i = tmp * u(3,i+p,j,k) + u41i = tmp * u(4,i+p,j,k) + u51i = tmp * u(5,i+p,j,k) + + tmp = 1.0d+00/ u(1,i-1+p,j,k) + + u21im1 = tmp * u(2,i-1+p,j,k) + u31im1 = tmp * u(3,i-1+p,j,k) + u41im1 = tmp * u(4,i-1+p,j,k) + u51im1 = tmp * u(5,i-1+p,j,k) + + flu(2,p) = (4.0d+00/3.0d+00) * tx3 * (u21i-u21im1) + flu(3,p) = tx3 * ( u31i - u31im1 ) + flu(4,p) = tx3 * ( u41i - u41im1 ) + flu(5,p) = 0.50d+00 * ( 1.0d+00 - c1*c5) + > * tx3 * ( ( u21i **2 + u31i **2+u41i **2) + > - ( u21im1**2 + u31im1**2+u41im1**2)) + > + (1.0d+00/6.0d+00) + > * tx3 * ( u21i**2 - u21im1**2 ) + > + c1 * c5 * tx3 * ( u51i - u51im1 ) + enddo + + rsd(1,i,j,k) = rsd(1,i,j,k) + > + dx1 * tx1 * ( u(1,i-1,j,k) + > - 2.0d+00 * u(1,i,j,k) + > + u(1,i+1,j,k) ) + rsd(2,i,j,k) = rsd(2,i,j,k) + > + tx3 * c3 * c4 * ( flu(2,1) - flu(2,0) ) + > + dx2 * tx1 * ( u(2,i-1,j,k) + > - 2.0d+00 * u(2,i,j,k) + > + u(2,i+1,j,k) ) + rsd(3,i,j,k) = rsd(3,i,j,k) + > + tx3 * c3 * c4 * ( flu(3,1) - flu(3,0) ) + > + dx3 * tx1 * ( u(3,i-1,j,k) + > - 2.0d+00 * u(3,i,j,k) + > + u(3,i+1,j,k) ) + rsd(4,i,j,k) = rsd(4,i,j,k) + > + tx3 * c3 * c4 * ( flu(4,1) - flu(4,0) ) + > + dx4 * tx1 * ( u(4,i-1,j,k) + > - 2.0d+00 * u(4,i,j,k) + > + u(4,i+1,j,k) ) + rsd(5,i,j,k) = rsd(5,i,j,k) + > + tx3 * c3 * c4 * ( flu(5,1) - flu(5,0) ) + > + dx5 * tx1 * ( u(5,i-1,j,k) + > - 2.0d+00 * u(5,i,j,k) + > + u(5,i+1,j,k) ) + + + if (i .eq. 2)then + do m = 1, 5 + rsd(m,2,j,k) = rsd(m,2,j,k) + > - dssp * ( + 5.0d+00 * u(m,2,j,k) + > - 4.0d+00 * u(m,3,j,k) + > + u(m,4,j,k) ) + enddo + else if (i .eq. 3)then + do m = 1, 5 + rsd(m,3,j,k) = rsd(m,3,j,k) + > - dssp * ( - 4.0d+00 * u(m,2,j,k) + > + 6.0d+00 * u(m,3,j,k) + > - 4.0d+00 * u(m,4,j,k) + > + u(m,5,j,k) ) + enddo + else if (i .eq. nx-2)then + do m = 1, 5 + rsd(m,nx-2,j,k) = rsd(m,nx-2,j,k) + > - dssp * ( u(m,nx-4,j,k) + > - 4.0d+00 * u(m,nx-3,j,k) + > + 6.0d+00 * u(m,nx-2,j,k) + > - 4.0d+00 * u(m,nx-1,j,k) ) + enddo + else if (i .eq. nx-1)then + do m = 1, 5 + rsd(m,nx-1,j,k) = rsd(m,nx-1,j,k) + > - dssp * ( u(m,nx-3,j,k) + > - 4.0d+00 * u(m,nx-2,j,k) + > + 5.0d+00 * u(m,nx-1,j,k) ) + enddo + else + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - dssp * ( u(m,i-2,j,k) + > - 4.0d+00 * u(m,i-1,j,k) + > + 6.0d+00 * u(m,i,j,k) + > - 4.0d+00 * u(m,i+1,j,k) + > + u(m,i+2,j,k) ) + end do + endif + ! end do + ! end do +! end do +! if (timeron) call timer_stop(t_rhsx) + +! if (timeron) call timer_start(t_rhsy) +! do k = 2, nz - 1 + ! do j = jst, jend + ! do i = ist, iend + do p = -1, 1, 2 + flu(1,p) = u(3,i,j+p,k) + u31 = u(3,i,j+p,k) / u(1,i,j+p,k) + + q = qs(i,j+p,k) + + flu(2,p) = u(2,i,j+p,k) * u31 + flu(3,p) = u(3,i,j+p,k) * u31 + c2 * (u(5,i,j+p,k)-q) + flu(4,p) = u(4,i,j+p,k) * u31 + flu(5,p) = ( c1 * u(5,i,j+p,k) - c2 * q ) * u31 + end do + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - ty2 * ( flu(m,1) - flu(m,-1) ) + end do + + do p = 0, 1 + tmp = 1.0d+00/ u(1,i,j+p,k) + + u21j = tmp * u(2,i,j+p,k) + u31j = tmp * u(3,i,j+p,k) + u41j = tmp * u(4,i,j+p,k) + u51j = tmp * u(5,i,j+p,k) + + tmp = 1.0d+00/ u(1,i,j-1+p,k) + u21jm1 = tmp * u(2,i,j-1+p,k) + u31jm1 = tmp * u(3,i,j-1+p,k) + u41jm1 = tmp * u(4,i,j-1+p,k) + u51jm1 = tmp * u(5,i,j-1+p,k) + + flu(2,p) = ty3 * ( u21j - u21jm1 ) + flu(3,p) = (4.0d+00/3.0d+00) * ty3 * (u31j-u31jm1) + flu(4,p) = ty3 * ( u41j - u41jm1 ) + flu(5,p) = 0.50d+00 * ( 1.0d+00 - c1*c5 ) + > * ty3 * ( ( u21j **2 + u31j **2 + u41j **2 ) + > - ( u21jm1**2 + u31jm1**2 + u41jm1**2 ) ) + > + (1.0d+00/6.0d+00) + > * ty3 * ( u31j**2 - u31jm1**2 ) + > + c1 * c5 * ty3 * ( u51j - u51jm1 ) + enddo + + rsd(1,i,j,k) = rsd(1,i,j,k) + > + dy1 * ty1 * ( u(1,i,j-1,k) + > - 2.0d+00 * u(1,i,j,k) + > + u(1,i,j+1,k) ) + + rsd(2,i,j,k) = rsd(2,i,j,k) + > + ty3 * c3 * c4 * ( flu(2,1) - flu(2,0) ) + > + dy2 * ty1 * ( u(2,i,j-1,k) + > - 2.0d+00 * u(2,i,j,k) + > + u(2,i,j+1,k) ) + + rsd(3,i,j,k) = rsd(3,i,j,k) + > + ty3 * c3 * c4 * ( flu(3,1) - flu(3,0) ) + > + dy3 * ty1 * ( u(3,i,j-1,k) + > - 2.0d+00 * u(3,i,j,k) + > + u(3,i,j+1,k) ) + + rsd(4,i,j,k) = rsd(4,i,j,k) + > + ty3 * c3 * c4 * ( flu(4,1) - flu(4,0) ) + > + dy4 * ty1 * ( u(4,i,j-1,k) + > - 2.0d+00 * u(4,i,j,k) + > + u(4,i,j+1,k) ) + + rsd(5,i,j,k) = rsd(5,i,j,k) + > + ty3 * c3 * c4 * ( flu(5,1) - flu(5,0) ) + > + dy5 * ty1 * ( u(5,i,j-1,k) + > - 2.0d+00 * u(5,i,j,k) + > + u(5,i,j+1,k) ) + + + + if (j .eq. 2) then + do m = 1, 5 + rsd(m,i,2,k) = rsd(m,i,2,k) + > - dssp * ( + 5.0d+00 * u(m,i,2,k) + > - 4.0d+00 * u(m,i,3,k) + > + u(m,i,4,k) ) + enddo + elseif (j .eq. 3) then + do m = 1, 5 + rsd(m,i,3,k) = rsd(m,i,3,k) + > - dssp * ( - 4.0d+00 * u(m,i,2,k) + > + 6.0d+00 * u(m,i,3,k) + > - 4.0d+00 * u(m,i,4,k) + > + u(m,i,5,k) ) + end do + elseif (j .eq. ny-2) then + do m = 1, 5 + rsd(m,i,ny-2,k) = rsd(m,i,ny-2,k) + > - dssp * ( u(m,i,ny-4,k) + > - 4.0d+00 * u(m,i,ny-3,k) + > + 6.0d+00 * u(m,i,ny-2,k) + > - 4.0d+00 * u(m,i,ny-1,k) ) + enddo + elseif (j .eq. ny-1) then + do m = 1, 5 + rsd(m,i,ny-1,k) = rsd(m,i,ny-1,k) + > - dssp * ( u(m,i,ny-3,k) + > - 4.0d+00 * u(m,i,ny-2,k) + > + 5.0d+00 * u(m,i,ny-1,k) ) + end do + else + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - dssp * ( u(m,i,j-2,k) + > - 4.0d+00 * u(m,i,j-1,k) + > + 6.0d+00 * u(m,i,j,k) + > - 4.0d+00 * u(m,i,j+1,k) + > + u(m,i,j+2,k) ) + end do + endif + +! end do +! end do +! end do + +! if (timeron) call timer_stop(t_rhsy) + +! if (timeron) call timer_start(t_rhsz) +! do k = 2, nz - 1 +! do j = jst, jend +! do i = ist, iend + do p=-1,1,2 + flu(1,p) = u(4,i,j,k+p) + u41 = u(4,i,j,k+p) / u(1,i,j,k+p) + + q = qs(i,j,k+p) + + flu(2,p) = u(2,i,j,k+p) * u41 + flu(3,p) = u(3,i,j,k+p) * u41 + flu(4,p) = u(4,i,j,k+p) * u41 + c2 * (u(5,i,j,k+p)-q) + flu(5,p) = ( c1 * u(5,i,j,k+p) - c2 * q ) * u41 + enddo + + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - tz2 * ( flu(m,1) - flu(m,-1) ) + end do + + do p=0,1 + tmp = 1.0d+00/ u(1,i,j,k+p) + + u21k = tmp * u(2,i,j,k+p) + u31k = tmp * u(3,i,j,k+p) + u41k = tmp * u(4,i,j,k+p) + u51k = tmp * u(5,i,j,k+p) + + tmp = 1.0d+00/ u(1,i,j,k-1+p) + + u21km1 = tmp * u(2,i,j,k-1+p) + u31km1 = tmp * u(3,i,j,k-1+p) + u41km1 = tmp * u(4,i,j,k-1+p) + u51km1 = tmp * u(5,i,j,k-1+p) + + flu(2,p) = tz3 * ( u21k - u21km1 ) + flu(3,p) = tz3 * ( u31k - u31km1 ) + flu(4,p) = (4.0d+00/3.0d+00) * tz3 * (u41k-u41km1) + flu(5,p) = 0.50d+00 * ( 1.0d+00 - c1*c5 ) + > * tz3 * ( ( u21k **2 + u31k **2 + u41k **2 ) + > - ( u21km1**2 + u31km1**2 + u41km1**2 ) ) + > + (1.0d+00/6.0d+00) + > * tz3 * ( u41k**2 - u41km1**2 ) + > + c1 * c5 * tz3 * ( u51k - u51km1 ) + enddo + rsd(1,i,j,k) = rsd(1,i,j,k) + > + dz1 * tz1 * ( u(1,i,j,k-1) + > - 2.0d+00 * u(1,i,j,k) + > + u(1,i,j,k+1) ) + rsd(2,i,j,k) = rsd(2,i,j,k) + > + tz3 * c3 * c4 * ( flu(2,1) - flu(2,0) ) + > + dz2 * tz1 * ( u(2,i,j,k-1) + > - 2.0d+00 * u(2,i,j,k) + > + u(2,i,j,k+1) ) + rsd(3,i,j,k) = rsd(3,i,j,k) + > + tz3 * c3 * c4 * ( flu(3,1) - flu(3,0) ) + > + dz3 * tz1 * ( u(3,i,j,k-1) + > - 2.0d+00 * u(3,i,j,k) + > + u(3,i,j,k+1) ) + rsd(4,i,j,k) = rsd(4,i,j,k) + > + tz3 * c3 * c4 * ( flu(4,1) - flu(4,0) ) + > + dz4 * tz1 * ( u(4,i,j,k-1) + > - 2.0d+00 * u(4,i,j,k) + > + u(4,i,j,k+1) ) + rsd(5,i,j,k) = rsd(5,i,j,k) + > + tz3 * c3 * c4 * ( flu(5,1) - flu(5,0) ) + > + dz5 * tz1 * ( u(5,i,j,k-1) + > - 2.0d+00 * u(5,i,j,k) + > + u(5,i,j,k+1) ) + + + if (k .eq. 2) then + do m = 1, 5 + rsd(m,i,j,2) = rsd(m,i,j,2) + > - dssp * ( + 5.0d+00 * u(m,i,j,2) + > - 4.0d+00 * u(m,i,j,3) + > + u(m,i,j,4) ) + end do + elseif (k .eq. 3) then + do m = 1, 5 + rsd(m,i,j,3) = rsd(m,i,j,3) + > - dssp * ( - 4.0d+00 * u(m,i,j,2) + > + 6.0d+00 * u(m,i,j,3) + > - 4.0d+00 * u(m,i,j,4) + > + u(m,i,j,5) ) + end do + elseif (k .eq. nz-2) then + do m = 1, 5 + rsd(m,i,j,nz-2) = rsd(m,i,j,nz-2) + > - dssp * ( u(m,i,j,nz-4) + > - 4.0d+00 * u(m,i,j,nz-3) + > + 6.0d+00 * u(m,i,j,nz-2) + > - 4.0d+00 * u(m,i,j,nz-1) ) + end do + elseif (k .eq. nz-1) then + do m = 1, 5 + rsd(m,i,j,nz-1) = rsd(m,i,j,nz-1) + > - dssp * ( u(m,i,j,nz-3) + > - 4.0d+00 * u(m,i,j,nz-2) + > + 5.0d+00 * u(m,i,j,nz-1) ) + end do + else + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - dssp * ( u(m,i,j,k-2) + > - 4.0d+00 * u(m,i,j,k-1) + > + 6.0d+00 * u(m,i,j,k) + > - 4.0d+00 * u(m,i,j,k+1) + > + u(m,i,j,k+2) ) + end do + endif + + end do + end do + end do +!DVM$ end region +! if (timeron) call timer_stop(t_rhsz) + if (timeron) call timer_stop(t_rhs) + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f1 b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f1 new file mode 100644 index 0000000..02b1dc0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f1 @@ -0,0 +1,536 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine rhs () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! compute the right hand sides +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer i,j,k,m + +!DVM$ ALIGN flux_br3(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX3,iEX +!DVM$&4,iEX2) +!DVM$ DYNAMIC flux_br3 + double precision ,allocatable:: flux_br3(:,:,:,:) +!DVM$ SHADOW flux_br3( 0:0,1:1,0:0,0:0 ) + +!DVM$ ALIGN flux_br2(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX3,iEX +!DVM$&2,iEX4) +!DVM$ DYNAMIC flux_br2 + double precision ,allocatable:: flux_br2(:,:,:,:) +!DVM$ SHADOW flux_br2( 0:0,1:1,0:0,0:0 ) + +!DVM$ ALIGN flux_br1(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX2 +!DVM$&,iEX3,iEX4) +!DVM$ DYNAMIC flux_br1 + double precision ,allocatable:: flux_br1(:,:,:,:) +!DVM$ SHADOW flux_br1( 0:0,1:1,0:0,0:0 ) + double precision q + double precision tmp,utmp(6,isiz3),rtmp(5,isiz3) + +!DVM$ ALIGN rtmp_br1(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX3,iEX +!DVM$&4,iEX2) +!DVM$ DYNAMIC rtmp_br1 + double precision ,allocatable:: rtmp_br1(:,:,:,:) + +!DVM$ ALIGN utmp_br1(iEX1,iEX2,iEX3,iEX4) WITH dvmh_temp0(iEX1,iEX3,iEX +!DVM$&4,iEX2) +!DVM$ DYNAMIC utmp_br1 + double precision ,allocatable:: utmp_br1(:,:,:,:) +!DVM$ SHADOW utmp_br1( 0:0,2:2,0:0,0:0 ) + double precision u21,u31,u41 + double precision u21i,u31i,u41i,u51i + double precision u21j,u31j,u41j,u51j + double precision u21k,u31k,u41k,u51k + double precision u21im1,u31im1,u41im1,u51im1 + double precision u21jm1,u31jm1,u41jm1,u51jm1 + double precision u21km1,u31km1,u41km1,u51km1 + +!DVM$ interval 11 + if (timeron) call timer_start(t_rhs) +!DVM$ region +!DVM$ PARALLEL (k,j,i) ON qs(i,j,k), PRIVATE (j,i,tmp,k,m) +!DVM$&,SHADOW_COMPUTE,SHADOW_RENEW (u) + do k = 1,nz + do j = 1,ny + do i = 1,nx + tmp = 1.0d+00 / u(1,i,j,k) + qs(i,j,k) = 0.50d+00 * (u(2,i,j,k) * u(2,i,j,k) + u(3,i,j + &,k) * u(3,i,j,k) + u(4,i,j,k) * u(4,i,j,k)) * tmp + tmp = 1.0d+00 / u(1,i,j,k) + rho_i(i,j,k) = tmp + do m = 1,5 + rsd(m,i,j,k) = (-(frct(m,i,j,k))) + enddo + enddo + enddo + enddo +!DVM$ end region + allocate(flux_br1(5,isiz1,2:isiz2 - 1,2:isiz3 - 1)) + +!--------------------------------------------------------------------- +! xi-direction flux differences +!--------------------------------------------------------------------- +!DVM$ region +!DVM$ PARALLEL (k,j,i) ON flux_br1(*,i,j,k), PRIVATE (j,i,k,q,u21), +!DVM$&SHADOW_COMPUTE + do k = 2,nz - 1 + do j = jst,jend + do i = 1,nx + flux_br1(1,i,j,k) = u(2,i,j,k) + u21 = u(2,i,j,k) * rho_i(i,j,k) + q = qs(i,j,k) + flux_br1(2,i,j,k) = u(2,i,j,k) * u21 + c2 * (u(5,i,j,k) - + & q) + flux_br1(3,i,j,k) = u(3,i,j,k) * u21 + flux_br1(4,i,j,k) = u(4,i,j,k) * u21 + flux_br1(5,i,j,k) = (c1 * u(5,i,j,k) - c2 * q) * u21 + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,i,m) ON rsd(m,i,j,k), PRIVATE (j,i,k,m) + do k = 2,nz - 1 + do j = jst,jend + do i = ist,iend + do m = 1,5 + rsd(m,i,j,k) = rsd(m,i,j,k) - tx2 * (flux_br1(m,i + 1, + &j,k) - flux_br1(m,i - 1,j,k)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,i) ON flux_br1(*,i,j,k), PRIVATE (j,i,tmp,k,u21i,u31 +!DVM$&i,u41im1,u51im1,u51i,u41i,u21im1,u31im1),SHADOW_COMPUTE + do k = 2,nz - 1 + do j = jst,jend + do i = ist,nx + tmp = rho_i(i,j,k) + u21i = tmp * u(2,i,j,k) + u31i = tmp * u(3,i,j,k) + u41i = tmp * u(4,i,j,k) + u51i = tmp * u(5,i,j,k) + tmp = rho_i(i - 1,j,k) + u21im1 = tmp * u(2,i - 1,j,k) + u31im1 = tmp * u(3,i - 1,j,k) + u41im1 = tmp * u(4,i - 1,j,k) + u51im1 = tmp * u(5,i - 1,j,k) + flux_br1(2,i,j,k) = 4.0d+00 / 3.0d+00 * tx3 * (u21i - u21 + &im1) + flux_br1(3,i,j,k) = tx3 * (u31i - u31im1) + flux_br1(4,i,j,k) = tx3 * (u41i - u41im1) + flux_br1(5,i,j,k) = 0.50d+00 * (1.0d+00 - c1 * c5) * tx3 + &* (u21i** 2 + u31i** 2 + u41i** 2 - (u21im1** 2 + u31im1** 2 + u41 + &im1** 2)) + 1.0d+00 / 6.0d+00 * tx3 * (u21i** 2 - u21im1** 2) + c1 + & * c5 * tx3 * (u51i - u51im1) + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,i) ON rsd(*,i,j,k), PRIVATE (j,i,k) + do k = 2,nz - 1 + do j = jst,jend + do i = ist,iend + rsd(1,i,j,k) = rsd(1,i,j,k) + dx1 * tx1 * (u(1,i - 1,j,k) + & - 2.0d+00 * u(1,i,j,k) + u(1,i + 1,j,k)) + rsd(2,i,j,k) = rsd(2,i,j,k) + tx3 * c3 * c4 * (flux_br1(2 + &,i + 1,j,k) - flux_br1(2,i,j,k)) + dx2 * tx1 * (u(2,i - 1,j,k) - 2 + &.0d+00 * u(2,i,j,k) + u(2,i + 1,j,k)) + rsd(3,i,j,k) = rsd(3,i,j,k) + tx3 * c3 * c4 * (flux_br1(3 + &,i + 1,j,k) - flux_br1(3,i,j,k)) + dx3 * tx1 * (u(3,i - 1,j,k) - 2 + &.0d+00 * u(3,i,j,k) + u(3,i + 1,j,k)) + rsd(4,i,j,k) = rsd(4,i,j,k) + tx3 * c3 * c4 * (flux_br1(4 + &,i + 1,j,k) - flux_br1(4,i,j,k)) + dx4 * tx1 * (u(4,i - 1,j,k) - 2 + &.0d+00 * u(4,i,j,k) + u(4,i + 1,j,k)) + rsd(5,i,j,k) = rsd(5,i,j,k) + tx3 * c3 * c4 * (flux_br1(5 + &,i + 1,j,k) - flux_br1(5,i,j,k)) + dx5 * tx1 * (u(5,i - 1,j,k) - 2 + &.0d+00 * u(5,i,j,k) + u(5,i + 1,j,k)) + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! Fourth-order dissipation +!--------------------------------------------------------------------- +!DVM$ PARALLEL (k,j,m) ON rsd(m,2,j,k), PRIVATE (j,k,m) + do k = 2,nz - 1 + do j = jst,jend + do m = 1,5 + rsd(m,2,j,k) = rsd(m,2,j,k) - dssp * ((+(5.0d+00)) * u(m, + &2,j,k) - 4.0d+00 * u(m,3,j,k) + u(m,4,j,k)) + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,m) ON rsd(m,3,j,k), PRIVATE (j,k,m) + do k = 2,nz - 1 + do j = jst,jend + do m = 1,5 + rsd(m,3,j,k) = rsd(m,3,j,k) - dssp * ((-(4.0d+00)) * u(m, + &2,j,k) + 6.0d+00 * u(m,3,j,k) - 4.0d+00 * u(m,4,j,k) + u(m,5,j,k)) + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,i,m) ON rsd(m,i,j,k), PRIVATE (j,i,k,m) + do k = 2,nz - 1 + do j = jst,jend + do i = 4,nx - 3 + do m = 1,5 + rsd(m,i,j,k) = rsd(m,i,j,k) - dssp * (u(m,i - 2,j,k) - + & 4.0d+00 * u(m,i - 1,j,k) + 6.0d+00 * u(m,i,j,k) - 4.0d+00 * u(m,i + & + 1,j,k) + u(m,i + 2,j,k)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,m) ON rsd(m,nx + -2,j,k), PRIVATE (j,k,m) + do k = 2,nz - 1 + do j = jst,jend + do m = 1,5 + rsd(m,nx - 2,j,k) = rsd(m,nx - 2,j,k) - dssp * (u(m,nx - + &4,j,k) - 4.0d+00 * u(m,nx - 3,j,k) + 6.0d+00 * u(m,nx - 2,j,k) - 4 + &.0d+00 * u(m,nx - 1,j,k)) + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,m) ON rsd(m,nx + -1,j,k), PRIVATE (j,k,m) + do k = 2,nz - 1 + do j = jst,jend + do m = 1,5 + rsd(m,nx - 1,j,k) = rsd(m,nx - 1,j,k) - dssp * (u(m,nx - + &3,j,k) - 4.0d+00 * u(m,nx - 2,j,k) + 5.0d+00 * u(m,nx - 1,j,k)) + enddo + enddo + enddo +!DVM$ end region + deallocate(flux_br1) + allocate(flux_br2(5,isiz1,2:isiz1 - 1,2:isiz3 - 1)) + +!--------------------------------------------------------------------- +! eta-direction flux differences +!--------------------------------------------------------------------- +!DVM$ region +!DVM$ PARALLEL (k,i,j) ON flux_br2(*,j,i,k), PRIVATE (j,i,k,q,u31), +!DVM$& SHADOW_COMPUTE + do k = 2,nz - 1 + do i = ist,iend + do j = 1,ny + flux_br2(1,j,i,k) = u(3,i,j,k) + u31 = u(3,i,j,k) * rho_i(i,j,k) + q = qs(i,j,k) + flux_br2(2,j,i,k) = u(2,i,j,k) * u31 + flux_br2(3,j,i,k) = u(3,i,j,k) * u31 + c2 * (u(5,i,j,k) - + & q) + flux_br2(4,j,i,k) = u(4,i,j,k) * u31 + flux_br2(5,j,i,k) = (c1 * u(5,i,j,k) - c2 * q) * u31 + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,j,m) ON rsd(m,i,j,k), PRIVATE (j,i,k,m) + do k = 2,nz - 1 + do i = ist,iend + do j = jst,jend + do m = 1,5 + rsd(m,i,j,k) = rsd(m,i,j,k) - ty2 * (flux_br2(m,j + 1, + &i,k) - flux_br2(m,j - 1,i,k)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,j) ON flux_br2(*,j,i,k), PRIVATE (u51j,j,u31j,u41j,u +!DVM$&51jm1,u21j,i,tmp,u41jm1,u21jm1,u31jm1,k),SHADOW_COMPUTE + do k = 2,nz - 1 + do i = ist,iend + do j = jst,ny + tmp = rho_i(i,j,k) + u21j = tmp * u(2,i,j,k) + u31j = tmp * u(3,i,j,k) + u41j = tmp * u(4,i,j,k) + u51j = tmp * u(5,i,j,k) + tmp = rho_i(i,j - 1,k) + u21jm1 = tmp * u(2,i,j - 1,k) + u31jm1 = tmp * u(3,i,j - 1,k) + u41jm1 = tmp * u(4,i,j - 1,k) + u51jm1 = tmp * u(5,i,j - 1,k) + flux_br2(2,j,i,k) = ty3 * (u21j - u21jm1) + flux_br2(3,j,i,k) = 4.0d+00 / 3.0d+00 * ty3 * (u31j - u31 + &jm1) + flux_br2(4,j,i,k) = ty3 * (u41j - u41jm1) + flux_br2(5,j,i,k) = 0.50d+00 * (1.0d+00 - c1 * c5) * ty3 + &* (u21j** 2 + u31j** 2 + u41j** 2 - (u21jm1** 2 + u31jm1** 2 + u41 + &jm1** 2)) + 1.0d+00 / 6.0d+00 * ty3 * (u31j** 2 - u31jm1** 2) + c1 + & * c5 * ty3 * (u51j - u51jm1) + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,j) ON rsd(*,i,j,k), PRIVATE (j,i,k) + do k = 2,nz - 1 + do i = ist,iend + do j = jst,jend + rsd(1,i,j,k) = rsd(1,i,j,k) + dy1 * ty1 * (u(1,i,j - 1,k) + & - 2.0d+00 * u(1,i,j,k) + u(1,i,j + 1,k)) + rsd(2,i,j,k) = rsd(2,i,j,k) + ty3 * c3 * c4 * (flux_br2(2 + &,j + 1,i,k) - flux_br2(2,j,i,k)) + dy2 * ty1 * (u(2,i,j - 1,k) - 2 + &.0d+00 * u(2,i,j,k) + u(2,i,j + 1,k)) + rsd(3,i,j,k) = rsd(3,i,j,k) + ty3 * c3 * c4 * (flux_br2(3 + &,j + 1,i,k) - flux_br2(3,j,i,k)) + dy3 * ty1 * (u(3,i,j - 1,k) - 2 + &.0d+00 * u(3,i,j,k) + u(3,i,j + 1,k)) + rsd(4,i,j,k) = rsd(4,i,j,k) + ty3 * c3 * c4 * (flux_br2(4 + &,j + 1,i,k) - flux_br2(4,j,i,k)) + dy4 * ty1 * (u(4,i,j - 1,k) - 2 + &.0d+00 * u(4,i,j,k) + u(4,i,j + 1,k)) + rsd(5,i,j,k) = rsd(5,i,j,k) + ty3 * c3 * c4 * (flux_br2(5 + &,j + 1,i,k) - flux_br2(5,j,i,k)) + dy5 * ty1 * (u(5,i,j - 1,k) - 2 + &.0d+00 * u(5,i,j,k) + u(5,i,j + 1,k)) + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,m) ON rsd(m,i,2,k), PRIVATE (i,k,m) + do k = 2,nz - 1 + do i = ist,iend + do m = 1,5 + rsd(m,i,2,k) = rsd(m,i,2,k) - dssp * ((+(5.0d+00)) * u(m, + &i,2,k) - 4.0d+00 * u(m,i,3,k) + u(m,i,4,k)) + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,m) ON rsd(m,i,3,k), PRIVATE (i,k,m) + do k = 2,nz - 1 + do i = ist,iend + do m = 1,5 + rsd(m,i,3,k) = rsd(m,i,3,k) - dssp * ((-(4.0d+00)) * u(m, + &i,2,k) + 6.0d+00 * u(m,i,3,k) - 4.0d+00 * u(m,i,4,k) + u(m,i,5,k)) + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,j,m) ON rsd(m,i,j,k), PRIVATE (j,i,k,m) + do k = 2,nz - 1 + do i = ist,iend + do j = 4,ny - 3 + do m = 1,5 + rsd(m,i,j,k) = rsd(m,i,j,k) - dssp * (u(m,i,j - 2,k) - + & 4.0d+00 * u(m,i,j - 1,k) + 6.0d+00 * u(m,i,j,k) - 4.0d+00 * u(m,i + &,j + 1,k) + u(m,i,j + 2,k)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,m) ON rsd(m,i,ny + -2,k), PRIVATE (i,k,m) + do k = 2,nz - 1 + do i = ist,iend + do m = 1,5 + rsd(m,i,ny - 2,k) = rsd(m,i,ny - 2,k) - dssp * (u(m,i,ny + &- 4,k) - 4.0d+00 * u(m,i,ny - 3,k) + 6.0d+00 * u(m,i,ny - 2,k) - 4 + &.0d+00 * u(m,i,ny - 1,k)) + enddo + enddo + enddo +!DVM$ PARALLEL (k,i,m) ON rsd(m,i,ny + -1,k), PRIVATE (i,k,m) + do k = 2,nz - 1 + do i = ist,iend + do m = 1,5 + rsd(m,i,ny - 1,k) = rsd(m,i,ny - 1,k) - dssp * (u(m,i,ny + &- 3,k) - 4.0d+00 * u(m,i,ny - 2,k) + 5.0d+00 * u(m,i,ny - 1,k)) + enddo + enddo + enddo +!DVM$ end region + deallocate(flux_br2) + allocate(utmp_br1(6,isiz3,2:isiz1 - 1,2:isiz2 - 1)) + allocate(rtmp_br1(5,isiz3,2:isiz1 - 1,2:isiz2 - 1)) + allocate(flux_br3(5,isiz1,2:isiz1 - 1,2:isiz2 - 1)) + +!--------------------------------------------------------------------- +! zeta-direction flux differences +!--------------------------------------------------------------------- +!DVM$ region +!DVM$ PARALLEL (j,i,k) ON utmp_br1(*,k,i,j), PRIVATE (j,i,k), +!DVM$& SHADOW_COMPUTE + do j = jst,jend + do i = ist,iend + do k = 1,nz + utmp_br1(1,k,i,j) = u(1,i,j,k) + utmp_br1(2,k,i,j) = u(2,i,j,k) + utmp_br1(3,k,i,j) = u(3,i,j,k) + utmp_br1(4,k,i,j) = u(4,i,j,k) + utmp_br1(5,k,i,j) = u(5,i,j,k) + utmp_br1(6,k,i,j) = rho_i(i,j,k) + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,k) ON flux_br3(*,k,i,j), PRIVATE (j,i,k,q,u41), +!DVM$& SHADOW_COMPUTE + do j = jst,jend + do i = ist,iend + do k = 1,nz + flux_br3(1,k,i,j) = utmp_br1(4,k,i,j) + u41 = utmp_br1(4,k,i,j) * utmp_br1(6,k,i,j) + q = qs(i,j,k) + flux_br3(2,k,i,j) = utmp_br1(2,k,i,j) * u41 + flux_br3(3,k,i,j) = utmp_br1(3,k,i,j) * u41 + flux_br3(4,k,i,j) = utmp_br1(4,k,i,j) * u41 + c2 * (utmp_ + &br1(5,k,i,j) - q) + flux_br3(5,k,i,j) = (c1 * utmp_br1(5,k,i,j) - c2 * q) * u + &41 + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,k,m) ON rtmp_br1(m,k,i,j), PRIVATE (j,i,k,m) + do j = jst,jend + do i = ist,iend + do k = 2,nz - 1 + do m = 1,5 + rtmp_br1(m,k,i,j) = rsd(m,i,j,k) - tz2 * (flux_br3(m,k + & + 1,i,j) - flux_br3(m,k - 1,i,j)) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,k) ON flux_br3(*,k,i,j), PRIVATE (j,i,tmp,k,u21km1,u +!DVM$&41km1,u51k,u51km1,u31km1,u31k,u41k,u21k),SHADOW_COMPUTE + do j = jst,jend + do i = ist,iend + do k = 2,nz + tmp = utmp_br1(6,k,i,j) + u21k = tmp * utmp_br1(2,k,i,j) + u31k = tmp * utmp_br1(3,k,i,j) + u41k = tmp * utmp_br1(4,k,i,j) + u51k = tmp * utmp_br1(5,k,i,j) + tmp = utmp_br1(6,k - 1,i,j) + u21km1 = tmp * utmp_br1(2,k - 1,i,j) + u31km1 = tmp * utmp_br1(3,k - 1,i,j) + u41km1 = tmp * utmp_br1(4,k - 1,i,j) + u51km1 = tmp * utmp_br1(5,k - 1,i,j) + flux_br3(2,k,i,j) = tz3 * (u21k - u21km1) + flux_br3(3,k,i,j) = tz3 * (u31k - u31km1) + flux_br3(4,k,i,j) = 4.0d+00 / 3.0d+00 * tz3 * (u41k - u41 + &km1) + flux_br3(5,k,i,j) = 0.50d+00 * (1.0d+00 - c1 * c5) * tz3 + &* (u21k** 2 + u31k** 2 + u41k** 2 - (u21km1** 2 + u31km1** 2 + u41 + &km1** 2)) + 1.0d+00 / 6.0d+00 * tz3 * (u41k** 2 - u41km1** 2) + c1 + & * c5 * tz3 * (u51k - u51km1) + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,k) ON rtmp_br1(*,k,i,j), PRIVATE (j,i,k) + do j = jst,jend + do i = ist,iend + do k = 2,nz - 1 + rtmp_br1(1,k,i,j) = rtmp_br1(1,k,i,j) + dz1 * tz1 * (utmp + &_br1(1,k - 1,i,j) - 2.0d+00 * utmp_br1(1,k,i,j) + utmp_br1(1,k + 1 + &,i,j)) + rtmp_br1(2,k,i,j) = rtmp_br1(2,k,i,j) + tz3 * c3 * c4 * ( + &flux_br3(2,k + 1,i,j) - flux_br3(2,k,i,j)) + dz2 * tz1 * (utmp_br1 + &(2,k - 1,i,j) - 2.0d+00 * utmp_br1(2,k,i,j) + utmp_br1(2,k + 1,i,j + &)) + rtmp_br1(3,k,i,j) = rtmp_br1(3,k,i,j) + tz3 * c3 * c4 * ( + &flux_br3(3,k + 1,i,j) - flux_br3(3,k,i,j)) + dz3 * tz1 * (utmp_br1 + &(3,k - 1,i,j) - 2.0d+00 * utmp_br1(3,k,i,j) + utmp_br1(3,k + 1,i,j + &)) + rtmp_br1(4,k,i,j) = rtmp_br1(4,k,i,j) + tz3 * c3 * c4 * ( + &flux_br3(4,k + 1,i,j) - flux_br3(4,k,i,j)) + dz4 * tz1 * (utmp_br1 + &(4,k - 1,i,j) - 2.0d+00 * utmp_br1(4,k,i,j) + utmp_br1(4,k + 1,i,j + &)) + rtmp_br1(5,k,i,j) = rtmp_br1(5,k,i,j) + tz3 * c3 * c4 * ( + &flux_br3(5,k + 1,i,j) - flux_br3(5,k,i,j)) + dz5 * tz1 * (utmp_br1 + &(5,k - 1,i,j) - 2.0d+00 * utmp_br1(5,k,i,j) + utmp_br1(5,k + 1,i,j + &)) + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! fourth-order dissipation +!--------------------------------------------------------------------- +!DVM$ PARALLEL (j,i,m) ON rsd(m,i,j,2), PRIVATE (j,i,m) + do j = jst,jend + do i = ist,iend + do m = 1,5 + rsd(m,i,j,2) = rtmp_br1(m,2,i,j) - dssp * ((+(5.0d+00)) * + & utmp_br1(m,2,i,j) - 4.0d+00 * utmp_br1(m,3,i,j) + utmp_br1(m,4,i, + &j)) + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,m) ON rsd(m,i,j,3), PRIVATE (j,i,m) + do j = jst,jend + do i = ist,iend + do m = 1,5 + rsd(m,i,j,3) = rtmp_br1(m,3,i,j) - dssp * ((-(4.0d+00)) * + & utmp_br1(m,2,i,j) + 6.0d+00 * utmp_br1(m,3,i,j) - 4.0d+00 * utmp_ + &br1(m,4,i,j) + utmp_br1(m,5,i,j)) + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,k,m) ON rsd(m,i,j,k), PRIVATE (j,i,k,m) + do j = jst,jend + do i = ist,iend + do k = 4,nz - 3 + do m = 1,5 + rsd(m,i,j,k) = rtmp_br1(m,k,i,j) - dssp * (utmp_br1(m, + &k - 2,i,j) - 4.0d+00 * utmp_br1(m,k - 1,i,j) + 6.0d+00 * utmp_br1( + &m,k,i,j) - 4.0d+00 * utmp_br1(m,k + 1,i,j) + utmp_br1(m,k + 2,i,j) + &) + enddo + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,m) ON rsd(m,i,j,nz + -2), PRIVATE (j,i,m) + do j = jst,jend + do i = ist,iend + do m = 1,5 + rsd(m,i,j,nz - 2) = rtmp_br1(m,nz - 2,i,j) - dssp * (utmp + &_br1(m,nz - 4,i,j) - 4.0d+00 * utmp_br1(m,nz - 3,i,j) + 6.0d+00 * + &utmp_br1(m,nz - 2,i,j) - 4.0d+00 * utmp_br1(m,nz - 1,i,j)) + enddo + enddo + enddo +!DVM$ PARALLEL (j,i,m) ON rsd(m,i,j,nz + -1), PRIVATE (j,i,m) + do j = jst,jend + do i = ist,iend + do m = 1,5 + rsd(m,i,j,nz - 1) = rtmp_br1(m,nz - 1,i,j) - dssp * (utmp + &_br1(m,nz - 3,i,j) - 4.0d+00 * utmp_br1(m,nz - 2,i,j) + 5.0d+00 * + &utmp_br1(m,nz - 1,i,j)) + enddo + enddo + enddo +!DVM$ end region + deallocate(flux_br3) + deallocate(rtmp_br1) + deallocate(utmp_br1) + if (timeron) call timer_stop(t_rhs) +!DVM$ end interval + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f2 b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f2 new file mode 100644 index 0000000..b55561d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/rhs.f2 @@ -0,0 +1,415 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine rhs + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c compute the right hand sides +c--------------------------------------------------------------------- + + implicit none + + include 'applu.incl' + +c--------------------------------------------------------------------- +c local variables +c--------------------------------------------------------------------- + integer i, j, k, m, p + double precision q + double precision tmp, utmp(6,isiz3), rtmp(5,isiz3) + double precision u21, u31, u41 + double precision u21i, u31i, u41i, u51i + double precision u21j, u31j, u41j, u51j + double precision u21k, u31k, u41k, u51k + double precision u21im1, u31im1, u41im1, u51im1 + double precision u21jm1, u31jm1, u41jm1, u51jm1 + double precision u21km1, u31km1, u41km1, u51km1 + double precision flu(5,-1:1) + + + if (timeron) call timer_start(t_rhs) +!DVM$ PARALLEL (k,j,i) ON qs(i,j,k), PRIVATE (j,i,tmp,k,m) +!DVM$&,SHADOW_COMPUTE,SHADOW_RENEW (u) + do k = 1, nz + do j = 1, ny + do i = 1, nx + do m = 1, 5 + rsd(m,i,j,k) = - frct(m,i,j,k) + end do + tmp = 1.0d+00 / u(1,i,j,k) + rho_i(i,j,k) = tmp + qs(i,j,k) = 0.50d+00 * ( u(2,i,j,k) * u(2,i,j,k) + > + u(3,i,j,k) * u(3,i,j,k) + > + u(4,i,j,k) * u(4,i,j,k) ) + > * tmp + end do + end do + end do + +! if (timeron) call timer_start(t_rhsx) +!DVM$ PARALLEL (k,j,i) on rsd(*,i,j,k) + do k = 2, nz - 1 + do j = jst, jend + do i = ist, iend + do p = -1, 1, 2 + flu(1,p) = u(2,i+p,j,k) + u21 = u(2,i+p,j,k) * rho_i(i+p,j,k) + + q = qs(i+p,j,k) + + flu(2,p) = u(2,i+p,j,k) * u21 + c2 * + > ( u(5,i+p,j,k) - q ) + flu(3,p) = u(3,i+p,j,k) * u21 + flu(4,p) = u(4,i+p,j,k) * u21 + flu(5,p) = ( c1 * u(5,i+p,j,k) - c2 * q ) * u21 + end do + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - tx2 * ( flu(m,1) - flu(m,-1) ) + end do + + do p = 0, 1 + tmp = rho_i(i+p,j,k) + + u21i = tmp * u(2,i+p,j,k) + u31i = tmp * u(3,i+p,j,k) + u41i = tmp * u(4,i+p,j,k) + u51i = tmp * u(5,i+p,j,k) + + tmp = rho_i(i-1+p,j,k) + + u21im1 = tmp * u(2,i-1+p,j,k) + u31im1 = tmp * u(3,i-1+p,j,k) + u41im1 = tmp * u(4,i-1+p,j,k) + u51im1 = tmp * u(5,i-1+p,j,k) + + flu(2,p) = (4.0d+00/3.0d+00) * tx3 * (u21i-u21im1) + flu(3,p) = tx3 * ( u31i - u31im1 ) + flu(4,p) = tx3 * ( u41i - u41im1 ) + flu(5,p) = 0.50d+00 * ( 1.0d+00 - c1*c5) + > * tx3 * ( ( u21i **2 + u31i **2+u41i **2) + > - ( u21im1**2 + u31im1**2+u41im1**2)) + > + (1.0d+00/6.0d+00) + > * tx3 * ( u21i**2 - u21im1**2 ) + > + c1 * c5 * tx3 * ( u51i - u51im1 ) + enddo + + rsd(1,i,j,k) = rsd(1,i,j,k) + > + dx1 * tx1 * ( u(1,i-1,j,k) + > - 2.0d+00 * u(1,i,j,k) + > + u(1,i+1,j,k) ) + rsd(2,i,j,k) = rsd(2,i,j,k) + > + tx3 * c3 * c4 * ( flu(2,1) - flu(2,0) ) + > + dx2 * tx1 * ( u(2,i-1,j,k) + > - 2.0d+00 * u(2,i,j,k) + > + u(2,i+1,j,k) ) + rsd(3,i,j,k) = rsd(3,i,j,k) + > + tx3 * c3 * c4 * ( flu(3,1) - flu(3,0) ) + > + dx3 * tx1 * ( u(3,i-1,j,k) + > - 2.0d+00 * u(3,i,j,k) + > + u(3,i+1,j,k) ) + rsd(4,i,j,k) = rsd(4,i,j,k) + > + tx3 * c3 * c4 * ( flu(4,1) - flu(4,0) ) + > + dx4 * tx1 * ( u(4,i-1,j,k) + > - 2.0d+00 * u(4,i,j,k) + > + u(4,i+1,j,k) ) + rsd(5,i,j,k) = rsd(5,i,j,k) + > + tx3 * c3 * c4 * ( flu(5,1) - flu(5,0) ) + > + dx5 * tx1 * ( u(5,i-1,j,k) + > - 2.0d+00 * u(5,i,j,k) + > + u(5,i+1,j,k) ) + + + if (i .eq. 2)then + do m = 1, 5 + rsd(m,2,j,k) = rsd(m,2,j,k) + > - dssp * ( + 5.0d+00 * u(m,2,j,k) + > - 4.0d+00 * u(m,3,j,k) + > + u(m,4,j,k) ) + enddo + else if (i .eq. 3)then + do m = 1, 5 + rsd(m,3,j,k) = rsd(m,3,j,k) + > - dssp * ( - 4.0d+00 * u(m,2,j,k) + > + 6.0d+00 * u(m,3,j,k) + > - 4.0d+00 * u(m,4,j,k) + > + u(m,5,j,k) ) + enddo + else if (i .eq. nx-2)then + do m = 1, 5 + rsd(m,nx-2,j,k) = rsd(m,nx-2,j,k) + > - dssp * ( u(m,nx-4,j,k) + > - 4.0d+00 * u(m,nx-3,j,k) + > + 6.0d+00 * u(m,nx-2,j,k) + > - 4.0d+00 * u(m,nx-1,j,k) ) + enddo + else if (i .eq. nx-1)then + do m = 1, 5 + rsd(m,nx-1,j,k) = rsd(m,nx-1,j,k) + > - dssp * ( u(m,nx-3,j,k) + > - 4.0d+00 * u(m,nx-2,j,k) + > + 5.0d+00 * u(m,nx-1,j,k) ) + enddo + else + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - dssp * ( u(m,i-2,j,k) + > - 4.0d+00 * u(m,i-1,j,k) + > + 6.0d+00 * u(m,i,j,k) + > - 4.0d+00 * u(m,i+1,j,k) + > + u(m,i+2,j,k) ) + end do + endif + ! end do + ! end do +! end do +! if (timeron) call timer_stop(t_rhsx) + +! if (timeron) call timer_start(t_rhsy) +! do k = 2, nz - 1 + ! do j = jst, jend + ! do i = ist, iend + do p = -1, 1, 2 + flu(1,p) = u(3,i,j+p,k) + u31 = u(3,i,j+p,k) * rho_i(i,j+p,k) + + q = qs(i,j+p,k) + + flu(2,p) = u(2,i,j+p,k) * u31 + flu(3,p) = u(3,i,j+p,k) * u31 + c2 * (u(5,i,j+p,k)-q) + flu(4,p) = u(4,i,j+p,k) * u31 + flu(5,p) = ( c1 * u(5,i,j+p,k) - c2 * q ) * u31 + end do + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - ty2 * ( flu(m,1) - flu(m,-1) ) + end do + + do p = 0, 1 + tmp = rho_i(i,j+p,k) + + u21j = tmp * u(2,i,j+p,k) + u31j = tmp * u(3,i,j+p,k) + u41j = tmp * u(4,i,j+p,k) + u51j = tmp * u(5,i,j+p,k) + + tmp = rho_i(i,j-1+p,k) + u21jm1 = tmp * u(2,i,j-1+p,k) + u31jm1 = tmp * u(3,i,j-1+p,k) + u41jm1 = tmp * u(4,i,j-1+p,k) + u51jm1 = tmp * u(5,i,j-1+p,k) + + flu(2,p) = ty3 * ( u21j - u21jm1 ) + flu(3,p) = (4.0d+00/3.0d+00) * ty3 * (u31j-u31jm1) + flu(4,p) = ty3 * ( u41j - u41jm1 ) + flu(5,p) = 0.50d+00 * ( 1.0d+00 - c1*c5 ) + > * ty3 * ( ( u21j **2 + u31j **2 + u41j **2 ) + > - ( u21jm1**2 + u31jm1**2 + u41jm1**2 ) ) + > + (1.0d+00/6.0d+00) + > * ty3 * ( u31j**2 - u31jm1**2 ) + > + c1 * c5 * ty3 * ( u51j - u51jm1 ) + enddo + + rsd(1,i,j,k) = rsd(1,i,j,k) + > + dy1 * ty1 * ( u(1,i,j-1,k) + > - 2.0d+00 * u(1,i,j,k) + > + u(1,i,j+1,k) ) + + rsd(2,i,j,k) = rsd(2,i,j,k) + > + ty3 * c3 * c4 * ( flu(2,1) - flu(2,0) ) + > + dy2 * ty1 * ( u(2,i,j-1,k) + > - 2.0d+00 * u(2,i,j,k) + > + u(2,i,j+1,k) ) + + rsd(3,i,j,k) = rsd(3,i,j,k) + > + ty3 * c3 * c4 * ( flu(3,1) - flu(3,0) ) + > + dy3 * ty1 * ( u(3,i,j-1,k) + > - 2.0d+00 * u(3,i,j,k) + > + u(3,i,j+1,k) ) + + rsd(4,i,j,k) = rsd(4,i,j,k) + > + ty3 * c3 * c4 * ( flu(4,1) - flu(4,0) ) + > + dy4 * ty1 * ( u(4,i,j-1,k) + > - 2.0d+00 * u(4,i,j,k) + > + u(4,i,j+1,k) ) + + rsd(5,i,j,k) = rsd(5,i,j,k) + > + ty3 * c3 * c4 * ( flu(5,1) - flu(5,0) ) + > + dy5 * ty1 * ( u(5,i,j-1,k) + > - 2.0d+00 * u(5,i,j,k) + > + u(5,i,j+1,k) ) + + + + if (j .eq. 2) then + do m = 1, 5 + rsd(m,i,2,k) = rsd(m,i,2,k) + > - dssp * ( + 5.0d+00 * u(m,i,2,k) + > - 4.0d+00 * u(m,i,3,k) + > + u(m,i,4,k) ) + enddo + elseif (j .eq. 3) then + do m = 1, 5 + rsd(m,i,3,k) = rsd(m,i,3,k) + > - dssp * ( - 4.0d+00 * u(m,i,2,k) + > + 6.0d+00 * u(m,i,3,k) + > - 4.0d+00 * u(m,i,4,k) + > + u(m,i,5,k) ) + end do + elseif (j .eq. ny-2) then + do m = 1, 5 + rsd(m,i,ny-2,k) = rsd(m,i,ny-2,k) + > - dssp * ( u(m,i,ny-4,k) + > - 4.0d+00 * u(m,i,ny-3,k) + > + 6.0d+00 * u(m,i,ny-2,k) + > - 4.0d+00 * u(m,i,ny-1,k) ) + enddo + elseif (j .eq. ny-1) then + do m = 1, 5 + rsd(m,i,ny-1,k) = rsd(m,i,ny-1,k) + > - dssp * ( u(m,i,ny-3,k) + > - 4.0d+00 * u(m,i,ny-2,k) + > + 5.0d+00 * u(m,i,ny-1,k) ) + end do + else + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - dssp * ( u(m,i,j-2,k) + > - 4.0d+00 * u(m,i,j-1,k) + > + 6.0d+00 * u(m,i,j,k) + > - 4.0d+00 * u(m,i,j+1,k) + > + u(m,i,j+2,k) ) + end do + endif + +! end do +! end do +! end do + +! if (timeron) call timer_stop(t_rhsy) + +! if (timeron) call timer_start(t_rhsz) +! do k = 2, nz - 1 +! do j = jst, jend +! do i = ist, iend + do p=-1,1,2 + flu(1,p) = u(4,i,j,k+p) + u41 = u(4,i,j,k+p) * rho_i(i,j,k+p) + + q = qs(i,j,k+p) + + flu(2,p) = u(2,i,j,k+p) * u41 + flu(3,p) = u(3,i,j,k+p) * u41 + flu(4,p) = u(4,i,j,k+p) * u41 + c2 * (u(5,i,j,k+p)-q) + flu(5,p) = ( c1 * u(5,i,j,k+p) - c2 * q ) * u41 + enddo + + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - tz2 * ( flu(m,1) - flu(m,-1) ) + end do + + do p=0,1 + tmp = rho_i(i,j,k+p) + + u21k = tmp * u(2,i,j,k+p) + u31k = tmp * u(3,i,j,k+p) + u41k = tmp * u(4,i,j,k+p) + u51k = tmp * u(5,i,j,k+p) + + tmp = rho_i(i,j,k-1+p) + + u21km1 = tmp * u(2,i,j,k-1+p) + u31km1 = tmp * u(3,i,j,k-1+p) + u41km1 = tmp * u(4,i,j,k-1+p) + u51km1 = tmp * u(5,i,j,k-1+p) + + flu(2,p) = tz3 * ( u21k - u21km1 ) + flu(3,p) = tz3 * ( u31k - u31km1 ) + flu(4,p) = (4.0d+00/3.0d+00) * tz3 * (u41k-u41km1) + flu(5,p) = 0.50d+00 * ( 1.0d+00 - c1*c5 ) + > * tz3 * ( ( u21k **2 + u31k **2 + u41k **2 ) + > - ( u21km1**2 + u31km1**2 + u41km1**2 ) ) + > + (1.0d+00/6.0d+00) + > * tz3 * ( u41k**2 - u41km1**2 ) + > + c1 * c5 * tz3 * ( u51k - u51km1 ) + enddo + rsd(1,i,j,k) = rsd(1,i,j,k) + > + dz1 * tz1 * ( u(1,i,j,k-1) + > - 2.0d+00 * u(1,i,j,k) + > + u(1,i,j,k+1) ) + rsd(2,i,j,k) = rsd(2,i,j,k) + > + tz3 * c3 * c4 * ( flu(2,1) - flu(2,0) ) + > + dz2 * tz1 * ( u(2,i,j,k-1) + > - 2.0d+00 * u(2,i,j,k) + > + u(2,i,j,k+1) ) + rsd(3,i,j,k) = rsd(3,i,j,k) + > + tz3 * c3 * c4 * ( flu(3,1) - flu(3,0) ) + > + dz3 * tz1 * ( u(3,i,j,k-1) + > - 2.0d+00 * u(3,i,j,k) + > + u(3,i,j,k+1) ) + rsd(4,i,j,k) = rsd(4,i,j,k) + > + tz3 * c3 * c4 * ( flu(4,1) - flu(4,0) ) + > + dz4 * tz1 * ( u(4,i,j,k-1) + > - 2.0d+00 * u(4,i,j,k) + > + u(4,i,j,k+1) ) + rsd(5,i,j,k) = rsd(5,i,j,k) + > + tz3 * c3 * c4 * ( flu(5,1) - flu(5,0) ) + > + dz5 * tz1 * ( u(5,i,j,k-1) + > - 2.0d+00 * u(5,i,j,k) + > + u(5,i,j,k+1) ) + + + if (k .eq. 2) then + do m = 1, 5 + rsd(m,i,j,2) = rsd(m,i,j,2) + > - dssp * ( + 5.0d+00 * u(m,i,j,2) + > - 4.0d+00 * u(m,i,j,3) + > + u(m,i,j,4) ) + end do + elseif (k .eq. 3) then + do m = 1, 5 + rsd(m,i,j,3) = rsd(m,i,j,3) + > - dssp * ( - 4.0d+00 * u(m,i,j,2) + > + 6.0d+00 * u(m,i,j,3) + > - 4.0d+00 * u(m,i,j,4) + > + u(m,i,j,5) ) + end do + elseif (k .eq. nz-2) then + do m = 1, 5 + rsd(m,i,j,nz-2) = rsd(m,i,j,nz-2) + > - dssp * ( u(m,i,j,nz-4) + > - 4.0d+00 * u(m,i,j,nz-3) + > + 6.0d+00 * u(m,i,j,nz-2) + > - 4.0d+00 * u(m,i,j,nz-1) ) + end do + elseif (k .eq. nz-1) then + do m = 1, 5 + rsd(m,i,j,nz-1) = rsd(m,i,j,nz-1) + > - dssp * ( u(m,i,j,nz-3) + > - 4.0d+00 * u(m,i,j,nz-2) + > + 5.0d+00 * u(m,i,j,nz-1) ) + end do + else + do m = 1, 5 + rsd(m,i,j,k) = rsd(m,i,j,k) + > - dssp * ( u(m,i,j,k-2) + > - 4.0d+00 * u(m,i,j,k-1) + > + 6.0d+00 * u(m,i,j,k) + > - 4.0d+00 * u(m,i,j,k+1) + > + u(m,i,j,k+2) ) + end do + endif + + end do + end do + end do +! if (timeron) call timer_stop(t_rhsz) + if (timeron) call timer_stop(t_rhs) + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setbv.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setbv.f new file mode 100644 index 0000000..67e62a5 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setbv.f @@ -0,0 +1,104 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine setbv () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! set the boundary values of dependent variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer i,j,k,m + double precision temp1(5),temp2(5) + +!--------------------------------------------------------------------- +! set the dependent variable values along the top and bottom faces +!--------------------------------------------------------------------- +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r1(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: u +!DVM$ PARALLEL (j,i) ON u(*,i,j,*), PRIVATE (m,i,j,temp2,temp1) + do j = 1,ny + do i = 1,nx + call exact(i,j,1,temp1) + call exact(i,j,nz,temp2) + do m = 1,5 + u(m,i,j,1) = temp1(m) + u(m,i,j,nz) = temp2(m) + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! set the dependent variable values along north and south faces +!--------------------------------------------------------------------- +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: u +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r2(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: u +!DVM$ PARALLEL (k,i) ON u(*,i,*,k), PRIVATE (m,i,temp2,k,temp1) + do k = 1,nz + do i = 1,nx + call exact(i,1,k,temp1) + call exact(i,ny,k,temp2) + do m = 1,5 + u(m,i,1,k) = temp1(m) + u(m,i,ny,k) = temp2(m) + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! set the dependent variable values along east and west faces +!--------------------------------------------------------------------- +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: u +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r3(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: u +!DVM$ PARALLEL (k,j) ON u(*,*,j,k), PRIVATE (m,j,temp2,k,temp1) + do k = 1,nz + do j = 1,ny + call exact(1,j,k,temp1) + call exact(nx,j,k,temp2) + do m = 1,5 + u(m,1,j,k) = temp1(m) + u(m,nx,j,k) = temp2(m) + enddo + enddo + enddo +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: u + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setcoeff.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setcoeff.f new file mode 100644 index 0000000..19c3778 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setcoeff.f @@ -0,0 +1,166 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine setcoeff () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! set up coefficients +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + dxi = 1.0d+00 / (nx0 - 1) + deta = 1.0d+00 / (ny0 - 1) + dzeta = 1.0d+00 / (nz0 - 1) + tx1 = 1.0d+00 / (dxi * dxi) + tx2 = 1.0d+00 / (2.0d+00 * dxi) + tx3 = 1.0d+00 / dxi + ty1 = 1.0d+00 / (deta * deta) + ty2 = 1.0d+00 / (2.0d+00 * deta) + ty3 = 1.0d+00 / deta + tz1 = 1.0d+00 / (dzeta * dzeta) + tz2 = 1.0d+00 / (2.0d+00 * dzeta) + tz3 = 1.0d+00 / dzeta + +!--------------------------------------------------------------------- +! diffusion coefficients +!--------------------------------------------------------------------- + dx1 = 0.75d+00 + dx2 = dx1 + dx3 = dx1 + dx4 = dx1 + dx5 = dx1 + dy1 = 0.75d+00 + dy2 = dy1 + dy3 = dy1 + dy4 = dy1 + dy5 = dy1 + dz1 = 1.00d+00 + dz2 = dz1 + dz3 = dz1 + dz4 = dz1 + dz5 = dz1 + +!--------------------------------------------------------------------- +! fourth difference dissipation +!--------------------------------------------------------------------- + dssp = max (dx1,dy1,dz1) / 4.0d+00 + +!--------------------------------------------------------------------- +! coefficients of the exact solution to the first pde +!--------------------------------------------------------------------- + ce(1,1) = 2.0d+00 + ce(1,2) = 0.0d+00 + ce(1,3) = 0.0d+00 + ce(1,4) = 4.0d+00 + ce(1,5) = 5.0d+00 + ce(1,6) = 3.0d+00 + ce(1,7) = 5.0d-01 + ce(1,8) = 2.0d-02 + ce(1,9) = 1.0d-02 + ce(1,10) = 3.0d-02 + ce(1,11) = 5.0d-01 + ce(1,12) = 4.0d-01 + ce(1,13) = 3.0d-01 + +!--------------------------------------------------------------------- +! coefficients of the exact solution to the second pde +!--------------------------------------------------------------------- + ce(2,1) = 1.0d+00 + ce(2,2) = 0.0d+00 + ce(2,3) = 0.0d+00 + ce(2,4) = 0.0d+00 + ce(2,5) = 1.0d+00 + ce(2,6) = 2.0d+00 + ce(2,7) = 3.0d+00 + ce(2,8) = 1.0d-02 + ce(2,9) = 3.0d-02 + ce(2,10) = 2.0d-02 + ce(2,11) = 4.0d-01 + ce(2,12) = 3.0d-01 + ce(2,13) = 5.0d-01 + +!--------------------------------------------------------------------- +! coefficients of the exact solution to the third pde +!--------------------------------------------------------------------- + ce(3,1) = 2.0d+00 + ce(3,2) = 2.0d+00 + ce(3,3) = 0.0d+00 + ce(3,4) = 0.0d+00 + ce(3,5) = 0.0d+00 + ce(3,6) = 2.0d+00 + ce(3,7) = 3.0d+00 + ce(3,8) = 4.0d-02 + ce(3,9) = 3.0d-02 + ce(3,10) = 5.0d-02 + ce(3,11) = 3.0d-01 + ce(3,12) = 5.0d-01 + ce(3,13) = 4.0d-01 + +!--------------------------------------------------------------------- +! coefficients of the exact solution to the fourth pde +!--------------------------------------------------------------------- + ce(4,1) = 2.0d+00 + ce(4,2) = 2.0d+00 + ce(4,3) = 0.0d+00 + ce(4,4) = 0.0d+00 + ce(4,5) = 0.0d+00 + ce(4,6) = 2.0d+00 + ce(4,7) = 3.0d+00 + ce(4,8) = 3.0d-02 + ce(4,9) = 5.0d-02 + ce(4,10) = 4.0d-02 + ce(4,11) = 2.0d-01 + ce(4,12) = 1.0d-01 + ce(4,13) = 3.0d-01 + +!--------------------------------------------------------------------- +! coefficients of the exact solution to the fifth pde +!--------------------------------------------------------------------- + ce(5,1) = 5.0d+00 + ce(5,2) = 4.0d+00 + ce(5,3) = 3.0d+00 + ce(5,4) = 2.0d+00 + ce(5,5) = 1.0d-01 + ce(5,6) = 4.0d-01 + ce(5,7) = 3.0d-01 + ce(5,8) = 5.0d-02 + ce(5,9) = 4.0d-02 + ce(5,10) = 3.0d-02 + ce(5,11) = 1.0d-01 + ce(5,12) = 3.0d-01 + ce(5,13) = 2.0d-01 + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setiv.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setiv.f new file mode 100644 index 0000000..047066d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/setiv.f @@ -0,0 +1,82 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine setiv () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! +! set the initial values of independent variables based on tri-linear +! interpolation of boundary values in the computational space. +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! local variables +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + integer i,j,k,m + double precision xi,eta,zeta + double precision pxi,peta,pzeta + double precision ue_1jk(5),ue_nx0jk(5),ue_i1k(5),ue_iny0k(5),ue_i + &j1(5),ue_ijnz(5) +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0_r0(iEX0,iEX1,iEX2,iE +!DVM$&X3) :: u +!DVM$ PARALLEL (k) ON u(*,*,*,k), PRIVATE (xi,m,peta,pxi,pzeta,i,j,eta,u +!DVM$&e_ij1,zeta,ue_i1k,ue_iny0k,k,ue_1jk,ue_nx0jk,ue_ijnz) + do k = 2,nz - 1 + zeta = dble (k - 1) / (nz - 1) + do j = 2,ny - 1 + eta = dble (j - 1) / (ny0 - 1) + do i = 2,nx - 1 + xi = dble (i - 1) / (nx0 - 1) + call exact(1,j,k,ue_1jk) + call exact(nx0,j,k,ue_nx0jk) + call exact(i,1,k,ue_i1k) + call exact(i,ny0,k,ue_iny0k) + call exact(i,j,1,ue_ij1) + call exact(i,j,nz,ue_ijnz) + do m = 1,5 + pxi = (1.0d+00 - xi) * ue_1jk(m) + xi * ue_nx0jk(m) + peta = (1.0d+00 - eta) * ue_i1k(m) + eta * ue_iny0k(m) + pzeta = (1.0d+00 - zeta) * ue_ij1(m) + zeta * ue_ijnz( + &m) + u(m,i,j,k) = pxi + peta + pzeta - pxi * peta - peta * + &pzeta - pzeta * pxi + pxi * peta * pzeta + enddo + enddo + enddo + enddo +!DVM$ REALIGN (iEX0,iEX1,iEX2,iEX3) WITH dvmh_temp0(iEX0,iEX1,iEX2,iEX3) +!DVM$& :: u + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/ssor.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/ssor.f new file mode 100644 index 0000000..c2aea5f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/ssor.f @@ -0,0 +1,765 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine ssor (niter) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! to perform pseudo-time stepping SSOR iterations +! for five nonlinear pde's. +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + integer :: niter + +!--------------------------------------------------------------------- +! end of include file + INCLUDE 'applu.incl' +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + integer :: i,j,k,m,n + integer :: istep + double precision :: tmp,tv(5),d_(5,5),a_(5,5),b_(5,5),c_(5,5) + double precision :: delunm(5),rs(5) + external timer_read + double precision :: timer_read + integer :: mod_522_2 + integer :: mod_522_1 + integer :: mod_522_0 + double precision :: tmp3 + double precision :: tmp2 + double precision :: tmp1 + double precision :: c34 + double precision :: c1345 + double precision :: r43 + integer :: j__3 + integer :: i__4 + integer :: d_15_14 + integer :: d_15_13 + integer :: ldx_14_12 + integer :: ldx_14_11 + integer :: ldy_13_10 + integer :: ldy_13_9 + integer :: ldz_12_8 + integer :: ldz_12_7 + integer :: v_11_6 + integer :: v_11_5 + double precision :: tv__15(5) + double precision :: tmat(5,5) + double precision :: tmp1__16 + double precision :: tmp__17 + integer :: m__18 + integer :: j__19 + integer :: i__20 + double precision :: tmp3__21 + double precision :: tmp2__22 + double precision :: tmp1__23 + double precision :: c34__24 + double precision :: c1345__25 + double precision :: r43__26 + integer :: j__27 + integer :: i__28 + integer :: udz_43_38 + integer :: udz_43_37 + integer :: udy_42_36 + integer :: udy_42_35 + integer :: udx_41_34 + integer :: udx_41_33 + integer :: d_40_32 + integer :: d_40_31 + integer :: v_38_30 + integer :: v_38_29 + double precision :: tmat__39(5,5) + double precision :: tmp1__40 + double precision :: tmp__41 + integer :: m__42 + integer :: j__43 + integer :: i__44 + +!--------------------------------------------------------------------- +! begin pseudo-time stepping iterations +!--------------------------------------------------------------------- + tmp = 1.0d+00 / (omega * (2.0d+00 - omega)) + do i = 1,11 + call timer_clear(i) + enddo + +!--------------------------------------------------------------------- +! compute the steady-state residuals +!--------------------------------------------------------------------- + call rhs() + +!--------------------------------------------------------------------- +! compute the L2 norms of newton iteration residuals +!--------------------------------------------------------------------- + call l2norm(isiz1,isiz2,isiz3,nx0,ny0,nz0,ist,iend,jst,jend,rsd,rs + &dnm) + +! if ( ipr .eq. 1 ) then +! write (*,*) ' Initial residual norms' +! write (*,*) +! write (*,1007) ( rsdnm(m), m = 1, 5 ) +! write (*,'(/a)') 'Iteration RMS-residual of 5th PDE' +! end if + do i = 1,11 + call timer_clear(i) + enddo + call timer_start(1) + +!--------------------------------------------------------------------- +! the timestep loop +!--------------------------------------------------------------------- + do istep = 1,niter + mod_522_0 = mod (istep,20) + +! if ( ( mod ( istep, inorm ) .eq. 0 ) .and. +! > ipr .eq. 1 ) then +! write ( *, 1001 ) istep +! end if + if (mod_522_0 .eq. 0 .or. istep .eq. itmax .or. istep .eq. 1) t + &hen + if (niter .gt. 1) write (unit = *,fmt = 200) istep +200 FORMAT(' Time step ', I4) + endif + +!--------------------------------------------------------------------- +! perform SSOR iteration +!--------------------------------------------------------------------- + if (timeron) then + call timer_start(5) + endif +!DVM$ INTERVAL 22 + if (timeron) then + call timer_stop(5) + endif + r43 = 4.0d+00 / 3.0d+00 + c1345 = c1 * c3 * c4 * c5 + c34 = c3 * c4 + r43__26 = 4.0d+00 / 3.0d+00 + c1345__25 = c1 * c3 * c4 * c5 + c34__24 = c3 * c4 +!DVM$ REGION +!DVM$ PARALLEL (k,j,i) ON rsd(*,i,j,k), PRIVATE (tmp3,tmp1,tmp2,tmat, +!DVM$&k,tv,rs,rmk,rmj,rmi,ro),ACROSS (rsd(0:0,1:0,1:0,1:0)),CUDA_BLOCK ( +!DVM$&16,16) + do k = 2,nz - 1 + do j = jst,jend + do i = ist,iend + rmk = 1.0d+00 / u(1,i,j,k - 1) + rmj = 1.0d+00 / u(1,i,j - 1,k) + rmi = 1.0d+00 / u(1,i - 1,j,k) + ro = 1.0d+00 / u(1,i,j,k) + rs(1) = dt * rsd(1,i,j,k) + rs(2) = dt * rsd(2,i,j,k) + rs(3) = dt * rsd(3,i,j,k) + rs(4) = dt * rsd(4,i,j,k) + rs(5) = dt * rsd(5,i,j,k) + rs(1) = rs(1) - omega * ((-(dt)) * tz1 * dz1 * rsd(1,i + &,j,k - 1) + (-(dt)) * tz2 * rsd(4,i,j,k - 1)) + tv(1) = rs(1) - omega * ((-(dt)) * ty1 * dy1 * rsd(1,i + &,j - 1,k) + (-(dt)) * tx1 * dx1 * rsd(1,i - 1,j,k) + (-(dt)) * tx2 + & * rsd(2,i - 1,j,k) + (-(dt)) * ty2 * rsd(3,i,j - 1,k) + 0.0d+00 * + & rsd(3,i - 1,j,k) + 0.0d+00 * rsd(4,i - 1,j,k) + 0.0d+00 * rsd(5,i + & - 1,j,k)) + tmat(1,1) = 1.0d+00 + dt * 2.0d+00 * (tx1 * dx1 + ty1 + &* dy1 + tz1 * dz1) + tmat(1,2) = 0 + tmat(1,3) = 0 + tmat(1,4) = 0 + tmat(1,5) = 0 + rs(2) = rs(2) - omega * (((-(dt)) * tz2 * ((-(u(2,i,j, + &k - 1) * u(4,i,j,k - 1))) * rmk * rmk) - dt * tz1 * ((-(c34)) * rm + &k * rmk * u(2,i,j,k - 1))) * rsd(1,i,j,k - 1) + ((-(dt)) * tz2 * ( + &u(4,i,j,k - 1) * rmk) - dt * tz1 * c34 * rmk - dt * tz1 * dz2) * r + &sd(2,i,j,k - 1) + (-(dt)) * tz2 * (u(2,i,j,k - 1) * rmk) * rsd(4,i + &,j,k - 1)) + tv(2) = rs(2) - omega * (((-(dt)) * ty2 * ((-(u(2,i,j + &- 1,k) * u(3,i,j - 1,k))) * rmj * rmj) - dt * ty1 * ((-(c34)) * rm + &j * rmj * u(2,i,j - 1,k))) * rsd(1,i,j - 1,k) + ((-(dt)) * tx2 * ( + &(-((u(2,i - 1,j,k) * rmi)** 2)) + c2 * qs(i - 1,j,k) * rmi) - dt * + & tx1 * ((-(r43)) * c34 * rmi * rmi * u(2,i - 1,j,k))) * rsd(1,i - + &1,j,k) + ((-(dt)) * ty2 * (u(3,i,j - 1,k) * rmj) - dt * ty1 * (c34 + & * rmj) - dt * ty1 * dy2) * rsd(2,i,j - 1,k) + ((-(dt)) * tx2 * (( + &2.0d+00 - c2) * (u(2,i - 1,j,k) * rmi)) - dt * tx1 * (r43 * c34 * + &rmi) - dt * tx1 * dx2) * rsd(2,i - 1,j,k) + (-(dt)) * ty2 * (u(2,i + &,j - 1,k) * rmj) * rsd(3,i,j - 1,k) + (-(dt)) * tx2 * ((-(c2)) * ( + &u(3,i - 1,j,k) * rmi)) * rsd(3,i - 1,j,k) + 0.0d+00 * rsd(4,i,j - + &1,k) + (-(dt)) * tx2 * ((-(c2)) * (u(4,i - 1,j,k) * rmi)) * rsd(4, + &i - 1,j,k) + 0.0d+00 * rsd(5,i,j - 1,k) + (-(dt)) * tx2 * c2 * rsd + &(5,i - 1,j,k)) + tmat(2,1) = (-(dt)) * 2.0d+00 * (tx1 * r43 + ty1 + tz1 + &) * c34 * ro * ro * u(2,i,j,k) + tmat(2,2) = 1.0d+00 + dt * 2.0d+00 * c34 * ro * (tx1 * + & r43 + ty1 + tz1) + dt * 2.0d+00 * (tx1 * dx2 + ty1 * dy2 + tz1 * + &dz2) + tmat(2,3) = 0 + tmat(2,4) = 0 + tmat(2,5) = 0 + rs(3) = rs(3) - omega * (((-(dt)) * tz2 * ((-(u(3,i,j, + &k - 1) * u(4,i,j,k - 1))) * rmk * rmk) - dt * tz1 * ((-(c34)) * rm + &k * rmk * u(3,i,j,k - 1))) * rsd(1,i,j,k - 1) + ((-(dt)) * tz2 * ( + &u(4,i,j,k - 1) * rmk) - dt * tz1 * (c34 * rmk) - dt * tz1 * dz3) * + & rsd(3,i,j,k - 1) + (-(dt)) * tz2 * (u(3,i,j,k - 1) * rmk) * rsd(4 + &,i,j,k - 1)) + tv(3) = rs(3) - omega * (((-(dt)) * ty2 * ((-((u(3,i,j + & - 1,k) * rmj)** 2)) + c2 * (qs(i,j - 1,k) * rmj)) - dt * ty1 * (( + &-(r43)) * c34 * rmj * rmj * u(3,i,j - 1,k))) * rsd(1,i,j - 1,k) + + &((-(dt)) * tx2 * ((-(u(2,i - 1,j,k) * u(3,i - 1,j,k))) * rmi * rmi + &) - dt * tx1 * ((-(c34)) * rmi * rmi * u(3,i - 1,j,k))) * rsd(1,i + &- 1,j,k) + (-(dt)) * ty2 * ((-(c2)) * (u(2,i,j - 1,k) * rmj)) * rs + &d(2,i,j - 1,k) + (-(dt)) * tx2 * (u(3,i - 1,j,k) * rmi) * rsd(2,i + &- 1,j,k) + ((-(dt)) * ty2 * ((2.0d+00 - c2) * (u(3,i,j - 1,k) * rm + &j)) - dt * ty1 * (r43 * c34 * rmj) - dt * ty1 * dy3) * rsd(3,i,j - + & 1,k) + ((-(dt)) * tx2 * (u(2,i - 1,j,k) * rmi) - dt * tx1 * (c34 + &* rmi) - dt * tx1 * dx3) * rsd(3,i - 1,j,k) + (-(dt)) * ty2 * ((-( + &c2)) * (u(4,i,j - 1,k) * rmj)) * rsd(4,i,j - 1,k) + 0.0d+00 * rsd( + &4,i - 1,j,k) + (-(dt)) * ty2 * c2 * rsd(5,i,j - 1,k) + 0.0d+00 * r + &sd(5,i - 1,j,k)) + tmat(3,1) = (-(dt)) * 2.0d+00 * (tx1 + ty1 * r43 + tz1 + &) * c34 * ro * ro * u(3,i,j,k) + tmat(3,2) = 0 + tmat(3,3) = 1.0d+00 + dt * 2.0d+00 * c34 * ro * (tx1 + + & ty1 * r43 + tz1) + dt * 2.0d+00 * (tx1 * dx3 + ty1 * dy3 + tz1 * + &dz3) + tmat(3,4) = 0 + tmat(3,5) = 0 + rs(4) = rs(4) - omega * (((-(dt)) * tz2 * ((-((u(4,i,j + &,k - 1) * rmk)** 2)) + c2 * qs(i,j,k - 1) * rmk) - dt * tz1 * ((-( + &r43)) * c34 * rmk * rmk * u(4,i,j,k - 1))) * rsd(1,i,j,k - 1) + (- + &(dt)) * tz2 * ((-(c2)) * (u(2,i,j,k - 1) * rmk)) * rsd(2,i,j,k - 1 + &) + (-(dt)) * tz2 * ((-(c2)) * (u(3,i,j,k - 1) * rmk)) * rsd(3,i,j + &,k - 1) + ((-(dt)) * tz2 * (2.0d+00 - c2) * (u(4,i,j,k - 1) * rmk) + & - dt * tz1 * (r43 * c34 * rmk) - dt * tz1 * dz4) * rsd(4,i,j,k - + &1) + (-(dt)) * tz2 * c2 * rsd(5,i,j,k - 1)) + tv(4) = rs(4) - omega * (((-(dt)) * ty2 * ((-(u(3,i,j + &- 1,k) * u(4,i,j - 1,k))) * rmj * rmj) - dt * ty1 * ((-(c34)) * rm + &j * rmj * u(4,i,j - 1,k))) * rsd(1,i,j - 1,k) + ((-(dt)) * tx2 * ( + &(-(u(2,i - 1,j,k) * u(4,i - 1,j,k))) * rmi * rmi) - dt * tx1 * ((- + &(c34)) * rmi * rmi * u(4,i - 1,j,k))) * rsd(1,i - 1,j,k) + 0.0d+00 + & * rsd(2,i,j - 1,k) + (-(dt)) * tx2 * (u(4,i - 1,j,k) * rmi) * rsd + &(2,i - 1,j,k) + (-(dt)) * ty2 * (u(4,i,j - 1,k) * rmj) * rsd(3,i,j + & - 1,k) + 0.0d+00 * rsd(3,i - 1,j,k) + ((-(dt)) * ty2 * (u(3,i,j - + & 1,k) * rmj) - dt * ty1 * (c34 * rmj) - dt * ty1 * dy4) * rsd(4,i, + &j - 1,k) + ((-(dt)) * tx2 * (u(2,i - 1,j,k) * rmi) - dt * tx1 * (c + &34 * rmi) - dt * tx1 * dx4) * rsd(4,i - 1,j,k) + 0.0d+00 * rsd(5,i + &,j - 1,k) + 0.0d+00 * rsd(5,i - 1,j,k)) + tmat(4,1) = (-(dt)) * 2.0d+00 * (tx1 + ty1 + tz1 * r43 + &) * c34 * ro * ro * u(4,i,j,k) + tmat(4,2) = 0 + tmat(4,3) = 0 + tmat(4,4) = 1.0d+00 + dt * 2.0d+00 * c34 * ro * (tx1 + + & ty1 + tz1 * r43) + dt * 2.0d+00 * (tx1 * dx4 + ty1 * dy4 + tz1 * + &dz4) + tmat(4,5) = 0 + rs(5) = rs(5) - omega * (((-(dt)) * tz2 * ((c2 * 2.0d0 + & * qs(i,j,k - 1) - c1 * u(5,i,j,k - 1)) * u(4,i,j,k - 1) * rmk * r + &mk) - dt * tz1 * ((-(c34 - c1345)) * rmk * rmk * rmk * u(2,i,j,k - + & 1)** 2 - (c34 - c1345) * rmk * rmk * rmk * u(3,i,j,k - 1)** 2 - ( + &r43 * c34 - c1345) * rmk * rmk * rmk * u(4,i,j,k - 1)** 2 - c1345 + &* rmk * rmk * u(5,i,j,k - 1))) * rsd(1,i,j,k - 1) + ((-(dt)) * tz2 + & * ((-(c2)) * (u(2,i,j,k - 1) * u(4,i,j,k - 1)) * rmk * rmk) - dt + &* tz1 * (c34 - c1345) * rmk * rmk * u(2,i,j,k - 1)) * rsd(2,i,j,k + &- 1) + ((-(dt)) * tz2 * ((-(c2)) * (u(3,i,j,k - 1) * u(4,i,j,k - 1 + &)) * rmk * rmk) - dt * tz1 * (c34 - c1345) * rmk * rmk * u(3,i,j,k + & - 1)) * rsd(3,i,j,k - 1) + ((-(dt)) * tz2 * (c1 * (u(5,i,j,k - 1) + & * rmk) - c2 * (qs(i,j,k - 1) * rmk + u(4,i,j,k - 1) * u(4,i,j,k - + & 1) * rmk * rmk)) - dt * tz1 * (r43 * c34 - c1345) * rmk * rmk * u + &(4,i,j,k - 1)) * rsd(4,i,j,k - 1) + ((-(dt)) * tz2 * (c1 * (u(4,i, + &j,k - 1) * rmk)) - dt * tz1 * c1345 * rmk - dt * tz1 * dz5) * rsd( + &5,i,j,k - 1)) + tv(5) = rs(5) - omega * (((-(dt)) * ty2 * ((c2 * 2.0d0 + & * qs(i,j - 1,k) - c1 * u(5,i,j - 1,k)) * (u(3,i,j - 1,k) * rmj * + &rmj)) - dt * ty1 * ((-(c34 - c1345)) * rmj * rmj * rmj * u(2,i,j - + & 1,k)** 2 - (r43 * c34 - c1345) * rmj * rmj * rmj * u(3,i,j - 1,k) + &** 2 - (c34 - c1345) * rmj * rmj * rmj * u(4,i,j - 1,k)** 2 - c134 + &5 * rmj * rmj * u(5,i,j - 1,k))) * rsd(1,i,j - 1,k) + ((-(dt)) * t + &x2 * ((c2 * 2.0d0 * qs(i - 1,j,k) - c1 * u(5,i - 1,j,k)) * u(2,i - + & 1,j,k) * rmi * rmi) - dt * tx1 * ((-(r43 * c34 - c1345)) * rmi * + &rmi * rmi * u(2,i - 1,j,k)** 2 - (c34 - c1345) * rmi * rmi * rmi * + & u(3,i - 1,j,k)** 2 - (c34 - c1345) * rmi * rmi * rmi * u(4,i - 1, + &j,k)** 2 - c1345 * rmi * rmi * u(5,i - 1,j,k))) * rsd(1,i - 1,j,k) + & + ((-(dt)) * ty2 * ((-(c2)) * (u(2,i,j - 1,k) * u(3,i,j - 1,k)) * + & rmj * rmj) - dt * ty1 * (c34 - c1345) * rmj * rmj * u(2,i,j - 1,k + &)) * rsd(2,i,j - 1,k) + ((-(dt)) * tx2 * (c1 * (u(5,i - 1,j,k) * r + &mi) - c2 * (u(2,i - 1,j,k) * u(2,i - 1,j,k) * rmi * rmi + qs(i - 1 + &,j,k) * rmi)) - dt * tx1 * (r43 * c34 - c1345) * rmi * rmi * u(2,i + & - 1,j,k)) * rsd(2,i - 1,j,k) + ((-(dt)) * ty2 * (c1 * (u(5,i,j - + &1,k) * rmj) - c2 * (qs(i,j - 1,k) * rmj + u(3,i,j - 1,k) * u(3,i,j + & - 1,k) * rmj * rmj)) - dt * ty1 * (r43 * c34 - c1345) * rmj * rmj + & * u(3,i,j - 1,k)) * rsd(3,i,j - 1,k) + ((-(dt)) * tx2 * ((-(c2)) + &* (u(3,i - 1,j,k) * u(2,i - 1,j,k)) * rmi * rmi) - dt * tx1 * (c34 + & - c1345) * rmi * rmi * u(3,i - 1,j,k)) * rsd(3,i - 1,j,k) + ((-(d + &t)) * ty2 * ((-(c2)) * (u(3,i,j - 1,k) * u(4,i,j - 1,k)) * rmj * r + &mj) - dt * ty1 * (c34 - c1345) * rmj * rmj * u(4,i,j - 1,k)) * rsd + &(4,i,j - 1,k) + ((-(dt)) * tx2 * ((-(c2)) * (u(4,i - 1,j,k) * u(2, + &i - 1,j,k)) * rmi * rmi) - dt * tx1 * (c34 - c1345) * rmi * rmi * + &u(4,i - 1,j,k)) * rsd(4,i - 1,j,k) + ((-(dt)) * ty2 * (c1 * (u(3,i + &,j - 1,k) * rmj)) - dt * ty1 * c1345 * rmj - dt * ty1 * dy5) * rsd + &(5,i,j - 1,k) + ((-(dt)) * tx2 * (c1 * (u(2,i - 1,j,k) * rmi)) - d + &t * tx1 * c1345 * rmi - dt * tx1 * dx5) * rsd(5,i - 1,j,k)) + tmat(5,1) = (-(dt)) * 2.0d+00 * (((tx1 * (r43 * c34 - + &c1345) + ty1 * (c34 - c1345) + tz1 * (c34 - c1345)) * u(2,i,j,k)** + & 2 + (tx1 * (c34 - c1345) + ty1 * (r43 * c34 - c1345) + tz1 * (c34 + & - c1345)) * u(3,i,j,k)** 2 + (tx1 * (c34 - c1345) + ty1 * (c34 - + &c1345) + tz1 * (r43 * c34 - c1345)) * u(4,i,j,k)** 2) * ro * ro * + &ro + (tx1 + ty1 + tz1) * c1345 * ro * ro * u(5,i,j,k)) + tmat(5,2) = dt * 2.0d+00 * ro * ro * u(2,i,j,k) * (tx1 + & * (r43 * c34 - c1345) + ty1 * (c34 - c1345) + tz1 * (c34 - c1345) + &) + tmat(5,3) = dt * 2.0d+00 * ro * ro * u(3,i,j,k) * (tx1 + & * (c34 - c1345) + ty1 * (r43 * c34 - c1345) + tz1 * (c34 - c1345) + &) + tmat(5,4) = dt * 2.0d+00 * ro * ro * u(4,i,j,k) * (tx1 + & * (c34 - c1345) + ty1 * (c34 - c1345) + tz1 * (r43 * c34 - c1345) + &) + tmat(5,5) = 1.0d+00 + dt * 2.0d+00 * (tx1 + ty1 + tz1) + & * c1345 * ro + dt * 2.0d+00 * (tx1 * dx5 + ty1 * dy5 + tz1 * dz5) + tmp1 = 1.0d+00 / tmat(1,1) + tmp2 = tmp1 * tmat(2,1) + tmat(2,2) = tmat(2,2) - tmp2 * tmat(1,2) + tmat(2,3) = tmat(2,3) - tmp2 * tmat(1,3) + tmat(2,4) = tmat(2,4) - tmp2 * tmat(1,4) + tmat(2,5) = tmat(2,5) - tmp2 * tmat(1,5) + tv(2) = tv(2) - tv(1) * tmp2 + tmp2 = tmp1 * tmat(3,1) + tmat(3,2) = tmat(3,2) - tmp2 * tmat(1,2) + tmat(3,3) = tmat(3,3) - tmp2 * tmat(1,3) + tmat(3,4) = tmat(3,4) - tmp2 * tmat(1,4) + tmat(3,5) = tmat(3,5) - tmp2 * tmat(1,5) + tv(3) = tv(3) - tv(1) * tmp2 + tmp2 = tmp1 * tmat(4,1) + tmat(4,2) = tmat(4,2) - tmp2 * tmat(1,2) + tmat(4,3) = tmat(4,3) - tmp2 * tmat(1,3) + tmat(4,4) = tmat(4,4) - tmp2 * tmat(1,4) + tmat(4,5) = tmat(4,5) - tmp2 * tmat(1,5) + tv(4) = tv(4) - tv(1) * tmp2 + tmp2 = tmp1 * tmat(5,1) + tmat(5,2) = tmat(5,2) - tmp2 * tmat(1,2) + tmat(5,3) = tmat(5,3) - tmp2 * tmat(1,3) + tmat(5,4) = tmat(5,4) - tmp2 * tmat(1,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(1,5) + tv(5) = tv(5) - tv(1) * tmp2 + tmp1 = 1.0d+00 / tmat(2,2) + tmp2 = tmp1 * tmat(3,2) + tmat(3,3) = tmat(3,3) - tmp2 * tmat(2,3) + tmat(3,4) = tmat(3,4) - tmp2 * tmat(2,4) + tmat(3,5) = tmat(3,5) - tmp2 * tmat(2,5) + tv(3) = tv(3) - tv(2) * tmp2 + tmp2 = tmp1 * tmat(4,2) + tmat(4,3) = tmat(4,3) - tmp2 * tmat(2,3) + tmat(4,4) = tmat(4,4) - tmp2 * tmat(2,4) + tmat(4,5) = tmat(4,5) - tmp2 * tmat(2,5) + tv(4) = tv(4) - tv(2) * tmp2 + tmp2 = tmp1 * tmat(5,2) + tmat(5,3) = tmat(5,3) - tmp2 * tmat(2,3) + tmat(5,4) = tmat(5,4) - tmp2 * tmat(2,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(2,5) + tv(5) = tv(5) - tv(2) * tmp2 + tmp1 = 1.0d+00 / tmat(3,3) + tmp2 = tmp1 * tmat(4,3) + tmat(4,4) = tmat(4,4) - tmp2 * tmat(3,4) + tmat(4,5) = tmat(4,5) - tmp2 * tmat(3,5) + tv(4) = tv(4) - tv(3) * tmp2 + tmp2 = tmp1 * tmat(5,3) + tmat(5,4) = tmat(5,4) - tmp2 * tmat(3,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(3,5) + tv(5) = tv(5) - tv(3) * tmp2 + tmp1 = 1.0d+00 / tmat(4,4) + tmp2 = tmp1 * tmat(5,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(4,5) + tv(5) = tv(5) - tv(4) * tmp2 + rs(5) = tv(5) / tmat(5,5) + tv(4) = tv(4) - tmat(4,5) * rs(5) + rs(4) = tv(4) / tmat(4,4) + tv(3) = tv(3) - tmat(3,4) * rs(4) - tmat(3,5) * rs(5) + rs(3) = tv(3) / tmat(3,3) + tv(2) = tv(2) - tmat(2,3) * rs(3) - tmat(2,4) * rs(4) + &- tmat(2,5) * rs(5) + rs(2) = tv(2) / tmat(2,2) + tv(1) = tv(1) - tmat(1,2) * rs(2) - tmat(1,3) * rs(3) + &- tmat(1,4) * rs(4) - tmat(1,5) * rs(5) + rs(1) = tv(1) / tmat(1,1) + rsd(1,i,j,k) = rs(1) + rsd(2,i,j,k) = rs(2) + rsd(3,i,j,k) = rs(3) + rsd(4,i,j,k) = rs(4) + rsd(5,i,j,k) = rs(5) + enddo + enddo + enddo +!DVM$ PARALLEL (k,j,i) ON rsd(*,i,j,k), PRIVATE (tv,tmat,tmp2,tmp1,rm +!DVM$&k,rmj,rmi,ro),ACROSS (rsd(0:0,0:1,0:1,0:1)),CUDA_BLOCK (16,16) + do k = nz - 1,2,(-(1)) + do j = jend,jst,(-(1)) + do i = iend,ist,(-(1)) + rmk = 1.0d+00 / u(1,i,j,k + 1) + rmj = 1.0d+00 / u(1,i,j + 1,k) + rmi = 1.0d+00 / u(1,i + 1,j,k) + ro = 1.0d+00 / u(1,i,j,k) + tv(1) = omega * ((-(dt)) * tz1 * dz1 * rsd(1,i,j,k + 1 + &) + 0.0d+00 * rsd(2,i,j,k + 1) + 0.0d+00 * rsd(3,i,j,k + 1) + dt * + & tz2 * rsd(4,i,j,k + 1) + 0.0d+00 * rsd(5,i,j,k + 1)) + tv(1) = tv(1) + omega * ((-(dt)) * ty1 * dy1 * rsd(1,i + &,j + 1,k) + (-(dt)) * tx1 * dx1 * rsd(1,i + 1,j,k) + 0.0d+00 * rsd + &(2,i,j + 1,k) + dt * tx2 * rsd(2,i + 1,j,k) + dt * ty2 * rsd(3,i,j + & + 1,k) + 0.0d+00 * rsd(3,i + 1,j,k) + 0.0d+00 * rsd(4,i,j + 1,k) + &+ 0.0d+00 * rsd(4,i + 1,j,k) + 0.0d+00 * rsd(5,i,j + 1,k) + 0.0d+0 + &0 * rsd(5,i + 1,j,k)) + tmat(1,1) = 1.0d+00 + dt * 2.0d+00 * (tx1 * dx1 + ty1 + &* dy1 + tz1 * dz1) + tmat(1,2) = 0.0d+00 + tmat(1,3) = 0.0d+00 + tmat(1,4) = 0.0d+00 + tmat(1,5) = 0.0d+00 + tv(2) = omega * ((dt * tz2 * ((-(u(2,i,j,k + 1) * u(4, + &i,j,k + 1))) * rmk * rmk) - dt * tz1 * ((-(c34__24)) * rmk * rmk * + & u(2,i,j,k + 1))) * rsd(1,i,j,k + 1) + (dt * tz2 * (u(4,i,j,k + 1) + & * rmk) - dt * tz1 * c34__24 * rmk - dt * tz1 * dz2) * rsd(2,i,j,k + & + 1) + 0.0d+00 * rsd(3,i,j,k + 1) + dt * tz2 * (u(2,i,j,k + 1) * + &rmk) * rsd(4,i,j,k + 1) + 0.0d+00 * rsd(5,i,j,k + 1)) + tv(2) = tv(2) + omega * ((dt * ty2 * ((-(u(2,i,j + 1,k + &) * u(3,i,j + 1,k))) * rmj * rmj) - dt * ty1 * ((-(c34__24)) * rmj + & * rmj * u(2,i,j + 1,k))) * rsd(1,i,j + 1,k) + (dt * tx2 * ((-((u( + &2,i + 1,j,k) * rmi)** 2)) + c2 * qs(i + 1,j,k) * rmi) - dt * tx1 * + & ((-(r43__26)) * c34__24 * rmi * rmi * u(2,i + 1,j,k))) * rsd(1,i + &+ 1,j,k) + (dt * ty2 * (u(3,i,j + 1,k) * rmj) - dt * ty1 * (c34__2 + &4 * rmj) - dt * ty1 * dy2) * rsd(2,i,j + 1,k) + (dt * tx2 * ((2.0d + &+00 - c2) * (u(2,i + 1,j,k) * rmi)) - dt * tx1 * (r43__26 * c34__2 + &4 * rmi) - dt * tx1 * dx2) * rsd(2,i + 1,j,k) + dt * ty2 * (u(2,i, + &j + 1,k) * rmj) * rsd(3,i,j + 1,k) + dt * tx2 * ((-(c2)) * (u(3,i + &+ 1,j,k) * rmi)) * rsd(3,i + 1,j,k) + 0.0d+00 * rsd(4,i,j + 1,k) + + & dt * tx2 * ((-(c2)) * (u(4,i + 1,j,k) * rmi)) * rsd(4,i + 1,j,k) + &+ 0.0d+00 * rsd(5,i,j + 1,k) + dt * tx2 * c2 * rsd(5,i + 1,j,k)) + tmat(2,1) = dt * 2.0d+00 * ((-(tx1)) * r43__26 - ty1 - + & tz1) * (c34__24 * ro * ro * u(2,i,j,k)) + tmat(2,2) = 1.0d+00 + dt * 2.0d+00 * c34__24 * ro * (t + &x1 * r43__26 + ty1 + tz1) + dt * 2.0d+00 * (tx1 * dx2 + ty1 * dy2 + &+ tz1 * dz2) + tmat(2,3) = 0.0d+00 + tmat(2,4) = 0.0d+00 + tmat(2,5) = 0.0d+00 + tv(3) = omega * ((dt * tz2 * ((-(u(3,i,j,k + 1) * u(4, + &i,j,k + 1))) * rmk * rmk) - dt * tz1 * ((-(c34__24)) * rmk * rmk * + & u(3,i,j,k + 1))) * rsd(1,i,j,k + 1) + 0.0d+00 * rsd(2,i,j,k + 1) + &+ (dt * tz2 * (u(4,i,j,k + 1) * rmk) - dt * tz1 * (c34__24 * rmk) + &- dt * tz1 * dz3) * rsd(3,i,j,k + 1) + dt * tz2 * (u(3,i,j,k + 1) + &* rmk) * rsd(4,i,j,k + 1) + 0.0d+00 * rsd(5,i,j,k + 1)) + tv(3) = tv(3) + omega * ((dt * ty2 * ((-((u(3,i,j + 1, + &k) * rmj)** 2)) + c2 * (qs(i,j + 1,k) * rmj)) - dt * ty1 * ((-(r43 + &__26)) * c34__24 * rmj * rmj * u(3,i,j + 1,k))) * rsd(1,i,j + 1,k) + & + (dt * tx2 * ((-(u(2,i + 1,j,k) * u(3,i + 1,j,k))) * rmi * rmi) + &- dt * tx1 * ((-(c34__24)) * rmi * rmi * u(3,i + 1,j,k))) * rsd(1, + &i + 1,j,k) + dt * ty2 * ((-(c2)) * (u(2,i,j + 1,k) * rmj)) * rsd(2 + &,i,j + 1,k) + dt * tx2 * (u(3,i + 1,j,k) * rmi) * rsd(2,i + 1,j,k) + & + (dt * ty2 * ((2.0d+00 - c2) * (u(3,i,j + 1,k) * rmj)) - dt * ty + &1 * (r43__26 * c34__24 * rmj) - dt * ty1 * dy3) * rsd(3,i,j + 1,k) + & + (dt * tx2 * (u(2,i + 1,j,k) * rmi) - dt * tx1 * (c34__24 * rmi) + & - dt * tx1 * dx3) * rsd(3,i + 1,j,k) + dt * ty2 * ((-(c2)) * (u(4 + &,i,j + 1,k) * rmj)) * rsd(4,i,j + 1,k) + 0.0d+00 * rsd(4,i + 1,j,k + &) + dt * ty2 * c2 * rsd(5,i,j + 1,k) + 0.0d+00 * rsd(5,i + 1,j,k)) + tmat(3,1) = dt * 2.0d+00 * ((-(tx1)) - ty1 * r43__26 - + & tz1) * (c34__24 * ro * ro * u(3,i,j,k)) + tmat(3,2) = 0.0d+00 + tmat(3,3) = 1.0d+00 + dt * 2.0d+00 * c34__24 * ro * (t + &x1 + ty1 * r43__26 + tz1) + dt * 2.0d+00 * (tx1 * dx3 + ty1 * dy3 + &+ tz1 * dz3) + tmat(3,4) = 0.0d+00 + tmat(3,5) = 0.0d+00 + tv(4) = omega * ((dt * tz2 * ((-((u(4,i,j,k + 1) * rmk + &)** 2)) + c2 * (qs(i,j,k + 1) * rmk)) - dt * tz1 * ((-(r43__26)) * + & c34__24 * rmk * rmk * u(4,i,j,k + 1))) * rsd(1,i,j,k + 1) + dt * + &tz2 * ((-(c2)) * (u(2,i,j,k + 1) * rmk)) * rsd(2,i,j,k + 1) + dt * + & tz2 * ((-(c2)) * (u(3,i,j,k + 1) * rmk)) * rsd(3,i,j,k + 1) + (dt + & * tz2 * (2.0d+00 - c2) * (u(4,i,j,k + 1) * rmk) - dt * tz1 * (r43 + &__26 * c34__24 * rmk) - dt * tz1 * dz4) * rsd(4,i,j,k + 1) + dt * + &tz2 * c2 * rsd(5,i,j,k + 1)) + tv(4) = tv(4) + omega * ((dt * ty2 * ((-(u(3,i,j + 1,k + &) * u(4,i,j + 1,k))) * rmj * rmj) - dt * ty1 * ((-(c34__24)) * rmj + & * rmj * u(4,i,j + 1,k))) * rsd(1,i,j + 1,k) + (dt * tx2 * ((-(u(2 + &,i + 1,j,k) * u(4,i + 1,j,k))) * rmi * rmi) - dt * tx1 * ((-(c34__ + &24)) * rmi * rmi * u(4,i + 1,j,k))) * rsd(1,i + 1,j,k) + 0.0d+00 * + & rsd(2,i,j + 1,k) + dt * tx2 * (u(4,i + 1,j,k) * rmi) * rsd(2,i + + &1,j,k) + dt * ty2 * (u(4,i,j + 1,k) * rmj) * rsd(3,i,j + 1,k) + 0. + &0d+00 * rsd(3,i + 1,j,k) + (dt * ty2 * (u(3,i,j + 1,k) * rmj) - dt + & * ty1 * (c34__24 * rmj) - dt * ty1 * dy4) * rsd(4,i,j + 1,k) + (d + &t * tx2 * (u(2,i + 1,j,k) * rmi) - dt * tx1 * (c34__24 * rmi) - dt + & * tx1 * dx4) * rsd(4,i + 1,j,k) + 0.0d+00 * rsd(5,i,j + 1,k) + 0. + &0d+00 * rsd(5,i + 1,j,k)) + tmat(4,1) = dt * 2.0d+00 * ((-(tx1)) - ty1 - tz1 * r43 + &__26) * (c34__24 * ro * ro * u(4,i,j,k)) + tmat(4,2) = 0.0d+00 + tmat(4,3) = 0.0d+00 + tmat(4,4) = 1.0d+00 + dt * 2.0d+00 * c34__24 * ro * (t + &x1 + ty1 + tz1 * r43__26) + dt * 2.0d+00 * (tx1 * dx4 + ty1 * dy4 + &+ tz1 * dz4) + tmat(4,5) = 0.0d+00 + tv(5) = omega * ((dt * tz2 * ((c2 * 2.0d0 * qs(i,j,k + + & 1) - c1 * u(5,i,j,k + 1)) * (u(4,i,j,k + 1) * rmk * rmk)) - dt * + &tz1 * ((-(c34__24 - c1345__25)) * rmk * rmk * rmk * u(2,i,j,k + 1) + &** 2 - (c34__24 - c1345__25) * rmk * rmk * rmk * u(3,i,j,k + 1)** + &2 - (r43__26 * c34__24 - c1345__25) * rmk * rmk * rmk * u(4,i,j,k + &+ 1)** 2 - c1345__25 * rmk * rmk * u(5,i,j,k + 1))) * rsd(1,i,j,k + &+ 1) + (dt * tz2 * ((-(c2)) * (u(2,i,j,k + 1) * u(4,i,j,k + 1)) * + &rmk * rmk) - dt * tz1 * (c34__24 - c1345__25) * rmk * rmk * u(2,i, + &j,k + 1)) * rsd(2,i,j,k + 1) + (dt * tz2 * ((-(c2)) * (u(3,i,j,k + + & 1) * u(4,i,j,k + 1)) * rmk * rmk) - dt * tz1 * (c34__24 - c1345__ + &25) * rmk * rmk * u(3,i,j,k + 1)) * rsd(3,i,j,k + 1) + (dt * tz2 * + & (c1 * (u(5,i,j,k + 1) * rmk) - c2 * (qs(i,j,k + 1) * rmk + u(4,i, + &j,k + 1) * u(4,i,j,k + 1) * rmk * rmk)) - dt * tz1 * (r43__26 * c3 + &4__24 - c1345__25) * rmk * rmk * u(4,i,j,k + 1)) * rsd(4,i,j,k + 1 + &) + (dt * tz2 * (c1 * (u(4,i,j,k + 1) * rmk)) - dt * tz1 * c1345__ + &25 * rmk - dt * tz1 * dz5) * rsd(5,i,j,k + 1)) + tv(5) = tv(5) + omega * ((dt * ty2 * ((c2 * 2.0d0 * qs + &(i,j + 1,k) - c1 * u(5,i,j + 1,k)) * (u(3,i,j + 1,k) * rmj * rmj)) + & - dt * ty1 * ((-(c34__24 - c1345__25)) * rmj * rmj * rmj * u(2,i, + &j + 1,k)** 2 - (r43__26 * c34__24 - c1345__25) * rmj * rmj * rmj * + & u(3,i,j + 1,k)** 2 - (c34__24 - c1345__25) * rmj * rmj * rmj * u( + &4,i,j + 1,k)** 2 - c1345__25 * rmj * rmj * u(5,i,j + 1,k))) * rsd( + &1,i,j + 1,k) + (dt * tx2 * ((c2 * 2.0d0 * qs(i + 1,j,k) - c1 * u(5 + &,i + 1,j,k)) * (u(2,i + 1,j,k) * rmi * rmi)) - dt * tx1 * ((-(r43_ + &_26 * c34__24 - c1345__25)) * rmi * rmi * rmi * u(2,i + 1,j,k)** 2 + & - (c34__24 - c1345__25) * rmi * rmi * rmi * u(3,i + 1,j,k)** 2 - + &(c34__24 - c1345__25) * rmi * rmi * rmi * u(4,i + 1,j,k)** 2 - c13 + &45__25 * rmi * rmi * u(5,i + 1,j,k))) * rsd(1,i + 1,j,k) + (dt * t + &y2 * ((-(c2)) * (u(2,i,j + 1,k) * u(3,i,j + 1,k)) * rmj * rmj) - d + &t * ty1 * (c34__24 - c1345__25) * rmj * rmj * u(2,i,j + 1,k)) * rs + &d(2,i,j + 1,k) + (dt * tx2 * (c1 * (u(5,i + 1,j,k) * rmi) - c2 * ( + &u(2,i + 1,j,k) * u(2,i + 1,j,k) * rmi * rmi + qs(i + 1,j,k) * rmi) + &) - dt * tx1 * (r43__26 * c34__24 - c1345__25) * rmi * rmi * u(2,i + & + 1,j,k)) * rsd(2,i + 1,j,k) + (dt * ty2 * (c1 * (u(5,i,j + 1,k) + &* rmj) - c2 * (qs(i,j + 1,k) * rmj + u(3,i,j + 1,k) * u(3,i,j + 1, + &k) * rmj * rmj)) - dt * ty1 * (r43__26 * c34__24 - c1345__25) * rm + &j * rmj * u(3,i,j + 1,k)) * rsd(3,i,j + 1,k) + (dt * tx2 * ((-(c2) + &) * (u(3,i + 1,j,k) * u(2,i + 1,j,k)) * rmi * rmi) - dt * tx1 * (c + &34__24 - c1345__25) * rmi * rmi * u(3,i + 1,j,k)) * rsd(3,i + 1,j, + &k) + (dt * ty2 * ((-(c2)) * (u(3,i,j + 1,k) * u(4,i,j + 1,k)) * rm + &j * rmj) - dt * ty1 * (c34__24 - c1345__25) * rmj * rmj * u(4,i,j + &+ 1,k)) * rsd(4,i,j + 1,k) + (dt * tx2 * ((-(c2)) * (u(4,i + 1,j,k + &) * u(2,i + 1,j,k)) * rmi * rmi) - dt * tx1 * (c34__24 - c1345__25 + &) * rmi * rmi * u(4,i + 1,j,k)) * rsd(4,i + 1,j,k) + (dt * ty2 * ( + &c1 * (u(3,i,j + 1,k) * rmj)) - dt * ty1 * c1345__25 * rmj - dt * t + &y1 * dy5) * rsd(5,i,j + 1,k) + (dt * tx2 * (c1 * (u(2,i + 1,j,k) * + & rmi)) - dt * tx1 * c1345__25 * rmi - dt * tx1 * dx5) * rsd(5,i + + &1,j,k)) + tmat(5,1) = (-(dt)) * 2.0d+00 * (((tx1 * (r43__26 * c3 + &4__24 - c1345__25) + ty1 * (c34__24 - c1345__25) + tz1 * (c34__24 + &- c1345__25)) * u(2,i,j,k)** 2 + (tx1 * (c34__24 - c1345__25) + ty + &1 * (r43__26 * c34__24 - c1345__25) + tz1 * (c34__24 - c1345__25)) + & * u(3,i,j,k)** 2 + (tx1 * (c34__24 - c1345__25) + ty1 * (c34__24 + &- c1345__25) + tz1 * (r43__26 * c34__24 - c1345__25)) * u(4,i,j,k) + &** 2) * ro * ro * ro + (tx1 + ty1 + tz1) * c1345__25 * ro * ro * u + &(5,i,j,k)) + tmat(5,2) = dt * 2.0d+00 * (tx1 * (r43__26 * c34__24 - + & c1345__25) + ty1 * (c34__24 - c1345__25) + tz1 * (c34__24 - c1345 + &__25)) * ro * ro * u(2,i,j,k) + tmat(5,3) = dt * 2.0d+00 * (tx1 * (c34__24 - c1345__25 + &) + ty1 * (r43__26 * c34__24 - c1345__25) + tz1 * (c34__24 - c1345 + &__25)) * ro * ro * u(3,i,j,k) + tmat(5,4) = dt * 2.0d+00 * (tx1 * (c34__24 - c1345__25 + &) + ty1 * (c34__24 - c1345__25) + tz1 * (r43__26 * c34__24 - c1345 + &__25)) * ro * ro * u(4,i,j,k) + tmat(5,5) = 1.0d+00 + dt * 2.0d+00 * (tx1 + ty1 + tz1) + & * c1345__25 * ro + dt * 2.0d+00 * (tx1 * dx5 + ty1 * dy5 + tz1 * + &dz5) + tmp1 = 1.0d+00 / tmat(1,1) + tmp2 = tmp1 * tmat(2,1) + tmat(2,2) = tmat(2,2) - tmp2 * tmat(1,2) + tmat(2,3) = tmat(2,3) - tmp2 * tmat(1,3) + tmat(2,4) = tmat(2,4) - tmp2 * tmat(1,4) + tmat(2,5) = tmat(2,5) - tmp2 * tmat(1,5) + tv(2) = tv(2) - tv(1) * tmp2 + tmp2 = tmp1 * tmat(3,1) + tmat(3,2) = tmat(3,2) - tmp2 * tmat(1,2) + tmat(3,3) = tmat(3,3) - tmp2 * tmat(1,3) + tmat(3,4) = tmat(3,4) - tmp2 * tmat(1,4) + tmat(3,5) = tmat(3,5) - tmp2 * tmat(1,5) + tv(3) = tv(3) - tv(1) * tmp2 + tmp2 = tmp1 * tmat(4,1) + tmat(4,2) = tmat(4,2) - tmp2 * tmat(1,2) + tmat(4,3) = tmat(4,3) - tmp2 * tmat(1,3) + tmat(4,4) = tmat(4,4) - tmp2 * tmat(1,4) + tmat(4,5) = tmat(4,5) - tmp2 * tmat(1,5) + tv(4) = tv(4) - tv(1) * tmp2 + tmp2 = tmp1 * tmat(5,1) + tmat(5,2) = tmat(5,2) - tmp2 * tmat(1,2) + tmat(5,3) = tmat(5,3) - tmp2 * tmat(1,3) + tmat(5,4) = tmat(5,4) - tmp2 * tmat(1,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(1,5) + tv(5) = tv(5) - tv(1) * tmp2 + tmp1 = 1.0d+00 / tmat(2,2) + tmp2 = tmp1 * tmat(3,2) + tmat(3,3) = tmat(3,3) - tmp2 * tmat(2,3) + tmat(3,4) = tmat(3,4) - tmp2 * tmat(2,4) + tmat(3,5) = tmat(3,5) - tmp2 * tmat(2,5) + tv(3) = tv(3) - tv(2) * tmp2 + tmp2 = tmp1 * tmat(4,2) + tmat(4,3) = tmat(4,3) - tmp2 * tmat(2,3) + tmat(4,4) = tmat(4,4) - tmp2 * tmat(2,4) + tmat(4,5) = tmat(4,5) - tmp2 * tmat(2,5) + tv(4) = tv(4) - tv(2) * tmp2 + tmp2 = tmp1 * tmat(5,2) + tmat(5,3) = tmat(5,3) - tmp2 * tmat(2,3) + tmat(5,4) = tmat(5,4) - tmp2 * tmat(2,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(2,5) + tv(5) = tv(5) - tv(2) * tmp2 + tmp1 = 1.0d+00 / tmat(3,3) + tmp2 = tmp1 * tmat(4,3) + tmat(4,4) = tmat(4,4) - tmp2 * tmat(3,4) + tmat(4,5) = tmat(4,5) - tmp2 * tmat(3,5) + tv(4) = tv(4) - tv(3) * tmp2 + tmp2 = tmp1 * tmat(5,3) + tmat(5,4) = tmat(5,4) - tmp2 * tmat(3,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(3,5) + tv(5) = tv(5) - tv(3) * tmp2 + tmp1 = 1.0d+00 / tmat(4,4) + tmp2 = tmp1 * tmat(5,4) + tmat(5,5) = tmat(5,5) - tmp2 * tmat(4,5) + tv(5) = tv(5) - tv(4) * tmp2 + tv(5) = tv(5) / tmat(5,5) + tv(4) = tv(4) - tmat(4,5) * tv(5) + tv(4) = tv(4) / tmat(4,4) + tv(3) = tv(3) - tmat(3,4) * tv(4) - tmat(3,5) * tv(5) + tv(3) = tv(3) / tmat(3,3) + tv(2) = tv(2) - tmat(2,3) * tv(3) - tmat(2,4) * tv(4) + &- tmat(2,5) * tv(5) + tv(2) = tv(2) / tmat(2,2) + tv(1) = tv(1) - tmat(1,2) * tv(2) - tmat(1,3) * tv(3) + &- tmat(1,4) * tv(4) - tmat(1,5) * tv(5) + tv(1) = tv(1) / tmat(1,1) + rsd(1,i,j,k) = rsd(1,i,j,k) - tv(1) + rsd(2,i,j,k) = rsd(2,i,j,k) - tv(2) + rsd(3,i,j,k) = rsd(3,i,j,k) - tv(3) + rsd(4,i,j,k) = rsd(4,i,j,k) - tv(4) + rsd(5,i,j,k) = rsd(5,i,j,k) - tv(5) + enddo + enddo + enddo + +!--------------------------------------------------------------------- +! update the variables +!--------------------------------------------------------------------- +! if (timeron) then +! call timer_start(10) +! endif +!DVM$ PARALLEL (k,j,i,m) ON u(m,i,j,k), PRIVATE (j,m,i,k) + do k = 1,nz + do j = jst,jend + do i = ist,iend + do m = 1,5 + u(m,i,j,k) = u(m,i,j,k) + tmp * rsd(m,i,j,k) + enddo + enddo + enddo + enddo +!DVM$ END REGION + +! if (timeron) then +! call timer_stop(10) +! endif +!--------------------------------------------------------------------- +! compute the steady-state residuals +!--------------------------------------------------------------------- +!DVM$ END INTERVAL + call rhs() + mod_522_2 = mod (istep,inorm) + +!--------------------------------------------------------------------- +! compute the max-norms of newton iteration residuals +!--------------------------------------------------------------------- + if (mod_522_2 .eq. 0 .or. istep .eq. itmax) then + if (timeron) then + call timer_start(11) + endif + call l2norm(isiz1,isiz2,isiz3,nx0,ny0,nz0,ist,iend,jst,jend, + &rsd,rsdnm) + if (timeron) then + call timer_stop(11) + endif + +! if ( ipr .eq. 1 ) then +! write (*,1007) ( rsdnm(m), m = 1, 5 ) +! end if + endif + +!--------------------------------------------------------------------- +! check the newton-iteration residuals against the tolerance levels +!--------------------------------------------------------------------- + if (rsdnm(1) .lt. tolrsd(1) .and. rsdnm(2) .lt. tolrsd(2) .and. + & rsdnm(3) .lt. tolrsd(3) .and. rsdnm(4) .lt. tolrsd(4) .and. rsdnm + &(5) .lt. tolrsd(5)) then + +! if (ipr .eq. 1 ) then + write (unit = *,fmt = 1004) istep + +! end if + goto 900 + endif + enddo +900 continue + call timer_stop(1) + maxtime = timer_read (1) + return +1001 FORMAT (1X/5X,'pseudo-time SSOR iteration no.=',I4/) +1004 FORMAT (1X/1X,'convergence was achieved after ',I4, ' pseudo-tim + &e steps' ) +1006 FORMAT (1X/1X,'RMS-norm of SSOR-iteration correction ', 'for first + & pde = ',1PE12.5/, 1X,'RMS-norm of SSOR-iteration correction ', ' + &for second pde = ',1PE12.5/, 1X,'RMS-norm of SSOR-iteration correc + &tion ', 'for third pde = ',1PE12.5/, 1X,'RMS-norm of SSOR-iterati + &on correction ', 'for fourth pde = ',1PE12.5/, 1X,'RMS-norm of SSO + &R-iteration correction ', 'for fifth pde = ',1PE12.5) +1007 FORMAT (1X/1X,'RMS-norm of steady-state residual for ', 'first pde + & = ',1PE12.5/, 1X,'RMS-norm of steady-state residual for ', 'seco + &nd pde = ',1PE12.5/, 1X,'RMS-norm of steady-state residual for ', + &'third pde = ',1PE12.5/, 1X,'RMS-norm of steady-state residual fo + &r ', 'fourth pde = ',1PE12.5/, 1X,'RMS-norm of steady-state residu + &al for ', 'fifth pde = ',1PE12.5) + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/timers.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/timers.f new file mode 100644 index 0000000..480c728 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/timers.f @@ -0,0 +1,97 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_clear(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + elapsed(n) = 0.0 + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_start(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + start(n) = elapsed_time() + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_stop(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + double precision t, now + now = elapsed_time() + t = now - start(n) + elapsed(n) = elapsed(n) + t + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function timer_read(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + timer_read = elapsed(n) + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function elapsed_time() + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + + double precision dvtime + elapsed_time = dvtime() + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/verify.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/verify.f new file mode 100644 index 0000000..14e4b80 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/LU/verify.f @@ -0,0 +1,382 @@ + +! *** generated by SAPFOR with version 1124 and build date: Apr 18 2019 20:56:38 + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + subroutine verify (xcr, xce, xci, class, verified) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! verification routine +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--- applu.incl +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! npbparams.h defines parameters that depend on the class and +! number of nodes +!--------------------------------------------------------------------- + implicit none + +!--------------------------------------------------------------------- +! end of include file +!--------------------------------------------------------------------- + +!--------------------------------------------------------------------- +! end of include file + include 'applu.incl' +!--------------------------------------------------------------------- + double precision xcr(5),xce(5),xci + double precision xcrref(5),xceref(5),xciref,xcrdif(5),xcedif(5),x + &cidif,epsilon,dtref + integer m + character class + logical verified + +!--------------------------------------------------------------------- +! tolerance level +!--------------------------------------------------------------------- + epsilon = 1.0d-08 + class = 'U' + verified = .TRUE. + do m = 1,5 + xcrref(m) = 1.0 + xceref(m) = 1.0 + enddo + xciref = 1.0 + if (nx0 .eq. 12 .and. ny0 .eq. 12 .and. nz0 .eq. 12 .and. itmax .e + &q. 50) then + class = 'S' + dtref = 5.0d-1 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual, for the (12X12X12) grid, +! after 50 time steps, with DT = 5.0d-01 +!--------------------------------------------------------------------- + xcrref(1) = 1.6196343210976702d-02 + xcrref(2) = 2.1976745164821318d-03 + xcrref(3) = 1.5179927653399185d-03 + xcrref(4) = 1.5029584435994323d-03 + xcrref(5) = 3.4264073155896461d-02 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error, for the (12X12X12) grid, +! after 50 time steps, with DT = 5.0d-01 +!--------------------------------------------------------------------- + xceref(1) = 6.4223319957960924d-04 + xceref(2) = 8.4144342047347926d-05 + xceref(3) = 5.8588269616485186d-05 + xceref(4) = 5.8474222595157350d-05 + xceref(5) = 1.3103347914111294d-03 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (12X12X12) grid, +! after 50 time steps, with DT = 5.0d-01 +!--------------------------------------------------------------------- + xciref = 7.8418928865937083d+00 + else if (nx0 .eq. 33 .and. ny0 .eq. 33 .and. nz0 .eq. 33 .and. itm + &ax .eq. 300) then + +!SPEC95fp size + class = 'W' + dtref = 1.5d-3 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual, for the (33x33x33) grid, +! after 300 time steps, with DT = 1.5d-3 +!--------------------------------------------------------------------- + xcrref(1) = 0.1236511638192d+02 + xcrref(2) = 0.1317228477799d+01 + xcrref(3) = 0.2550120713095d+01 + xcrref(4) = 0.2326187750252d+01 + xcrref(5) = 0.2826799444189d+02 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error, for the (33X33X33) grid, +!--------------------------------------------------------------------- + xceref(1) = 0.4867877144216d+00 + xceref(2) = 0.5064652880982d-01 + xceref(3) = 0.9281818101960d-01 + xceref(4) = 0.8570126542733d-01 + xceref(5) = 0.1084277417792d+01 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (33X33X33) grid, +! after 300 time steps, with DT = 1.5d-3 +!--------------------------------------------------------------------- + xciref = 0.1161399311023d+02 + else if (nx0 .eq. 64 .and. ny0 .eq. 64 .and. nz0 .eq. 64 .and. itm + &ax .eq. 250) then + class = 'A' + dtref = 2.0d+0 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual, for the (64X64X64) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xcrref(1) = 7.7902107606689367d+02 + xcrref(2) = 6.3402765259692870d+01 + xcrref(3) = 1.9499249727292479d+02 + xcrref(4) = 1.7845301160418537d+02 + xcrref(5) = 1.8384760349464247d+03 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error, for the (64X64X64) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xceref(1) = 2.9964085685471943d+01 + xceref(2) = 2.8194576365003349d+00 + xceref(3) = 7.3473412698774742d+00 + xceref(4) = 6.7139225687777051d+00 + xceref(5) = 7.0715315688392578d+01 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (64X64X64) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xciref = 2.6030925604886277d+01 + else if (nx0 .eq. 102 .and. ny0 .eq. 102 .and. nz0 .eq. 102 .and. + &itmax .eq. 250) then + class = 'B' + dtref = 2.0d+0 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual, for the (102X102X102) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xcrref(1) = 3.5532672969982736d+03 + xcrref(2) = 2.6214750795310692d+02 + xcrref(3) = 8.8333721850952190d+02 + xcrref(4) = 7.7812774739425265d+02 + xcrref(5) = 7.3087969592545314d+03 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error, for the (102X102X102) +! grid, after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xceref(1) = 1.1401176380212709d+02 + xceref(2) = 8.1098963655421574d+00 + xceref(3) = 2.8480597317698308d+01 + xceref(4) = 2.5905394567832939d+01 + xceref(5) = 2.6054907504857413d+02 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (102X102X102) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xciref = 4.7887162703308227d+01 + else if (nx0 .eq. 162 .and. ny0 .eq. 162 .and. nz0 .eq. 162 .and. + &itmax .eq. 250) then + class = 'C' + dtref = 2.0d+0 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual, for the (162X162X162) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xcrref(1) = 1.03766980323537846d+04 + xcrref(2) = 8.92212458801008552d+02 + xcrref(3) = 2.56238814582660871d+03 + xcrref(4) = 2.19194343857831427d+03 + xcrref(5) = 1.78078057261061185d+04 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error, for the (162X162X162) +! grid, after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xceref(1) = 2.15986399716949279d+02 + xceref(2) = 1.55789559239863600d+01 + xceref(3) = 5.41318863077207766d+01 + xceref(4) = 4.82262643154045421d+01 + xceref(5) = 4.55902910043250358d+02 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (162X162X162) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xciref = 6.66404553572181300d+01 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (162X162X162) grid, +! after 250 time steps, with DT = 2.0d+00 +!--------------------------------------------------------------------- + xciref = 6.66404553572181300d+01 + else if (nx0 .eq. 408 .and. ny0 .eq. 408 .and. nz0 .eq. 408 .and. + &itmax .eq. 300) then + class = 'D' + dtref = 1.0d+0 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual, for the (408X408X408) grid, +! after 300 time steps, with DT = 1.0d+00 +!--------------------------------------------------------------------- + xcrref(1) = 0.4868417937025d+05 + xcrref(2) = 0.4696371050071d+04 + xcrref(3) = 0.1218114549776d+05 + xcrref(4) = 0.1033801493461d+05 + xcrref(5) = 0.7142398413817d+05 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error, for the (408X408X408) +! grid, after 300 time steps, with DT = 1.0d+00 +!--------------------------------------------------------------------- + xceref(1) = 0.3752393004482d+03 + xceref(2) = 0.3084128893659d+02 + xceref(3) = 0.9434276905469d+02 + xceref(4) = 0.8230686681928d+02 + xceref(5) = 0.7002620636210d+03 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (408X408X408) grid, +! after 300 time steps, with DT = 1.0d+00 +!--------------------------------------------------------------------- + xciref = 0.8334101392503d+02 + else if (nx0 .eq. 1020 .and. ny0 .eq. 1020 .and. nz0 .eq. 1020 .an + &d. itmax .eq. 300) then + class = 'E' + dtref = 0.5d+0 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of residual, for the (1020X1020X1020) grid, +! after 300 time steps, with DT = 0.5d+00 +!--------------------------------------------------------------------- + xcrref(1) = 0.2099641687874d+06 + xcrref(2) = 0.2130403143165d+05 + xcrref(3) = 0.5319228789371d+05 + xcrref(4) = 0.4509761639833d+05 + xcrref(5) = 0.2932360006590d+06 + +!--------------------------------------------------------------------- +! Reference values of RMS-norms of solution error, for the (1020X1020X1020) +! grid, after 300 time steps, with DT = 0.5d+00 +!--------------------------------------------------------------------- + xceref(1) = 0.4800572578333d+03 + xceref(2) = 0.4221993400184d+02 + xceref(3) = 0.1210851906824d+03 + xceref(4) = 0.1047888986770d+03 + xceref(5) = 0.8363028257389d+03 + +!--------------------------------------------------------------------- +! Reference value of surface integral, for the (1020X1020X1020) grid, +! after 300 time steps, with DT = 0.5d+00 +!--------------------------------------------------------------------- + xciref = 0.9512163272273d+02 + else + verified = .FALSE. + endif + +!--------------------------------------------------------------------- +! verification test for residuals if gridsize is one of +! the defined grid sizes above (class .ne. 'U') +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! Compute the difference of solution values and the known reference values. +!--------------------------------------------------------------------- + do m = 1,5 + xcrdif(m) = dabs ((xcr(m) - xcrref(m)) / xcrref(m)) + xcedif(m) = dabs ((xce(m) - xceref(m)) / xceref(m)) + enddo + xcidif = dabs ((xci - xciref) / xciref) + +!--------------------------------------------------------------------- +! Output the comparison of computed results to known cases. +!--------------------------------------------------------------------- + if (class .ne. 'U') then + write (unit = *,fmt = 1990) class +1990 format(/, ' Verification being performed for class ', a + &) + write (unit = *,fmt = 2000) epsilon +2000 format(' Accuracy setting for epsilon = ', E20.13) + verified = dabs (dt - dtref) .le. epsilon + if (.not.(verified)) then + class = 'U' + write (unit = *,fmt = 1000) dtref +1000 format(' DT does not match the reference value + & of ', E15.8) + endif + else + write (unit = *,fmt = 1995) +1995 format(' Unknown class') + endif + if (class .ne. 'U') then + write (unit = *,fmt = 2001) + else + write (unit = *,fmt = 2005) + endif +2001 format(' Comparison of RMS-norms of residual') +2005 format(' RMS-norms of residual') + do m = 1,5 + if (class .eq. 'U') then + write (unit = *,fmt = 2015) m,xcr(m) + else if (xcrdif(m) .le. epsilon) then + write (unit = *,fmt = 2011) m,xcr(m),xcrref(m),xcrdif(m) + else + verified = .FALSE. + write (unit = *,fmt = 2010) m,xcr(m),xcrref(m),xcrdif(m) + endif + enddo + if (class .ne. 'U') then + write (unit = *,fmt = 2002) + else + write (unit = *,fmt = 2006) + endif +2002 format(' Comparison of RMS-norms of solution error') +2006 format(' RMS-norms of solution error') + do m = 1,5 + if (class .eq. 'U') then + write (unit = *,fmt = 2015) m,xce(m) + else if (xcedif(m) .le. epsilon) then + write (unit = *,fmt = 2011) m,xce(m),xceref(m),xcedif(m) + else + verified = .FALSE. + write (unit = *,fmt = 2010) m,xce(m),xceref(m),xcedif(m) + endif + enddo +2010 format(' FAILURE: ', i2, 2x, E20.13, E20.13, E20.13) +2011 format(' ', i2, 2x, E20.13, E20.13, E20.13) +2015 format(' ', i2, 2x, E20.13) + if (class .ne. 'U') then + write (unit = *,fmt = 2025) + else + write (unit = *,fmt = 2026) + endif +2025 format(' Comparison of surface integral') +2026 format(' Surface integral') + if (class .eq. 'U') then + write (unit = *,fmt = 2030) xci + else if (xcidif .le. epsilon) then + write (unit = *,fmt = 2032) xci,xciref,xcidif + else + verified = .FALSE. + write (unit = *,fmt = 2031) xci,xciref,xcidif + endif +2030 format(' ', 4x, E20.13) +2031 format(' FAILURE: ', 4x, E20.13, E20.13, E20.13) +2032 format(' ', 4x, E20.13, E20.13, E20.13) + if (class .eq. 'U') then + write (unit = *,fmt = 2022) + write (unit = *,fmt = 2023) +2022 format(' No reference values provided') +2023 format(' No verification performed') + else if (verified) then + write (unit = *,fmt = 2020) +2020 format(' Verification Successful') + else + write (unit = *,fmt = 2021) +2021 format(' Verification failed') + endif + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/Makefile new file mode 100644 index 0000000..e7dec93 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/Makefile @@ -0,0 +1,31 @@ +SHELL=/bin/sh +BENCHMARK=mg +BENCHMARKU=MG + +include ../config/make.def +include ../sys/make.common + +SOURCES = mg.fdv \ + mg3p.fdv \ + comm3.fdv \ + interp.fdv \ + norm2u3.fdv \ + psinv.fdv \ + resid.fdv \ + rjrp3.fdv \ + setupDVM.fdv \ + utilities.fdv \ + zran3.fdv + +OBJS = ${SOURCES:.fdv=.o} + +${PROGRAM}: config $(OBJS) + ${FLINK} -o ${PROGRAM} ${OBJS} + +%.o: %.fdv npbparams.h globals.h dvmvars.h + ${F77} ${FFLAGS} -c -o $@ $< + +clean: + rm -f npbparams.h + rm -f *.o *~ + rm -f *.cu *.cuf *.c *.f diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/TODO_make.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/TODO_make.bat new file mode 100644 index 0000000..a764763 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/TODO_make.bat @@ -0,0 +1,12 @@ +@echo off + +set CLASS=%1 +set OPT=%2 + +CALL ..\sys\setparams MG %CLASS% +CALL %F77% %OPT% mg 1>out_%CLASS%.txt 2>err_%CLASS%.txt +if exist mg.exe ( + copy mg.exe %BIN%\mg.%CLASS%.x.exe + del mg.exe +) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/comm3.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/comm3.fdv new file mode 100644 index 0000000..8869c07 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/comm3.fdv @@ -0,0 +1,88 @@ +c--------------------------------------------------------------------- +c Îáíîâëåíèå ãðàíè÷íûõ ýëåìåíòîâ. +c Âåëè÷èíà ãðàíèöû ðàâíà äâóì îò îò êàæäîãî êðàÿ ìàññèâà. +c--------------------------------------------------------------------- +c @param double precission :: u(n1 ,n2 ,n3) - íåêîòîðàÿ ìàòðèöà +c @param integer :: kk - ôèêòèâíûé ïàðàìåòð +c--------------------------------------------------------------------- + subroutine comm3(u,n1,n2,n3,kk) +c--------------------------------------------------------------------- +!DVM$ INHERIT u +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c comm3 organizes the communication on all borders +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer n1, n2, n3, kk, i1, i2, i3 + integer blockX, blockY + double precision u(n1,n2,n3) +!DVM$ interval 5 +!DVM$ REGION +!, REMOTE_ACCESS (u(n1-1,:,:)) +!DVM$ PARALLEL (i3,i2) ON u(1,i2,i3) +CDVM$& ,cuda_block(128) + do i3=2,n3-1 + do i2=2,n2-1 + u(1,i2,i3) = u(n1-1,i2,i3) + enddo + enddo + +!, REMOTE_ACCESS (u(2,:,:)) +!DVM$ PARALLEL (i3,i2) ON u(n1,i2,i3 ) +CDVM$& ,cuda_block(128) + do i3=2,n3-1 + do i2=2,n2-1 + u(n1,i2,i3) = u(2,i2,i3) + enddo + enddo + +c---------------------------------- +!, REMOTE_ACCESS (u(:,n2-1,:)) + +!DVM$ PARALLEL (i3,i1) ON u(i1,1,i3) +CDVM$& ,cuda_block(128) + do i3=2,n3-1 + do i1=1,n1 + u(i1,1,i3) = u(i1,n2-1,i3) + enddo + enddo + +! , REMOTE_ACCESS (u(:,2,:)) +!DVM$ PARALLEL (i3,i1) ON u(i1,n2,i3) +CDVM$& ,cuda_block(128) + do i3=2,n3-1 + do i1=1,n1 + u(i1,n2,i3) = u(i1,2,i3) + enddo + enddo + +c---------------------------------- + +!, REMOTE_ACCESS (u(:,:,n3-1)) +!DVM$ PARALLEL (i2,i1) ON u(i1,i2,1) +CDVM$& ,cuda_block(128) + do i2=1,n2 + do i1=1,n1 + u(i1,i2,1) = u(i1,i2,n3-1) + enddo + enddo + +!, REMOTE_ACCESS (u(:,:,2)) +!DVM$ PARALLEL (i2,i1) ON u(i1,i2,n3) +CDVM$& ,cuda_block(128) + do i2=1,n2 + do i1=1,n1 + u(i1,i2,n3) = u(i1,i2,2) + enddo + enddo +!DVM$ END REGION +!DVM$ end interval + if (timeron) call timer_stop(T_comm3) + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/dvmvars.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/dvmvars.h new file mode 100644 index 0000000..cf36571 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/dvmvars.h @@ -0,0 +1,57 @@ +c--------------------------------------------------------------------- +c FDVM specifications +c--------------------------------------------------------------------- + integer p_u_ir(maxlevel) !p_u_ir(k) ≡ u(ir(k)) + integer p_r_ir(maxlevel) !p_u_ir(k) ≡ r(ir(k)) + integer pu !pu ≡ u(lt) ≡ p_u_ir(lt) + integer pr !pr ≡ r(lt) ≡ p_r_ir(lt) + integer pv !pv ≡ v + + integer p_curr_u_k !p_curr_u_k ≡ u(k) + integer p_curr_u_j !p_curr_u_j ≡ u(j) + + integer p_curr_r_k !p_curr_r_k ≡ r(k) + integer p_curr_r_j !p_curr_r_j ≡ r(j) + + common /pointers/ p_u_ir, p_r_ir + common /pointers/ pu, pr, pv + common /pointers/ p_curr_r_j, p_curr_r_k + common /pointers/ p_curr_u_j, p_curr_u_k + +CDVM$ DOUBLE PRECISION, POINTER(:,:,:) :: p_u_ir, p_r_ir, +CDVM$& pu, pr, pv, +CDVM$& p_curr_r_j, p_curr_r_k, +CDVM$& p_curr_u_j, p_curr_u_k + +CDVM$ ALIGN :: pu, pr, pv, +CDVM$& p_u_ir, p_r_ir, +CDVM$& p_curr_r_k, p_curr_r_j, +CDVM$& p_curr_u_k, p_curr_u_j + +CDVM$ DYNAMIC p_u_ir, p_r_ir, +CDVM$& pu, pr, pv, +CDVM$& p_curr_r_j, p_curr_r_k, +CDVM$& p_curr_u_j, p_curr_u_k + +CDVM$ SHADOW pu(1:1,1:1,1:1) +CDVM$ SHADOW pr(1:1,1:1,1:1) + +CDVM$ SHADOW p_curr_r_k(1:1,1:1,1:1) +CDVM$ SHADOW p_curr_u_k(1:1,1:1,1:1) +CDVM$ SHADOW p_curr_u_j(1:1,1:1,1:1) + +CDVM$ TEMPLATE EXT (nv1, nv2, nv3) +CDVM$ DISTRIBUTE EXT (BLOCK, BLOCK, BLOCK) + +c--------------------------------------------------------------------- +c Distribution from programm +c--------------------------------------------------------------------- + double precision u(nr), r(nr) + double precision v(nv) + + common /noautom/ u,r,v +CDVM$ HEAP u, r, v + + double precision a(0:3), c(0:3) + common /coefficients/ a,c +CDVM$ DISTRIBUTE (*) :: a, c \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/globals.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/globals.h new file mode 100644 index 0000000..89e0af6 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/globals.h @@ -0,0 +1,68 @@ +c--------------------------------------------------------------------- +c Parameter lm (declared and set in "npbparams.h") is the log-base2 of +c the edge size max for the partition on a given node, so must be changed +c either to save space (if running a small case) or made bigger for larger +c cases, for example, 512^3. Thus lm=7 means that the largest dimension +c of a partition that can be solved on a node is 2^7 = 128. lm is set +c automatically in npbparams.h +c Parameters ndim1, ndim2, ndim3 are the local problem dimensions. +c--------------------------------------------------------------------- + + include 'npbparams.h' + + integer nm ! actual dimension including ghost cells for communications +c *** type of nv, nr and ir is set in npbparams.h +c > , nv ! size of rhs array +c > , nr ! size of residual array + > , nm2 ! size of communication buffer + > , maxlevel! maximum number of levels + + integer nv1, nv2, nv3 + parameter( nv1=one*(2+2**ndim1) ) + parameter( nv2=one*(2+2**ndim2) ) + parameter( nv3=one*(2+2**ndim3) ) + + parameter( nm=2+2**lm, maxlevel=(lt_default+1) ) + parameter( nm2=2*nm*nm) + parameter( nv=nv1*nv2*nv3/one/one ) + parameter( nr = ((nv+nm**2+5*nm+7*lm+6)/7)*8 ) +c--------------------------------------------------------------------- + integer nbr(3,-1:1,maxlevel), msg_type(3,-1:1) + integer msg_id(3,-1:1,2),nx(maxlevel),ny(maxlevel),nz(maxlevel) + common /mg3/ nbr,msg_type,msg_id,nx,ny,nz + + character class + common /ClassType/class + + integer debug_vec(0:7) + common /my_debug/ debug_vec + + integer m1(maxlevel), m2(maxlevel), m3(maxlevel) + integer lt, lb + common /fap/ ir(maxlevel),m1,m2,m3,lt,lb + + logical ver + ! FALSE for GPU and TRUE for CPU + parameter (ver = .false. ) + logical dead(maxlevel), give_ex(3,maxlevel), take_ex(3,maxlevel) + common /comm_ex/ dead, give_ex, take_ex + +c--------------------------------------------------------------------- +c Set at m=1024, can handle cases up to 1024^3 case +c--------------------------------------------------------------------- + integer m +c parameter( m=1037 ) + parameter( m=nm+1 ) + + double precision buff(nm2,4) + common /buffer/ buff + + logical timeron + common /timers/ timeron + integer T_init, T_bench, T_psinv, T_resid, T_rprj3, T_interp, + > T_norm2, T_mg3P, T_resid2, T_comm3, T_last + parameter (T_init=1, T_bench=2, T_mg3P=3, + > T_psinv=4, T_resid=5, T_resid2=6, T_rprj3=7, + > T_interp=8, T_norm2=9, T_comm3=10, T_last=10) + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/interp.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/interp.fdv new file mode 100644 index 0000000..0fa268f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/interp.fdv @@ -0,0 +1,169 @@ + +c--------------------------------------------------------------------- +c Òðèëèíåéíàÿ ýêñòðàïîëÿöèÿ èñêîìîé ôóíêöèè íà ïîäðîáíóþ ñåòêó +c--------------------------------------------------------------------- +c u(h) = u(h) + Q u(H) +c ãäå H = 2h - øàã ðàçáèåíèÿ ñåòêè, +c Q - ëèíåéíûé îïåðàòîð òðèëèíåéíîé ýêñòðàïîëÿöèè +c u - ìàòðèöà çíà÷åíèé èñêîìîé ôóíêöèè +c--------------------------------------------------------------------- +c Èñïîëüçóåòñÿ äëÿ ïîñòðîåíèå ïîäðîáíîé ñåòêè çíà÷åíèé èñêîìîé ôóíêöèè, +c ïðè âîñõîæäåíèè ïî V-öèêëó +c--------------------------------------------------------------------- +c @param double precission :: z(mm1,mm2,mm3) ? u(H) - ãðóáàÿ ñåòêà +c @param double precission :: u(n1 ,n2 ,n3 ) ? u(h) - ïîäðîáíàÿ ñåòêà +c @param integer :: k - òåêóùèé øàã óêðóïíåíèÿ ðàçáèåíèÿ ïåðâîíà÷àëüíîé ñåòêè +c--------------------------------------------------------------------- + subroutine interp( z,mm1,mm2,mm3,u,n1,n2,n3,k ) +c--------------------------------------------------------------------- +!DVM$ INHERIT z,u +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c interp adds the trilinear interpolation of the correction +c from the coarser grid to the current approximation: u = u + Qu' +c +c Observe that this implementation costs 16A + 4M, where +c A and M denote the costs of Addition and Multiplication. +c Note that this vectorizes, and is also fine for cache +c based machines. Vector machines may get slightly better +c performance however, with 8 separate "do i1" loops, rather than 4. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer mm1, mm2, mm3, n1, n2, n3,k + double precision z(mm1,mm2,mm3),u(n1,n2,n3),z1,z1_p1,z2,z2_p1 + double precision z3,z3_p1,z4,z4_p1 + integer i3, i2, i1, d1, d2, d3, t1, t2, t3 +!DVM$ interval 1 + if( n1 .ne. 3 .and. n2 .ne. 3 .and. n3 .ne. 3 ) then + if ( ver ) then + +!DVM$ REGION +!DVM$ PARALLEL (i3,i2) ON u(*, 2*i2, 2*i3), +!DVM$& SHADOW_RENEW(z(CORNER)), cuda_block(32,6) +!DVM$& ,private(i1,z1,z1_p1, z2,z2_p1, z3,z3_p1, z4,z4_p1) + do i3=1,mm3-1 + do i2=1,mm2-1 + z1 = z(1,i2,i3) + z2 = z(1,i2+1,i3+1) + z3 = z(1,i2,i3+1) + z4 = z(1,i2+1,i3) + do i1=1, mm1-1 + z1_p1 = z(i1+1,i2,i3) + z2_p1 = z(i1+1,i2+1,i3+1) + z3_p1 = z(i1+1,i2,i3+1) + z4_p1 = z(i1+1,i2+1,i3) + u(2*i1-1,2*i2-1,2*i3-1) = u(2*i1-1,2*i2-1,2*i3-1) + z1 + u(2*i1,2*i2-1,2*i3-1) = u(2*i1,2*i2-1,2*i3-1) + + & 0.5d0 * ( z1_p1 + z1 ) + u(2*i1-1,2*i2,2*i3-1) = u(2*i1-1,2*i2,2*i3-1) + + & 0.5d0 * ( z4 + z1 ) + u(2*i1,2*i2,2*i3-1) = u(2*i1,2*i2,2*i3-1) + + & 0.25d0*( z4 + z1 + z4_p1 + z1_p1) + u(2*i1-1,2*i2-1,2*i3) = u(2*i1-1,2*i2-1,2*i3) + + & +0.5d0 * ( z3 + z1 ) + u(2*i1,2*i2-1,2*i3) = u(2*i1,2*i2-1,2*i3) + + & 0.25d0*( z3 + z1 + z3_p1 + z1_p1) + u(2*i1-1,2*i2,2*i3) = u(2*i1-1,2*i2,2*i3) + + & 0.25d0* (z2 + z3 + z4 + z1 ) + u(2*i1,2*i2,2*i3) = u(2*i1,2*i2,2*i3) + + & 0.125d0*( z2 + z3 + z4 + z1 + z2_p1 + z3_p1 + & + z4_p1 + z1_p1 ) + z1 = z1_p1 + z2 = z2_p1 + z3 = z3_p1 + z4 = z4_p1 + enddo + enddo + enddo +!DVM$ END REGION + + else +!DVM$ REGION +!DVM$ PARALLEL (i3,i1) ON u(2*i1, *, 2*i3), +!DVM$& SHADOW_RENEW(z(CORNER)), cuda_block(32,6) +!DVM$& ,private(i2,z1,z1_p1, z2,z2_p1, z3,z3_p1, z4,z4_p1) + do i3=1,mm3-1 + do i1=1, mm1-1 + z1 = z(i1,1,i3) + z2 = z(i1+1,1,i3) + z3 = z(i1,1,i3+1) + z4 = z(i1+1,1,i3+1) + do i2=1,mm2-1 + z1_p1 = z(i1,i2+1,i3) + z2_p1 = z(i1+1,i2+1,i3) + z3_p1 = z(i1,i2+1,i3+1) + z4_p1 = z(i1+1,i2+1,i3+1) + u(2*i1-1,2*i2-1,2*i3-1) = u(2*i1-1,2*i2-1,2*i3-1) + z1 + u(2*i1,2*i2-1,2*i3-1) = u(2*i1,2*i2-1,2*i3-1) + + & 0.5d0 * ( z2 + z1 ) + u(2*i1-1,2*i2,2*i3-1) = u(2*i1-1,2*i2,2*i3-1) + + & 0.5d0 * ( z1_p1 + z1 ) + u(2*i1,2*i2,2*i3-1) = u(2*i1,2*i2,2*i3-1) + + & 0.25d0*( z1_p1 + z1 + z2_p1 + z2) + u(2*i1-1,2*i2-1,2*i3) = u(2*i1-1,2*i2-1,2*i3) + + & +0.5d0 * ( z3 + z1 ) + u(2*i1,2*i2-1,2*i3) = u(2*i1,2*i2-1,2*i3) + + & 0.25d0*( z3 + z1 + z4 + z2) + u(2*i1-1,2*i2,2*i3) = u(2*i1-1,2*i2,2*i3) + + & 0.25d0* (z3_p1 + z3 + z1_p1 + z1 ) + u(2*i1,2*i2,2*i3) = u(2*i1,2*i2,2*i3) + + & 0.125d0*( z3_p1 + z3 + z1_p1 + z1 + + & z4_p1 + z4 + z2_p1 + z2 ) + z1 = z1_p1 + z2 = z2_p1 + z3 = z3_p1 + z4 = z4_p1 + enddo + enddo + enddo +!DVM$ END REGION + endif + + else + + if(n1.eq.3) then; d1 = 2; t1 = 1; else; d1 = 1; t1 = 0; endif + if(n2.eq.3) then; d2 = 2; t2 = 1; else; d2 = 1; t2 = 0; endif + if(n3.eq.3) then; d3 = 2; t3 = 1; else; d3 = 1; t3 = 0; endif +!DVM$ REGION +!DVM$ PARALLEL (i3,i2,i1) ON u(2*i1-d1,2*i2-d2,2*i3-d3), +!DVM$& SHADOW_RENEW(z(CORNER)), PRIVATE(i3,i2,i1) +!DVM$& ,cuda_block(32,6,1) + do i3=d3,mm3-1 + do i2=d2,mm2-1 + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-d2,2*i3-d3)=u(2*i1-d1,2*i2-d2,2*i3-d3) + & +z(i1,i2,i3) + u(2*i1-t1,2*i2-d2,2*i3-d3)=u(2*i1-t1,2*i2-d2,2*i3-d3) + & +0.5D0*(z(i1+1,i2,i3)+z(i1,i2,i3)) + u(2*i1-d1,2*i2-t2,2*i3-d3)=u(2*i1-d1,2*i2-t2,2*i3-d3) + & +0.5D0*(z(i1,i2+1,i3)+z(i1,i2,i3)) + u(2*i1-t1,2*i2-t2,2*i3-d3)=u(2*i1-t1,2*i2-t2,2*i3-d3) + & +0.25D0*(z(i1+1,i2+1,i3)+z(i1+1,i2,i3) + & +z(i1, i2+1,i3)+z(i1, i2,i3)) + u(2*i1-d1,2*i2-d2,2*i3-t3)=u(2*i1-d1,2*i2-d2,2*i3-t3) + & +0.5D0*(z(i1,i2,i3+1)+z(i1,i2,i3)) + u(2*i1-t1,2*i2-d2,2*i3-t3)=u(2*i1-t1,2*i2-d2,2*i3-t3) + & +0.25D0*(z(i1+1,i2,i3+1)+z(i1,i2,i3+1) + & +z(i1+1,i2,i3 )+z(i1,i2,i3 )) + u(2*i1-d1,2*i2-t2,2*i3-t3)=u(2*i1-d1,2*i2-t2,2*i3-t3) + & +0.25D0*(z(i1,i2+1,i3+1)+z(i1,i2,i3+1) + & +z(i1,i2+1,i3 )+z(i1,i2,i3 )) + u(2*i1-t1,2*i2-t2,2*i3-t3)=u(2*i1-t1,2*i2-t2,2*i3-t3) + & +0.125D0*(z(i1+1,i2+1,i3+1)+z(i1+1,i2,i3+1) + & +z(i1 ,i2+1,i3+1)+z(i1 ,i2,i3+1) + & +z(i1+1,i2+1,i3 )+z(i1+1,i2,i3 ) + & +z(i1 ,i2+1,i3 )+z(i1 ,i2,i3 )) + enddo + enddo + enddo + +!DVM$ END REGION + endif +!DVM$ end interval + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/mg.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/mg.fdv new file mode 100644 index 0000000..45c42f6 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/mg.fdv @@ -0,0 +1,369 @@ +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! D V M V E R S I O N ! +! ! +! M G ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is an OpenMP version of the NPB MG code. ! +! It is described in NAS Technical Report 99-011. ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 3.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 3.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/Software/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (650) 604-3957 ! +! ! +!-------------------------------------------------------------------------! + + +c--------------------------------------------------------------------- +c +c Authors: +c Original: +c E. Barszcz +c P. Frederickson +c A. Woo +c M. Yarrow +c H. Jin +c DVM/DVMH vesion: +c A. Shubert +c Optimized for DVM/DVMH: +c A. Kolganov +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Программа Ñ€ÐµÑˆÐ°ÑŽÑ‰Ð°Ñ ÑƒÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ðµ ПуаÑона многоÑеточным методом (V-цикл) +c--------------------------------------------------------------------- + program mg +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + include 'dvmvars.h' + +c---------------------------------------------------------------------------c +c k is the current level. It is passed down through subroutine args +c and is NOT global. it is the current iteration +c---------------------------------------------------------------------------c + + integer k, it, pdim, pi + + external timer_read + double precision t, tinit, mflops, timer_read + +c---------------------------------------------------------------------------c +c These arrays are in common because they are quite large +c and probably shouldn't be allocated on the stack. They +c are always passed as subroutine args. +c---------------------------------------------------------------------------c + + double precision rnm2, rnmu, epsilon + integer n1, n2, n3, nit + double precision nn, verify_value, err, t_1,t_2 + logical verified + + integer i, fstatus + character t_names(t_last)*8 + double precision tmax, elapsed_time + + do i = T_init, T_last + call timer_clear(i) + end do + +c--------------------------------------------------------------------- +c Read in and broadcast input data +c--------------------------------------------------------------------- + + open(unit=7,file='timer.flag', status='old', iostat=fstatus) + if (fstatus .eq. 0) then + timeron = .true. + t_names(t_init) = 'init' + t_names(t_bench) = 'benchmk' + t_names(t_mg3P) = 'mg3P' + t_names(t_psinv) = 'psinv' + t_names(t_resid) = 'resid' + t_names(t_rprj3) = 'rprj3' + t_names(t_interp) = 'interp' + t_names(t_norm2) = 'norm2' + t_names(t_comm3) = 'comm3' + close(7) + else + timeron = .false. + endif + + write (*, 1000) + + open(unit=7,file="mg.input", status="old", iostat=fstatus) + if (fstatus .eq. 0) then + write(*,50) + 50 format(' Reading from input file mg.input') + read(7,*) lt + read(7,*) nx(lt), ny(lt), nz(lt) + read(7,*) nit + read(7,*) (debug_vec(i),i=0,7) + else + write(*,51) + 51 format(' No input file. Using compiled defaults ') + lt = lt_default + nit = nit_default + nx(lt) = nx_default + ny(lt) = ny_default + nz(lt) = nz_default + do i = 0,7 + debug_vec(i) = debug_default + end do + endif + + + if ( (nx(lt) .ne. ny(lt)) .or. (nx(lt) .ne. nz(lt)) ) then + Class = 'U' + else if( nx(lt) .eq. 32 .and. nit .eq. 4 ) then + Class = 'S' + else if( nx(lt) .eq. 128 .and. nit .eq. 4 ) then + Class = 'W' + else if( nx(lt) .eq. 256 .and. nit .eq. 4 ) then + Class = 'A' + else if( nx(lt) .eq. 256 .and. nit .eq. 20 ) then + Class = 'B' + else if( nx(lt) .eq. 512 .and. nit .eq. 20 ) then + Class = 'C' + else if( nx(lt) .eq. 1024 .and. nit .eq. 50 ) then + Class = 'D' + else if( nx(lt) .eq. 2048 .and. nit .eq. 50 ) then + Class = 'E' + else + Class = 'U' + endif + +c--------------------------------------------------------------------- +c Use these for debug info: +c--------------------------------------------------------------------- +c debug_vec(0) = 1 !=> report all norms +c debug_vec(1) = 1 !=> some setup information +c debug_vec(1) = 2 !=> more setup information +c debug_vec(2) = k => at level k or below, show result of resid +c debug_vec(3) = k => at level k or below, show result of psinv +c debug_vec(4) = k => at level k or below, show result of rprj +c debug_vec(5) = k => at level k or below, show result of interp +c debug_vec(6) = 1 => (unused) +c debug_vec(7) = 1 => (unused) +c--------------------------------------------------------------------- + a(0) = -8.0D0/3.0D0 + a(1) = 0.0D0 + a(2) = 1.0D0/6.0D0 + a(3) = 1.0D0/12.0D0 + + if(Class .eq. 'A' .or. Class .eq. 'S'.or. Class .eq.'W') then +c--------------------------------------------------------------------- +c Coefficients for the S(a) smoother +c--------------------------------------------------------------------- + c(0) = -3.0D0/8.0D0 + c(1) = +1.0D0/32.0D0 + c(2) = -1.0D0/64.0D0 + c(3) = 0.0D0 + else +c--------------------------------------------------------------------- +c Coefficients for the S(b) smoother +c--------------------------------------------------------------------- + c(0) = -3.0D0/17.0D0 + c(1) = +1.0D0/33.0D0 + c(2) = -1.0D0/61.0D0 + c(3) = 0.0D0 + endif + lb = 1 + k = lt + +c********************************************************************** +c********************************************************************** +c********************* START HERE ************************************* +c********************************************************************** +c********************************************************************** + + call setup(n1,n2,n3,k) + call setupDVM(0) + + call timer_start(T_init) + + call zero3(u(pu),n1,n2,n3) + call zran3(v(pv),n1,n2,n3,nx(lt),ny(lt),k,class) + + write (*, 1001) nx(lt),ny(lt),nz(lt), Class + write (*, 1002) nit + write (*, *) + + pdim = PROCESSORS_RANK() + write (*, 310) pdim + do pi=1, pdim + write (*, 311) pi, PROCESSORS_SIZE(pi) + enddo + write (*, *) ' ' + + 310 format(' Processors grid rank: ', i4) + 311 format(' Grid dimension [', i4, '] size: ', i4) + + 1000 format(//,' NAS Parallel Benchmarks (NPB3.3-DVMH)', + > ' - MG Benchmark', /) + 1001 format(' Size: ', i4, 'x', i4, 'x', i4, ' (class ', A, ')' ) + 1002 format(' Iterations: ', i5) + + call resid(u(pu),v(pv),r(pr),n1,n2,n3,a,k) + +c--------------------------------------------------------------------- +c One iteration for startup +c--------------------------------------------------------------------- + call mg3P(n1,n2,n3,k) + call resid(u(pu),v(pv),r(pr),n1,n2,n3,a,k) + call norm2u3(r(pr),n1,n2,n3,rnm2,rnmu,nx(lt),ny(lt),nz(lt)) + call setup(n1,n2,n3,k) + + call zero3(u(pu),n1,n2,n3) + call zran3(v(pv),n1,n2,n3,nx(lt),ny(lt),k,class) + + call timer_stop(T_init) + tinit = timer_read(T_init) + + write( *,'(A,F15.3,A/)' ) + > ' Initialization time: ',tinit, ' seconds' + + do i = T_bench, T_last + call timer_clear(i) + end do + + call timer_start(T_bench) + call resid(u(pu),v(pv),r(pr),n1,n2,n3,a,k) + call norm2u3(r(pr),n1,n2,n3,rnm2,rnmu,nx(lt),ny(lt),nz(lt)) + +! временный вызов +! call timer_start(T_bench) +c***************************************************************** +c********************MAIN LOOP *********************************** +c***************************************************************** + + do it = 1, nit + if (it.eq.1 .or. it.eq.nit .or. mod(it,5).eq.0) then + write(*,80) it + 80 format(' iter ',i3) + endif + call mg3P(n1,n2,n3,k) + call resid(u(pu),v(pv),r(pr),n1,n2,n3,a,k) + enddo + + call norm2u3(r(pr),n1,n2,n3,rnm2,rnmu,nx(lt),ny(lt),nz(lt)) + + call timer_stop(T_bench) + + t = timer_read(T_bench) + + verified = .FALSE. + verify_value = 0.0 + + write(*,100) + 100 format(/' Benchmark completed ') + + epsilon = 1.d-8 + if (Class .ne. 'U') then + if(Class.eq.'S') then + verify_value = 0.5307707005734d-04 + elseif(Class.eq.'W') then + verify_value = 0.6467329375339d-05 + elseif(Class.eq.'A') then + verify_value = 0.2433365309069d-05 + elseif(Class.eq.'B') then + verify_value = 0.1800564401355d-05 + elseif(Class.eq.'C') then + verify_value = 0.5706732285740d-06 + elseif(Class.eq.'D') then + verify_value = 0.1583275060440d-09 + elseif(Class.eq.'E') then + verify_value = 0.5630442584711d-10 + endif + + err = abs( rnm2 - verify_value ) / verify_value + if( err .le. epsilon ) then + verified = .TRUE. + write(*, 200) + write(*, 201) rnm2 + write(*, 202) err + 200 format(' VERIFICATION SUCCESSFUL ') + 201 format(' L2 Norm is ', E20.13) + 202 format(' Error is ', E20.13) + else + verified = .FALSE. + write(*, 300) + write(*, 301) rnm2 + write(*, 302) verify_value + 300 format(' VERIFICATION FAILED') + 301 format(' L2 Norm is ', E20.13) + 302 format(' The correct L2 Norm is ', E20.13) + endif + else + verified = .FALSE. + write (*, 400) + write (*, 401) + write (*, 201) rnm2 + 400 format(' Problem size unknown') + 401 format(' NO VERIFICATION PERFORMED') + endif + + nn = 1.0d0*nx(lt)*ny(lt)*nz(lt) + + if( t .ne. 0. ) then + mflops = 58.*nit*nn*1.0D-6 /t + else + mflops = 0.0 + endif + + call print_results('MG', class, nx(lt), ny(lt), nz(lt), + > nit, t, + > mflops, ' floating point', + > verified, npbversion, compiletime, + > cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + + 600 format( i4, 2e19.12) + +c--------------------------------------------------------------------- +c More timers +c--------------------------------------------------------------------- + if (.not.timeron) goto 999 + + tmax = timer_read(t_bench) + if (tmax .eq. 0.0) tmax = 1.0 + + write(*,800) + 800 format(' SECTION Time (secs)') + do i=t_bench, t_last + t = timer_read(i) + if (i.eq.t_resid2) then + t = timer_read(T_resid) - t + write(*,820) 'mg-resid', t, t*100./tmax + else + write(*,810) t_names(i), t, t*100./tmax + endif + 810 format(2x,a8,':',f9.3,' (',f6.2,'%)') + 820 format(' --> ',a8,':',f9.3,' (',f6.2,'%)') + end do + + 999 continue + + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/mg3p.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/mg3p.fdv new file mode 100644 index 0000000..da735d3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/mg3p.fdv @@ -0,0 +1,167 @@ +c--------------------------------------------------------------------- +c Èòåðàöèÿ ñïóñêà ïî V-öèêëó +c--------------------------------------------------------------------- +c @param integer d1, d2, d3 - ñìåùåíèå íà êðàåâûå óñëîâèÿ +c @param integer k - íîìåð ñåòêè +c--------------------------------------------------------------------- + subroutine VDownIteration(d1, d2, d3, k) + + implicit none + + include 'globals.h' + include 'dvmvars.h' + + integer k + integer d1, d2, d3 + +! !DVM$ GET_ACTUAL(p_curr_r_k) + !write (*,*) 'R(',k,') down: ' + !call printMatrix(r(p_curr_r_k), m1(k),m2(k),m3(k)); + !stop + + call rprj3( + > r(p_curr_r_k),m1(k),m2(k),m3(k), + > r(p_curr_r_j),m1(k-1),m2(k-1),m3(k-1), + > k, d1, d2, d3 + > ) + +! !DVM$ GET_ACTUAL(p_curr_r_j) + !write (*,*) 'R(',k-1,') down: ' + !call printMatrix(r(p_curr_r_j), m1(k-1),m2(k-1),m3(k-1)); + !stop + + return + end + +c--------------------------------------------------------------------- +c Èòåðàöèÿ ïîäúåìà ïî V-öèêëó +c--------------------------------------------------------------------- +c @param integer k - íîìåð ñåòêè +c--------------------------------------------------------------------- + subroutine VUpIteration(k) + + implicit none + + include 'globals.h' + include 'dvmvars.h' + + integer k + integer m1k, m2k, m3k + +c--------------------------------------------------------------------- +c prolongate from level k-1 to k +c--------------------------------------------------------------------- + call zero3(u(p_curr_u_k),m1(k),m2(k),m3(k)) + + call interp( + > u(p_curr_u_j),m1(k-1),m2(k-1),m3(k-1), + > u(p_curr_u_k),m1(k),m2(k),m3(k), + > k + > ) + +c--------------------------------------------------------------------- +c compute residual for level k +c--------------------------------------------------------------------- + call resid( + > u(p_curr_u_k), + > r(p_curr_r_k), + > r(p_curr_r_k), + > m1(k),m2(k),m3(k), + > a,k + > ) + + +c--------------------------------------------------------------------- +c apply smoother +c--------------------------------------------------------------------- + call psinv(r(p_curr_r_k),u(p_curr_u_k),m1(k),m2(k),m3(k),c,k) + + return + end + +c--------------------------------------------------------------------- +c Ìíîãîñåòî÷íûé ðåøàòåëü óðàâíåíèÿ Ïóàñîíà +c--------------------------------------------------------------------- + subroutine mg3P(n1,n2,n3,k) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c multigrid V-cycle routine +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + include 'dvmvars.h' + + integer n1, n2, n3, k + + integer j, d1, d2, d3 + +c--------------------------------------------------------------------- +c down cycle. +c restrict the residual from the find grid to the coarse +c--------------------------------------------------------------------- +!!DVM$ INTERVAL 1 + p_curr_r_j = pr + + do k= lt, lb+1 , -1 + j = k-1 + + p_curr_r_k = p_curr_r_j + p_curr_r_j = p_r_ir(j) + + if(m1(k).eq.3)then; d1 = 2; else; d1 = 1; endif + if(m2(k).eq.3)then; d2 = 2; else; d2 = 1; endif + if(m3(k).eq.3)then; d3 = 2; else; d3 = 1; endif + + call VDownIteration(d1,d2,d3,k) + enddo +!!DVM$ END INTERVAL + +c--------------------------------------------------------------------- +c compute an approximate solution on the coarsest grid +c--------------------------------------------------------------------- +!!DVM$ INTERVAL 5 + k = lb + + p_curr_u_k = p_u_ir(k) + p_curr_r_k = p_r_ir(k) + + call zero3(u(p_curr_u_k),m1(k),m2(k),m3(k)) + call psinv(r(p_curr_r_k),u(p_curr_u_k),m1(k),m2(k),m3(k),c,k) +!!DVM$ END INTERVAL + +c--------------------------------------------------------------------- +c up cycle. +c--------------------------------------------------------------------- +!!DVM$ INTERVAL 6 + do k = lb+1, lt-1 + j = k-1 + + p_curr_u_j = p_curr_u_k + p_curr_u_k = p_u_ir(k) + p_curr_r_k = p_r_ir(k) + + call VUpIteration(k) + enddo +!!DVM$ END INTERVAL + + 200 continue + + j = lt - 1 + k = lt + + p_curr_u_j = p_u_ir(j) + + call interp(u(p_curr_u_j),m1(j) ,m2(j) ,m3(j), + > u(pu),m1(k),m2(k),m3(k), + > k + > ) + + call resid (u(pu),v(pv),r(pr),m1(k),m2(k),m3(k),a,k) + + call psinv (r(pr),u(pu),m1(k),m2(k),m3(k),c,k) + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/norm2u3.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/norm2u3.fdv new file mode 100644 index 0000000..a98f21f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/norm2u3.fdv @@ -0,0 +1,51 @@ +c--------------------------------------------------------------------- +c Ðàñ÷åò íîðìû +c--------------------------------------------------------------------- + subroutine norm2u3(r,n1,n2,n3,rnm2,rnmu,nx,ny,nz) +c--------------------------------------------------------------------- +!DVM$ INHERIT r +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c norm2u3 evaluates approximations to the L2 norm and the +c uniform (or L-infinity or Chebyshev) norm, under the +c assumption that the boundaries are periodic or zero. Add the +c boundaries in with half weight (quarter weight on the edges +c and eighth weight at the corners) for inhomogeneous boundaries. +c--------------------------------------------------------------------- + implicit none + + integer n1, n2, n3, nx, ny, nz + double precision rnm2, rnmu, r(n1,n2,n3) + double precision s, a + integer i3, i2, i1 + + double precision dn + + integer T_norm2 + parameter (T_norm2=9) + + dn = 1.0d0*nx*ny*nz + s=0.0D0 + rnmu = 0.0D0 + + +!DVM$ REGION +!DVM$ PARALLEL (i3,i2,i1) ON r(i1,i2,i3), +!DVM$& REDUCTION(SUM(s), MAX(rnmu)), PRIVATE(a) +!DVM$& ,cuda_block(32,4,1) + do i3=2,n3-1 + do i2=2,n2-1 + do i1=2,n1-1 + s=s+r(i1,i2,i3)**2 + a=abs(r(i1,i2,i3)) + rnmu=dmax1(rnmu,a) + enddo + enddo + enddo +!DVM$ END REGION +!!DVM$ END INTERVAL + rnm2=sqrt( s / dn ) + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/psinv.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/psinv.fdv new file mode 100644 index 0000000..97d0723 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/psinv.fdv @@ -0,0 +1,167 @@ +c--------------------------------------------------------------------- +c Èíòåðïîëÿöèÿ ðåøåíèÿ íà îñíîâå íåâÿçêè +c--------------------------------------------------------------------- +c u(h) = u(h) + C r(h) +c ãäå C - âåêòîð-ñòîëáåö êîýôèöåíòîâ ñêëàæèâàíèÿ, +c r - íåâÿçêà +c h - øàã ðàçáèåíèÿ +c--------------------------------------------------------------------- +c Èñïîëüçóåòñÿ: +c - ðåøåíèå çàäà÷è íà ãðóáîé ñåòêå íà äíå V-öèêëà; +c - ñãëàæèâàíèå âûñîêî÷àñòîòíûõ êîìïîíåíò ïðè âîçõîæäåíèè ïî V-öèêëó +c--------------------------------------------------------------------- +c @param double precission :: r(n1,n2,n3) ? r(h) - íåâÿçêà +c @param double precission :: u(n1,n2,n3) ? u(H) - ãðóáàÿ ñåòêà +c @param double precission :: ñ(3) ? Ñ - êîýôèöåíòû ñãëàæèâàíèÿ +c @param integer :: k - òåêóùèé øàã óêðóïíåíèÿ ðàçáèåíèÿ ïåðâîíà÷àëüíîé ñåòêè +c--------------------------------------------------------------------- + subroutine psinv( r,u,n1,n2,n3,c,k) +c--------------------------------------------------------------------- +!DVM$ INHERIT r,u,c +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c psinv applies an approximate inverse as smoother: u = u + Cr +c +c This implementation costs 15A + 4M per result, where +c A and M denote the costs of Addition and Multiplication. +c Presuming coefficient c(3) is zero (the NPB assumes this, +c but it is thus not a general case), 2A + 1M may be eliminated, +c resulting in 13A + 3M. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer n1,n2,n3,k + double precision u(n1,n2,n3),r(n1,n2,n3),c(0:3) + double precision c_0,c_1,c_2, r1,r1_m1,r1_p1, r2,r2_m1,r2_p1 + double precision r3,r3_m1,r3_p1, r4,r4_m1,r4_p1, r5,r5_m1,r5_p1 + integer i3, i2, i1 + + if(Class .eq. 'A' .or. Class .eq. 'S'.or. Class .eq.'W') then + c_0 = -3.0D0/8.0D0 + c_1 = +1.0D0/32.0D0 + c_2 = -1.0D0/64.0D0 + else + c_0 = -3.0D0/17.0D0 + c_1 = +1.0D0/33.0D0 + c_2 = -1.0D0/61.0D0 + endif + +!DVM$ interval 2 + if( ver ) then +!DVM$ REGION +!DVM$ PARALLEL (i3,i2) ON u(*,i2,i3),cuda_block(32,6), +!DVM$& SHADOW_RENEW(r(CORNER)), +!DVM$& private(i1,r1,r1_m1,r1_p1,r2,r2_m1,r2_p1,r3,r3_m1,r3_p1, +!DVM$& r4,r4_m1,r4_p1, r5,r5_m1,r5_p1) + do i3=2,n3-1 + do i2=2,n2-1 + r1_m1=r(1,i2,i3) + r1=r(2,i2,i3) + r2_m1=r(1,i2-1,i3) + r2=r(2,i2-1,i3) + r3_m1=r(1,i2+1,i3) + r3=r(2,i2+1,i3) + r4_m1=r(1,i2,i3+1) + r4=r(2,i2,i3+1) + r5_m1=r(1,i2,i3-1) + r5=r(2,i2,i3-1) + do i1=2,n1-1 + r1_p1=r(i1+1,i2,i3) + r2_p1=r(i1+1,i2-1,i3) + r3_p1=r(i1+1,i2+1,i3) + r4_p1=r(i1+1,i2,i3+1) + r5_p1=r(i1+1,i2,i3-1) + u(i1,i2,i3) = u(i1,i2,i3) + & + c_0 * r1 + & + c_1 * ( r1_m1 + r1_p1 + r2 + r3 + r5 + r4) + & + c_2 * ( r(i1,i2-1,i3-1) + r(i1,i2+1,i3-1) + & + r(i1,i2-1,i3+1) + r(i1,i2+1,i3+1) + & + r2_m1+r3_m1+r5_m1+r4_m1+r2_p1+r3_p1+r5_p1+r4_p1) + r1_m1 = r1 + r1 = r1_p1 + r2_m1 = r2 + r2 = r2_p1 + r3_m1 = r3 + r3 = r3_p1 + r4_m1 = r4 + r4 = r4_p1 + r5_m1 = r5 + r5 = r5_p1 + enddo + enddo + enddo +!DVM$ END REGION + else +!DVM$ REGION +!DVM$ PARALLEL (i3,i1) ON u(i1,*,i3),cuda_block(32,6) +!DVM$& ,private(i2,r1,r1_m1,r1_p1, r2,r2_m1,r2_p1, r3,r3_m1,r3_p1, +!DVM$& r4,r4_m1,r4_p1, r5,r5_m1,r5_p1), SHADOW_RENEW(r(CORNER)) + do i3=2,n3-1 + do i1=2,n1-1 + r1_m1 = r(i1,1,i3) + r1 = r(i1,2,i3) + + r2_m1 = r(i1-1,1,i3) + r2 = r(i1-1,2,i3) + + r3_m1 = r(i1+1,1,i3) + r3 = r(i1+1,2,i3) + + r4_m1 = r(i1,1,i3+1) + r4 = r(i1,2,i3+1) + + r5_m1 = r(i1,1,i3-1) + r5 = r(i1,2,i3-1) + + do i2=2,n2-1 + r1_p1 = r(i1,i2+1,i3) + r2_p1 = r(i1-1,i2+1,i3) + r3_p1 = r(i1+1,i2+1,i3) + r4_p1 = r(i1,i2+1,i3+1) + r5_p1 = r(i1,i2+1,i3-1) + u(i1,i2,i3) = u(i1,i2,i3) + & + c_0 * r1 + & + c_1 * ( r2 + r3 + & + r1_m1 + r1_p1 + & + r4 + r5 + & ) + & + c_2 * ( + & r4_m1 + r4_p1 + & + r5_m1 + r5_p1 + & + r2_m1 + r2_p1 + & + r(i1-1,i2,i3-1) + r(i1-1,i2,i3+1) + & + r3_m1 + r3_p1 + & + r(i1+1,i2,i3-1) + r(i1+1,i2,i3+1) + & ) + r1_m1 = r1 + r1 = r1_p1 + + r2_m1 = r2 + r2 = r2_p1 + + r3_m1 = r3 + r3 = r3_p1 + + r4_m1 = r4 + r4 = r4_p1 + + r5_m1 = r5 + r5 = r5_p1 + enddo + enddo + enddo +!DVM$ END REGION + endif +!DVM$ end interval +c--------------------------------------------------------------------- +c exchange boundary points +c--------------------------------------------------------------------- + call comm3(u,n1,n2,n3,k) + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/resid.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/resid.fdv new file mode 100644 index 0000000..27c57e8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/resid.fdv @@ -0,0 +1,196 @@ +c--------------------------------------------------------------------- +c Óòî÷íåíèå íåâÿçêè +c--------------------------------------------------------------------- +c r(h) = v - A u(h) +c ãäå A - âåêòîð-ñòîëáåö êîýôèöåíòîâ, +c v - ïîãðåøíîñòü (íà âíóòðåííèõ óçëàõ V-öèêëà, îïðåäåëÿåòñÿ íåâÿçêîé) +c h - øàã ðàçáèåíèÿ +c--------------------------------------------------------------------- +c Èñïîëüçóåòñÿ äëÿ óòî÷íåíèÿ íåâÿçêè, ïðè âîñõîæäåíèè ïî V-öèêëó +c--------------------------------------------------------------------- +c @param double precission :: r(n1,n2,n3) ? r(h) - íåâÿçêà +c @param double precission :: v(n1,n2,n3) ? v - ïîãðåøíîñòü +c @param double precission :: a(3) ? A - êîýôèöèåíòû +c @param integer :: k - òåêóùèé øàã óêðóïíåíèÿ ðàçáèåíèÿ ïåðâîíà÷àëüíîé ñåòêè +c--------------------------------------------------------------------- + subroutine resid( u,v,r,n1,n2,n3,a,k ) +c--------------------------------------------------------------------- +!DVM$ INHERIT r, u, a, v +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c resid computes the residual: r = v - Au +c +c This implementation costs 15A + 4M per result, where +c A and M denote the costs of Addition (or Subtraction) and +c Multiplication, respectively. +c Presuming coefficient a(1) is zero (the NPB assumes this, +c but it is thus not a general case), 3A + 1M may be eliminated, +c resulting in 12A + 3M. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer n1,n2,n3,k + double precision u(n1,n2,n3),v(n1,n2,n3),r(n1,n2,n3),a(0:3) + integer i3, i2, i1 + double precision u1_m1,u1,u1_p1, u2_m1,u2,u2_p1, u3_m1,u3,u3_p1 + double precision u4_m1,u4,u4_p1, u5_m1,u5,u5_p1, u6_m1,u6,u6_p1 + double precision u7_m1,u7,u7_p1, u8_m1,u8,u8_p1 + +!DVM$ interval 3 + if ( ver ) then + +!DVM$ REGION +!DVM$ PARALLEL (i3,i2) ON r(*,i2,i3), cuda_block(32,6) +!DVM$& ,private(i1, u1_m1,u1,u1_p1, u2_m1,u2,u2_p1, u3_m1,u3,u3_p1, +!DVM$& u4_m1,u4,u4_p1, u5_m1,u5,u5_p1, u6_m1,u6,u6_p1, +!DVM$& u7_m1,u7,u7_p1, u8_m1,u8,u8_p1),SHADOW_RENEW(u(CORNER)) + do i3=2,n3-1 + do i2=2,n2-1 + u1_m1 = u(1,i2-1,i3-1) + u1 = u(2,i2-1,i3-1) + u2_m1 = u(1,i2+1,i3+1) + u2 = u(2,i2+1,i3+1) + u3_m1 = u(1,i2-1,i3+1) + u3 = u(2,i2-1,i3+1) + u4_m1 = u(1,i2+1,i3-1) + u4 = u(2,i2+1,i3-1) + u5_m1 = u(1,i2+1,i3) + u5 = u(2,i2+1,i3) + u6_m1 = u(1,i2-1,i3) + u6 = u(2,i2-1,i3) + u7_m1 = u(1,i2,i3-1) + u7 = u(2,i2,i3-1) + u8_m1 = u(1,i2,i3+1) + u8 = u(2,i2,i3+1) + do i1=2,n1-1 + u1_p1 = u(i1+1,i2-1,i3-1) + u2_p1 = u(i1+1,i2+1,i3+1) + u3_p1 = u(i1+1,i2-1,i3+1) + u4_p1 = u(i1+1,i2+1,i3-1) + u5_p1 = u(i1+1,i2+1,i3) + u6_p1 = u(i1+1,i2-1,i3) + u7_p1 = u(i1+1,i2,i3-1) + u8_p1 = u(i1+1,i2,i3+1) + r(i1,i2,i3) = v(i1,i2,i3) + & + 8.0D0/3.0D0 * u(i1,i2,i3) - 1.0D0/6.0D0 * + & (u1+u4+u3+u2+u6_m1+u5_m1+u7_m1+u8_m1+u6_p1+u5_p1+u7_p1+u8_p1) + & -1.0D0/12.0D0*(u1_m1+u4_m1+u3_m1+u2_m1+u1_p1+u4_p1+u3_p1+u2_p1) + u1_m1 = u1 + u1 = u1_p1 + u2_m1 = u2 + u2 = u2_p1 + u3_m1 = u3 + u3 = u3_p1 + u4_m1 = u4 + u4 = u4_p1 + u5_m1 = u5 + u5 = u5_p1 + u6_m1 = u6 + u6 = u6_p1 + u7_m1 = u7 + u7 = u7_p1 + u8_m1 = u8 + u8 = u8_p1 + enddo + enddo + enddo +!DVM$ END REGION + + else +!DVM$ REGION +!DVM$ PARALLEL (i3,i1) ON r(i1,*,i3), cuda_block(32,6) +!DVM$& ,private(i2, u1_m1,u1,u1_p1, u2_m1,u2,u2_p1, u3_m1,u3,u3_p1, +!DVM$& u4_m1,u4,u4_p1, u5_m1,u5,u5_p1, u6_m1,u6,u6_p1, +!DVM$& u7_m1,u7,u7_p1, u8_m1,u8,u8_p1),SHADOW_RENEW(u(CORNER)) + do i3=2,n3-1 + do i1=2,n1-1 + u1_m1 = u(i1,1,i3-1) + u1 = u(i1,2,i3-1) + + u2_m1 = u(i1,1,i3+1) + u2 = u(i1,2,i3+1) + + u3_m1 = u(i1-1,1,i3) + u3 = u(i1-1,2,i3) + + u4_m1 = u(i1-1,1,i3-1) + u4 = u(i1-1,2,i3-1) + + u5_m1 = u(i1-1,1,i3+1) + u5 = u(i1-1,2,i3+1) + + u6_m1 = u(i1+1,1,i3) + u6 = u(i1+1,2,i3) + + u7_m1 = u(i1+1,1,i3-1) + u7 = u(i1+1,2,i3-1) + + u8_m1 = u(i1+1,1,i3+1) + u8 = u(i1+1,2,i3+1) + do i2=2,n2-1 + u1_p1 = u(i1,i2+1,i3-1) + u2_p1 = u(i1,i2+1,i3+1) + u3_p1 = u(i1-1,i2+1,i3) + u4_p1 = u(i1-1,i2+1,i3-1) + u5_p1 = u(i1-1,i2+1,i3+1) + u6_p1 = u(i1+1,i2+1,i3) + u7_p1 = u(i1+1,i2+1,i3-1) + u8_p1 = u(i1+1,i2+1,i3+1) + + r(i1,i2,i3) = v(i1,i2,i3) + & + 8.0D0/3.0D0 * u(i1,i2,i3) + & - 1.0D0/6.0D0 * ( + & u1_m1 + u1_p1 + & + u2_m1 + u2_p1 + & + u3_m1 + u3_p1 + & + u4 + u5 + & + u6_m1 + u6_p1 + & + u7 + u8 + & ) + & - 1.0D0/12.0D0 * ( + & u4_m1 + u4_p1 + & + u5_m1 + u5_p1 + & + u7_m1 + u7_p1 + & + u8_m1 + u8_p1 + & ) + u1_m1 = u1 + u1 = u1_p1 + + u2_m1 = u2 + u2 = u2_p1 + + u3_m1 = u3 + u3 = u3_p1 + + u4_m1 = u4 + u4 = u4_p1 + + u5_m1 = u5 + u5 = u5_p1 + + u6_m1 = u6 + u6 = u6_p1 + + u7_m1 = u7 + u7 = u7_p1 + + u8_m1 = u8 + u8 = u8_p1 + enddo + enddo + enddo +!DVM$ END REGION + endif +!DVM$ end interval +c--------------------------------------------------------------------- +c exchange boundary data +c--------------------------------------------------------------------- + call comm3(r,n1,n2,n3,k) + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/rjrp3.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/rjrp3.fdv new file mode 100644 index 0000000..6b8170e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/rjrp3.fdv @@ -0,0 +1,169 @@ +c--------------------------------------------------------------------- +c Òðèëèíåéíàÿ ïðîåêöèÿ (îãðàíè÷åíèå) íåâÿçêè íà ãðóáóþ ñåòêó +c--------------------------------------------------------------------- +c r(H) = P r(h) +c ãäå H = 2h - øàã ðàçáèåíèÿ ñåòêè, +c P - ëèíåéíûé îïåðàòîð òðèëèíåéíîé ïðîåêöèè, +c r - íåâÿçêà +c--------------------------------------------------------------------- +c Èñïîëüçóåòñÿ äëÿ ïîñòðîåíèå ãðóáîé ñåòêè íåâÿçêè, ïðè âîñõîæäåíèè ïî V-öèêëó +c--------------------------------------------------------------------- +c @param double precission :: r(m1k,m2k,m3k) ? r(h) - ïîäðîáíàÿ ñåòêà +c @param double precission :: s(m1j,m2j,m3j) ? r(H) - ãðóáàÿ ñåòêà +c @param double precission :: d1, d2, d3 - ñìåùåíèå íà êðàåâûå óñëîâèÿ +c @param integer :: k - òåêóùèé øàã óêðóïíåíèÿ ðàçáèåíèÿ ïåðâîíà÷àëüíîé ñåòêè +c--------------------------------------------------------------------- + subroutine rprj3( r,m1k,m2k,m3k,s,m1j,m2j,m3j,k, d1,d2,d3) +c--------------------------------------------------------------------- +!DVM$ INHERIT r,s +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c rprj3 projects onto the next coarser grid, +c using a trilinear Finite Element projection: s = r' = P r +c +c This implementation costs 20A + 4M per result, where +c A and M denote the costs of Addition and Multiplication. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer m1k, m2k, m3k, m1j, m2j, m3j,k + double precision r(m1k,m2k,m3k), s(m1j,m2j,m3j) + integer j3, j2, j1, i3, i2, i1, d1, d2, d3, j + double precision r1_m1,r1_p1, r2_m1,r2_p1, r3_m1,r3_p1 + double precision r4_m1,r4_p1, r5_m1,r5_p1, r6_m1,r6_p1 + double precision r7_m1,r7_p1, r8_m1,r8_p1, r9_m1,r9_p1,y2,x2 + +!DVM$ interval 4 + if( ver ) then + +!DVM$ REGION +!DVM$ PARALLEL (j3,j2) ON s(*,j2,j3), SHADOW_RENEW(r(CORNER)), +!DVM$& cuda_block(32,6), PRIVATE(i1, i2, i3, j1, +!DVM$& r1_m1,r1_p1, r2_m1,r2_p1, r3_m1,r3_p1, r4_m1,r4_p1, r5_m1,r5_p1 +!DVM$&,r6_m1,r6_p1, r7_m1,r7_p1, r8_m1,r8_p1, r9_m1,r9_p1,y2,x2) + do j3=2,m3j-1 + do j2=2,m2j-1 + i3 = 2*j3-d3 + i2 = 2*j2-d2 + + r1_m1 = r(2*2-d1-1,i2+1,i3) + r2_m1 = r(2*2-d1-1,i2,i3+1) + r3_m1 = r(2*2-d1-1,i2+1,i3+1) + r4_m1 = r(2*2-d1-1,i2-1,i3) + r5_m1 = r(2*2-d1-1,i2,i3-1) + r6_m1 = r(2*2-d1-1,i2-1,i3-1) + r7_m1 = r(2*2-d1-1,i2,i3) + r8_m1 = r(2*2-d1-1,i2-1,i3+1) + r9_m1 = r(2*2-d1-1,i2+1,i3-1) + + do j1=2,m1j-1 + i1 = 2*j1-d1 + r1_p1 = r(i1+1,i2+1,i3) + r2_p1 = r(i1+1,i2,i3+1) + r3_p1 = r(i1+1,i2+1,i3+1) + r4_p1 = r(i1+1,i2-1,i3) + r5_p1 = r(i1+1,i2,i3-1) + r6_p1 = r(i1+1,i2-1,i3-1) + r7_p1 = r(i1+1,i2,i3) + r8_p1 = r(i1+1,i2-1,i3+1) + r9_p1 = r(i1+1,i2+1,i3-1) + + y2 = r(i1, i2-1,i3-1) + r(i1, i2-1,i3+1) + & + r(i1, i2+1,i3-1) + r(i1, i2+1,i3+1) + x2 = r(i1, i2-1,i3 ) + r(i1, i2+1,i3 ) + & + r(i1, i2, i3-1) + r(i1, i2, i3+1) + s(j1,j2,j3) = + & 0.5D0 * r(i1,i2,i3) + & + 0.25D0 * ( r7_m1 + r7_p1 + x2) + & + 0.125D0 * ( r4_m1 + r1_m1 + r5_m1 + r2_m1 + + & r4_p1 + r1_p1 + r5_p1 + r2_p1 + y2) + & + 0.0625D0 * ( r6_m1 + r8_m1 + & + r9_m1 + r3_m1 + r6_p1 + r8_p1 + r9_p1 + r3_p1) + r1_m1 = r1_p1 + r2_m1 = r2_p1 + r3_m1 = r3_p1 + r4_m1 = r4_p1 + r5_m1 = r5_p1 + r6_m1 = r6_p1 + r7_m1 = r7_p1 + r8_m1 = r8_p1 + r9_m1 = r9_p1 + enddo + enddo + enddo +!DVM$ END REGION + + else +!DVM$ REGION +!DVM$ PARALLEL (j3,j1) ON s(j1,*,j3), SHADOW_RENEW(r(CORNER)), +!DVM$& cuda_block(32,6), PRIVATE(i1, i2, i3, j2, +!DVM$& r1_m1,r1_p1, r2_m1,r2_p1, r3_m1,r3_p1, r4_m1,r4_p1, r5_m1,r5_p1 +!DVM$&,r6_m1,r6_p1, r7_m1,r7_p1, r8_m1,r8_p1, r9_m1,r9_p1) + do j3=2,m3j-1 + do j1=2,m1j-1 + i3 = 2*j3-d3 + i1 = 2*j1-d1 + + r1_m1 = r(i1,2*2-d2-1,i3) + r2_m1 = r(i1-1,2*2-d2-1,i3) + r3_m1 = r(i1+1,2*2-d2-1,i3) + r4_m1 = r(i1,2*2-d2-1,i3+1) + r5_m1 = r(i1,2*2-d2-1,i3-1) + r6_m1 = r(i1+1,2*2-d2-1,i3+1) + r7_m1 = r(i1+1,2*2-d2-1,i3-1) + r8_m1 = r(i1-1,2*2-d2-1,i3-1) + r9_m1 = r(i1-1,2*2-d2-1,i3+1) + do j2=2,m2j-1 + i2 = 2*j2-d2 + r1_p1 = r(i1,i2+1,i3) + r2_p1 = r(i1-1,i2+1,i3) + r3_p1 = r(i1+1,i2+1,i3) + r4_p1 = r(i1,i2+1,i3+1) + r5_p1 = r(i1,i2+1,i3-1) + r6_p1 = r(i1+1,i2+1,i3+1) + r7_p1 = r(i1+1,i2+1,i3-1) + r8_p1 = r(i1-1,i2+1,i3-1) + r9_p1 = r(i1-1,i2+1,i3+1) + s(j1,j2,j3) = + & 0.5D0 * r(i1,i2,i3) + & + 0.25D0 * ( r1_m1 + r1_p1 + + & r(i1-1,i2,i3) + r(i1+1,i2,i3) + & + r(i1,i2,i3-1) + r(i1,i2,i3+1)) + & + 0.125D0 * ( + & r2_m1 + r2_p1 + r3_m1 + r3_p1 + & + r5_m1 + r4_m1 + & + r5_p1 + r4_p1 + & + r(i1-1,i2, i3-1) + r(i1-1,i2, i3+1) + & + r(i1+1,i2, i3-1) + r(i1+1,i2, i3+1)) + & + 0.0625D0 * ( + & r8_m1 + r9_m1 + & + r8_p1 + r9_p1 + & + r7_m1 + r6_m1 + & + r7_p1 + r6_p1) + + r1_m1 = r1_p1 + r2_m1 = r2_p1 + r3_m1 = r3_p1 + r4_m1 = r4_p1 + r5_m1 = r5_p1 + r6_m1 = r6_p1 + r7_m1 = r7_p1 + r8_m1 = r8_p1 + r9_m1 = r9_p1 + enddo + + enddo + enddo +!DVM$ END REGION + endif +!DVM$ end interval + j = k-1 + call comm3(s,m1j,m2j,m3j,j) + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/setupDVM.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/setupDVM.fdv new file mode 100644 index 0000000..2b3a49c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/setupDVM.fdv @@ -0,0 +1,226 @@ + +c--------------------------------------------------------------------- +c Âûðàâíèâàíèå ìàññèâîâ äëÿ ñïóñêà ïî V-öèêëó +c @param integer d1, d2, d3 - ñìåùåíèå íà êðàåâûå óñëîâèÿ +c @param integer k - íîìåð ñåòêè +c--------------------------------------------------------------------- + subroutine dvmAlignDownCycle(d1, d2, d3, k) + + implicit none + + include 'globals.h' + include 'dvmvars.h' + + integer k + integer d1, d2, d3 + + integer t1, t2, t3 + +!DVM$ TEMPLATE EXT_V_DOWN (m1(k)+1, m2(k)+1, m3(k)+1) +!DVM$ DISTRIBUTE EXT_V_DOWN (BLOCK, BLOCK, BLOCK) + + t1 = d1 - 1; t2 = d2 - 1; t3 = d3 - 1; + +!DVM$ REALIGN p_curr_r_j(i,j,k) WITH EXT_V_DOWN(2*i-1, 2*j-1, 2*k-1) +!DVM$ REALIGN p_curr_r_k(i,j,k) WITH EXT_V_DOWN(i+t1, j+t2, k+t3) + + return + end + +c--------------------------------------------------------------------- +c Âûðàâíèâàíèå ìàññèâîâ äëÿ ïîäúåìà ïî V-öèêëó +c @param integer d1, d2, d3 - ñìåùåíèå íà êðàåâûå óñëîâèÿ +c @param integer k - íîìåð ñåòêè +c--------------------------------------------------------------------- + subroutine dvmAlignUpCycle(k) + + implicit none + + include 'globals.h' + include 'dvmvars.h' + + integer k + +!!DVM$ SHADOW p_curr_u_k(1:1,1:1,1:1) +!!DVM$ SHADOW p_curr_u_j(1:1,1:1,1:1) + +!DVM$ TEMPLATE EXT_V_UP (m1(k)+1, m2(k)+1, m3(k)+1) +!DVM$ DISTRIBUTE EXT_V_UP (BLOCK, BLOCK, BLOCK) + +!DVM$ REALIGN p_curr_u_j(i,j,k) WITH EXT_V_UP(2*i-1, 2*j-1, 2*k-1) +!DVM$ REALIGN p_curr_u_k(i,j,k) WITH EXT_V_UP(i, j, k) +!DVM$ REALIGN p_curr_r_k(i,j,k) WITH EXT_V_UP(i, j, k) + + return + end + +c--------------------------------------------------------------------- +c Èíèöèàëèçàöèÿ ïàðàìåòðîâ DVM +c @param integer isSecond - 1 ïðè ïîâòîðíîì âûçîâå +c--------------------------------------------------------------------- + subroutine setupDVM(isSecond) + implicit none + + include 'globals.h' + include 'dvmvars.h' + + integer allocate, k, j, isSecond + integer pdim(3) + integer d1, d2, d3 + +!DVM$ TEMPLATE EXT_BOTTOM (m1(lb), m2(lb), m3(lb)) +!DVM$ DISTRIBUTE EXT_BOTTOM (BLOCK, BLOCK, BLOCK) + +!DVM$ TEMPLATE EXT_LAST (m1(lt)+1, m2(lt)+1, m3(lt)+1) +!DVM$ DISTRIBUTE EXT_LAST (BLOCK, BLOCK, BLOCK) + + if (isSecond .eq. 0) then + ! Âûäåëÿåì ìàññèâ óêîçàòåëåé + do k = lt, 1, -1 + pdim =(/ m1(k), m2(k), m3(k) /) + p_u_ir(k) = allocate(pdim, ir(k)) + p_r_ir(k) = allocate(pdim, ir(k)) + enddo + + ! Âûäåëÿåì ïàìÿòü â êó÷å ïîä íåâÿçêó + pdim =(/ m1(lt), m2(lt), m3(lt) /) + pv = allocate(pdim, 1) + + ! Äîáàâëÿåì ñîêðàùåíèÿ + pu = p_u_ir(lt) + pr = p_r_ir(lt) + endif + + ! Âûðàâíèâàåì íà ñïóñê + p_curr_r_j = pr + do k= lt, lb+1 , -1 + j = k-1 + p_curr_r_k = p_curr_r_j + p_curr_r_j = p_r_ir(j) + + if(m1(k).eq.3)then; d1 = 2; else; d1 = 1; endif + if(m2(k).eq.3)then; d2 = 2; else; d2 = 1; endif + if(m3(k).eq.3)then; d3 = 2; else; d3 = 1; endif + + call dvmAlignDownCycle(d1, d2, d3, k) + enddo + + ! Âûðàâíèâàåì äíî + k = lb + p_curr_u_k = p_u_ir(k) + p_curr_r_k = p_r_ir(k) +!DVM$ REALIGN (i, j, k) WITH EXT_BOTTOM(i,j,k) :: p_curr_u_k +!DVM$ REALIGN (i, j, k) WITH EXT_BOTTOM(i,j,k) :: p_curr_r_k + + ! Âûðàâíèâàåì ïîäúåì + do k = lb+1, lt-1 + j = k-1 + + p_curr_u_j = p_curr_u_k + p_curr_u_k = p_u_ir(k) + p_curr_r_k = p_r_ir(k) + + call dvmAlignUpCycle(k) + enddo + + ! Âûðàâíèâàåì ïîñëåäíþþ èòåðàöèþ + j = lt - 1 + k = lt + + p_curr_u_j = p_u_ir(j) + +!DVM$ REALIGN p_curr_u_j(i,j,k) WITH EXT_LAST(2*i-1, 2*j-1, 2*k-1) +!DVM$ REALIGN pu(i,j,k) WITH EXT_LAST(i, j, k) +!DVM$ REALIGN pr(i,j,k) WITH EXT_LAST(i, j, k) +!DVM$ REALIGN pv(i,j,k) WITH EXT_LAST(i, j, k) + + end subroutine setupDVM + + +c--------------------------------------------------------------------- +c Çàãëóøêà äëÿ DVM +c--------------------------------------------------------------------- + function allocate(dims, disp) + integer allocate + allocate = disp + return + end function allocate + +c--------------------------------------------------------------------- +c Èíèöèàëèçàöèÿ ïàðàìåòðîâ ïðîãðàììû +c--------------------------------------------------------------------- + subroutine setup(n1,n2,n3,k) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + + include 'globals.h' + + integer is1, is2, is3, ie1, ie2, ie3 + common /grid/ is1,is2,is3,ie1,ie2,ie3 + + integer n1,n2,n3,k + integer j + + integer ax, mi(3,maxlevel) + integer ng(3,maxlevel) + + ng(1,lt) = nx(lt) + ng(2,lt) = ny(lt) + ng(3,lt) = nz(lt) + do ax=1,3 + do k=lt-1,1,-1 + ng(ax,k) = ng(ax,k+1)/2 + enddo + enddo + 61 format(10i4) + do k=lt,1,-1 + nx(k) = ng(1,k) + ny(k) = ng(2,k) + nz(k) = ng(3,k) + enddo + + do k = lt,1,-1 + do ax = 1,3 + mi(ax,k) = 2 + ng(ax,k) + enddo + + m1(k) = mi(1,k) + m2(k) = mi(2,k) + m3(k) = mi(3,k) + + enddo + + k = lt + is1 = 2 + ng(1,k) - ng(1,lt) + ie1 = 1 + ng(1,k) + n1 = 3 + ie1 - is1 + is2 = 2 + ng(2,k) - ng(2,lt) + ie2 = 1 + ng(2,k) + n2 = 3 + ie2 - is2 + is3 = 2 + ng(3,k) - ng(3,lt) + ie3 = 1 + ng(3,k) + n3 = 3 + ie3 - is3 + + + ir(lt)=1 + do j = lt-1, 1, -1 + ir(j)=ir(j+1)+one*m1(j+1)*m2(j+1)*m3(j+1) + enddo + + if( debug_vec(1) .ge. 1 )then + write(*,*)' in setup, ' + write(*,*)' k lt nx ny nz ', + & ' n1 n2 n3 is1 is2 is3 ie1 ie2 ie3' + write(*,9) k,lt,ng(1,k),ng(2,k),ng(3,k), + & n1,n2,n3,is1,is2,is3,ie1,ie2,ie3 + 9 format(15i4) + endif + + k = lt + + return + end + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/utilities.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/utilities.fdv new file mode 100644 index 0000000..25056c7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/utilities.fdv @@ -0,0 +1,415 @@ +c--------------------------------------------------------------------- +c Çàïîëíåíèå òðåõìåðíîé ìàòðèöè íóëÿìè +c--------------------------------------------------------------------- +c @param double precission :: z(n1 ,n2 ,n3) - íåêîòîðàÿ ìàòðèöà +c--------------------------------------------------------------------- + subroutine zero3(z,n1,n2,n3) +c--------------------------------------------------------------------- +!DVM$ INHERIT z +c--------------------------------------------------------------------- + + implicit none + + integer n1, n2, n3 + double precision z(n1,n2,n3) + integer i1, i2, i3 + +!!DVM$ INTERVAL 3 +!DVM$ REGION +!DVM$ PARALLEL (i3,i2,i1) ON z(i1,i2,i3), PRIVATE(i3,i2,i1) +!DVM$&, cuda_block(32,6) + do i3=1,n3 + do i2=1,n2 + do i1=1,n1 + z(i1,i2,i3)=0.0D0 + enddo + enddo + enddo +!DVM$ END REGION +!!DVM$ END INTERVAL + + return + end + + +c----- end of program ------------------------------------------------ + +c -- DEBUG -------------------------------------------------------- + + subroutine printMatrix(a,n1,n2,n3) +c--------------------------------------------------------------------- +!DVM$ INHERIT a + integer n1,n2,n3,i1,i2,i3 + double precision a(n1,n2,n3), z(n2) + integer m1, m2, m3 + + write(*,*) 'MATRIX ------------------' + write(*,*) a + write(*,*) ' ' +! m1 = min(n1,18) +! m2 = min(n2,14) +! m3 = min(n3,18) + +! write(*,*)' ' +! do i3=1,m3 +! do i1=1,m1 +! do i2=1,m2 +! z(i2) = a(i1,i2,i3) +! enddo +! write(*,6)(z(i2),i2=1,m2) +! enddo +! write(*,*)' - - - - - - - ' +! enddo +! write(*,*)' ' +! 6 format(15f6.3) + + return + end + + subroutine printMatrixNN(a,n1,n2,n3) +c--------------------------------------------------------------------- +!DVM$ INHERIT a + integer n1, n2, n3 + double precision a(n1,n2,n3), z + + do i3=1,n3 + do i2=1,n2 + do i1=1,n1 + z = a(i1,i2,i3) + if (z.ne.0) then + write(*,*) '(',i1,',',i2,',',i3,')=',z + endif + enddo + enddo + enddo + + end + + +c -- EXTERNAL -------------------------------------------------------- + + subroutine timer_clear(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + elapsed(n) = 0.0 + return + end + + subroutine timer_start(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + start(n) = elapsed_time() + return + end + + subroutine timer_stop(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + double precision t, now + + now = elapsed_time() + t = now - start(n) + elapsed(n) = elapsed(n) + t + return + end + + + double precision function timer_read(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + timer_read = elapsed(n) + return + end + + double precision function elapsed_time() + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + implicit none + + double precision t + double precision dvtime + + data t/0.d0/ +c This function must measure wall clock time, not CPU time. +c Since there is no portable timer in Fortran (77) +c we call a routine compiled in C (though the C source may have +c to be tweaked). + t = dvtime() +c The following is not ok for "official" results because it reports +c CPU time not wall clock time. It may be useful for developing/testing +c on timeshared Crays, though. +c call second(t) + + elapsed_time = t + + return + end + + subroutine print_results(name, class, n1, n2, n3, niter, + > t, mops, optype, verified, npbversion) +c ,compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + implicit none + character*2 name + character*1 class + integer n1, n2, n3, niter, j + double precision t, mops + character optype*24, size*13 + logical verified + character*5 npbversion +c > , compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7 + + write (*, 2) name + 2 format(//, ' ', A2, ' Benchmark Completed.') + + write (*, 3) Class + 3 format(' Class = ', 12x, a12) + +c If this is not a grid-based problem (EP, FT, CG), then +c we only print n1, which contains some measure of the +c problem size. In that case, n2 and n3 are both zero. +c Otherwise, we print the grid size n1xn2xn3 + + if ((n2 .eq. 0) .and. (n3 .eq. 0)) then + if (name(1:2) .eq. 'EP') then + write(size, '(f12.0)' ) 2.d0**n1 + do j =13,1,-1 + if (size(j:j) .eq. '.') size(j:j) = ' ' + end do + write (*,42) size + 42 format(' Size = ',12x, a14) + else + write (*,44) n1 + 44 format(' Size = ',12x, i12) + endif + else + write (*, 4) n1,n2,n3 + 4 format(' Size = ',12x, i3,'x',i3,'x',i3) + endif + + write (*, 5) niter + 5 format(' Iterations = ', 12x, i12) + + write (*, 6) t + 6 format(' Time in seconds = ',12x, f12.2) + + write (*,9) mops + 9 format(' Mop/s total = ',12x, f12.2) + + write(*, 11) optype + 11 format(' Operation type = ', a24) + + if (verified) then + write(*,12) ' SUCCESSFUL' + else + write(*,12) 'UNSUCCESSFUL' + endif + 12 format(' Verification = ', 12x, a) + + write(*,13) npbversion + 13 format(' Version = ', 12x, a12) + +c write(*,14) compiletime +c 14 format(' Compile date = ', 12x, a12) + + +c write (*,121) cs1 +c 121 format(/, ' Compile options:', /, +c > ' F77 = ', A) + +c write (*,122) cs2 +c 122 format(' FLINK = ', A) + +c write (*,123) cs3 +c 123 format(' F_LIB = ', A) +c +c write (*,124) cs4 +c 124 format(' F_INC = ', A) +c +c write (*,125) cs5 +c 125 format(' FFLAGS = ', A) +c +c write (*,126) cs6 +c 126 format(' FLINKFLAGS = ', A) +c +c write(*, 127) cs7 +c 127 format(' RAND = ', A) + + write (*,130) + 130 format(//' Please send the results of this run to:'// + > ' NPB Development Team '/ + > ' Internet: npb@nas.nasa.gov'/ + > ' '/ + > ' If email is not available, send this to:'// + > ' MS T27A-1'/ + > ' NASA Ames Research Center'/ + > ' Moffett Field, CA 94035-1000'// + > ' Fax: 415-604-3957'//) + + + return + end + + + double precision function randlc (x, a) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c This routine returns a uniform pseudorandom double precision number in the +c range (0, 1) by using the linear congruential generator +c +c x_{k+1} = a x_k (mod 2^46) +c +c where 0 < x_k < 2^46 and 0 < a < 2^46. This scheme generates 2^44 numbers +c before repeating. The argument A is the same as 'a' in the above formula, +c and X is the same as x_0. A and X must be odd double precision integers +c in the range (1, 2^46). The returned value RANDLC is normalized to be +c between 0 and 1, i.e. RANDLC = 2^(-46) * x_1. X is updated to contain +c the new seed x_1, so that subsequent calls to RANDLC using the same +c arguments will generate a continuous sequence. +c +c This routine should produce the same results on any computer with at least +c 48 mantissa bits in double precision floating point data. On 64 bit +c systems, double precision should be disabled. +c +c David H. Bailey October 26, 1990 +c +c--------------------------------------------------------------------- + + implicit none + + double precision r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + randlc = r46 * x + + return + end + + subroutine vranlc (n, x, a, y) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c This routine generates N uniform pseudorandom double precision numbers in +c the range (0, 1) by using the linear congruential generator +c +c x_{k+1} = a x_k (mod 2^46) +c +c where 0 < x_k < 2^46 and 0 < a < 2^46. This scheme generates 2^44 numbers +c before repeating. The argument A is the same as 'a' in the above formula, +c and X is the same as x_0. A and X must be odd double precision integers +c in the range (1, 2^46). The N results are placed in Y and are normalized +c to be between 0 and 1. X is updated to contain the new seed, so that +c subsequent calls to VRANLC using the same arguments will generate a +c continuous sequence. If N is zero, only initialization is performed, and +c the variables X, A and Y are ignored. +c +c This routine is the standard version designed for scalar or RISC systems. +c However, it should produce the same results on any single processor +c computer with at least 48 mantissa bits in double precision floating point +c data. On 64 bit systems, double precision should be disabled. +c +c--------------------------------------------------------------------- + + implicit none + + integer i,n + double precision y,r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + dimension y(*) + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Generate N results. This loop is not vectorizable. +c--------------------------------------------------------------------- + do i = 1, n + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + y(i) = r46 * x + enddo + return + end +c--------------------------------------------------------------------- \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/zran3.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/zran3.fdv new file mode 100644 index 0000000..8311672 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG/zran3.fdv @@ -0,0 +1,431 @@ + +c--------------------------------------------------------------------- +c Çàïîëíåíèå òðåõìåðíîé ìàòðèöè ïñåâäî-ñëó÷àéíûìè ÷èñëàìè +c--------------------------------------------------------------------- +c @param double precission :: z(n1 ,n2 ,n3) - íåêîòîðàÿ ìàòðèöà +c @param integer :: k - ôèêòèâíûé ïàðàìåòð +c--------------------------------------------------------------------- + subroutine zran3(z,n1,n2,n3,nx,ny,k,class) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c zran3 loads +1 at ten randomly chosen points, +c loads -1 at a different ten random points, +c and zero elsewhere. +c--------------------------------------------------------------------- + implicit none + include 'npbparams.h' +!DVM$ INHERIT z +!DVM$ DYNAMIC z + integer is1, is2, is3, ie1, ie2, ie3,i3b,i3e,i2b,i1b + common /grid/ is1,is2,is3,ie1,ie2,ie3 + + integer n1, n2, n3, k, nx, ny, ierr, i0, m0, m1 + double precision z(n1,n2,n3),zz(2+2**ndim1) + + character*1 class + integer mm, i1, i2, i3, d1, e1, e2, e3,ii2,ii1 + double precision x, a, max_val, min_val + double precision xx, x0, x1, a1, a2, ai + parameter( mm = 10, a = 5.D0 ** 13, x = 314159265.D0) + double precision ten( mm, 0:1 ), temp, best + integer i, j1( mm, 0:1 ), j2( mm, 0:1 ), j3( mm, 0:1 ) + integer jg( 0:3, mm, 0:1 ), jg_temp(4) + integer id1,id2,id3,idx1,idx2,idx3,nj,x22 + + call zero3(z,n1,n2,n3) + + if(Class .eq. 'S') then + j1( 10,1)= 9 + j1( 10,0)= 2 + j2( 10,1)= 3 + j2( 10,0)= 13 + j3( 10,1)= 22 + j3( 10,0)= 4 + ten( 10,1)= 0.9999958165E+00 + ten( 10,0)= 0.1621806298E-04 + j1( 9,1)= 21 + j1( 9,0)= 15 + j2( 9,1)= 31 + j2( 9,0)= 10 + j3( 9,1)= 33 + j3( 9,0)= 19 + ten( 9,1)= 0.9999389618E+00 + ten( 9,0)= 0.7495597642E-04 + j1( 8,1)= 4 + j1( 8,0)= 7 + j2( 8,1)= 2 + j2( 8,0)= 16 + j3( 8,1)= 5 + j3( 8,0)= 2 + ten( 8,1)= 0.9999174510E+00 + ten( 8,0)= 0.1889568795E-03 + j1( 7,1)= 6 + j1( 7,0)= 6 + j2( 7,1)= 24 + j2( 7,0)= 30 + j3( 7,1)= 5 + j3( 7,0)= 17 + ten( 7,1)= 0.9998666211E+00 + ten( 7,0)= 0.1958622020E-03 + j1( 6,1)= 3 + j1( 6,0)= 14 + j2( 6,1)= 18 + j2( 6,0)= 4 + j3( 6,1)= 23 + j3( 6,0)= 3 + ten( 6,1)= 0.9998273669E+00 + ten( 6,0)= 0.2522906835E-03 + j1( 5,1)= 23 + j1( 5,0)= 7 + j2( 5,1)= 33 + j2( 5,0)= 19 + j3( 5,1)= 8 + j3( 5,0)= 10 + ten( 5,1)= 0.9997817402E+00 + ten( 5,0)= 0.2966875037E-03 + j1( 4,1)= 14 + j1( 4,0)= 22 + j2( 4,1)= 17 + j2( 4,0)= 21 + j3( 4,1)= 14 + j3( 4,0)= 13 + ten( 4,1)= 0.9997789044E+00 + ten( 4,0)= 0.3082809722E-03 + j1( 3,1)= 32 + j1( 3,0)= 28 + j2( 3,1)= 6 + j2( 3,0)= 17 + j3( 3,1)= 27 + j3( 3,0)= 33 + ten( 3,1)= 0.9997405518E+00 + ten( 3,0)= 0.3944731504E-03 + j1( 2,1)= 30 + j1( 2,0)= 10 + j2( 2,1)= 2 + j2( 2,0)= 27 + j3( 2,1)= 30 + j3( 2,0)= 24 + ten( 2,1)= 0.9997394292E+00 + ten( 2,0)= 0.4423527428E-03 + j1( 1,1)= 19 + j1( 1,0)= 9 + j2( 1,1)= 28 + j2( 1,0)= 16 + j3( 1,1)= 19 + j3( 1,0)= 28 + ten( 1,1)= 0.9996874580E+00 + ten( 1,0)= 0.4726676489E-03 + else if(class .eq. 'W') then + j1( 10,1)= 115 + j1( 10,0)= 17 + j2( 10,1)= 87 + j2( 10,0)= 24 + j3( 10,1)= 52 + j3( 10,0)= 125 + ten( 10,1)= 0.9999999670E+00 + ten( 10,0)= 0.4097578454E-06 + j1( 9,1)= 129 + j1( 9,0)= 104 + j2( 9,1)= 47 + j2( 9,0)= 119 + j3( 9,1)= 34 + j3( 9,0)= 61 + ten( 9,1)= 0.9999996061E+00 + ten( 9,0)= 0.9408003763E-06 + j1( 8,1)= 16 + j1( 8,0)= 16 + j2( 8,1)= 112 + j2( 8,0)= 123 + j3( 8,1)= 120 + j3( 8,0)= 77 + ten( 8,1)= 0.9999987379E+00 + ten( 8,0)= 0.1220169409E-05 + j1( 7,1)= 36 + j1( 7,0)= 111 + j2( 7,1)= 23 + j2( 7,0)= 89 + j3( 7,1)= 102 + j3( 7,0)= 123 + ten( 7,1)= 0.9999973226E+00 + ten( 7,0)= 0.1432884929E-05 + j1( 6,1)= 31 + j1( 6,0)= 11 + j2( 6,1)= 19 + j2( 6,0)= 3 + j3( 6,1)= 111 + j3( 6,0)= 23 + ten( 6,1)= 0.9999970764E+00 + ten( 6,0)= 0.1917141063E-05 + j1( 5,1)= 29 + j1( 5,0)= 97 + j2( 5,1)= 50 + j2( 5,0)= 36 + j3( 5,1)= 13 + j3( 5,0)= 56 + ten( 5,1)= 0.9999968171E+00 + ten( 5,0)= 0.2780729588E-05 + j1( 4,1)= 82 + j1( 4,0)= 40 + j2( 4,1)= 92 + j2( 4,0)= 128 + j3( 4,1)= 22 + j3( 4,0)= 14 + ten( 4,1)= 0.9999964096E+00 + ten( 4,0)= 0.3077687282E-05 + j1( 3,1)= 28 + j1( 3,0)= 94 + j2( 3,1)= 86 + j2( 3,0)= 85 + j3( 3,1)= 75 + j3( 3,0)= 37 + ten( 3,1)= 0.9999960890E+00 + ten( 3,0)= 0.3419091698E-05 + j1( 2,1)= 41 + j1( 2,0)= 72 + j2( 2,1)= 34 + j2( 2,0)= 4 + j3( 2,1)= 3 + j3( 2,0)= 66 + ten( 2,1)= 0.9999958165E+00 + ten( 2,0)= 0.3899679498E-05 + j1( 1,1)= 117 + j1( 1,0)= 116 + j2( 1,1)= 88 + j2( 1,0)= 105 + j3( 1,1)= 22 + j3( 1,0)= 7 + ten( 1,1)= 0.9999953932E+00 + ten( 1,0)= 0.4564590384E-05 + else if(class .eq. 'A' .or. class .eq. 'B') then + j1( 10,1)= 54 + j1( 10,0)= 223 + j2( 10,1)= 209 + j2( 10,0)= 42 + j3( 10,1)= 40 + j3( 10,0)= 240 + ten( 10,1)= 0.9999999811E+00 + ten( 10,0)= 0.1058528198E-07 + j1( 9,1)= 243 + j1( 9,0)= 154 + j2( 9,1)= 172 + j2( 9,0)= 162 + j3( 9,1)= 14 + j3( 9,0)= 36 + ten( 9,1)= 0.9999999670E+00 + ten( 9,0)= 0.6491002580E-07 + j1( 8,1)= 203 + j1( 8,0)= 82 + j2( 8,1)= 18 + j2( 8,0)= 184 + j3( 8,1)= 198 + j3( 8,0)= 255 + ten( 8,1)= 0.9999999092E+00 + ten( 8,0)= 0.1261776816E-06 + j1( 7,1)= 202 + j1( 7,0)= 250 + j2( 7,1)= 83 + j2( 7,0)= 170 + j3( 7,1)= 209 + j3( 7,0)= 157 + ten( 7,1)= 0.9999999006E+00 + ten( 7,0)= 0.2087648028E-06 + j1( 6,1)= 115 + j1( 6,0)= 199 + j2( 6,1)= 123 + j2( 6,0)= 7 + j3( 6,1)= 207 + j3( 6,0)= 203 + ten( 6,1)= 0.9999998605E+00 + ten( 6,0)= 0.3218575699E-06 + j1( 5,1)= 212 + j1( 5,0)= 92 + j2( 5,1)= 7 + j2( 5,0)= 63 + j3( 5,1)= 248 + j3( 5,0)= 205 + ten( 5,1)= 0.9999998070E+00 + ten( 5,0)= 0.3231413785E-06 + j1( 4,1)= 45 + j1( 4,0)= 17 + j2( 4,1)= 194 + j2( 4,0)= 205 + j3( 4,1)= 234 + j3( 4,0)= 32 + ten( 4,1)= 0.9999997641E+00 + ten( 4,0)= 0.4097578454E-06 + j1( 3,1)= 176 + j1( 3,0)= 101 + j2( 3,1)= 246 + j2( 3,0)= 156 + j3( 3,1)= 164 + j3( 3,0)= 59 + ten( 3,1)= 0.9999997464E+00 + ten( 3,0)= 0.4272763050E-06 + j1( 2,1)= 5 + j1( 2,0)= 102 + j2( 2,1)= 118 + j2( 2,0)= 138 + j3( 2,1)= 175 + j3( 2,0)= 112 + ten( 2,1)= 0.9999997340E+00 + ten( 2,0)= 0.4331109977E-06 + j1( 1,1)= 57 + j1( 1,0)= 211 + j2( 1,1)= 120 + j2( 1,0)= 154 + j3( 1,1)= 167 + j3( 1,0)= 98 + ten( 1,1)= 0.9999996868E+00 + ten( 1,0)= 0.4353645551E-06 + else if(class .eq. 'C') then + j1( 10,1)= 310 + j1( 10,0)= 399 + j2( 10,1)= 361 + j2( 10,0)= 312 + j3( 10,1)= 11 + j3( 10,0)= 200 + ten( 10,1)= 0.9999999811E+00 + ten( 10,0)= 0.6358860105E-08 + j1( 9,1)= 11 + j1( 9,0)= 96 + j2( 9,1)= 493 + j2( 9,0)= 401 + j3( 9,1)= 118 + j3( 9,0)= 238 + ten( 9,1)= 0.9999999808E+00 + ten( 9,0)= 0.7946667324E-08 + j1( 8,1)= 451 + j1( 8,0)= 223 + j2( 8,1)= 270 + j2( 8,0)= 278 + j3( 8,1)= 443 + j3( 8,0)= 61 + ten( 8,1)= 0.9999999778E+00 + ten( 8,0)= 0.1058528198E-07 + j1( 7,1)= 149 + j1( 7,0)= 344 + j2( 7,1)= 117 + j2( 7,0)= 139 + j3( 7,1)= 199 + j3( 7,0)= 168 + ten( 7,1)= 0.9999999700E+00 + ten( 7,0)= 0.2456904724E-07 + j1( 6,1)= 243 + j1( 6,0)= 383 + j2( 6,1)= 87 + j2( 6,0)= 74 + j3( 6,1)= 5 + j3( 6,0)= 283 + ten( 6,1)= 0.9999999670E+00 + ten( 6,0)= 0.2954460854E-07 + j1( 5,1)= 509 + j1( 5,0)= 352 + j2( 5,1)= 43 + j2( 5,0)= 194 + j3( 5,1)= 127 + j3( 5,0)= 418 + ten( 5,1)= 0.9999999666E+00 + ten( 5,0)= 0.4643648310E-07 + j1( 4,1)= 163 + j1( 4,0)= 18 + j2( 4,1)= 280 + j2( 4,0)= 21 + j3( 4,1)= 75 + j3( 4,0)= 457 + ten( 4,1)= 0.9999999358E+00 + ten( 4,0)= 0.4987107616E-07 + j1( 3,1)= 146 + j1( 3,0)= 154 + j2( 3,1)= 93 + j2( 3,0)= 338 + j3( 3,1)= 312 + j3( 3,0)= 10 + ten( 3,1)= 0.9999999149E+00 + ten( 3,0)= 0.6491002580E-07 + j1( 2,1)= 203 + j1( 2,0)= 402 + j2( 2,1)= 10 + j2( 2,0)= 504 + j3( 2,1)= 51 + j3( 2,0)= 449 + ten( 2,1)= 0.9999999092E+00 + ten( 2,0)= 0.6990178747E-07 + j1( 1,1)= 151 + j1( 1,0)= 74 + j2( 1,1)= 401 + j2( 1,0)= 2 + j3( 1,1)= 331 + j3( 1,0)= 107 + ten( 1,1)= 0.9999999069E+00 + ten( 1,0)= 0.8774652827E-07 + endif + + i1 = mm + i0 = mm + do i=mm,1,-1 + + best = 0.d0 + if(best .lt. ten( i1, 1 ))then + jg( 0, i, 1) = 0 + jg( 1, i, 1) = is1 - 2 + j1( i1, 1 ) + jg( 2, i, 1) = is2 - 2 + j2( i1, 1 ) + jg( 3, i, 1) = is3 - 2 + j3( i1, 1 ) + i1 = i1-1 + else + jg( 0, i, 1) = 0 + jg( 1, i, 1) = 0 + jg( 2, i, 1) = 0 + jg( 3, i, 1) = 0 + endif + + best = 1.d0 + if(best .gt. ten( i0, 0 ))then + jg( 0, i, 0) = 0 + jg( 1, i, 0) = is1 - 2 + j1( i0, 0 ) + jg( 2, i, 0) = is2 - 2 + j2( i0, 0 ) + jg( 3, i, 0) = is3 - 2 + j3( i0, 0 ) + i0 = i0-1 + else + jg( 0, i, 0) = 0 + jg( 1, i, 0) = 0 + jg( 2, i, 0) = 0 + jg( 3, i, 0) = 0 + endif + + enddo + +!DVM$ region +!DVM$ PARALLEL (i3,i2,i1) ON z(i1,i2,i3), private(i),cuda_block(32,6) + do i3=1,n3 + do i2=1,n2 + do i1=1,n1 + z(i1,i2,i3) = 0.0D0 + do i = mm,1,-1 + if(i1 .eq. jg(1,i,0) .and. i2 .eq. jg(2,i,0) + & .and. i3 .eq. jg(3,i,0)) then + z(i1,i2,i3) = -1.0D0 + endif + if(i1 .eq. jg(1,i,1) .and. i2 .eq. jg(2,i,1) + & .and. i3 .eq. jg(3,i,1)) then + z(i1,i2,i3) = 1.0D0 + endif + enddo + enddo + enddo + enddo + +!DVM$ end region + + + call comm3(z,n1,n2,n3,k) + +c--------------------------------------------------------------------- +c call showall(z,n1,n2,n3) +c--------------------------------------------------------------------- + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/dtime.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/dtime.h new file mode 100644 index 0000000..eabcb83 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/dtime.h @@ -0,0 +1,4 @@ + integer dvm_debug +C dvm_debug = 0 - standard mode, dvm_debug > 0 - debugging mode + parameter (dvm_debug=0) + \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/dvmvar.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/dvmvar.h new file mode 100644 index 0000000..77d0fbe --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/dvmvar.h @@ -0,0 +1,21 @@ +c--------------------------------------------------------------------- +c FDVM specifications +c--------------------------------------------------------------------- +!! integer pv,pv1,pu1,pr1,pu(maxlevel),pr(maxlevel),pus,pus1 + integer psize(3),pdim + common /pointers/ pv,pu1,pr1,pu,pr,pv1,pus,pus1 + common/processors/ psize,pdim + DOUBLE PRECISION,POINTER,DIMENSION(:,:,:) :: + & pv,pu1,pr1,pv1,pus,pus1 +!! DOUBLE PRECISION,POINTER,DIMENSION(:,:,:) :: +!! & pu(maxlevel),pr(maxlevel) +CDVM$ TEMPLATE tmp (1+2**(lt+1),1+2**(lt+1),1+2**(lt+1)) +CDVM$ DISTRIBUTE tmp (*,*,BLOCK) +CDVM$ ALIGN :: pr1,pv,pu1,pus,pus1 +CDVM$ DYNAMIC pv,tmp,pus,pus1,pu1,pr1 + TYPE P + DOUBLE PRECISION,POINTER,DIMENSION(:,:,:) :: p +CDVM$ ALIGN :: p +CDVM$ DYNAMIC p + END TYPE + TYPE(P) pu(maxlevel),pr(maxlevel) diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/globals.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/globals.h new file mode 100644 index 0000000..1816894 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/globals.h @@ -0,0 +1,52 @@ +c--------------------------------------------------------------------- +c Parameter lm (declared and set in "npbparams.h") is the log-base2 of +c the edge size max for the partition on a given node, so must be changed +c either to save space (if running a small case) or made bigger for larger +c cases, for example, 512^3. Thus lm=7 means that the largest dimension +c of a partition that can be solved on a node is 2^7 = 128. lm is set +c automatically in npbparams.h +c Parameters ndim1, ndim2, ndim3 are the local problem dimensions. +c--------------------------------------------------------------------- + + include 'npbparams.h' +! nm - actual dimension including ghost cells for communications +! nv - size of rhs array +! nr - size of residual array +! nm2 - size of communication buffer +! maxlevel- maximum number of levels + integer nm + > , nv + > , nr + > , nm2 + > , maxlevel + + parameter( nm=2+2**lm, nv=(2+2**ndim1)*(2+2**ndim2)*(2+2**ndim3) ) + parameter( nm2=2*nm*nm, maxlevel=11 ) + parameter( nr = (8*(nv+nm**2+5*nm+7*lm))/7 ) +c--------------------------------------------------------------------- + integer nx(maxlevel),ny(maxlevel),nz(maxlevel) + common /mg3/ nx,ny,nz + + character class + common /ClassType/class + + integer debug_vec(0:7) + common /my_debug/ debug_vec + + integer ir(maxlevel), m1(maxlevel), m2(maxlevel), m3(maxlevel) + integer lt, lb, mi(3,maxlevel),nreq,lbdvm + common /fap/ ir,m1,m2,m3,lt,lb,mi,nreq,lbdvm + logical proc1 + parameter (proc1 = .TRUE.) +c--------------------------------------------------------------------- +c Set at m=1024, can handle cases up to 1024^3 case +c--------------------------------------------------------------------- + integer m + parameter( m=1037 ) + + double precision buff(nm2,4) + common /buffer/ buff + + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/mgdv3al.fdv b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/mgdv3al.fdv new file mode 100644 index 0000000..33ae884 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/MG_DVM/mgdv3al.fdv @@ -0,0 +1,2564 @@ +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 2.3 ! +! ! +! D V M V E R S I O N S ! +! ! +! M G ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is DVM version of the NPB MG code. ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 2.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 2.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/NAS/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! Send bug reports to npb-bugs@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (415) 604-3957 ! +! ! +!-------------------------------------------------------------------------! + + +c--------------------------------------------------------------------- +c +c Authors: E. Barszcz +c P. Frederickson +c A. Woo +c M. Yarrow +c +c--------------------------------------------------------------------- + + +c--------------------------------------------------------------------- + program mgdv3 +c--------------------------------------------------------------------- + + implicit none + + include 'globals.h' + +c---------------------------------------------------------------------------c +c k is the current level. It is passed down through subroutine args +c and is NOT global. it is the current iteration +c---------------------------------------------------------------------------c + + integer k, it + + external timer_read + double precision t, tinit, mflops, timer_read + +c---------------------------------------------------------------------------c +c These arrays are in common because they are quite large +c and probably shouldn't be allocated on the stack. They +c are always passed as subroutine args. +c---------------------------------------------------------------------------c + +!! double precision u(nr),v(nv),r(nr) + double precision a(0:3),c(0:3) +!! common /noautom/ u,v,r +!!CDVM$ HEAP u,v,r + double precision rnm2, rnmu, old2, oldu, epsilon + integer n1, n2, n3, nn, nit + double precision verify_value + logical verified + + integer ierr,i, fstatus + integer T_bench, T_init + parameter (T_bench=1, T_init=2) +c---------------------------------------------------------------------------c + include 'dvmvar.h' +c---------------------------------------------------------------------------c + + call timer_clear(T_bench) + call timer_clear(T_init) + + + call timer_start(T_init) + + +c--------------------------------------------------------------------- +c Read in and broadcast input data +c--------------------------------------------------------------------- + + write (*, 1000) + + open(unit=7,file='mg.input', status='old', iostat=fstatus) + if (fstatus .eq. 0) then + write(*,50) + 50 format(' Reading from input file mg.input') + read(7,*) lt + read(7,*) nx(lt), ny(lt), nz(lt) + read(7,*) nit + read(7,*) (debug_vec(i),i=0,7) + else + write(*,51) + 51 format(' No input file. Using compiled defaults ') + lt = lt_default + nit = nit_default + nx(lt) = nx_default + ny(lt) = ny_default + nz(lt) = nz_default + do i = 0,7 + debug_vec(i) = debug_default + end do + endif + + + if ( (nx(lt) .ne. ny(lt)) .or. (nx(lt) .ne. nz(lt)) ) then + Class = 'U' + else if( nx(lt) .eq. 32 .and. nit .eq. 4 ) then + Class = 'S' + else if( nx(lt) .eq. 64 .and. nit .eq. 40 ) then + Class = 'W' + else if( nx(lt) .eq. 256 .and. nit .eq. 20 ) then + Class = 'B' + else if( nx(lt) .eq. 512 .and. nit .eq. 20 ) then + Class = 'C' + else if( nx(lt) .eq. 256 .and. nit .eq. 4 ) then + Class = 'A' + else + Class = 'U' + endif + +c--------------------------------------------------------------------- +c Use these for debug info: +c--------------------------------------------------------------------- +c debug_vec(0) = 1 !=> report all norms +c debug_vec(1) = 1 !=> some setup information +c debug_vec(1) = 2 !=> more setup information +c debug_vec(2) = k => at level k or below, show result of resid +c debug_vec(3) = k => at level k or below, show result of psinv +c debug_vec(4) = k => at level k or below, show result of rprj +c debug_vec(5) = k => at level k or below, show result of interp +c debug_vec(6) = 1 => (unused) +c debug_vec(7) = 1 => (unused) +c--------------------------------------------------------------------- + a(0) = -8.0D0/3.0D0 + a(1) = 0.0D0 + a(2) = 1.0D0/6.0D0 + a(3) = 1.0D0/12.0D0 + + if(Class .eq. 'A' .or. Class .eq. 'S'.or. Class .eq.'W') then +c--------------------------------------------------------------------- +c Coefficients for the S(a) smoother +c--------------------------------------------------------------------- + c(0) = -3.0D0/8.0D0 + c(1) = +1.0D0/32.0D0 + c(2) = -1.0D0/64.0D0 + c(3) = 0.0D0 + else +c--------------------------------------------------------------------- +c Coefficients for the S(b) smoother +c--------------------------------------------------------------------- + c(0) = -3.0D0/17.0D0 + c(1) = +1.0D0/33.0D0 + c(2) = -1.0D0/61.0D0 + c(3) = 0.0D0 + endif + lb = 1 + k = lt + + call setup(n1,n2,n3,k) + call setdvm() + + call zero3(pu(lt)%p,n1,n2,n3) + + call zran3(pv,n1,n2,n3,nx(lt),ny(lt),k) + + call norm2u3(pv,n1,n2,n3,rnm2,rnmu,nx(lt),ny(lt),nz(lt)) +c write(*,*) +c write(*,*)' norms of random v are' +c write(*,600) 0, rnm2, rnmu +c write(*,*)' about to evaluate resid, k=',k + + write (*, 1001) nx(lt),ny(lt),nz(lt), Class + write (*, 1002) nit + + 1000 format(//,' NAS Parallel Benchmarks 2.3- DVM version', + > ' - MG Benchmark', /) + 1001 format(' Size: ', i3, 'x', i3, 'x', i3, ' (class ', A, ')' ) + 1002 format(' Iterations: ', i3) + + + if(psize(1).ne.1) then + call resid(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + else + call residd2(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + endif + call norm2u3(pr(lt)%p,n1,n2,n3,rnm2,rnmu,nx(lt),ny(lt),nz(lt)) + old2 = rnm2 + oldu = rnmu + +c--------------------------------------------------------------------- +c One iteration for startup +c--------------------------------------------------------------------- + call mg3P(a,c,n1,n2,n3,k) + + if(psize(1).ne.1) then + call resid(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + else + call residd2(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + endif + + +C call setup(n1,n2,n3,k) + call zero3(pu(lt)%p,n1,n2,n3) + + call zran3(pv,n1,n2,n3,nx(lt),ny(lt),k) + + call timer_stop(T_init) + call timer_start(T_bench) + +CDVM$ INTERVAL 1 + + if(psize(1).ne.1) then + call resid(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + else + call residd2(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + endif + call norm2u3(pr(lt)%p,n1,n2,n3,rnm2,rnmu,nx(lt),ny(lt),nz(lt)) + old2 = rnm2 + oldu = rnmu + + do it=1,nit + call mg3P(a,c,n1,n2,n3,k) + + if(psize(1).ne.1) then + call resid(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + else + call residd2(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + endif + + enddo + call norm2u3(pr(lt)%p,n1,n2,n3,rnm2,rnmu,nx(lt),ny(lt),nz(lt)) +CDVM$ END INTERVAL + call timer_stop(T_bench) + t = timer_read(T_bench) + tinit = timer_read(T_init) + verified = .FALSE. + verify_value = 0.0 + + write( *,'(/A,F15.3,A/)' ) + > ' Initialization time: ',tinit, ' seconds' + write(*,100) + 100 format(' Benchmark completed ') + + epsilon = 1.d-8 + if (Class .ne. 'U') then + if(Class.eq.'S') then + verify_value = 0.530770700573d-04 + elseif(Class.eq.'W') then + verify_value = 0.250391406439E-17 ! 40 iterations +! 0.183103168997d-044 iterations + elseif(Class.eq.'A') then + verify_value = 0.2433365309d-5 + elseif(Class.eq.'B') then + verify_value = 0.180056440132d-5 + elseif(Class.eq.'C') then + verify_value = 0.570674826298d-06 + endif + + if( abs( rnm2 - verify_value ) .le. epsilon ) then + verified = .TRUE. + write(*, 200) + write(*, 201) rnm2 + write(*, 202) rnm2 - verify_value + 200 format(' VERIFICATION SUCCESSFUL ') + 201 format(' L2 Norm is ', E20.12) + 202 format(' Error is ', E20.12) + else + verified = .FALSE. + write(*, 300) + write(*, 301) rnm2 + write(*, 302) verify_value + 300 format(' VERIFICATION FAILED') + 301 format(' L2 Norm is ', E20.12) + 302 format(' The correct L2 Norm is ', E20.12) + endif + else + verified = .FALSE. + write (*, 400) + write (*, 401) + 400 format(' Problem size unknown') + 401 format(' NO VERIFICATION PERFORMED') + endif + + nn = nx(lt)*ny(lt)*nz(lt) + + if( t .ne. 0. ) then + mflops = 58.*nit*nn*1.0D-6 /t + else + mflops = 0.0 + endif + + call print_results('MG', class, nx(lt), ny(lt), nz(lt), + > nit, t, + > mflops, ' floating point', + > verified, npbversion) +c , compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + + 600 format( i4, 2e19.12) + + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine setup(n1,n2,n3,k) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + + include 'globals.h' + + integer is1, is2, is3, ie1, ie2, ie3 + common /grid/ is1,is2,is3,ie1,ie2,ie3 + + integer n1,n2,n3,k + integer d, i, j + integer ax + integer ng(3,10) + integer s, dir,ierr + + + ng(1,lt) = nx(lt) + ng(2,lt) = ny(lt) + ng(3,lt) = nz(lt) + do ax=1,3 + do k=lt-1,1,-1 + ng(ax,k) = ng(ax,k+1)/2 + enddo + enddo + 61 format(10i4) + do k=lt,1,-1 + nx(k) = ng(1,k) + ny(k) = ng(2,k) + nz(k) = ng(3,k) + enddo + + do k = lt,1,-1 + do ax = 1,3 + mi(ax,k) = 2 + ng(ax,k) + enddo + + m1(k) = mi(1,k) + m2(k) = mi(2,k) + m3(k) = mi(3,k) + + enddo + + + k = lt + is1 = 2 + ng(1,k) - ng(1,lt) + ie1 = 1 + ng(1,k) + n1 = 3 + ie1 - is1 + is2 = 2 + ng(2,k) - ng(2,lt) + ie2 = 1 + ng(2,k) + n2 = 3 + ie2 - is2 + is3 = 2 + ng(3,k) - ng(3,lt) + ie3 = 1 + ng(3,k) + n3 = 3 + ie3 - is3 + + + +c--------------------------------------------------------------------- + ir(lt)=1 + + do j = lt-1, 1, -1 + ir(j)=ir(j+1)+m1(j+1)*m2(j+1)*m3(j+1) + enddo +c--------------------------------------------------------------------- + + if( debug_vec(1) .ge. 1 )then + write(*,*)' in setup, ' + write(*,*)' k lt nx ny nz ', + > ' n1 n2 n3 is1 is2 is3 ie1 ie2 ie3' + write(*,9) k,lt,ng(1,k),ng(2,k),ng(3,k), + > n1,n2,n3,is1,is2,is3,ie1,ie2,ie3 + 9 format(15i4) + endif + + k = lt + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + subroutine setdvm() +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + include 'dvmvar.h' + integer kg1,kg2,j,i,k +!! double precision u(nr),v(nv),r(nr) +!! common /noautom/ u,v,r +!!CDVM$ HEAP u,v,r + integer PROCESSORS_SIZE,PROCESSORS_RANK + integer np,nsp,np1,lbdv(3) +c integer pdim,psize(3) + integer ngb(64,3),ngb1(64), ngb2(64), ngb3(64) + PROCESSORS_RANK() = 3 + PROCESSORS_SIZE(i) = 1 +CDVM$ DEBUG 1 (D=0) + pdim = PROCESSORS_RANK() + if(pdim.ne.3) then + print *, 'PROCESSORS_RANK must be equal to 3' + stop + endif + do i=1,pdim + psize(i)=PROCESSORS_SIZE(i) + enddo + print *, 'pdim=',pdim,':',(psize(i),i=1,pdim) + +C Must satisfy +C 2**(lbdvm-1) >= NUMBER_OF_PROCESSORS() +C lb <= lbdvm < lt + do k=1,pdim + np=psize(k) + np1=psize(k) + do i=1,10 + np1=np1/2 + if(np1.le.1) go to 100 + enddo + print *,'You must decrease the number of processors' + stop +100 lbdv(k)=i+1 + if(lbdv(k).lt.lb) lbdv(k)=lb + if(lbdv(k).ge.lt) then + print *,'You must decrease the number of processors or + > increase size of problem' + stop + endif +c print *, 'lbdvm=',lbdvm + if(np.eq.1) then + ngb(1,k)= 2**(lt+1)+1 + else + nsp = (2**lt)/np + ngb(1,k) = nsp+1 + do i=2,np-1 + ngb(i,k)=nsp + enddo + ngb(np,k) = 2**(lt+1)-nsp*(np-1) + endif + enddo + lbdvm=1 + do k=1,pdim + if(lbdvm .lt. lbdv(k)) lbdvm=lbdv(k) + enddo + do i=1,psize(1) + ngb1(i) = ngb(i,1) + enddo + if(pdim .gt.1) then + do i=1,psize(2) + ngb2(i) = ngb(i,2) + enddo + endif + if(pdim .gt.2) then + do i=1,psize(3) + ngb3(i) = ngb(i,3) + enddo + endif +CDVM$ ENDDEBUG 1 + +c print *, (ngb1(i),i=1,psize(1)) +c print *, (ngb2(i),i=1,psize(2)) +c print *, (ngb3(i),i=1,psize(3)) + + if(pdim .eq.1) then +CDVM$ REDISTRIBUTE tmp(*,*,GEN_BLOCK(ngb1)) + else if(pdim .eq.2) then +CDVM$ REDISTRIBUTE tmp(*,GEN_BLOCK(ngb1),GEN_BLOCK(ngb2)) + else +CDVM$ REDISTRIBUTE tmp(GEN_BLOCK(ngb1),GEN_BLOCK(ngb2),GEN_BLOCK(ngb3)) + endif + ALLOCATE(pv(mi(1,lt),mi(2,lt),mi(3,lt))) + ALLOCATE(pr(lt)%p(mi(1,lt),mi(2,lt),mi(3,lt))) + ALLOCATE(pu(lt)%p(mi(1,lt),mi(2,lt),mi(3,lt))) +!! pv1 => pu1 +! pr(lt)%p=>pr1 +! pu(lt)%p=>pu1 + do j = lt-1, 1, -1 + ALLOCATE(pr(j)%p(mi(1,j),mi(2,j),mi(3,j))) + ! pr(j) = ALLOCATE(pr(j) mi(1,j),r,ir(j)) + ALLOCATE(pu(j)%p(mi(1,j),mi(2,j),mi(3,j))) + !pu(j) = ALLOCATE(mi(1,j),u,ir(j)) + if(j.eq.lbdvm) then + ALLOCATE(pus1(mi(1,j),mi(2,j),mi(3,j))) !pus1 = ALLOCATE(mi(1,j),u,ir(j)) + endif + if(j.eq.lbdvm-1) then + ALLOCATE(pus(mi(1,j),mi(2,j),mi(3,j))) !pus = ALLOCATE(mi(1,j),u,ir(j)) + endif + enddo + + kg1=1 + kg2=0 + do j = lt, 1, -1 + pu1 => pu(j)%p + if(j.ge.lbdvm) then +CDVM$ REALIGN (i,j,k) WITH tmp(kg1*i-kg2,kg1*j-kg2,kg1*k-kg2)::pu1 + else + if(proc1) then +CDVM$ REALIGN (*,*,*) WITH tmp(2**(lt-1)+1,2**(lt-1)+1,2**(lt-1)+1) +CDVM$* :: pu1 + else +CDVM$ REALIGN (*,*,*) WITH tmp(*,*,*) :: pu1 + endif + endif + pu(j)%p => pu1 + kg1 = kg1*2 + kg2 = kg1-1 + enddo + +CDVM$ REALIGN (i,j,k) WITH tmp(i,j,k):: pv + + kg1=1 + kg2=0 + do j = lt, 1, -1 + pr1 => pr(j)%p + if(j.ge.lbdvm) then +CDVM$ REALIGN (i,j,k) WITH tmp(kg1*i-kg2,kg1*j-kg2,kg1*k-kg2)::pr1 + else + if(proc1) then +CDVM$ REALIGN (*,*,*) WITH tmp(2**(lt-1)+1,2**(lt-1)+1,2**(lt-1)+1) +CDVM$* :: pr1 + else +CDVM$ REALIGN (*,*,*) WITH tmp(*,*,*) :: pr1 + endif + endif + pr(j)%p => pr1 + kg1 = kg1*2 + kg2 = kg1-1 + enddo + + kg1=2 + kg2=1 + do j = lt-1, 1, -1 + if(j.eq.lbdvm) then +CDVM$ REALIGN (i,j,k) WITH tmp(kg1*i-kg2,kg1*j-kg2,kg1*k-kg2)::pus1 + endif + if(j.eq.lbdvm-1) then +CDVM$ REALIGN (i,j,k) WITH tmp(kg1*i-kg2,kg1*j-kg2,kg1*k-kg2)::pus + endif + kg1 = kg1*2 + kg2 = kg1-1 + enddo + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine mg3P(a,c,n1,n2,n3,k) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c multigrid V-cycle routine +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + include 'dvmvar.h' + integer n1, n2, n3, k +!! double precision u(nr),v(nv),r(nr) + double precision a(0:3),c(0:3) +!! common /noautom/ u,v,r +!!CDVM$ HEAP u,v,r + integer j + +c--------------------------------------------------------------------- +c down cycle. +c restrict the residual from the find grid to the coarse +c--------------------------------------------------------------------- + + do k= lt, lb+1 , -1 + j = k-1 + if(psize(1).ne.1) then + call rprj3(pr(k)%p,m1(k),m2(k),m3(k), + > pr(j)%p,m1(j),m2(j),m3(j),k,pus,pu(lb)%p, + > mi(1,lb),mi(2,lb),mi(3,lb)) + else + call rprj3d2(pr(k)%p,m1(k),m2(k),m3(k), + > pr(j)%p,m1(j),m2(j),m3(j),k,pus,pu(lb)%p, + > mi(1,lb),mi(2,lb),mi(3,lb)) + endif + enddo + + k = lb +c--------------------------------------------------------------------- +c compute an approximate solution on the coarsest grid +c--------------------------------------------------------------------- + call zero3(pu(k)%p,m1(k),m2(k),m3(k)) + + if(psize(1).ne.1) then + call psinv(pr(k)%p,pu(k)%p,m1(k),m2(k),m3(k),c,k) + else + call psinvd2(pr(k)%p,pu(k)%p,m1(k),m2(k),m3(k),c,k) + endif + do k = lb+1, lt-1 + j = k-1 + +c--------------------------------------------------------------------- +c prolongate from level k-1 to k +c--------------------------------------------------------------------- + if(k.ne.lbdvm .or..not.proc1) + > call zero3(pu(k)%p,m1(k),m2(k),m3(k)) + + if(psize(1).ne.1) then + call interp(pu(j)%p,m1(j),m2(j),m3(j), + > pu(k)%p,m1(k),m2(k),m3(k),k,pus1,pu(lb)%p, + > mi(1,lb),mi(2,lb),mi(3,lb)) + +c--------------------------------------------------------------------- +c compute residual for level k +c--------------------------------------------------------------------- + call resid(pu(k)%p,pr(k)%p,pr(k)%p,m1(k),m2(k),m3(k),a,k) +c--------------------------------------------------------------------- +c apply smoother +c--------------------------------------------------------------------- + call psinv(pr(k)%p,pu(k)%p,m1(k),m2(k),m3(k),c,k) + else + call interpd2(pu(j)%p,m1(j),m2(j),m3(j), + > pu(k)%p,m1(k),m2(k),m3(k),k,pus1,pu(lb)%p, + > mi(1,lb),mi(2,lb),mi(3,lb)) + call residd2(pu(k)%p,pr(k)%p,pr(k)%p,m1(k),m2(k),m3(k), + > a,k) + call psinvd2(pr(k)%p,pu(k)%p,m1(k),m2(k),m3(k),c,k) + endif + + enddo + 200 continue + j = lt - 1 + k = lt + if(psize(1).ne.1) then + call interp(pu(j)%p,m1(j),m2(j),m3(j),pu(lt)%p,n1,n2,n3,k, + > pus1,pu(lb)%p,mi(1,lb),mi(2,lb),mi(3,lb)) + call resid(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + call psinv(pr(lt)%p,pu(lt)%p,n1,n2,n3,c,k) + else + call interpd2(pu(j)%p,m1(j),m2(j),m3(j),pu(lt)%p,n1,n2,n3,k, + > pus1,pu(lb)%p,mi(1,lb),mi(2,lb),mi(3,lb)) + + call residd2(pu(lt)%p,pv,pr(lt)%p,n1,n2,n3,a,k) + call psinvd2(pr(lt)%p,pu(lt)%p,n1,n2,n3,c,k) + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine psinv( r,u,n1,n2,n3,c,k) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c psinv applies an approximate inverse as smoother: u = u + Cr +c +c This implementation costs 15A + 4M per result, where +c A and M denote the costs of Addition and Multiplication. +c Presuming coefficient c(3) is zero (the NPB assumes this, +c but it is thus not a general case), 2A + 1M may be eliminated, +c resulting in 13A + 3M. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer n1,n2,n3,k + double precision u(n1,n2,n3),r(n1,n2,n3),c(0:3) + integer i3, i2, i1 +CDVM$ INHERIT r,u + double precision r1(m), r2(m) +CDVM$ SHADOW_GROUP gr(r(CORNER)) +CDVM$ SHADOW_START gr +CDVM$ PARALLEL (i3,i2,i1) ON u(i1,i2,i3), SHADOW_WAIT gr + do i3=2,n3-1 + do i2=2,n2-1 + do i1=2,n1-1 + u(i1,i2,i3) = u(i1,i2,i3) + > + c(0) * r(i1,i2,i3) + > + c(1) * ( r(i1-1,i2,i3) + r(i1+1,i2,i3) + > + r(i1,i2-1,i3) + r(i1,i2+1,i3) + > + r(i1,i2,i3-1) + r(i1,i2,i3+1) ) + > + c(2) * (r(i1,i2-1,i3-1) + r(i1,i2+1,i3-1) + > + r(i1,i2-1,i3+1) + r(i1,i2+1,i3+1) + > + r(i1-1,i2-1,i3) + r(i1-1,i2+1,i3) + > + r(i1-1,i2,i3-1) + r(i1-1,i2,i3+1) + > + r(i1+1,i2-1,i3) + r(i1+1,i2+1,i3) + > + r(i1+1,i2,i3-1) + r(i1+1,i2,i3+1) ) +c--------------------------------------------------------------------- +c Assume c(3) = 0 (Enable line below if c(3) not= 0) +c--------------------------------------------------------------------- +c > + c(3) * ( r2(i1-1) + r2(i1+1) ) +c--------------------------------------------------------------------- + enddo + enddo + enddo + +c--------------------------------------------------------------------- +c exchange boundary points +c--------------------------------------------------------------------- + call comm3(u,n1,n2,n3,k) + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(u,n1,n2,n3,' psinv',k) + endif + + if( debug_vec(3) .ge. k )then + call showall(u,n1,n2,n3) + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine psinvd2( r,u,n1,n2,n3,c,k) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c psinv applies an approximate inverse as smoother: u = u + Cr +c +c This implementation costs 15A + 4M per result, where +c A and M denote the costs of Addition and Multiplication. +c Presuming coefficient c(3) is zero (the NPB assumes this, +c but it is thus not a general case), 2A + 1M may be eliminated, +c resulting in 13A + 3M. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer n1,n2,n3,k + double precision u(n1,n2,n3),r(n1,n2,n3),c(0:3) + integer i3, i2, i1 +CDVM$ INHERIT r,u + double precision r1(m), r2(m) +CDVM$ SHADOW_GROUP gr(r(CORNER)) +CDVM$ SHADOW_START gr +CDVM$ PARALLEL (i3,i2) ON u(*,i2,i3), SHADOW_WAIT gr + do i3=2,n3-1 + do i2=2,n2-1 + do i1=1,n1 + r1(i1) = r(i1,i2-1,i3) + r(i1,i2+1,i3) + > + r(i1,i2,i3-1) + r(i1,i2,i3+1) + r2(i1) = r(i1,i2-1,i3-1) + r(i1,i2+1,i3-1) + > + r(i1,i2-1,i3+1) + r(i1,i2+1,i3+1) + enddo + do i1=2,n1-1 + u(i1,i2,i3) = u(i1,i2,i3) + > + c(0) * r(i1,i2,i3) + > + c(1) * ( r(i1-1,i2,i3) + r(i1+1,i2,i3) + > + r1(i1) ) + > + c(2) * ( r2(i1) + r1(i1-1) + r1(i1+1) ) +c--------------------------------------------------------------------- +c Assume c(3) = 0 (Enable line below if c(3) not= 0) +c--------------------------------------------------------------------- +c > + c(3) * ( r2(i1-1) + r2(i1+1) ) +c--------------------------------------------------------------------- + enddo + enddo + enddo + +c--------------------------------------------------------------------- +c exchange boundary points +c--------------------------------------------------------------------- + call comm3(u,n1,n2,n3,k) + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(u,n1,n2,n3,' psinv',k) + endif + + if( debug_vec(3) .ge. k )then + call showall(u,n1,n2,n3) + endif + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine resid( u,v,r,n1,n2,n3,a,k ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c resid computes the residual: r = v - Au +c +c This implementation costs 15A + 4M per result, where +c A and M denote the costs of Addition (or Subtraction) and +c Multiplication, respectively. +c Presuming coefficient a(1) is zero (the NPB assumes this, +c but it is thus not a general case), 3A + 1M may be eliminated, +c resulting in 12A + 3M. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' +CDVM$ INHERIT u,v,r + integer n1,n2,n3,k + double precision u(n1,n2,n3),v(n1,n2,n3),r(n1,n2,n3),a(0:3) + integer i3, i2, i1 + double precision u1(m), u2(m) +CDVM$ SHADOW_GROUP gu(u(CORNER)) +CDVM$ SHADOW_START gu +C DVM$ SHADOW_WAIT gu +CDVM$ PARALLEL (i3,i2,i1) ON r(i1,i2,i3), SHADOW_WAIT gu + do i3=2,n3-1 + do i2=2,n2-1 + do i1=2,n1-1 + r(i1,i2,i3) = v(i1,i2,i3) + > - a(0) * u(i1,i2,i3) +c--------------------------------------------------------------------- +c Assume a(1) = 0 (Enable 2 lines below if a(1) not= 0) +c--------------------------------------------------------------------- +c > - a(1) * ( u(i1-1,i2,i3) + u(i1+1,i2,i3) +c > + u1(i1) ) +c--------------------------------------------------------------------- + > - a(2) * (u(i1,i2-1,i3-1) + u(i1,i2+1,i3-1) + > + u(i1,i2-1,i3+1) + u(i1,i2+1,i3+1) + > + u(i1-1,i2-1,i3) + u(i1-1,i2+1,i3) + > + u(i1-1,i2,i3-1) + u(i1-1,i2,i3+1) + > + u(i1+1,i2-1,i3) + u(i1+1,i2+1,i3) + > + u(i1+1,i2,i3-1) + u(i1+1,i2,i3+1) ) + > - a(3) * (u(i1-1,i2-1,i3-1) + > + u(i1-1,i2+1,i3-1) + > + u(i1-1,i2-1,i3+1) + u(i1-1,i2+1,i3+1) + > + u(i1+1,i2-1,i3-1) + u(i1+1,i2+1,i3-1) + > + u(i1+1,i2-1,i3+1) + u(i1+1,i2+1,i3+1) ) + enddo + enddo + enddo + +c--------------------------------------------------------------------- +c exchange boundary data +c--------------------------------------------------------------------- + call comm3(r,n1,n2,n3,k) + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(r,n1,n2,n3,' resid',k) + endif + + if( debug_vec(2) .ge. k )then + call showall(r,n1,n2,n3) + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine residd2( u,v,r,n1,n2,n3,a,k ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c resid computes the residual: r = v - Au +c +c This implementation costs 15A + 4M per result, where +c A and M denote the costs of Addition (or Subtraction) and +c Multiplication, respectively. +c Presuming coefficient a(1) is zero (the NPB assumes this, +c but it is thus not a general case), 3A + 1M may be eliminated, +c resulting in 12A + 3M. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' +CDVM$ INHERIT u,v,r + integer n1,n2,n3,k + double precision u(n1,n2,n3),v(n1,n2,n3),r(n1,n2,n3),a(0:3) + integer i3, i2, i1 + double precision u1(m), u2(m) +CDVM$ SHADOW_GROUP gu(u(CORNER)) +CDVM$ SHADOW_START gu +C DVM$ SHADOW_WAIT gu +CDVM$ PARALLEL (i3,i2) ON r(*,i2,i3), SHADOW_WAIT gu + do i3=2,n3-1 + do i2=2,n2-1 + do i1=1,n1 + u1(i1) = u(i1,i2-1,i3) + u(i1,i2+1,i3) + > + u(i1,i2,i3-1) + u(i1,i2,i3+1) + u2(i1) = u(i1,i2-1,i3-1) + u(i1,i2+1,i3-1) + > + u(i1,i2-1,i3+1) + u(i1,i2+1,i3+1) + enddo + do i1=2,n1-1 + r(i1,i2,i3) = v(i1,i2,i3) + > - a(0) * u(i1,i2,i3) +c--------------------------------------------------------------------- +c Assume a(1) = 0 (Enable 2 lines below if a(1) not= 0) +c--------------------------------------------------------------------- +c > - a(1) * ( u(i1-1,i2,i3) + u(i1+1,i2,i3) +c > + u1(i1) ) +c--------------------------------------------------------------------- + > - a(2) * ( u2(i1) + u1(i1-1) + u1(i1+1) ) + > - a(3) * ( u2(i1-1) + u2(i1+1) ) + enddo + enddo + enddo + +c--------------------------------------------------------------------- +c exchange boundary data +c--------------------------------------------------------------------- + call comm3(r,n1,n2,n3,k) + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(r,n1,n2,n3,' resid',k) + endif + + if( debug_vec(2) .ge. k )then + call showall(r,n1,n2,n3) + endif + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine rprj3( r,m1k,m2k,m3k,s,m1j,m2j,m3j,k,r1,r2, + > m1i,m2i,m3i ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c rprj3 projects onto the next coarser grid, +c using a trilinear Finite Element projection: s = r' = P r +c +c This implementation costs 20A + 4M per result, where +c A and M denote the costs of Addition and Multiplication. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' +CDVM$ INHERIT r,s,r1,r2 +CDVM$ DYNAMIC s + integer m1k, m2k, m3k, m1j, m2j, m3j,k,m1i,m2i,m3i + double precision r(m1k,m2k,m3k), s(m1j,m2j,m3j),r1(m1j,m2j,m3j) + double precision r2(m1i,m2i,m3i) + integer j3, j2, j1, i3, i2, i1, d1, d2, d3, j + + double precision x1(m), y1(m), x2,y2 + + if(k.eq.lbdvm) then +CDVM$ NEW_VALUE +CDVM$ REALIGN s(i,j,k) WITH r1(i,j,k) + endif + if(m1k.eq.3)then + d1 = 2 + else + d1 = 1 + endif + + if(m2k.eq.3)then + d2 = 2 + else + d2 = 1 + endif + + if(m3k.eq.3)then + d3 = 2 + else + d3 = 1 + endif + +CDVM$ SHADOW_GROUP gr(r(CORNER)) +CDVM$ SHADOW_START gr +CDVM$ PARALLEL (j3,j2,j1) ON s(j1,j2,j3), SHADOW_WAIT gr + do j3=2,m3j-1 + do j2=2,m2j-1 + do j1=2,m1j-1 + i3 = 2*j3-d3 + i2 = 2*j2-d2 + + i1 = 2*j1-d1 + + y2 = r(i1, i2-1,i3-1) + r(i1, i2-1,i3+1) + > + r(i1, i2+1,i3-1) + r(i1, i2+1,i3+1) + x2 = r(i1, i2-1,i3 ) + r(i1, i2+1,i3 ) + > + r(i1, i2, i3-1) + r(i1, i2, i3+1) + s(j1,j2,j3) = + > 0.5D0 * r(i1,i2,i3) + > + 0.25D0 * ( r(i1-1,i2,i3) + r(i1+1,i2,i3) + x2) + > + 0.125D0 * ( r(i1-1,i2-1,i3 ) + r(i1-1,i2+1,i3 ) + > + r(i1-1,i2, i3-1) + r(i1-1,i2, i3+1) + > + r(i1+1,i2-1,i3 ) + r(i1+1,i2+1,i3 ) + > + r(i1+1,i2, i3-1) + r(i1+1,i2, i3+1) + y2) + > + 0.0625D0 * (r(i1-1,i2-1,i3-1) + r(i1-1,i2-1,i3+1) + > + r(i1-1,i2+1,i3-1) + r(i1-1,i2+1,i3+1) + > + r(i1+1,i2-1,i3-1) + r(i1+1,i2-1,i3+1) + > + r(i1+1,i2+1,i3-1) + r(i1+1,i2+1,i3+1) ) + enddo + + enddo + enddo + + + j = k-1 + + call comm3(s,m1j,m2j,m3j,j) + + if(k.eq.lbdvm) then + if(proc1) then +CDVM$ REALIGN s(*,*,*) WITH r2(*,*,*) + else +CDVM$ REALIGN s(*,*,*) WITH r1(*,*,*) + endif + endif + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(s,m1j,m2j,m3j,' rprj3',k-1) + endif + if( debug_vec(4) .ge. k )then + call showall(s,m1j,m2j,m3j) + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine rprj3d2( r,m1k,m2k,m3k,s,m1j,m2j,m3j,k,r1,r2, + > m1i,m2i,m3i ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c rprj3 projects onto the next coarser grid, +c using a trilinear Finite Element projection: s = r' = P r +c +c This implementation costs 20A + 4M per result, where +c A and M denote the costs of Addition and Multiplication. +c Note that this vectorizes, and is also fine for cache +c based machines. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' +CDVM$ INHERIT r,s,r1,r2 +CDVM$ DYNAMIC s + integer m1k, m2k, m3k, m1j, m2j, m3j,k,m1i,m2i,m3i + double precision r(m1k,m2k,m3k), s(m1j,m2j,m3j),r1(m1j,m2j,m3j) + double precision r2(m1i,m2i,m3i) + integer j3, j2, j1, i3, i2, i1, d1, d2, d3, j + + double precision x1(m), y1(m), x2,y2 + + if(k.eq.lbdvm) then +CDVM$ NEW_VALUE +CDVM$ REALIGN s(i,j,k) WITH r1(i,j,k) + endif + if(m1k.eq.3)then + d1 = 2 + else + d1 = 1 + endif + + if(m2k.eq.3)then + d2 = 2 + else + d2 = 1 + endif + + if(m3k.eq.3)then + d3 = 2 + else + d3 = 1 + endif + +CDVM$ SHADOW_GROUP gr(r(CORNER)) +CDVM$ SHADOW_START gr +CDVM$ PARALLEL (j3,j2) ON s(*,j2,j3), SHADOW_WAIT gr + do j3=2,m3j-1 + do j2=2,m2j-1 + i3 = 2*j3-d3 + i2 = 2*j2-d2 + + do j1=2,m1j + i1 = 2*j1-d1 + x1(i1-1) = r(i1-1,i2-1,i3 ) + r(i1-1,i2+1,i3 ) + > + r(i1-1,i2, i3-1) + r(i1-1,i2, i3+1) + y1(i1-1) = r(i1-1,i2-1,i3-1) + r(i1-1,i2-1,i3+1) + > + r(i1-1,i2+1,i3-1) + r(i1-1,i2+1,i3+1) + enddo + + do j1=2,m1j-1 + i1 = 2*j1-d1 + y2 = r(i1, i2-1,i3-1) + r(i1, i2-1,i3+1) + > + r(i1, i2+1,i3-1) + r(i1, i2+1,i3+1) + x2 = r(i1, i2-1,i3 ) + r(i1, i2+1,i3 ) + > + r(i1, i2, i3-1) + r(i1, i2, i3+1) + s(j1,j2,j3) = + > 0.5D0 * r(i1,i2,i3) + > + 0.25D0 * ( r(i1-1,i2,i3) + r(i1+1,i2,i3) + x2) + > + 0.125D0 * ( x1(i1-1) + x1(i1+1) + y2) + > + 0.0625D0 * ( y1(i1-1) + y1(i1+1) ) + enddo + + enddo + enddo + + + j = k-1 + + call comm3(s,m1j,m2j,m3j,j) + + if(k.eq.lbdvm) then + if(proc1) then +CDVM$ REALIGN s(*,*,*) WITH r2(*,*,*) + else +CDVM$ REALIGN s(*,*,*) WITH r1(*,*,*) + endif + endif + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(s,m1j,m2j,m3j,' rprj3',k-1) + endif + if( debug_vec(4) .ge. k )then + call showall(s,m1j,m2j,m3j) + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine interp( z,mm1,mm2,mm3,u,n1,n2,n3,k,u1,u2, + > m1i,m2i,m3i) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c interp adds the trilinear interpolation of the correction +c from the coarser grid to the current approximation: u = u + Qu' +c +c Observe that this implementation costs 16A + 4M, where +c A and M denote the costs of Addition and Multiplication. +c Note that this vectorizes, and is also fine for cache +c based machines. Vector machines may get slightly better +c performance however, with 8 separate "do i1" loops, rather than 4. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer mm1, mm2, mm3, n1, n2, n3,k,m1i,m2i,m3i + double precision z(mm1,mm2,mm3),u(n1,n2,n3),u1(n1,n2,n3) + double precision u2(m1i,m2i,m3i) + integer i3, i2, i1, d1, d2, d3, t1, t2, t3 + +c note that m = 1037 in globals.h but for this only need to be +c 535 to handle up to 1024^3 +c integer m +c parameter( m=535 ) + double precision z1(m),z2(m),z3(m) +CDVM$ INHERIT z,u,u1,u2 +CDVM$ DYNAMIC u + + if(k.eq.lbdvm .and. proc1) then +CDVM$ NEW_VALUE +CDVM$ REALIGN u(*,*,*) WITH u2(*,*,*) + call zero3(u,n1,n2,n3) + endif + + if( n1 .ne. 3 .and. n2 .ne. 3 .and. n3 .ne. 3 ) then +CDVM$ SHADOW_GROUP gz(z(CORNER)) +CDVM$ SHADOW_START gz +CDVM$ SHADOW_WAIT gz +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-1,2*i2-1,2*i3-1) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + + u(2*i1-1,2*i2-1,2*i3-1)=u(2*i1-1,2*i2-1,2*i3-1) + > +z(i1,i2,i3) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1,2*i2-1,2*i3-1) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + u(2*i1,2*i2-1,2*i3-1)=u(2*i1,2*i2-1,2*i3-1) + > +0.5d0*(z(i1+1,i2,i3)+z(i1,i2,i3)) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-1,2*i2,2*i3-1) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + u(2*i1-1,2*i2,2*i3-1)=u(2*i1-1,2*i2,2*i3-1) + > +0.5d0 * ( z(i1,i2+1,i3) + z(i1,i2,i3) ) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1,2*i2,2*i3-1) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + u(2*i1,2*i2,2*i3-1)=u(2*i1,2*i2,2*i3-1) + > +0.25d0*( z(i1,i2+1,i3) + z(i1,i2,i3) + > + z(i1+1,i2+1,i3) + z(i1+1,i2,i3) ) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-1,2*i2-1,2*i3) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + u(2*i1-1,2*i2-1,2*i3)=u(2*i1-1,2*i2-1,2*i3) + > +0.5d0 * ( z(i1,i2,i3+1) + z(i1,i2,i3) ) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1,2*i2-1,2*i3) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + u(2*i1,2*i2-1,2*i3)=u(2*i1,2*i2-1,2*i3) + > +0.25d0*( z(i1,i2,i3+1) + z(i1,i2,i3) + > + z(i1+1,i2,i3+1) + z(i1+1,i2,i3) ) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-1,2*i2,2*i3) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + u(2*i1-1,2*i2,2*i3)=u(2*i1-1,2*i2,2*i3) + > +0.25d0* (z(i1,i2+1,i3+1) + z(i1,i2,i3+1) + > + z(i1,i2+1,i3) + z(i1,i2,i3) ) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1,2*i2,2*i3) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1-1 + u(2*i1,2*i2,2*i3)=u(2*i1,2*i2,2*i3) + > +0.125d0*(z(i1,i2+1,i3+1) + z(i1,i2,i3+1) + > + z(i1,i2+1,i3) + z(i1,i2,i3) + > + z(i1+1,i2+1,i3+1) + z(i1+1,i2,i3+1) + > + z(i1+1,i2+1,i3) + z(i1+1,i2,i3) ) + enddo + enddo + enddo + + else + + if(n1.eq.3)then + d1 = 2 + t1 = 1 + else + d1 = 1 + t1 = 0 + endif + + if(n2.eq.3)then + d2 = 2 + t2 = 1 + else + d2 = 1 + t2 = 0 + endif + + if(n3.eq.3)then + d3 = 2 + t3 = 1 + else + d3 = 1 + t3 = 0 + endif + +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-d1,2*i2-d2,2*i3-d3) + do i3=d3,mm3-1 + do i2=d2,mm2-1 + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-d2,2*i3-d3)=u(2*i1-d1,2*i2-d2,2*i3-d3) + > +z(i1,i2,i3) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-t1,2*i2-d2,2*i3-d3) + do i3=d3,mm3-1 + do i2=d2,mm2-1 + do i1=1,mm1-1 + u(2*i1-t1,2*i2-d2,2*i3-d3)=u(2*i1-t1,2*i2-d2,2*i3-d3) + > +0.5D0*(z(i1+1,i2,i3)+z(i1,i2,i3)) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-d1,2*i2-t2,2*i3-d3) + do i3=d3,mm3-1 + do i2=d2,mm2-1 + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-t2,2*i3-d3)=u(2*i1-d1,2*i2-t2,2*i3-d3) + > +0.5D0*(z(i1,i2+1,i3)+z(i1,i2,i3)) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-t1,2*i2-t2,2*i3-d3) + do i3=d3,mm3-1 + do i2=d2,mm2-1 + do i1=1,mm1-1 + u(2*i1-t1,2*i2-t2,2*i3-d3)=u(2*i1-t1,2*i2-t2,2*i3-d3) + > +0.25D0*(z(i1+1,i2+1,i3)+z(i1+1,i2,i3) + > +z(i1, i2+1,i3)+z(i1, i2,i3)) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-d1,2*i2-d2,2*i3-t3) + do i3=1,mm3-1 + do i2=d2,mm2-1 + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-d2,2*i3-t3)=u(2*i1-d1,2*i2-d2,2*i3-t3) + > +0.5D0*(z(i1,i2,i3+1)+z(i1,i2,i3)) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-t1,2*i2-d2,2*i3-t3) + do i3=1,mm3-1 + do i2=d2,mm2-1 + do i1=1,mm1-1 + u(2*i1-t1,2*i2-d2,2*i3-t3)=u(2*i1-t1,2*i2-d2,2*i3-t3) + > +0.25D0*(z(i1+1,i2,i3+1)+z(i1,i2,i3+1) + > +z(i1+1,i2,i3 )+z(i1,i2,i3 )) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-d1,2*i2-t2,2*i3-t3) + do i3=1,mm3-1 + do i2=d2,mm2-1 + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-t2,2*i3-t3)=u(2*i1-d1,2*i2-t2,2*i3-t3) + > +0.25D0*(z(i1,i2+1,i3+1)+z(i1,i2,i3+1) + > +z(i1,i2+1,i3 )+z(i1,i2,i3 )) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2,i1) ON u(2*i1-t1,2*i2-t2,2*i3-t3) + do i3=1,mm3-1 + do i2=d2,mm2-1 + do i1=1,mm1-1 + u(2*i1-t1,2*i2-t2,2*i3-t3)=u(2*i1-t1,2*i2-t2,2*i3-t3) + > +0.125D0*(z(i1+1,i2+1,i3+1)+z(i1+1,i2,i3+1) + > +z(i1 ,i2+1,i3+1)+z(i1 ,i2,i3+1) + > +z(i1+1,i2+1,i3 )+z(i1+1,i2,i3 ) + > +z(i1 ,i2+1,i3 )+z(i1 ,i2,i3 )) + enddo + enddo + enddo + + + + endif + + if(k.eq.lbdvm) then + if(proc1) then +CDVM$ REALIGN u(i,j,k) WITH u1(i,j,k) + endif + endif + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(z,mm1,mm2,mm3,'z: inter',k-1) + call rep_nrm(u,n1,n2,n3,'u: inter',k) + endif + + if( debug_vec(5) .ge. k )then + call showall(z,mm1,mm2,mm3) + call showall(u,n1,n2,n3) + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine interpd2( z,mm1,mm2,mm3,u,n1,n2,n3,k,u1,u2, + > m1i,m2i,m3i) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c interp adds the trilinear interpolation of the correction +c from the coarser grid to the current approximation: u = u + Qu' +c +c Observe that this implementation costs 16A + 4M, where +c A and M denote the costs of Addition and Multiplication. +c Note that this vectorizes, and is also fine for cache +c based machines. Vector machines may get slightly better +c performance however, with 8 separate "do i1" loops, rather than 4. +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer mm1, mm2, mm3, n1, n2, n3,k,m1i,m2i,m3i + double precision z(mm1,mm2,mm3),u(n1,n2,n3),u1(n1,n2,n3) + double precision u2(m1i,m2i,m3i) + integer i3, i2, i1, d1, d2, d3, t1, t2, t3 + +c note that m = 1037 in globals.h but for this only need to be +c 535 to handle up to 1024^3 +c integer m +c parameter( m=535 ) + double precision z1(m),z2(m),z3(m) +CDVM$ INHERIT z,u,u1,u2 +CDVM$ DYNAMIC u + + if(k.eq.lbdvm .and. proc1) then +CDVM$ NEW_VALUE +CDVM$ REALIGN u(*,*,*) WITH u2(*,*,*) + call zero3(u,n1,n2,n3) + endif + + if( n1 .ne. 3 .and. n2 .ne. 3 .and. n3 .ne. 3 ) then +CDVM$ SHADOW_GROUP gz(z(CORNER)) +CDVM$ SHADOW_START gz +CDVM$ SHADOW_WAIT gz +CDVM$ PARALLEL (i3,i2) ON u(*,2*i2-1,2*i3-1) + do i3=1,mm3-1 + do i2=1,mm2-1 + +CDVM$ DEBUG 3(D=0) + do i1=1,mm1 + z1(i1) = z(i1,i2+1,i3) + z(i1,i2,i3) + z2(i1) = z(i1,i2,i3+1) + z(i1,i2,i3) + z3(i1) = z(i1,i2+1,i3+1) + z(i1,i2,i3+1) + z1(i1) + enddo +CDVM$ END DEBUG 3 + do i1=1,mm1-1 + u(2*i1-1,2*i2-1,2*i3-1)=u(2*i1-1,2*i2-1,2*i3-1) + > +z(i1,i2,i3) + u(2*i1,2*i2-1,2*i3-1)=u(2*i1,2*i2-1,2*i3-1) + > +0.5d0*(z(i1+1,i2,i3)+z(i1,i2,i3)) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2) ON u(*,2*i2,2*i3-1) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1 + z1(i1) = z(i1,i2+1,i3) + z(i1,i2,i3) + enddo + do i1=1,mm1-1 + u(2*i1-1,2*i2,2*i3-1)=u(2*i1-1,2*i2,2*i3-1) + > +0.5d0 * z1(i1) + u(2*i1,2*i2,2*i3-1)=u(2*i1,2*i2,2*i3-1) + > +0.25d0*( z1(i1) + z1(i1+1) ) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2) ON u(*,2*i2-1,2*i3) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1 + z2(i1) = z(i1,i2,i3+1) + z(i1,i2,i3) + enddo + do i1=1,mm1-1 + u(2*i1-1,2*i2-1,2*i3)=u(2*i1-1,2*i2-1,2*i3) + > +0.5d0 * z2(i1) + u(2*i1,2*i2-1,2*i3)=u(2*i1,2*i2-1,2*i3) + > +0.25d0*( z2(i1) + z2(i1+1) ) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2) ON u(*,2*i2,2*i3) + do i3=1,mm3-1 + do i2=1,mm2-1 + do i1=1,mm1 + z1(i1) = z(i1,i2+1,i3) + z(i1,i2,i3) + z3(i1) = z(i1,i2+1,i3+1) + z(i1,i2,i3+1) + z1(i1) + enddo + + do i1=1,mm1-1 + u(2*i1-1,2*i2,2*i3)=u(2*i1-1,2*i2,2*i3) + > +0.25d0* z3(i1) + u(2*i1,2*i2,2*i3)=u(2*i1,2*i2,2*i3) + > +0.125d0*( z3(i1) + z3(i1+1) ) + enddo + enddo + enddo + + else + + if(n1.eq.3)then + d1 = 2 + t1 = 1 + else + d1 = 1 + t1 = 0 + endif + + if(n2.eq.3)then + d2 = 2 + t2 = 1 + else + d2 = 1 + t2 = 0 + endif + + if(n3.eq.3)then + d3 = 2 + t3 = 1 + else + d3 = 1 + t3 = 0 + endif +CDVM$ PARALLEL (i3,i2) ON u(*,2*i2-d2,2*i3-d3) + do i3=d3,mm3-1 + do i2=d2,mm2-1 + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-d2,2*i3-d3)=u(2*i1-d1,2*i2-d2,2*i3-d3) + > +z(i1,i2,i3) + enddo + do i1=1,mm1-1 + u(2*i1-t1,2*i2-d2,2*i3-d3)=u(2*i1-t1,2*i2-d2,2*i3-d3) + > +0.5D0*(z(i1+1,i2,i3)+z(i1,i2,i3)) + enddo + + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-t2,2*i3-d3)=u(2*i1-d1,2*i2-t2,2*i3-d3) + > +0.5D0*(z(i1,i2+1,i3)+z(i1,i2,i3)) + enddo + do i1=1,mm1-1 + u(2*i1-t1,2*i2-t2,2*i3-d3)=u(2*i1-t1,2*i2-t2,2*i3-d3) + > +0.25D0*(z(i1+1,i2+1,i3)+z(i1+1,i2,i3) + > +z(i1, i2+1,i3)+z(i1, i2,i3)) + enddo + enddo + enddo +CDVM$ PARALLEL (i3,i2) ON u(*,2*i2-d2,2*i3-t3) + do i3=1,mm3-1 + do i2=d2,mm2-1 + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-d2,2*i3-t3)=u(2*i1-d1,2*i2-d2,2*i3-t3) + > +0.5D0*(z(i1,i2,i3+1)+z(i1,i2,i3)) + enddo + do i1=1,mm1-1 + u(2*i1-t1,2*i2-d2,2*i3-t3)=u(2*i1-t1,2*i2-d2,2*i3-t3) + > +0.25D0*(z(i1+1,i2,i3+1)+z(i1,i2,i3+1) + > +z(i1+1,i2,i3 )+z(i1,i2,i3 )) + enddo + + do i1=d1,mm1-1 + u(2*i1-d1,2*i2-t2,2*i3-t3)=u(2*i1-d1,2*i2-t2,2*i3-t3) + > +0.25D0*(z(i1,i2+1,i3+1)+z(i1,i2,i3+1) + > +z(i1,i2+1,i3 )+z(i1,i2,i3 )) + enddo + do i1=1,mm1-1 + u(2*i1-t1,2*i2-t2,2*i3-t3)=u(2*i1-t1,2*i2-t2,2*i3-t3) + > +0.125D0*(z(i1+1,i2+1,i3+1)+z(i1+1,i2,i3+1) + > +z(i1 ,i2+1,i3+1)+z(i1 ,i2,i3+1) + > +z(i1+1,i2+1,i3 )+z(i1+1,i2,i3 ) + > +z(i1 ,i2+1,i3 )+z(i1 ,i2,i3 )) + enddo + enddo + enddo + + endif + + if(k.eq.lbdvm) then + if(proc1) then +CDVM$ REALIGN u(i,j,k) WITH u1(i,j,k) + endif + endif + + if( debug_vec(0) .ge. 1 )then + call rep_nrm(z,mm1,mm2,mm3,'z: inter',k-1) + call rep_nrm(u,n1,n2,n3,'u: inter',k) + endif + + if( debug_vec(5) .ge. k )then + call showall(z,mm1,mm2,mm3) + call showall(u,n1,n2,n3) + endif + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine norm2u3(r,n1,n2,n3,rnm2,rnmu,nx,ny,nz) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c norm2u3 evaluates approximations to the L2 norm and the +c uniform (or L-infinity or Chebyshev) norm, under the +c assumption that the boundaries are periodic or zero. Add the +c boundaries in with half weight (quarter weight on the edges +c and eighth weight at the corners) for inhomogeneous boundaries. +c--------------------------------------------------------------------- + implicit none + + + integer n1, n2, n3, nx, ny, nz + double precision rnm2, rnmu, r(n1,n2,n3) + double precision s, a, ss + integer i3, i2, i1, ierr +CDVM$ INHERIT r + integer n + + n = nx*ny*nz + + s=0.0D0 + rnmu = 0.0D0 +CDVM$ PARALLEL (i3,i2,i1) ON r(i1,i2,i3),REDUCTION (SUM(s),MAX(rnmu)) + do i3=2,n3-1 + do i2=2,n2-1 + do i1=2,n1-1 + s=s+r(i1,i2,i3)**2 + a=abs(r(i1,i2,i3)) + if(a.gt.rnmu)rnmu=a + enddo + enddo + enddo + + rnm2=sqrt( s / float( n )) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine rep_nrm(u,n1,n2,n3,title,kk) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c report on norm +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' + + integer n1, n2, n3, kk + double precision u(n1,n2,n3) + character*8 title +CDVM$ INHERIT u + double precision rnm2, rnmu + + + call norm2u3(u,n1,n2,n3,rnm2,rnmu,nx(kk),ny(kk),nz(kk)) + write(*,7)kk,title,rnm2,rnmu + 7 format(' Level',i2,' in ',a8,': norms =',D21.14,D21.14) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine comm3(u,n1,n2,n3,kk) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c comm3 organizes the communication on all borders +c--------------------------------------------------------------------- + implicit none + + include 'globals.h' +CDVM$ INHERIT u + integer n1, n2, n3, kk + double precision u(n1,n2,n3) + integer axis + + do axis = 1, 3 + call comm1p( axis, u, n1, n2, n3, kk ) + enddo + + return + end + +c-------------------------------------------------------------------- + +c-------------------------------------------------------------------- + + + subroutine comm1p( axis, u, n1, n2, n3, kk ) + +c-------------------------------------------------------------------- + +c-------------------------------------------------------------------- + + + implicit none + + include 'globals.h' +CDVM$ INHERIT u +CDVM$ ASYNCID W + integer axis, dir, n1, n2, n3 + double precision u( n1, n2, n3 ) + + integer i3, i2, i1, buff_len,buff_id + integer i, kk, indx + + if( axis .eq. 1 )then +CDVM$ ASYNCHRONOUS W +CDVM$ F90 u(n1,2:n2-1,2:n3-1) = u(2,2:n2-1,2:n3-1) +CDVM$ F90 u(1,2:n2-1,2:n3-1) = u(n1-1,2:n2-1,2:n3-1) + do i3=2,n3-1 + do i2=2,n2-1 + u(n1,i2,i3) = u(2,i2,i3) + u(1,i2,i3) = u(n1-1,i2,i3) + enddo + enddo +CDVM$ END ASYNCHRONOUS + endif + + if( axis .eq. 2 )then +CDVM$ ASYNCHRONOUS W +CDVM$ F90 u(1:n1,n2,2:n3-1) = u(1:n1,2,2:n3-1) +CDVM$ F90 u(1:n1,1,2:n3-1) = u(1:n1,n2-1,2:n3-1) + do i3=2,n3-1 + do i1=1,n1 + u(i1,n2,i3) = u(i1,2,i3) + u(i1,1,i3) = u(i1,n2-1,i3) + enddo + enddo +CDVM$ END ASYNCHRONOUS + endif + + if( axis .eq. 3 )then +CDVM$ ASYNCHRONOUS W +CDVM$ F90 u(1:n1,1:n2,n3) = u(1:n1,1:n2,2) +CDVM$ F90 u(1:n1,1:n2,1) = u(1:n1,1:n2,n3-1) + do i2=1,n2 + do i1=1,n1 + u(i1,i2,n3) = u(i1,i2,2) + u(i1,i2,1) = u(i1,i2,n3-1) + enddo + enddo +CDVM$ END ASYNCHRONOUS + endif +CDVM$ ASYNCWAIT W + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine zran3(z,n1,n2,n3,nx,ny,k) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c zran3 loads +1 at ten randomly chosen points, +c loads -1 at a different ten random points, +c and zero elsewhere. +c--------------------------------------------------------------------- + implicit none + include 'npbparams.h' +CDVM$ INHERIT z +CDVM$ DYNAMIC z + integer is1, is2, is3, ie1, ie2, ie3,i3b,i3e,i2b,i1b + common /grid/ is1,is2,is3,ie1,ie2,ie3 + + integer n1, n2, n3, k, nx, ny, ierr, i0, m0, m1 + double precision z(n1,n2,n3),zz(2+2**ndim1) + + integer mm, i1, i2, i3, d1, e1, e2, e3,ii2,ii1 + double precision x, a + double precision xx, x0, x1, a1, a2, ai, power + parameter( mm = 10, a = 5.D0 ** 13, x = 314159265.D0) + double precision ten( mm, 0:1 ), temp, best + integer i, j1( mm, 0:1 ), j2( mm, 0:1 ), j3( mm, 0:1 ) + integer jg( 0:3, mm, 0:1 ), jg_temp(4) + external randlc + double precision randlc, rdummy + +CDVM$ DEBUG 8 (D=1) + a1 = power( a, nx ) + a2 = power( a, nx*ny ) + call zero3(z,n1,n2,n3) + + i = is1-2+nx*(is2-2+ny*(is3-2)) + + + d1 = ie1 - is1 + 1 + e1 = ie1 - is1 + 2 + e2 = ie2 - is2 + 2 + e3 = ie3 - is3 + 2 + x0 = x +c i0=0 + i3b=2 + i3e=e3 + i2b=2 + i1b=2 +CDVM$ PARALLEL (i3,i2,i1) ON z(i1,i2,i3),NEW(i3b,i3e,i2b,i1b) + + do i3 = i3b, i3e + do i2 = i2b, e2 + do i1=i1b,e1 + if(i1.eq.i1b) then + if(i3 .eq.i3b .and. i2 .eq. i2b) then + i = is1-2+nx*(i2b-2+ny*(i3b-2)) + ai = power( a, i ) + x0 = x + rdummy = randlc( x0, ai ) + x1 = x0 + endif + + if(i2 .eq.i2b .and.i3.ne.i3b ) then + rdummy = randlc( x0, a2 ) + x1 = x0 + endif + xx = x1 + call vranlc( d1, xx, a, zz( 2)) +c call vranlc( d1, xx, a, z( 2, i2, i3 )) + rdummy = randlc( x1, a1 ) + endif + z(i1,i2,i3) = zz(i1) + enddo + enddo + enddo + +c--------------------------------------------------------------------- +c call comm3(z,n1,n2,n3) +c call showall(z,n1,n2,n3) +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c each processor looks for twenty candidates +c--------------------------------------------------------------------- + + do i=1,mm + ten( i, 1 ) = 0.0D0 + j1( i, 1 ) = 0 + j2( i, 1 ) = 0 + j3( i, 1 ) = 0 + ten( i, 0 ) = 1.0D0 + j1( i, 0 ) = 0 + j2( i, 0 ) = 0 + j3( i, 0 ) = 0 + enddo +CDVM$ PARALLEL (i3,i2,i1) ON z(i1,i2,i3) + + do i3=2,n3-1 + do i2=2,n2-1 + do i1=2,n1-1 + if( z(i1,i2,i3) .gt. ten( 1, 1 ) )then + ten(1,1) = z(i1,i2,i3) + j1(1,1) = i1 + j2(1,1) = i2 + j3(1,1) = i3 + call bubble( ten, j1, j2, j3, mm, 1 ) + endif + if( z(i1,i2,i3) .lt. ten( 1, 0 ) )then + ten(1,0) = z(i1,i2,i3) + j1(1,0) = i1 + j2(1,0) = i2 + j3(1,0) = i3 + call bubble( ten, j1, j2, j3, mm, 0 ) + endif + enddo + enddo + enddo + + +c--------------------------------------------------------------------- +c Now which of these are globally best? +c--------------------------------------------------------------------- + i1 = mm + i0 = mm + do i=mm,1,-1 + + best=0. +CDVM$ PARALLEL (i3,ii2,ii1) ON z(ii1,ii2,i3),REDUCTION(MAX(best)) + do i3=2,n3-1 + do ii2=2,n2-1 + do ii1=2,n1-1 + if(best.eq.0.) best= z( j1(i1,1), j2(i1,1), j3(i1,1) ) + enddo + enddo + enddo + + if(best.eq.z(j1(i1,1),j2(i1,1),j3(i1,1)))then + jg( 0, i, 1) = 0 + jg( 1, i, 1) = is1 - 2 + j1( i1, 1 ) + jg( 2, i, 1) = is2 - 2 + j2( i1, 1 ) + jg( 3, i, 1) = is3 - 2 + j3( i1, 1 ) + i1 = i1-1 + else + jg( 0, i, 1) = 0 + jg( 1, i, 1) = 0 + jg( 2, i, 1) = 0 + jg( 3, i, 1) = 0 + endif + ten( i, 1 ) = best + + best=0. +CDVM$ PARALLEL (i3,ii2,ii1) ON z(ii1,ii2,i3),REDUCTION(MIN(best)) + do i3=2,n3-1 + do ii2=2,n2-1 + do ii1=2,n1-1 + if(best.eq.0.) best= z( j1(i0,0),j2(i0,0),j3(i0,0) ) + enddo + enddo + enddo + if(best.eq.z(j1(i0,0),j2(i0,0),j3(i0,0)))then + jg( 0, i, 0) = 0 + jg( 1, i, 0) = is1 - 2 + j1( i0, 0 ) + jg( 2, i, 0) = is2 - 2 + j2( i0, 0 ) + jg( 3, i, 0) = is3 - 2 + j3( i0, 0 ) + i0 = i0-1 + else + jg( 0, i, 0) = 0 + jg( 1, i, 0) = 0 + jg( 2, i, 0) = 0 + jg( 3, i, 0) = 0 + endif + ten( i, 0 ) = best + + enddo + m1 = i1+1 + m0 = i0+1 + +c write(*,*)' ' +c write(*,*)' negative charges at' +c write(*,9)(jg(1,i,0),jg(2,i,0),jg(3,i,0),i=1,mm) +c write(*,*)' positive charges at' +c write(*,9)(jg(1,i,1),jg(2,i,1),jg(3,i,1),i=1,mm) +c write(*,*)' small random numbers were' +c write(*,8)(ten( i,0),i=mm,1,-1) +c write(*,*)' and they were found on processor number' +c write(*,7)(jg(0,i,0),i=mm,1,-1) +c write(*,*)' large random numbers were' +c write(*,8)(ten( i,1),i=mm,1,-1) +c write(*,*)' and they were found on processor number' +c write(*,7)(jg(0,i,1),i=mm,1,-1) +c 9 format(5(' (',i3,2(',',i3),')')) +c 8 format(5D15.8) +c 7 format(10i4) +CDVM$ PARALLEL (i3,i2,i1) ON z(i1,i2,i3) + do i3=1,n3 + do i2=1,n2 + do i1=1,n1 + z(i1,i2,i3) = 0.0D0 + enddo + enddo + enddo + do i=mm,m0,-1 + z( j1(i,0), j2(i,0), j3(i,0) ) = -1.0D0 + enddo + do i=mm,m1,-1 + z( j1(i,1), j2(i,1), j3(i,1) ) = +1.0D0 + enddo + call comm3(z,n1,n2,n3,k) + +c--------------------------------------------------------------------- +c call showall(z,n1,n2,n3) +c--------------------------------------------------------------------- +CDVM$ END DEBUG 8 + return + end + + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine showall(z,n1,n2,n3) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + +CDVM$ INHERIT z + integer n1,n2,n3,i1,i2,i3,i,ierr + double precision z(n1,n2,n3) + integer m1, m2, m3 + + m1 = min(n1,18) + m2 = min(n2,14) + m3 = min(n3,18) + + write(*,*)' ' +C do i3=1,m3 +C do i1=1,m1 +C write(*,6)(z(i1,i2,i3),i2=1,m2) +C enddo + +C write(*,*)' - - - - - - - ' +C enddo + + write (*,*) z + + write(*,*)' ' + 6 format(15f6.3) + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function power( a, n ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c power raises an integer, disguised as a double +c precision real, to an integer power +c--------------------------------------------------------------------- + implicit none + + double precision a, aj + integer n, nj + external randlc + double precision randlc, rdummy + + power = 1.0D0 + nj = n + aj = a + 100 continue + + if( nj .eq. 0 ) goto 200 + if( mod(nj,2) .eq. 1 ) rdummy = randlc( power, aj ) + rdummy = randlc( aj, aj ) + nj = nj/2 + go to 100 + + 200 continue + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine bubble( ten, j1, j2, j3, m, ind ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c bubble does a bubble sort in direction dir +c--------------------------------------------------------------------- + implicit none + + + integer m, ind, j1( m, 0:1 ), j2( m, 0:1 ), j3( m, 0:1 ) + double precision ten( m, 0:1 ) + double precision temp + integer i, j_temp + + if( ind .eq. 1 )then + + do i=1,m-1 + if( ten(i,ind) .gt. ten(i+1,ind) )then + + temp = ten( i+1, ind ) + ten( i+1, ind ) = ten( i, ind ) + ten( i, ind ) = temp + + j_temp = j1( i+1, ind ) + j1( i+1, ind ) = j1( i, ind ) + j1( i, ind ) = j_temp + + j_temp = j2( i+1, ind ) + j2( i+1, ind ) = j2( i, ind ) + j2( i, ind ) = j_temp + + j_temp = j3( i+1, ind ) + j3( i+1, ind ) = j3( i, ind ) + j3( i, ind ) = j_temp + + else + go to 5 + endif + enddo + 5 return + else + + do i=1,m-1 + if( ten(i,ind) .lt. ten(i+1,ind) )then + + temp = ten( i+1, ind ) + ten( i+1, ind ) = ten( i, ind ) + ten( i, ind ) = temp + + j_temp = j1( i+1, ind ) + j1( i+1, ind ) = j1( i, ind ) + j1( i, ind ) = j_temp + + j_temp = j2( i+1, ind ) + j2( i+1, ind ) = j2( i, ind ) + j2( i, ind ) = j_temp + + j_temp = j3( i+1, ind ) + j3( i+1, ind ) = j3( i, ind ) + j3( i, ind ) = j_temp + + else + go to 6 + endif + enddo +6 return + endif + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine zero3(z,n1,n2,n3) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + +CDVM$ INHERIT z + integer n1, n2, n3 + double precision z(n1,n2,n3) + integer i1, i2, i3 + +CDVM$ PARALLEL (i3,i2,i1) ON z(i1,i2,i3) + do i3=1,n3 + do i2=1,n2 + do i1=1,n1 + z(i1,i2,i3)=0.0D0 + enddo + enddo + enddo + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- +! function ALLOCATE(size,ar,adp) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- +! integer size(3),adp,ALLOCATE +! double precision ar(1) +!CDVM$ DEBUG 2 (D=0) +! ALLOCATE = adp +!CDVM$ ENDDEBUG 2 +! return +! end + +c----- end of program ------------------------------------------------ + subroutine print_results(name, class, n1, n2, n3, niter, + > t, mops, optype, verified, npbversion) +c ,compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + implicit none + character*2 name + character*1 class + integer n1, n2, n3, niter, j + double precision t, mops + character optype*24, size*13 + logical verified + character*(*) npbversion +c > , compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7 + + write (*, 2) name + 2 format(//, ' ', A2, ' Benchmark Completed.') + + write (*, 3) Class + 3 format(' Class = ', 12x, a12) + +c If this is not a grid-based problem (EP, FT, CG), then +c we only print n1, which contains some measure of the +c problem size. In that case, n2 and n3 are both zero. +c Otherwise, we print the grid size n1xn2xn3 + + if ((n2 .eq. 0) .and. (n3 .eq. 0)) then + if (name(1:2) .eq. 'EP') then + write(size, '(f12.0)' ) 2.d0**n1 + do j =13,1,-1 + if (size(j:j) .eq. '.') size(j:j) = ' ' + end do + write (*,42) size + 42 format(' Size = ',12x, a14) + else + write (*,44) n1 + 44 format(' Size = ',12x, i12) + endif + else + write (*, 4) n1,n2,n3 + 4 format(' Size = ',12x, i3,'x',i3,'x',i3) + endif + + write (*, 5) niter + 5 format(' Iterations = ', 12x, i12) + + write (*, 6) t + 6 format(' Time in seconds = ',12x, f12.2) + + write (*,9) mops + 9 format(' Mop/s total = ',12x, f12.2) + + write(*, 11) optype + 11 format(' Operation type = ', a24) + + if (verified) then + write(*,12) ' SUCCESSFUL' + else + write(*,12) 'UNSUCCESSFUL' + endif + 12 format(' Verification = ', 12x, a) + + write(*,13) npbversion + 13 format(' Version = ', 12x, a12) + +c write(*,14) compiletime +c 14 format(' Compile date = ', 12x, a12) + + +c write (*,121) cs1 +c 121 format(/, ' Compile options:', /, +c > ' F77 = ', A) + +c write (*,122) cs2 +c 122 format(' FLINK = ', A) + +c write (*,123) cs3 +c 123 format(' F_LIB = ', A) +c +c write (*,124) cs4 +c 124 format(' F_INC = ', A) +c +c write (*,125) cs5 +c 125 format(' FFLAGS = ', A) +c +c write (*,126) cs6 +c 126 format(' FLINKFLAGS = ', A) +c +c write(*, 127) cs7 +c 127 format(' RAND = ', A) + + write (*,130) + 130 format(//' Please send the results of this run to:'// + > ' NPB Development Team '/ + > ' Internet: npb@nas.nasa.gov'/ + > ' '/ + > ' If email is not available, send this to:'// + > ' MS T27A-1'/ + > ' NASA Ames Research Center'/ + > ' Moffett Field, CA 94035-1000'// + > ' Fax: 415-604-3957'//) + + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function randlc (x, a) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c This routine returns a uniform pseudorandom double precision number in the +c range (0, 1) by using the linear congruential generator +c +c x_{k+1} = a x_k (mod 2^46) +c +c where 0 < x_k < 2^46 and 0 < a < 2^46. This scheme generates 2^44 numbers +c before repeating. The argument A is the same as 'a' in the above formula, +c and X is the same as x_0. A and X must be odd double precision integers +c in the range (1, 2^46). The returned value RANDLC is normalized to be +c between 0 and 1, i.e. RANDLC = 2^(-46) * x_1. X is updated to contain +c the new seed x_1, so that subsequent calls to RANDLC using the same +c arguments will generate a continuous sequence. +c +c This routine should produce the same results on any computer with at least +c 48 mantissa bits in double precision floating point data. On 64 bit +c systems, double precision should be disabled. +c +c David H. Bailey October 26, 1990 +c +c--------------------------------------------------------------------- + + implicit none + + double precision r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + randlc = r46 * x + + return + end + + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine vranlc (n, x, a, y) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c This routine generates N uniform pseudorandom double precision numbers in +c the range (0, 1) by using the linear congruential generator +c +c x_{k+1} = a x_k (mod 2^46) +c +c where 0 < x_k < 2^46 and 0 < a < 2^46. This scheme generates 2^44 numbers +c before repeating. The argument A is the same as 'a' in the above formula, +c and X is the same as x_0. A and X must be odd double precision integers +c in the range (1, 2^46). The N results are placed in Y and are normalized +c to be between 0 and 1. X is updated to contain the new seed, so that +c subsequent calls to VRANLC using the same arguments will generate a +c continuous sequence. If N is zero, only initialization is performed, and +c the variables X, A and Y are ignored. +c +c This routine is the standard version designed for scalar or RISC systems. +c However, it should produce the same results on any single processor +c computer with at least 48 mantissa bits in double precision floating point +c data. On 64 bit systems, double precision should be disabled. +c +c--------------------------------------------------------------------- + + implicit none + + integer i,n + double precision y,r23,r46,t23,t46,a,x,t1,t2,t3,t4,a1,a2,x1,x2,z + dimension y(*) + parameter (r23 = 0.5d0 ** 23, r46 = r23 ** 2, t23 = 2.d0 ** 23, + > t46 = t23 ** 2) + + +c--------------------------------------------------------------------- +c Break A into two parts such that A = 2^23 * A1 + A2. +c--------------------------------------------------------------------- + t1 = r23 * a + a1 = int (t1) + a2 = a - t23 * a1 + +c--------------------------------------------------------------------- +c Generate N results. This loop is not vectorizable. +c--------------------------------------------------------------------- + do i = 1, n + +c--------------------------------------------------------------------- +c Break X into two parts such that X = 2^23 * X1 + X2, compute +c Z = A1 * X2 + A2 * X1 (mod 2^23), and then +c X = 2^23 * Z + A2 * X2 (mod 2^46). +c--------------------------------------------------------------------- + t1 = r23 * x + x1 = int (t1) + x2 = x - t23 * x1 + t1 = a1 * x2 + a2 * x1 + t2 = int (r23 * t1) + z = t1 - t23 * t2 + t3 = t23 * z + a2 * x2 + t4 = int (r46 * t3) + x = t3 - t46 * t4 + y(i) = r46 * x + enddo + return + end +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_clear(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + elapsed(n) = 0.0 + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_start(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + start(n) = elapsed_time() + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_stop(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + double precision t, now + + now = elapsed_time() + t = now - start(n) + elapsed(n) = elapsed(n) + t + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function timer_read(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + timer_read = elapsed(n) + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function elapsed_time() + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + implicit none +CC external wtime +CC double precision wtime + + double precision t + double precision dvtime + include 'dtime.h' + data t/0.d0/ +c This function must measure wall clock time, not CPU time. +c Since there is no portable timer in Fortran (77) +c we call a routine compiled in C (though the C source may have +c to be tweaked). +c call wtime(t) +c The following is not ok for "official" results because it reports +c CPU time not wall clock time. It may be useful for developing/testing +c on timeshared Crays, though. +c call second(t) + + if(dvm_debug.ne.0) then + t=t+1.D0 + elapsed_time = t + else + elapsed_time = dvtime() + end if + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/Makefile new file mode 100644 index 0000000..8dad459 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/Makefile @@ -0,0 +1,44 @@ +SHELL=/bin/sh +BENCHMARK=sp +BENCHMARKU=SP + +include ../config/make.def +include ../sys/make.common + +SOURCES = sp.for \ + set_constants.for \ + initialize.for \ + exact_rhs.for \ + compute_rhs.for \ + verify.for \ + compute_errors.for \ + timers.for \ + print_result.for + +SOURCES_SINGLE = z_solve.for x_solve.for y_solve.for +SOURCES_MPI = x_solve_mpi.for y_solve_mpi.for z_solve_mpi.for + +OBJS = ${SOURCES:.for=.o} +OBJS_SINGLE = ${SOURCES_SINGLE:.for=.o} +OBJS_MPI = ${SOURCES_MPI:.for=.o} + +${PROGRAM}: config + @if [ $(VERSION) = MPI ] ; then \ + ${MAKE} MPI_VER; \ + else \ + ${MAKE} SINGLE_VER; \ + fi + +MPI_VER: $(OBJS) $(OBJS_MPI) + ${FLINK} -o ${PROGRAM} ${OBJS} $(OBJS_MPI) + +SINGLE_VER: $(OBJS) $(OBJS_SINGLE) + ${FLINK} -o ${PROGRAM} ${OBJS} $(OBJS_SINGLE) + +%.o: %.for npbparams.h header.h + ${F77} ${FFLAGS} -c -o $@ $< + +clean: + rm -f npbparams.h + rm -f *.o *~ + rm -f *.cu *.cuf *.c *.f diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/TODO_make.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/TODO_make.bat new file mode 100644 index 0000000..fabc282 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/TODO_make.bat @@ -0,0 +1,12 @@ +@echo off + +set CLASS=%1 +set OPT=%2 + +CALL ..\sys\setparams SP %CLASS% +CALL %F77% %OPT% sp 1>out_%CLASS%.txt 2>err_%CLASS%.txt +if exist sp.exe ( + copy sp.exe %BIN%\sp.%CLASS%.x.exe + del sp.exe +) + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/compute_errors.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/compute_errors.for new file mode 100644 index 0000000..8741a0c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/compute_errors.for @@ -0,0 +1,116 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine error_norm(rms) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function computes the norm of the difference between the +c computed solution and the exact solution +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, m, d + double precision xi, eta, zeta, u_exact(5), rms(5), add + double precision r1,r2,r3,r4,r5 + do m = 1, 5 + rms(m) = 0.0d0 + enddo + r1 = 0.0d0 + r2 = 0.0d0 + r3 = 0.0d0 + r4 = 0.0d0 + r5 = 0.0d0 +!DVM$ region +!DVM$ parallel (k,j,i) on u(*,i,j,k),private(zeta,eta,xi,add,u_exact,m) +!DVM$& ,reduction(SUM(r1),SUM(r2),SUM(r3),SUM(r4),SUM(r5)) +! DVM$& ,shadow_renew(u, rhs) + do k = 0, problem_size-1 + do j = 0, problem_size-1 + do i = 0, problem_size-1 + zeta = dble(k) * dnzm1 + eta = dble(j) * dnym1 + xi = dble(i) * dnxm1 + do m = 1, 5 + u_exact(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + + add = u(1,i,j,k)-u_exact(1) + r1 = r1 + add*add + add = u(2,i,j,k)-u_exact(2) + r2 = r2 + add*add + add = u(3,i,j,k)-u_exact(3) + r3 = r3 + add*add + add = u(4,i,j,k)-u_exact(4) + r4 = r4 + add*add + add = u(5,i,j,k)-u_exact(5) + r5 = r5 + add*add + end do + end do + end do +!DVM$ end region + + rms(1) = r1 + rms(2) = r2 + rms(3) = r3 + rms(4) = r4 + rms(5) = r5 + do m = 1, 5 + do d = 1, 3 + rms(m) = rms(m) / dble(grid_points(d)-2) + end do + rms(m) = dsqrt(rms(m)) + end do + + return + end + + + + subroutine rhs_norm(rms) + + include 'header.h' + + integer i, j, k, d, m + double precision rms(5), add + + do m = 1, 5 + rms(m) = 0.0d0 + enddo + +!DVM$ region +!DVM$ parallel (k,j,i) on u(*,i,j,k),private(add) +!DVM$& ,reduction(SUM(rms)) + do k = 1, nz2 + do j = 1, ny2 + do i = 1, nx2 + add = rhs(1,i,j,k) + rms(1) = rms(1) + add*add + add = rhs(2,i,j,k) + rms(2) = rms(2) + add*add + add = rhs(3,i,j,k) + rms(3) = rms(3) + add*add + add = rhs(4,i,j,k) + rms(4) = rms(4) + add*add + add = rhs(5,i,j,k) + rms(5) = rms(5) + add*add + end do + end do + end do +!DVM$ end region + do m = 1, 5 + do d = 1, 3 + rms(m) = rms(m) / dble(grid_points(d)-2) + end do + rms(m) = dsqrt(rms(m)) + end do + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/compute_rhs.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/compute_rhs.for new file mode 100644 index 0000000..9fb1ed0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/compute_rhs.for @@ -0,0 +1,339 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine compute_rhs(aditional_comp) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, m + double precision aux, rho_inv, uijk, up1, um1, vijk, vp1, vm1, + > wijk, wp1, wm1,rhs_(5) + double precision t1, t2, t3, ac, ru1, uu, vv, ww,ac2inv + integer aditional_comp + + if (timeron) call timer_start(t_rhs) + +!DVM$ region out(us,vs,ws,qs,rho_i,speed,square) + +!DVM$ parallel (k,j,i) on u(*,i,j,k),private(rho_inv,aux,m) +!DVM$& ,shadow_renew(u(0:0,2:3,2:3,2:3)),SHADOW_COMPUTE + do k = 0, problem_size-1 + do j = 0, problem_size-1 + do i = 0, problem_size-1 + rho_inv = 1.0d0/u(1,i,j,k) + rho_i(i,j,k) = rho_inv + us(i,j,k) = u(2,i,j,k) * rho_inv + vs(i,j,k) = u(3,i,j,k) * rho_inv + ws(i,j,k) = u(4,i,j,k) * rho_inv + square(i,j,k) = 0.5d0* ( + > u(2,i,j,k)*u(2,i,j,k) + + > u(3,i,j,k)*u(3,i,j,k) + + > u(4,i,j,k)*u(4,i,j,k) ) * rho_inv + qs(i,j,k) = square(i,j,k) * rho_inv +c--------------------------------------------------------------------- +c (don't need speed and ainx until the lhs computation) +c--------------------------------------------------------------------- + aux = c1c2*rho_inv* (u(5,i,j,k) - square(i,j,k)) + speed(i,j,k) = dsqrt(aux) + do m = 1, 5 + rhs(m,i,j,k) = forcing(m,i,j,k) + end do + end do + end do + end do + +!DVM$ parallel (k,j,i) on rhs(*,i,j,k),private(uijk,up1,um1,m +!DVM$& ,vijk,vp1,vm1,wijk,wp1,wm1,rhs_, +!DVM$& t1, t2, t3, ac, ru1, uu, vv, ww,ac2inv), CUDA_BLOCK(32,4) + do k = 1, nz2 + do j = 1, ny2 + do i = 1, nx2 + uijk = us(i,j,k) + up1 = us(i+1,j,k) + um1 = us(i-1,j,k) + + rhs_(1) = rhs(1,i,j,k) + rhs_(2) = rhs(2,i,j,k) + rhs_(3) = rhs(3,i,j,k) + rhs_(4) = rhs(4,i,j,k) + rhs_(5) = rhs(5,i,j,k) + + rhs_(1) = rhs_(1) + dx1tx1 * + > (u(1,i+1,j,k) - 2.0d0*u(1,i,j,k) + + > u(1,i-1,j,k)) - + > tx2 * (u(2,i+1,j,k) - u(2,i-1,j,k)) + + rhs_(2) = rhs_(2) + dx2tx1 * + > (u(2,i+1,j,k) - 2.0d0*u(2,i,j,k) + + > u(2,i-1,j,k)) + + > xxcon2*con43 * (up1 - 2.0d0*uijk + um1) - + > tx2 * (u(2,i+1,j,k)*up1 - + > u(2,i-1,j,k)*um1 + + > (u(5,i+1,j,k)- square(i+1,j,k)- + > u(5,i-1,j,k)+ square(i-1,j,k))* + > c2) + + rhs_(3) = rhs_(3) + dx3tx1 * + > (u(3,i+1,j,k) - 2.0d0*u(3,i,j,k) + + > u(3,i-1,j,k)) + + > xxcon2 * (vs(i+1,j,k) - 2.0d0*vs(i,j,k) + + > vs(i-1,j,k)) - + > tx2 * (u(3,i+1,j,k)*up1 - + > u(3,i-1,j,k)*um1) + + rhs_(4) = rhs_(4) + dx4tx1 * + > (u(4,i+1,j,k) - 2.0d0*u(4,i,j,k) + + > u(4,i-1,j,k)) + + > xxcon2 * (ws(i+1,j,k) - 2.0d0*ws(i,j,k) + + > ws(i-1,j,k)) - + > tx2 * (u(4,i+1,j,k)*up1 - + > u(4,i-1,j,k)*um1) + + rhs_(5) = rhs_(5) + dx5tx1 * + > (u(5,i+1,j,k) - 2.0d0*u(5,i,j,k) + + > u(5,i-1,j,k)) + + > xxcon3 * (qs(i+1,j,k) - 2.0d0*qs(i,j,k) + + > qs(i-1,j,k)) + + > xxcon4 * (up1*up1 - 2.0d0*uijk*uijk + + > um1*um1) + + > xxcon5 * (u(5,i+1,j,k)*rho_i(i+1,j,k) - + > 2.0d0*u(5,i,j,k)*rho_i(i,j,k) + + > u(5,i-1,j,k)*rho_i(i-1,j,k)) - + > tx2 * ( (c1*u(5,i+1,j,k) - + > c2*square(i+1,j,k))*up1 - + > (c1*u(5,i-1,j,k) - + > c2*square(i-1,j,k))*um1 ) + + if(i .eq. 1) then + do m = 1, 5 + rhs_(m) = rhs_(m)- dssp * + > ( 5.0d0*u(m,i,j,k) - 4.0d0*u(m,i+1,j,k) + + > u(m,i+2,j,k)) + end do + elseif(i .eq. 2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > (-4.0d0*u(m,i-1,j,k) + 6.0d0*u(m,i,j,k) - + > 4.0d0*u(m,i+1,j,k) + u(m,i+2,j,k)) + end do + elseif(i .ge. 3 .and. i .le. nx2-2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i-2,j,k) - 4.0d0*u(m,i-1,j,k) + + > 6.0*u(m,i,j,k) - 4.0d0*u(m,i+1,j,k) + + > u(m,i+2,j,k) ) + end do + elseif(i .eq. nx2-1) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i-2,j,k) - 4.0d0*u(m,i-1,j,k) + + > 6.0d0*u(m,i,j,k) - 4.0d0*u(m,i+1,j,k) ) + end do + elseif( i .eq. nx2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i-2,j,k) - 4.d0*u(m,i-1,j,k) + + > 5.d0*u(m,i,j,k) ) + end do + endif + + vijk = vs(i,j,k) + vp1 = vs(i,j+1,k) + vm1 = vs(i,j-1,k) + rhs_(1) = rhs_(1) + dy1ty1 * + > (u(1,i,j+1,k) - 2.0d0*u(1,i,j,k) + + > u(1,i,j-1,k)) - + > ty2 * (u(3,i,j+1,k) - u(3,i,j-1,k)) + rhs_(2) = rhs_(2) + dy2ty1 * + > (u(2,i,j+1,k) - 2.0d0*u(2,i,j,k) + + > u(2,i,j-1,k)) + + > yycon2 * (us(i,j+1,k) - 2.0d0*us(i,j,k) + + > us(i,j-1,k)) - + > ty2 * (u(2,i,j+1,k)*vp1 - + > u(2,i,j-1,k)*vm1) + rhs_(3) = rhs_(3) + dy3ty1 * + > (u(3,i,j+1,k) - 2.0d0*u(3,i,j,k) + + > u(3,i,j-1,k)) + + > yycon2*con43 * (vp1 - 2.0d0*vijk + vm1) - + > ty2 * (u(3,i,j+1,k)*vp1 - + > u(3,i,j-1,k)*vm1 + + > (u(5,i,j+1,k) - square(i,j+1,k) - + > u(5,i,j-1,k) + square(i,j-1,k)) + > *c2) + rhs_(4) = rhs_(4) + dy4ty1 * + > (u(4,i,j+1,k) - 2.0d0*u(4,i,j,k) + + > u(4,i,j-1,k)) + + > yycon2 * (ws(i,j+1,k) - 2.0d0*ws(i,j,k) + + > ws(i,j-1,k)) - + > ty2 * (u(4,i,j+1,k)*vp1 - + > u(4,i,j-1,k)*vm1) + rhs_(5) = rhs_(5) + dy5ty1 * + > (u(5,i,j+1,k) - 2.0d0*u(5,i,j,k) + + > u(5,i,j-1,k)) + + > yycon3 * (qs(i,j+1,k) - 2.0d0*qs(i,j,k) + + > qs(i,j-1,k)) + + > yycon4 * (vp1*vp1 - 2.0d0*vijk*vijk + + > vm1*vm1) + + > yycon5 * (u(5,i,j+1,k)*rho_i(i,j+1,k) - + > 2.0d0*u(5,i,j,k)*rho_i(i,j,k) + + > u(5,i,j-1,k)*rho_i(i,j-1,k)) - + > ty2 * ((c1*u(5,i,j+1,k) - + > c2*square(i,j+1,k)) * vp1 - + > (c1*u(5,i,j-1,k) - + > c2*square(i,j-1,k)) * vm1) + + if(j .eq. 1) then + do m = 1, 5 + rhs_(m) = rhs_(m)- dssp * + > ( 5.0d0*u(m,i,j,k) - 4.0d0*u(m,i,j+1,k) + + > u(m,i,j+2,k)) + end do + elseif(j .eq. 2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > (-4.0d0*u(m,i,j-1,k) + 6.0d0*u(m,i,j,k) - + > 4.0d0*u(m,i,j+1,k) + u(m,i,j+2,k)) + end do + elseif(j .ge. 3 .and. j .le. ny2-2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i,j-2,k) - 4.0d0*u(m,i,j-1,k) + + > 6.0*u(m,i,j,k) - 4.0d0*u(m,i,j+1,k) + + > u(m,i,j+2,k) ) + end do + elseif(j .eq. ny2-1) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i,j-2,k) - 4.0d0*u(m,i,j-1,k) + + > 6.0d0*u(m,i,j,k) - 4.0d0*u(m,i,j+1,k) ) + end do + elseif(j .eq. ny2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i,j-2,k) - 4.d0*u(m,i,j-1,k) + + > 5.d0*u(m,i,j,k) ) + end do + endif + + wijk = ws(i,j,k) + wp1 = ws(i,j,k+1) + wm1 = ws(i,j,k-1) + + rhs_(1) = rhs_(1) + dz1tz1 * + > (u(1,i,j,k+1) - 2.0d0*u(1,i,j,k) + + > u(1,i,j,k-1)) - + > tz2 * (u(4,i,j,k+1) - u(4,i,j,k-1)) + rhs_(2) = rhs_(2) + dz2tz1 * + > (u(2,i,j,k+1) - 2.0d0*u(2,i,j,k) + + > u(2,i,j,k-1)) + + > zzcon2 * (us(i,j,k+1) - 2.0d0*us(i,j,k) + + > us(i,j,k-1)) - + > tz2 * (u(2,i,j,k+1)*wp1 - + > u(2,i,j,k-1)*wm1) + rhs_(3) = rhs_(3) + dz3tz1 * + > (u(3,i,j,k+1) - 2.0d0*u(3,i,j,k) + + > u(3,i,j,k-1)) + + > zzcon2 * (vs(i,j,k+1) - 2.0d0*vs(i,j,k) + + > vs(i,j,k-1)) - + > tz2 * (u(3,i,j,k+1)*wp1 - + > u(3,i,j,k-1)*wm1) + rhs_(4) = rhs_(4) + dz4tz1 * + > (u(4,i,j,k+1) - 2.0d0*u(4,i,j,k) + + > u(4,i,j,k-1)) + + > zzcon2*con43 * (wp1 - 2.0d0*wijk + wm1) - + > tz2 * (u(4,i,j,k+1)*wp1 - + > u(4,i,j,k-1)*wm1 + + > (u(5,i,j,k+1) - square(i,j,k+1) - + > u(5,i,j,k-1) + square(i,j,k-1)) + > *c2) + rhs_(5) = rhs_(5) + dz5tz1 * + > (u(5,i,j,k+1) - 2.0d0*u(5,i,j,k) + + > u(5,i,j,k-1)) + + > zzcon3 * (qs(i,j,k+1) - 2.0d0*qs(i,j,k) + + > qs(i,j,k-1)) + + > zzcon4 * (wp1*wp1 - 2.0d0*wijk*wijk + + > wm1*wm1) + + > zzcon5 * (u(5,i,j,k+1)*rho_i(i,j,k+1) - + > 2.0d0*u(5,i,j,k)*rho_i(i,j,k) + + > u(5,i,j,k-1)*rho_i(i,j,k-1)) - + > tz2 * ( (c1*u(5,i,j,k+1) - + > c2*square(i,j,k+1))*wp1 - + > (c1*u(5,i,j,k-1) - + > c2*square(i,j,k-1))*wm1) + + if(k .eq. 1) then + do m = 1, 5 + rhs_(m) = rhs_(m)- dssp * + > ( 5.0d0*u(m,i,j,k) - 4.0d0*u(m,i,j,k+1) + + > u(m,i,j,k+2)) + end do + elseif(k .eq. 2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > (-4.0d0*u(m,i,j,k-1) + 6.0d0*u(m,i,j,k) - + > 4.0d0*u(m,i,j,k+1) + u(m,i,j,k+2)) + end do + elseif(k .ge. 3 .and. k .le. nz2-2) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i,j,k-2) - 4.0d0*u(m,i,j,k-1) + + > 6.0*u(m,i,j,k) - 4.0d0*u(m,i,j,k+1) + + > u(m,i,j,k+2) ) + end do + elseif(k .eq. nz2-1) then + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i,j,k-2) - 4.0d0*u(m,i,j,k-1) + + > 6.0d0*u(m,i,j,k) - 4.0d0*u(m,i,j,k+1) ) + end do + else + do m = 1, 5 + rhs_(m) = rhs_(m) - dssp * + > ( u(m,i,j,k-2) - 4.d0*u(m,i,j,k-1) + + > 5.d0*u(m,i,j,k) ) + end do + endif + + rhs_(1) = rhs_(1) * dt + rhs_(2) = rhs_(2) * dt + rhs_(3) = rhs_(3) * dt + rhs_(4) = rhs_(4) * dt + rhs_(5) = rhs_(5) * dt + + rhs(1,i,j,k) = rhs_(1) + rhs(2,i,j,k) = rhs_(2) + rhs(3,i,j,k) = rhs_(3) + rhs(4,i,j,k) = rhs_(4) + rhs(5,i,j,k) = rhs_(5) + + if(aditional_comp .eq. 1) then + ru1 = rho_i(i,j,k) + uu = us(i,j,k) + vv = vs(i,j,k) + ww = ws(i,j,k) + ac = speed(i,j,k) + ac2inv = ac*ac + + t1 = c2 / ac2inv * ( qs(i,j,k)*rhs_(1)-uu*rhs_(2)- + > vv*rhs_(3)- ww*rhs_(4) + rhs_(5) ) + t2 = bt * ru1 * ( uu * rhs_(1) - rhs_(2) ) + t3 = ( bt * ru1 * ac ) * t1 + + rhs(1,i,j,k) = rhs_(1) - t1 + rhs(2,i,j,k) = - ru1 * ( ww*rhs_(1) - rhs_(4)) + rhs(3,i,j,k) = ru1 * ( vv*rhs_(1) - rhs_(3)) + rhs(4,i,j,k) = - t2 + t3 + rhs(5,i,j,k) = t2 + t3 + endif + end do + end do + end do + +!DVM$ end region + if (timeron) call timer_stop(t_rhs) + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/exact_rhs.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/exact_rhs.for new file mode 100644 index 0000000..862aabd --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/exact_rhs.for @@ -0,0 +1,307 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine exact_rhs + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + + include 'header.h' + + double precision dtemp(5), xi, eta, zeta, dtpp + integer m, i, j, k, ip1, im1, jp1, p, p1, + > jm1, km1, kp1,z + double precision ue_(-2:2, 5), buf_(-2:2, 5),cuf_(-2:2),q_(-2:2) + + +!DVM$ region +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(m) + do k= 0, problem_size-1 + do j = 0, problem_size-1 + do i = 0, problem_size-1 + do m = 1, 5 + forcing(m,i,j,k) = 0.0d0 + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c xi-direction flux differences +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(zeta,eta,xi,m,dtemp +!DVM$& ,buf_,cuf_,q_,dtpp,z,ue_) + do k = 1, problem_size-2 + do j = 1, problem_size-2 + do i = 1, problem_size-2 + zeta = dble(k) * dnzm1 + eta = dble(j) * dnym1 + do z = -2, 2 + xi = dble(i + z) * dnxm1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,2) * buf_(z,2) + buf_(z,1) = cuf_(z) + buf_(z,3) * buf_(z,3) + + > buf_(z,4) * buf_(z,4) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3)* + > ue_(z,3) + buf_(z,4)*ue_(z,4)) + enddo + + forcing(1,i,j,k) = forcing(1,i,j,k) - + > tx2*( ue_(1,2)-ue_(-1,2) )+ + > dx1tx1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + forcing(2,i,j,k) = forcing(2,i,j,k) - tx2 * ( + > (ue_(1,2)*buf_(1,2)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,2)*buf_(-1,2)+c2*(ue_(-1,5)-q_(-1))))+ + > xxcon1*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dx2tx1*( ue_(1,2)-2.0d0* ue_(0,2)+ue_(-1,2)) + + forcing(3,i,j,k) = forcing(3,i,j,k) - tx2 * ( + > ue_(1,3)*buf_(1,2)-ue_(-1,3)*buf_(-1,2))+ + > xxcon2*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dx3tx1*( ue_(1,3)-2.0d0*ue_(0,3) +ue_(-1,3)) + + forcing(4,i,j,k) = forcing(4,i,j,k) - tx2*( + > ue_(1,4)*buf_(1,2)-ue_(-1,4)*buf_(-1,2))+ + > xxcon2*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dx4tx1*( ue_(1,4)-2.0d0* ue_(0,4)+ ue_(-1,4)) + + forcing(5,i,j,k) = forcing(5,i,j,k) - tx2*( + > buf_(1,2)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,2)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*xxcon3*(buf_(1,1)-2.0d0*buf_(0,1)+ + > buf_(-1,1))+ + > xxcon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > xxcon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dx5tx1*( ue_(1,5)-2.0d0* ue_(0,5)+ ue_(-1,5)) + do m = 1, 5 + if(i .eq. 1) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(i .eq. 2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(i .eq. problem_size-3) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(i .eq. problem_size-2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c eta-direction flux differences +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(zeta,eta,xi,m,dtemp +!DVM$& ,buf_,cuf_,q_,dtpp,z,ue_) + do k = 1, problem_size- 2 + do j = 1, problem_size-2 + do i = 1, problem_size- 2 + zeta = dble(k) * dnzm1 + xi = dble(i) * dnxm1 + do z = -2, 2 + eta = dble(j + z) * dnym1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,3) * buf_(z,3) + buf_(z,1) = cuf_(z) + buf_(z,2) * buf_(z,2) + + > buf_(z,4) * buf_(z,4) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3) + > *ue_(z,3) + buf_(z,4) * ue_(z,4)) + enddo + + forcing(1,i,j,k) = forcing(1,i,j,k) - + > ty2*( ue_(1,3)-ue_(-1,3) )+ + > dy1ty1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + forcing(2,i,j,k) = forcing(2,i,j,k) - ty2*( + > ue_(1,2)*buf_(1,3)-ue_(-1,2)*buf_(-1,3))+ + > yycon2*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dy2ty1*( ue_(1,2)-2.0* ue_(0,2)+ ue_(-1,2)) + + forcing(3,i,j,k) = forcing(3,i,j,k) - ty2*( + > (ue_(1,3)*buf_(1,3)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,3)*buf_(-1,3)+c2*(ue_(-1,5)-q_(-1))))+ + > yycon1*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dy3ty1*( ue_(1,3)-2.0d0*ue_(0,3) +ue_(-1,3)) + + forcing(4,i,j,k) = forcing(4,i,j,k) - ty2*( + > ue_(1,4)*buf_(1,3)-ue_(-1,4)*buf_(-1,3))+ + > yycon2*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dy4ty1*( ue_(1,4)-2.0d0*ue_(0,4)+ ue_(-1,4)) + + forcing(5,i,j,k) = forcing(5,i,j,k) - ty2*( + > buf_(1,3)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,3)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*yycon3*(buf_(1,1)-2.0d0*buf_(0,1)+ + > buf_(-1,1))+ + > yycon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > yycon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dy5ty1*(ue_(1,5)-2.0d0*ue_(0,5)+ue_(-1,5)) + do m = 1, 5 + if(j .eq. 1) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(j .eq. 2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(j .eq. problem_size-3) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(j .eq. problem_size-2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c zeta-direction flux differences +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(zeta,eta,xi,m +!DVM$& ,buf_,cuf_,q_,ue_,dtpp,dtemp,z) + do k = 1, problem_size-2 + do j = 1, problem_size-2 + do i = 1, problem_size-2 + xi = dble(i) * dnxm1 + eta = dble(j) * dnym1 + do z = -2, 2 + zeta = dble(k + z) * dnzm1 + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + ue_(z,m) = dtemp(m) + end do + dtpp = 1.0d0 / dtemp(1) + do m = 2, 5 + buf_(z, m) = dtpp * dtemp(m) + end do + + cuf_(z) = buf_(z,4) * buf_(z,4) + buf_(z,1) = cuf_(z) + buf_(z,2) * buf_(z,2) + + > buf_(z,3) * buf_(z,3) + q_(z) = 0.5d0*(buf_(z,2)*ue_(z,2) + buf_(z,3)* + > ue_(z,3) + buf_(z,4)*ue_(z,4)) + enddo + + forcing(1,i,j,k) = forcing(1,i,j,k) - + > tz2*( ue_(1,4)-ue_(-1,4) )+ + > dz1tz1*(ue_(1,1)-2.0d0*ue_(0,1)+ue_(-1,1)) + + forcing(2,i,j,k) = forcing(2,i,j,k) - tz2 * ( + > ue_(1,2)*buf_(1,4)-ue_(-1,2)*buf_(-1,4))+ + > zzcon2*(buf_(1,2)-2.0d0*buf_(0,2)+buf_(-1,2))+ + > dz2tz1*( ue_(1,2)-2.0d0* ue_(0,2)+ ue_(-1,2)) + + forcing(3,i,j,k) = forcing(3,i,j,k) - tz2 * ( + > ue_(1,3)*buf_(1,4)-ue_(-1,3)*buf_(-1,4))+ + > zzcon2*(buf_(1,3)-2.0d0*buf_(0,3)+buf_(-1,3))+ + > dz3tz1*(ue_(1,3)-2.0d0*ue_(0,3)+ue_(-1,3)) + + forcing(4,i,j,k) = forcing(4,i,j,k) - tz2 * ( + > (ue_(1,4)*buf_(1,4)+c2*(ue_(1,5)-q_(1)))- + > (ue_(-1,4)*buf_(-1,4)+c2*(ue_(-1,5)-q_(-1))))+ + > zzcon1*(buf_(1,4)-2.0d0*buf_(0,4)+buf_(-1,4))+ + > dz4tz1*( ue_(1,4)-2.0d0*ue_(0,4) +ue_(-1,4)) + + forcing(5,i,j,k) = forcing(5,i,j,k) - tz2 * ( + > buf_(1,4)*(c1*ue_(1,5)-c2*q_(1))- + > buf_(-1,4)*(c1*ue_(-1,5)-c2*q_(-1)))+ + > 0.5d0*zzcon3*(buf_(1,1)-2.0d0*buf_(0,1) + > +buf_(-1,1))+ + > zzcon4*(cuf_(1)-2.0d0*cuf_(0)+cuf_(-1))+ + > zzcon5*(buf_(1,5)-2.0d0*buf_(0,5)+buf_(-1,5))+ + > dz5tz1*( ue_(1,5)-2.0d0*ue_(0,5)+ ue_(-1,5)) + do m = 1, 5 + if(k .eq. 1) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (5.0d0*ue_(0,m) - 4.0d0*ue_(1,m) +ue_(2,m)) + else if(k .eq. 2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (-4.0d0*ue_(-1,m) + 6.0d0*ue_(0,m) - + > 4.0d0*ue_(1,m) + ue_(2,m)) + else if(k .eq. problem_size-3) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m)) + else if(k .eq. problem_size-2) then + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp * + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + 5.0d0*ue_(0,m)) + else + forcing(m,i,j,k) = forcing(m,i,j,k) - dssp* + > (ue_(-2,m) - 4.0d0*ue_(-1,m) + + > 6.0d0*ue_(0,m) - 4.0d0*ue_(1,m) + ue_(2,m)) + endif + end do + end do + end do + end do + +c--------------------------------------------------------------------- +c now change the sign of the forcing function, +c--------------------------------------------------------------------- +!DVM$ parallel (k,j,i) on forcing(*,i,j,k),private(m) + do k = 1, problem_size-2 + do j = 1, problem_size-2 + do i = 1, problem_size-2 + do m = 1, 5 + forcing(m,i,j,k) = -1.d0 * forcing(m,i,j,k) + end do + end do + end do + end do +!DVM$ end region + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/header.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/header.h new file mode 100644 index 0000000..d8fa07c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/header.h @@ -0,0 +1,120 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + +c--------------------------------------------------------------------- +c The following include file is generated automatically by the +c "setparams" utility. It defines +c problem_size: 12, 64, 102, 162 (for class T, A, B, C) +c dt_default: default time step for this problem size if no +c config file +c niter_default: default number of iterations for this problem size +c--------------------------------------------------------------------- + + include 'npbparams.h' + + integer grid_points(3), nx2, ny2, nz2,stage_n + common /global/ grid_points, nx2, ny2, nz2, timeron + + double precision tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3, + & dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4, + & dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt, + & ce(5,13), dxmax, dymax, dzmax, xxcon1, xxcon2, + & xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1, + & dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4, + & yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1, + & zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1, + & dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1, + & dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2, + & c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1, bt, + & dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1, + & c2dtty1, c2dttz1, comz1, comz4, comz5, comz6, + & c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16 + + common /constants/ tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3, + & dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4, + & dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt, + & ce, dxmax, dymax, dzmax, xxcon1, xxcon2, + & xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1, + & dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4, + & yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1, + & zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1, + & dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1, + & dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2, + & c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1, bt, + & dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1, + & c2dtty1, c2dttz1, comz1, comz4, comz5, comz6, + & c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16, + & stage_n + + + integer IMAX, JMAX, KMAX, IMAXP, JMAXP + + parameter (IMAX=problem_size,JMAX=problem_size,KMAX=problem_size) + parameter (IMAXP=IMAX/2*2,JMAXP=JMAX/2*2) + +c--------------------------------------------------------------------- +c To improve cache performance, first two dimensions padded by 1 +c for even number sizes only +c--------------------------------------------------------------------- + double precision + & u (5, 0:IMAXP, 0:JMAXP, 0:KMAX), + & us ( 0:IMAXP, 0:JMAXP, 0:KMAX), + & vs ( 0:IMAXP, 0:JMAXP, 0:KMAX), + & ws ( 0:IMAXP, 0:JMAXP, 0:KMAX), + & qs ( 0:IMAXP, 0:JMAXP, 0:KMAX), + & rho_i ( 0:IMAXP, 0:JMAXP, 0:KMAX), + & speed ( 0:IMAXP, 0:JMAXP, 0:KMAX), + & square ( 0:IMAXP, 0:JMAXP, 0:KMAX), + & rhs (5, 0:IMAXP, 0:JMAXP, 0:KMAX), + & forcing (5, 0:IMAXP, 0:JMAXP, 0:KMAX) + + common /fields/ u, us, vs, ws, qs, rho_i, speed, square, + & rhs, forcing + + double precision cv(0:problem_size-1), rhon(0:problem_size-1), + & rhos(0:problem_size-1), rhoq(0:problem_size-1), + & cuf(0:problem_size-1), q(0:problem_size-1), + & ue(0:problem_size-1,5), buf(0:problem_size-1,5), + & rhon_(0:problem_size-1,0:problem_size-1), + & cv_(0:problem_size-1,0:problem_size-1) + common /work_1d/ cv,rhon,rhos,rhoq, cuf, q, ue, buf,rhon_,cv_ + + double precision + & lhs(0:2,1:5,0:IMAXP, 0:JMAXP, 0:KMAX) + common /work_lhs/ lhs + +c----------------------------------------------------------------------- +c Timer constants +c----------------------------------------------------------------------- + integer t_rhsx,t_rhsy,t_rhsz,t_xsolve,t_ysolve,t_zsolve, + & t_rdis1,t_rdis2,t_tzetar,t_ninvr,t_pinvr,t_add, + & t_rhs,t_txinvr,t_last,t_total + logical timeron + parameter (t_total = 1) + parameter (t_rhsx = 2) + parameter (t_rhsy = 3) + parameter (t_rhsz = 4) + parameter (t_rhs = 5) + parameter (t_xsolve = 6) + parameter (t_ysolve = 7) + parameter (t_zsolve = 8) + parameter (t_rdis1 = 9) + parameter (t_rdis2 = 10) + parameter (t_txinvr = 11) + parameter (t_pinvr = 12) + parameter (t_ninvr = 13) + parameter (t_tzetar = 14) + parameter (t_add = 15) + parameter (t_last = 15) + +!DVM$ SHADOW lhs(0:0,0:0,2:2,2:2,2:2) +!DVM$ SHADOW (0:0,2:3,2:3,2:3) :: rhs,forcing,u +!DVM$ SHADOW (2:3,2:3,2:3) :: qs,us,ws,vs,speed,square,rho_i + +!DVM$ DISTRIBUTE u(*,BLOCK,BLOCK,BLOCK) +!DVM$ ALIGN (*,i,j,k) WITH u(*,i,j,k) :: forcing,rhs +!DVM$ ALIGN (*,*,i,j,k) WITH u(*,i,j,k) :: lhs +!DVM$ ALIGN (i,j,k) WITH u(*,i,j,k) :: square,speed,rho_i,qs,ws,vs,us diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/initialize.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/initialize.for new file mode 100644 index 0000000..0a4a1e7 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/initialize.for @@ -0,0 +1,189 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine initialize + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c This subroutine initializes the field variable u using +c tri-linear transfinite interpolation of the boundary values +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, m, ix, iy, iz + double precision xi, eta, zeta, Pface(5,3,2), Pxi, Peta, + > Pzeta, temp(5) + +!DVM$ region +!DVM$ parallel (k,j,i) on u(*,i,j,k), private(zeta, eta, xi, ix, pxi, m, +!DVM$& pface, iy, peta, iz, pzeta, temp) + do k = 0, problem_size-1 + do j = 0, problem_size-1 + do i = 0, problem_size-1 + u(1,i,j,k) = 1.0 + u(2,i,j,k) = 0.0 + u(3,i,j,k) = 0.0 + u(4,i,j,k) = 0.0 + u(5,i,j,k) = 1.0 + + zeta = dble(k) * dnzm1 + eta = dble(j) * dnym1 + xi = dble(i) * dnxm1 + + do ix = 1, 2 + Pxi = dble(ix-1) + + do m = 1, 5 + Pface(m,1,ix) = ce(m,1) + + > Pxi*(ce(m,2)+Pxi*(ce(m,5) +Pxi*(ce(m,8) + + > Pxi*ce(m,11))))+eta*(ce(m,3) + eta*(ce(m,6) + > + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + end do + + do iy = 1, 2 + Peta = dble(iy-1) + do m = 1, 5 + Pface(m,2,iy) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + + > xi*ce(m,11)))) + + > Peta*(ce(m,3) +Peta*(ce(m,6) +Peta*(ce(m,9)+ + > Peta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + end do + + do iz = 1, 2 + Pzeta = dble(iz-1) + do m = 1, 5 + Pface(m,3,iz) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + + > xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9)+ + > eta*ce(m,12))))+ + > Pzeta*(ce(m,4) + Pzeta*(ce(m,7) + Pzeta*(ce(m,10) + + > Pzeta*ce(m,13)))) + end do + end do + + do m = 1, 5 + Pxi = xi * Pface(m,1,2) + + > (1.0d0-xi) * Pface(m,1,1) + Peta = eta * Pface(m,2,2) + + > (1.0d0-eta) * Pface(m,2,1) + Pzeta = zeta * Pface(m,3,2) + + > (1.0d0-zeta) * Pface(m,3,1) + + u(m,i,j,k) = Pxi + Peta + Pzeta - + > Pxi*Peta - Pxi*Pzeta - Peta*Pzeta + + > Pxi*Peta*Pzeta + end do + + zeta = dble(k) * dnzm1 + eta = dble(j) * dnym1 + xi = 0.0d0 + if( i .eq. 0) then +! call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + temp(m) = ce(m,1) + + > xi*(ce(m,2)+xi*(ce(m,5)+xi*(ce(m,8)+xi*ce(m,11))))+ + > eta*(ce(m,3)+eta*(ce(m,6)+eta*(ce(m,9)+eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + u(m,i,j,k) = temp(m) + end do + endif + + xi = 1.0d0 + if( i .eq. problem_size-1) then +! call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + temp(m) = ce(m,1) + + > xi*(ce(m,2)+xi*(ce(m,5)+xi*(ce(m,8)+xi*ce(m,11))))+ + > eta*(ce(m,3)+eta*(ce(m,6)+eta*(ce(m,9)+eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + u(m,i,j,k) = temp(m) + end do + endif + + zeta = dble(k) * dnzm1 + eta = 0.0d0 + xi = dble(i) * dnxm1 + if( j .eq. 0) then +! call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + temp(m) = ce(m,1) + + > xi*(ce(m,2)+xi*(ce(m,5)+xi*(ce(m,8)+xi*ce(m,11))))+ + > eta*(ce(m,3)+eta*(ce(m,6)+eta*(ce(m,9)+eta*ce(m,12)))) + > +zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + u(m,i,j,k) = temp(m) + end do + endif + + eta = 1.0d0 + if( j .eq. problem_size-1) then +! call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + temp(m) = ce(m,1) + + > xi*(ce(m,2)+xi*(ce(m,5)+xi*(ce(m,8)+xi*ce(m,11))))+ + > eta*(ce(m,3)+eta*(ce(m,6)+eta*(ce(m,9)+eta*ce(m,12)))) + > +zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + u(m,i,j,k) = temp(m) + end do + endif + + zeta = 0.0d0 + eta = dble(j) * dnym1 + xi = dble(i) *dnxm1 + if( k .eq. 0) then +! call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + temp(m) = ce(m,1) + + > xi*(ce(m,2)+xi*(ce(m,5)+xi*(ce(m,8)+xi*ce(m,11))))+ + > eta*(ce(m,3)+eta*(ce(m,6)+eta*(ce(m,9)+eta*ce(m,12)))) + > +zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + u(m,i,j,k) = temp(m) + end do + endif + + zeta = 1.0d0 + if( k .eq. problem_size-1) then +! call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + temp(m) = ce(m,1) + + > xi*(ce(m,2)+xi*(ce(m,5)+xi*(ce(m,8)+xi*ce(m,11))))+ + > eta*(ce(m,3)+eta*(ce(m,6)+eta*(ce(m,9)+eta*ce(m,12)))) + > +zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + end do + do m = 1, 5 + u(m,i,j,k) = temp(m) + end do + endif + end do + end do + end do +!DVM$ end region + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/print_result.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/print_result.for new file mode 100644 index 0000000..7123b64 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/print_result.for @@ -0,0 +1,121 @@ + subroutine print_results(name, class, n1, n2, n3, niter, + > t, mops, optype, verified, npbversion, + > compiletime, cs1, cs2, cs3, cs4, cs5, cs6, cs7) + + implicit none + character name*(*) + character class*1 + integer n1, n2, n3, niter, j + double precision t, mops + character optype*24, size*15 + logical verified + character*(*) npbversion, compiletime, + > cs1, cs2, cs3, cs4, cs5, cs6, cs7 + integer num_threads, max_threads, i + max_threads = 1 + num_threads = 1 + + write (*, 2) name + 2 format(//, ' ', A, ' Benchmark Completed.') + + write (*, 3) Class + 3 format(' Class = ', 12x, a12) + +c If this is not a grid-based problem (EP, FT, CG), then +c we only print n1, which contains some measure of the +c problem size. In that case, n2 and n3 are both zero. +c Otherwise, we print the grid size n1xn2xn3 + + if ((n2 .eq. 0) .and. (n3 .eq. 0)) then + if (name(1:2) .eq. 'EP') then + write(size, '(f15.0)' ) 2.d0**n1 + j = 15 + if (size(j:j) .eq. '.') j = j - 1 + write (*,42) size(1:j) + 42 format(' Size = ',9x, a15) + else + write (*,44) n1 + 44 format(' Size = ',12x, i12) + endif + else + write (*, 4) n1,n2,n3 + 4 format(' Size = ',9x, i4,'x',i4,'x',i4) + endif + + write (*, 5) niter + 5 format(' Iterations = ', 12x, i12) + + write (*, 6) t + 6 format(' Time in seconds = ',12x, f12.2) + + write (*,7) num_threads + 7 format(' Total threads = ', 12x, i12) + + write (*,8) max_threads + 8 format(' Avail threads = ', 12x, i12) + + if (num_threads .ne. max_threads) write (*,88) + 88 format(' Warning: Threads used differ from threads available') + + write (*,9) mops + 9 format(' Mop/s total = ',12x, f12.2) + + write (*,10) mops/float( num_threads ) + 10 format(' Mop/s/thread = ', 12x, f12.2) + + write(*, 11) optype + 11 format(' Operation type = ', a24) + + if (verified) then + write(*,12) ' SUCCESSFUL' + else + write(*,12) 'UNSUCCESSFUL' + endif + 12 format(' Verification = ', 12x, a) + + write(*,13) npbversion + 13 format(' Version = ', 12x, a12) + + write(*,14) compiletime + 14 format(' Compile date = ', 12x, a12) + + + write (*,121) cs1 + 121 format(/, ' Compile options:', /, + > ' F77 = ', A) + + write (*,122) cs2 + 122 format(' FLINK = ', A) + + write (*,123) cs3 + 123 format(' F_LIB = ', A) + + write (*,124) cs4 + 124 format(' F_INC = ', A) + + write (*,125) cs5 + 125 format(' FFLAGS = ', A) + + write (*,126) cs6 + 126 format(' FLINKFLAGS = ', A) + + write(*, 127) cs7 + 127 format(' RAND = ', A) + + write (*,130) + 130 format(//' Please send all errors/feedbacks to:'// + > ' NPB Development Team'/ + > ' npb@nas.nasa.gov'//) +c 130 format(//' Please send the results of this run to:'// +c > ' NPB Development Team '/ +c > ' Internet: npb@nas.nasa.gov'/ +c > ' '/ +c > ' If email is not available, send this to:'// +c > ' MS T27A-1'/ +c > ' NASA Ames Research Center'/ +c > ' Moffett Field, CA 94035-1000'// +c > ' Fax: 650-604-3957'//) + + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/set_constants.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/set_constants.for new file mode 100644 index 0000000..f1b8a87 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/set_constants.for @@ -0,0 +1,202 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine set_constants + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + + ce(1,1) = 2.0d0 + ce(1,2) = 0.0d0 + ce(1,3) = 0.0d0 + ce(1,4) = 4.0d0 + ce(1,5) = 5.0d0 + ce(1,6) = 3.0d0 + ce(1,7) = 0.5d0 + ce(1,8) = 0.02d0 + ce(1,9) = 0.01d0 + ce(1,10) = 0.03d0 + ce(1,11) = 0.5d0 + ce(1,12) = 0.4d0 + ce(1,13) = 0.3d0 + + ce(2,1) = 1.0d0 + ce(2,2) = 0.0d0 + ce(2,3) = 0.0d0 + ce(2,4) = 0.0d0 + ce(2,5) = 1.0d0 + ce(2,6) = 2.0d0 + ce(2,7) = 3.0d0 + ce(2,8) = 0.01d0 + ce(2,9) = 0.03d0 + ce(2,10) = 0.02d0 + ce(2,11) = 0.4d0 + ce(2,12) = 0.3d0 + ce(2,13) = 0.5d0 + + ce(3,1) = 2.0d0 + ce(3,2) = 2.0d0 + ce(3,3) = 0.0d0 + ce(3,4) = 0.0d0 + ce(3,5) = 0.0d0 + ce(3,6) = 2.0d0 + ce(3,7) = 3.0d0 + ce(3,8) = 0.04d0 + ce(3,9) = 0.03d0 + ce(3,10) = 0.05d0 + ce(3,11) = 0.3d0 + ce(3,12) = 0.5d0 + ce(3,13) = 0.4d0 + + ce(4,1) = 2.0d0 + ce(4,2) = 2.0d0 + ce(4,3) = 0.0d0 + ce(4,4) = 0.0d0 + ce(4,5) = 0.0d0 + ce(4,6) = 2.0d0 + ce(4,7) = 3.0d0 + ce(4,8) = 0.03d0 + ce(4,9) = 0.05d0 + ce(4,10) = 0.04d0 + ce(4,11) = 0.2d0 + ce(4,12) = 0.1d0 + ce(4,13) = 0.3d0 + + ce(5,1) = 5.0d0 + ce(5,2) = 4.0d0 + ce(5,3) = 3.0d0 + ce(5,4) = 2.0d0 + ce(5,5) = 0.1d0 + ce(5,6) = 0.4d0 + ce(5,7) = 0.3d0 + ce(5,8) = 0.05d0 + ce(5,9) = 0.04d0 + ce(5,10) = 0.03d0 + ce(5,11) = 0.1d0 + ce(5,12) = 0.3d0 + ce(5,13) = 0.2d0 + + c1 = 1.4d0 + c2 = 0.4d0 + c3 = 0.1d0 + c4 = 1.0d0 + c5 = 1.4d0 + + bt = dsqrt(0.5d0) + + dnxm1 = 1.0d0 / dble(problem_size-1) + dnym1 = 1.0d0 / dble(problem_size-1) + dnzm1 = 1.0d0 / dble(problem_size-1) + + c1c2 = c1 * c2 + c1c5 = c1 * c5 + c3c4 = c3 * c4 + c1345 = c1c5 * c3c4 + + conz1 = (1.0d0-c1c5) + + tx1 = 1.0d0 / (dnxm1 * dnxm1) + tx2 = 1.0d0 / (2.0d0 * dnxm1) + tx3 = 1.0d0 / dnxm1 + + ty1 = 1.0d0 / (dnym1 * dnym1) + ty2 = 1.0d0 / (2.0d0 * dnym1) + ty3 = 1.0d0 / dnym1 + + tz1 = 1.0d0 / (dnzm1 * dnzm1) + tz2 = 1.0d0 / (2.0d0 * dnzm1) + tz3 = 1.0d0 / dnzm1 + + dx1 = 0.75d0 + dx2 = 0.75d0 + dx3 = 0.75d0 + dx4 = 0.75d0 + dx5 = 0.75d0 + + dy1 = 0.75d0 + dy2 = 0.75d0 + dy3 = 0.75d0 + dy4 = 0.75d0 + dy5 = 0.75d0 + + dz1 = 1.0d0 + dz2 = 1.0d0 + dz3 = 1.0d0 + dz4 = 1.0d0 + dz5 = 1.0d0 + + dxmax = dmax1(dx3, dx4) + dymax = dmax1(dy2, dy4) + dzmax = dmax1(dz2, dz3) + + dssp = 0.25d0 * dmax1(dx1, dmax1(dy1, dz1) ) + + c4dssp = 4.0d0 * dssp + c5dssp = 5.0d0 * dssp + + dttx1 = dt*tx1 + dttx2 = dt*tx2 + dtty1 = dt*ty1 + dtty2 = dt*ty2 + dttz1 = dt*tz1 + dttz2 = dt*tz2 + + c2dttx1 = 2.0d0*dttx1 + c2dtty1 = 2.0d0*dtty1 + c2dttz1 = 2.0d0*dttz1 + + dtdssp = dt*dssp + + comz1 = dtdssp + comz4 = 4.0d0*dtdssp + comz5 = 5.0d0*dtdssp + comz6 = 6.0d0*dtdssp + + c3c4tx3 = c3c4*tx3 + c3c4ty3 = c3c4*ty3 + c3c4tz3 = c3c4*tz3 + + dx1tx1 = dx1*tx1 + dx2tx1 = dx2*tx1 + dx3tx1 = dx3*tx1 + dx4tx1 = dx4*tx1 + dx5tx1 = dx5*tx1 + + dy1ty1 = dy1*ty1 + dy2ty1 = dy2*ty1 + dy3ty1 = dy3*ty1 + dy4ty1 = dy4*ty1 + dy5ty1 = dy5*ty1 + + dz1tz1 = dz1*tz1 + dz2tz1 = dz2*tz1 + dz3tz1 = dz3*tz1 + dz4tz1 = dz4*tz1 + dz5tz1 = dz5*tz1 + + c2iv = 2.5d0 + con43 = 4.0d0/3.0d0 + con16 = 1.0d0/6.0d0 + + xxcon1 = c3c4tx3*con43*tx3 + xxcon2 = c3c4tx3*tx3 + xxcon3 = c3c4tx3*conz1*tx3 + xxcon4 = c3c4tx3*con16*tx3 + xxcon5 = c3c4tx3*c1c5*tx3 + + yycon1 = c3c4ty3*con43*ty3 + yycon2 = c3c4ty3*ty3 + yycon3 = c3c4ty3*conz1*ty3 + yycon4 = c3c4ty3*con16*ty3 + yycon5 = c3c4ty3*c1c5*ty3 + + zzcon1 = c3c4tz3*con43*tz3 + zzcon2 = c3c4tz3*tz3 + zzcon3 = c3c4tz3*conz1*tz3 + zzcon4 = c3c4tz3*con16*tz3 + zzcon5 = c3c4tz3*c1c5*tz3 + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/sp.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/sp.for new file mode 100644 index 0000000..fb9c2cf --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/sp.for @@ -0,0 +1,231 @@ +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3.1 ! +! ! +! D V M H V E R S I O N ! +! ! +! S P ! +! ! +!-------------------------------------------------------------------------! +!-------------------------------------------------------------------------! + +c--------------------------------------------------------------------- +c +c Authors: +c Original: +c R. Van der Wijngaart +c W. Saphir +c H. Jin +c Optimize for DVMH: +c Kolganov A.S. +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- + program SP +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, niter, step, fstatus, n3 + external timer_read + double precision mflops, t, tmax, timer_read, trecs(t_last) + logical verified + character class + character t_names(t_last)*8 + +c--------------------------------------------------------------------- +c Read input file (if it exists), else take +c defaults from parameters +c--------------------------------------------------------------------- + + open (unit=2,file='timer.flag',status='old', iostat=fstatus) + if (fstatus .eq. 0) then + timeron = .true. + t_names(t_total) = 'total' + t_names(t_rhsx) = 'rhsx' + t_names(t_rhsy) = 'rhsy' + t_names(t_rhsz) = 'rhsz' + t_names(t_rhs) = 'rhs' + t_names(t_xsolve) = 'xsolve' + t_names(t_ysolve) = 'ysolve' + t_names(t_zsolve) = 'zsolve' + t_names(t_rdis1) = 'redist1' + t_names(t_rdis2) = 'redist2' + t_names(t_tzetar) = 'tzetar' + t_names(t_ninvr) = 'ninvr' + t_names(t_pinvr) = 'pinvr' + t_names(t_txinvr) = 'txinvr' + t_names(t_add) = 'add' + close(2) + else + timeron = .false. + endif + + write(*, 1000) + open (unit=2,file='inputsp.data',status='old', iostat=fstatus) + + if (fstatus .eq. 0) then + write(*,233) + 233 format(' Reading from input file inputsp.data') + read (2,*) niter + read (2,*) dt + read (2,*) grid_points(1), grid_points(2), grid_points(3) + close(2) + else + write(*,234) + niter = niter_default + dt = dt_default + grid_points(1) = problem_size + grid_points(2) = problem_size + grid_points(3) = problem_size + endif + 234 format(' No input file inputsp.data. Using compiled defaults') + open (unit = 2,file = 'inputStage',status = 'old',iostat = fstat + &us) + if (fstatus .eq. 0) then + read (unit = 2,fmt = *) stage_n + close (unit = 2) + else + stage_n = 0 + endif + write(*,*) 'stage = ', stage_n + + write(*, 1001) problem_size, problem_size, problem_size + write(*, 1002) niter, dt + write(*, *) + + 1000 format(//, ' NAS Parallel Benchmarks (NPB3.3.1-DVMH)', + > ' - SP Benchmark', /) + 1001 format(' Size: ', i4, 'x', i4, 'x', i4) + 1002 format(' Iterations: ', i4, ' dt: ', F11.7) + 1003 format(' Number of available threads: ', i5) + + if ( (problem_size .gt. IMAX) .or. + > (problem_size .gt. JMAX) .or. + > (problem_size .gt. KMAX) ) then + print *, (grid_points(i),i=1,3) + print *,' Problem size too big for compiled array sizes' + goto 999 + endif + nx2 = problem_size - 2 + ny2 = problem_size - 2 + nz2 = problem_size - 2 + + call set_constants + call exact_rhs + + call initialize + call adi_first + call adi_first + call initialize + + do i = 1, t_last + call timer_clear(i) + end do + call timer_start(1) +!DVM$ BARRIER + do step = 1, niter + + if (mod(step, 20) .eq. 0 .or. step .eq. 1) then + write(*, 200) step + 200 format(' Time step ', i4) + endif + + call adi + + end do + call timer_stop(1) + tmax = timer_read(1) + + call verify(niter, class, verified) + + if( tmax .ne. 0. ) then + n3 = problem_size*problem_size*problem_size + t = (problem_size+problem_size+problem_size)/3.0 + mflops = (881.174 * float( n3 ) + > -4683.91 * t**2 + > +11484.5 * t + > -19272.4) * float( niter ) / (tmax*1000000.0d0) + else + mflops = 0.0 + endif + + call print_results('SP', class, problem_size, + > problem_size, problem_size, niter, + > tmax, mflops, ' floating point', + > verified, npbversion,compiletime, cs1, cs2, cs3, cs4, cs5, + > cs6, '(none)') + +c--------------------------------------------------------------------- +c More timers +c--------------------------------------------------------------------- + if (.not.timeron) goto 999 + + do i=1, t_last + trecs(i) = timer_read(i) + end do + if (tmax .eq. 0.0) tmax = 1.0 + + write(*,800) + 800 format(' SECTION Time (secs)') + + do i=1, t_last + write(*,810) t_names(i), trecs(i), trecs(i)*100./tmax + if (i.eq.t_rhs) then + t = trecs(t_rhsx) + trecs(t_rhsy) + trecs(t_rhsz) + write(*,820) 'sub-rhs', t, t*100./tmax + t = trecs(t_rhs) - t + write(*,820) 'rest-rhs', t, t*100./tmax + elseif (i.eq.t_zsolve) then + t = trecs(t_zsolve) - trecs(t_rdis1) - trecs(t_rdis2) + write(*,820) 'sub-zsol', t, t*100./tmax + elseif (i.eq.t_rdis2) then + t = trecs(t_rdis1) + trecs(t_rdis2) + write(*,820) 'redist', t, t*100./tmax + endif + 810 format(2x,a8,':',f9.3,' (',f6.2,'%)') + 820 format(' --> ',a8,':',f9.3,' (',f6.2,'%)') + end do + + 999 continue + + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine adi_first + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + call compute_rhs(1) + call x_solve + call y_solve + call z_solve + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine adi + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- +!DVM$ interval 1 + call compute_rhs(1) +!DVM$ end interval +!DVM$ interval 12 + call x_solve +!DVM$ end interval +!DVM$ interval 13 + call y_solve +!DVM$ end interval +!DVM$ interval 14 + call z_solve +!DVM$ end interval + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/timers.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/timers.for new file mode 100644 index 0000000..f60983a --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/timers.for @@ -0,0 +1,99 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_clear(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + elapsed(n) = 0.0 + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_start(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + start(n) = elapsed_time() + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine timer_stop(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + external elapsed_time + double precision elapsed_time + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + double precision t, now + now = elapsed_time() + t = now - start(n) + elapsed(n) = elapsed(n) + t + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function timer_read(n) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + integer n + double precision start(64), elapsed(64) + common /tt/ start, elapsed + + timer_read = elapsed(n) + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision function elapsed_time() + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + + double precision t,dvtime + t = dvtime() + elapsed_time = t + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/verify.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/verify.for new file mode 100644 index 0000000..1201002 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/verify.for @@ -0,0 +1,356 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine verify(no_time_steps, class, verified) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c verification routine +c--------------------------------------------------------------------- + + include 'header.h' + + double precision xcrref(5),xceref(5),xcrdif(5),xcedif(5), + > epsilon, xce(5), xcr(5), dtref + integer m, no_time_steps + character class + logical verified + +c--------------------------------------------------------------------- +c tolerance level +c--------------------------------------------------------------------- + epsilon = 1.0d-08 + +c--------------------------------------------------------------------- +c compute the error norm and the residual norm, and exit if not printing +c--------------------------------------------------------------------- + + call error_norm(xce) + call compute_rhs(0) + call rhs_norm(xcr) + + do m = 1, 5 + xcr(m) = xcr(m) / dt + enddo + + class = 'U' + verified = .true. + + do m = 1,5 + xcrref(m) = 1.0 + xceref(m) = 1.0 + end do + +c--------------------------------------------------------------------- +c reference data for 12X12X12 grids after 100 time steps, with DT = 1.50d-02 +c--------------------------------------------------------------------- + if ( (problem_size .eq. 12 ) .and. + > (problem_size .eq. 12 ) .and. + > (problem_size .eq. 12 ) .and. + > (no_time_steps .eq. 100 )) then + + class = 'S' + dtref = 1.5d-2 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 2.7470315451339479d-02 + xcrref(2) = 1.0360746705285417d-02 + xcrref(3) = 1.6235745065095532d-02 + xcrref(4) = 1.5840557224455615d-02 + xcrref(5) = 3.4849040609362460d-02 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + xceref(1) = 2.7289258557377227d-05 + xceref(2) = 1.0364446640837285d-05 + xceref(3) = 1.6154798287166471d-05 + xceref(4) = 1.5750704994480102d-05 + xceref(5) = 3.4177666183390531d-05 + + +c--------------------------------------------------------------------- +c reference data for 36X36X36 grids after 400 time steps, with DT = 1.5d-03 +c--------------------------------------------------------------------- + elseif ( (problem_size .eq. 36) .and. + > (problem_size .eq. 36) .and. + > (problem_size .eq. 36) .and. + > (no_time_steps . eq. 400) ) then + + class = 'W' + dtref = 1.5d-3 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.1893253733584d-02 + xcrref(2) = 0.1717075447775d-03 + xcrref(3) = 0.2778153350936d-03 + xcrref(4) = 0.2887475409984d-03 + xcrref(5) = 0.3143611161242d-02 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + xceref(1) = 0.7542088599534d-04 + xceref(2) = 0.6512852253086d-05 + xceref(3) = 0.1049092285688d-04 + xceref(4) = 0.1128838671535d-04 + xceref(5) = 0.1212845639773d-03 + +c--------------------------------------------------------------------- +c reference data for 64X64X64 grids after 400 time steps, with DT = 1.5d-03 +c--------------------------------------------------------------------- + elseif ( (problem_size .eq. 64) .and. + > (problem_size .eq. 64) .and. + > (problem_size .eq. 64) .and. + > (no_time_steps . eq. 400) ) then + + class = 'A' + dtref = 1.5d-3 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 2.4799822399300195d0 + xcrref(2) = 1.1276337964368832d0 + xcrref(3) = 1.5028977888770491d0 + xcrref(4) = 1.4217816211695179d0 + xcrref(5) = 2.1292113035138280d0 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + xceref(1) = 1.0900140297820550d-04 + xceref(2) = 3.7343951769282091d-05 + xceref(3) = 5.0092785406541633d-05 + xceref(4) = 4.7671093939528255d-05 + xceref(5) = 1.3621613399213001d-04 + +c--------------------------------------------------------------------- +c reference data for 102X102X102 grids after 400 time steps, +c with DT = 1.0d-03 +c--------------------------------------------------------------------- + elseif ( (problem_size .eq. 102) .and. + > (problem_size .eq. 102) .and. + > (problem_size .eq. 102) .and. + > (no_time_steps . eq. 400) ) then + + class = 'B' + dtref = 1.0d-3 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.6903293579998d+02 + xcrref(2) = 0.3095134488084d+02 + xcrref(3) = 0.4103336647017d+02 + xcrref(4) = 0.3864769009604d+02 + xcrref(5) = 0.5643482272596d+02 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + xceref(1) = 0.9810006190188d-02 + xceref(2) = 0.1022827905670d-02 + xceref(3) = 0.1720597911692d-02 + xceref(4) = 0.1694479428231d-02 + xceref(5) = 0.1847456263981d-01 + +c--------------------------------------------------------------------- +c reference data for 162X162X162 grids after 400 time steps, +c with DT = 0.67d-03 +c--------------------------------------------------------------------- + elseif ( (problem_size .eq. 162) .and. + > (problem_size .eq. 162) .and. + > (problem_size .eq. 162) .and. + > (no_time_steps . eq. 400) ) then + + class = 'C' + dtref = 0.67d-3 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.5881691581829d+03 + xcrref(2) = 0.2454417603569d+03 + xcrref(3) = 0.3293829191851d+03 + xcrref(4) = 0.3081924971891d+03 + xcrref(5) = 0.4597223799176d+03 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + xceref(1) = 0.2598120500183d+00 + xceref(2) = 0.2590888922315d-01 + xceref(3) = 0.5132886416320d-01 + xceref(4) = 0.4806073419454d-01 + xceref(5) = 0.5483377491301d+00 + +c--------------------------------------------------------------------- +c reference data for 408X408X408 grids after 500 time steps, +c with DT = 0.3d-03 +c--------------------------------------------------------------------- + elseif ( (problem_size .eq. 408) .and. + > (problem_size .eq. 408) .and. + > (problem_size .eq. 408) .and. + > (no_time_steps . eq. 500) ) then + + class = 'D' + dtref = 0.30d-3 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.1044696216887d+05 + xcrref(2) = 0.3204427762578d+04 + xcrref(3) = 0.4648680733032d+04 + xcrref(4) = 0.4238923283697d+04 + xcrref(5) = 0.7588412036136d+04 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + xceref(1) = 0.5089471423669d+01 + xceref(2) = 0.5323514855894d+00 + xceref(3) = 0.1187051008971d+01 + xceref(4) = 0.1083734951938d+01 + xceref(5) = 0.1164108338568d+02 + +c--------------------------------------------------------------------- +c reference data for 1020X1020X1020 grids after 500 time steps, +c with DT = 0.1d-03 +c--------------------------------------------------------------------- + elseif ( (problem_size .eq. 1020) .and. + > (problem_size .eq. 1020) .and. + > (problem_size .eq. 1020) .and. + > (no_time_steps . eq. 500) ) then + + class = 'E' + dtref = 0.10d-3 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.6255387422609d+05 + xcrref(2) = 0.1495317020012d+05 + xcrref(3) = 0.2347595750586d+05 + xcrref(4) = 0.2091099783534d+05 + xcrref(5) = 0.4770412841218d+05 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + xceref(1) = 0.6742735164909d+02 + xceref(2) = 0.5390656036938d+01 + xceref(3) = 0.1680647196477d+02 + xceref(4) = 0.1536963126457d+02 + xceref(5) = 0.1575330146156d+03 + + + else + verified = .false. + endif + +c--------------------------------------------------------------------- +c verification test for residuals if gridsize is one of +c the defined grid sizes above (class .ne. 'U') +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Compute the difference of solution values and the known reference values. +c--------------------------------------------------------------------- + do m = 1, 5 + + xcrdif(m) = dabs((xcr(m)-xcrref(m))/xcrref(m)) + xcedif(m) = dabs((xce(m)-xceref(m))/xceref(m)) + + enddo + +c--------------------------------------------------------------------- +c Output the comparison of computed results to known cases. +c--------------------------------------------------------------------- + + if (class .ne. 'U') then + write(*, 1990) class + 1990 format(' Verification being performed for class ', a) + write (*,2000) epsilon + 2000 format(' accuracy setting for epsilon = ', E20.13) + verified = (dabs(dt-dtref) .le. epsilon) + if (.not.verified) then + class = 'U' + write (*,1000) dtref + 1000 format(' DT does not match the reference value of ', + > E15.8) + endif + else + write(*, 1995) + 1995 format(' Unknown class') + endif + + + if (class .ne. 'U') then + write (*, 2001) + else + write (*, 2005) + endif + + 2001 format(' Comparison of RMS-norms of residual') + 2005 format(' RMS-norms of residual') + do m = 1, 5 + if (class .eq. 'U') then + write(*, 2015) m, xcr(m) + else if (xcrdif(m) .le. epsilon .and. + & (.not. isnan(xcrdif(m)))) then + write (*,2011) m,xcr(m),xcrref(m),xcrdif(m) + else + verified = .false. + write (*,2010) m,xcr(m),xcrref(m),xcrdif(m) + endif + enddo + + if (class .ne. 'U') then + write (*,2002) + else + write (*,2006) + endif + 2002 format(' Comparison of RMS-norms of solution error') + 2006 format(' RMS-norms of solution error') + + do m = 1, 5 + if (class .eq. 'U') then + write(*, 2015) m, xce(m) + else if (xcedif(m) .le. epsilon .and. + & (.not. isnan(xcedif(m)))) then + write (*,2011) m,xce(m),xceref(m),xcedif(m) + else + verified = .false. + write (*,2010) m,xce(m),xceref(m),xcedif(m) + endif + enddo + + 2010 format(' FAILURE: ', i2, E20.13, E20.13, E20.13) + 2011 format(' ', i2, E20.13, E20.13, E20.13) + 2015 format(' ', i2, E20.13) + + if (class .eq. 'U') then + write(*, 2022) + write(*, 2023) + 2022 format(' No reference values provided') + 2023 format(' No verification performed') + else if (verified) then + write(*, 2020) + 2020 format(' Verification Successful') + else + write(*, 2021) + 2021 format(' Verification failed') + endif + + return + + + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/x_solve.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/x_solve.for new file mode 100644 index 0000000..21088b0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/x_solve.for @@ -0,0 +1,392 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function performs the solution of the approximate factorization +c step in the x-direction for all five matrix components +c simultaneously. The Thomas algorithm is employed to solve the +c systems for the x-lines. Boundary conditions are non-periodic +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, i1, i2, m, m1 + double precision ru1, fac1, fac2, rhs__(5,0:2),t1,t2 + double precision lhs__(5,0:2), lhsm__(5,0:2), lhsp__(5,0:2) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + if (timeron) call timer_start(t_xsolve) + +!DVM$ region local(lhs) +!DVM$ parallel (k,j) on u(*,*,j,k) +!DVM$& , CUDA_BLOCK(32,4) +!DVM$& ,private(m,i,ru1,i1,i2,fac1,fac2,lhs__, lhsp__, lhsm__, rhs__, +!DVM$& t1,t2) + do k = 1, nz2 + do j = 1, ny2 + do i = 0, problem_size-1 + + if(i .eq. 0) then + lhs__(1,0) = 0.0d0 + lhsp__(1,0) = 0.0d0 + lhsm__(1,0) = 0.0d0 + + lhs__(2,0) = 0.0d0 + lhsp__(2,0) = 0.0d0 + lhsm__(2,0) = 0.0d0 + + lhs__(3,0) = 1.0d0 + lhsp__(3,0) = 1.0d0 + lhsm__(3,0) = 1.0d0 + + lhs__(4,0) = 0.0d0 + lhsp__(4,0) = 0.0d0 + lhsm__(4,0) = 0.0d0 + + lhs__(5,0) = 0.0d0 + lhsp__(5,0) = 0.0d0 + lhsm__(5,0) = 0.0d0 + + lhs__(1,1) = 0.0d0 + ru1 = c3c4*1.0d0/u(1,1-1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(2,1) = - dttx2 * us(1-1,j,k) - dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(3,1) = 1.0d0 + c2dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,1+1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(4,1) = dttx2 * us(1+1,j,k) - dttx1 * ru1 + lhs__(5,1) = 0.0d0 + + lhs__(3,1) = lhs__(3,1) + comz5 + lhs__(4,1) = lhs__(4,1) - comz4 + lhs__(5,1) = lhs__(5,1) + comz1 + + lhsp__(1,1) = lhs__(1,1) + lhsp__(2,1) = lhs__(2,1) - dttx2 * speed(1-1,j,k) + lhsp__(3,1) = lhs__(3,1) + lhsp__(4,1) = lhs__(4,1) + dttx2 * speed(1+1,j,k) + lhsp__(5,1) = lhs__(5,1) + lhsm__(1,1) = lhs__(1,1) + lhsm__(2,1) = lhs__(2,1) + dttx2 * speed(1-1,j,k) + lhsm__(3,1) = lhs__(3,1) + lhsm__(4,1) = lhs__(4,1) - dttx2 * speed(1+1,j,k) + lhsm__(5,1) = lhs__(5,1) + endif + + if(i + 2 .lt. problem_size-1) then + m = i + 2 + lhs__(1,2) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,m-1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(2,2) = - dttx2 * us(m-1,j,k) - dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,m,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(3,2) = 1.0d0 + c2dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,m+1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(4,2) = dttx2 * us(m+1,j,k) - dttx1 * ru1 + lhs__(5,2) = 0.0d0 + + if(m .eq. 1) then + lhs__(3,2) = lhs__(3,2) + comz5 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. 2) then + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .ge. 3 .and. m .le. nx2-2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. nx2-1) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + else if(m .eq. nx2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz5 + endif + + lhsp__(1,2) = lhs__(1,2) + lhsp__(2,2) = lhs__(2,2) - dttx2 * speed(m-1,j,k) + lhsp__(3,2) = lhs__(3,2) + lhsp__(4,2) = lhs__(4,2) + dttx2 * speed(m+1,j,k) + lhsp__(5,2) = lhs__(5,2) + lhsm__(1,2) = lhs__(1,2) + lhsm__(2,2) = lhs__(2,2) + dttx2 * speed(m-1,j,k) + lhsm__(3,2) = lhs__(3,2) + lhsm__(4,2) = lhs__(4,2) - dttx2 * speed(m+1,j,k) + lhsm__(5,2) = lhs__(5,2) + else if(i + 2 .eq. nx2+1) then + lhs__(1,2) = 0.0d0 + lhsp__(1,2) = 0.0d0 + lhsm__(1,2) = 0.0d0 + + lhs__(2,2) = 0.0d0 + lhsp__(2,2) = 0.0d0 + lhsm__(2,2) = 0.0d0 + + lhs__(3,2) = 1.0d0 + lhsp__(3,2) = 1.0d0 + lhsm__(3,2) = 1.0d0 + + lhs__(4,2) = 0.0d0 + lhsp__(4,2) = 0.0d0 + lhsm__(4,2) = 0.0d0 + + lhs__(5,2) = 0.0d0 + lhsp__(5,2) = 0.0d0 + lhsm__(5,2) = 0.0d0 + endif +!********************************** end of init + + i1 = i + 1 + i2 = i + 2 + fac1 = 1.d0/lhs__(3,0) + lhs__(4,0) = fac1*lhs__(4,0) + lhs__(5,0) = fac1*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + end do + + if(i .le. nx2-1) then + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + lhs__(2,2)=lhs__(2,2)-lhs__(1,2)*lhs__(4,0) + lhs__(3,2)=lhs__(3,2)-lhs__(1,2)*lhs__(5,0) + do m = 1, 3 + rhs(m,i1,j,k)=rhs(m,i1,j,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i2,j,k)=rhs(m,i2,j,k)-lhs__(1,2)*rhs(m,i,j,k) + end do + + else + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + fac2 = 1.d0/lhs__(3,1) + do m = 1, 3 + rhs(m,i1,j,k) = rhs(m,i1,j,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i1,j,k) = fac2*rhs(m,i1,j,k) + end do + endif + + m = 4 + fac1 = 1.d0/lhsp__(3,0) + lhsp__(4,0) = fac1*lhsp__(4,0) + lhsp__(5,0) = fac1*lhsp__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsp__(3,1)=lhsp__(3,1)-lhsp__(2,1)*lhsp__(4,0) + lhsp__(4,1)=lhsp__(4,1)-lhsp__(2,1)*lhsp__(5,0) + rhs(m,i1,j,k) = rhs(m,i1,j,k)-lhsp__(2,1)*rhs(m,i,j,k) + if(i .lt. nx2) then + lhsp__(2,2)=lhsp__(2,2)-lhsp__(1,2)*lhsp__(4,0) + lhsp__(3,2)=lhsp__(3,2)-lhsp__(1,2)*lhsp__(5,0) + rhs(m,i2,j,k)=rhs(m,i2,j,k)-lhsp__(1,2)*rhs(m,i,j,k) + endif + m = 5 + fac1 = 1.d0/lhsm__(3,0) + lhsm__(4,0) = fac1*lhsm__(4,0) + lhsm__(5,0) = fac1*lhsm__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsm__(3,1)=lhsm__(3,1)-lhsm__(2,1)*lhsm__(4,0) + lhsm__(4,1)=lhsm__(4,1)-lhsm__(2,1)*lhsm__(5,0) + rhs(m,i1,j,k)=rhs(m,i1,j,k) -lhsm__(2,1)*rhs(m,i,j,k) + if(i .lt. nx2) then + lhsm__(2,2)=lhsm__(2,2)-lhsm__(1,2)*lhsm__(4,0) + lhsm__(3,2)=lhsm__(3,2)-lhsm__(1,2)*lhsm__(5,0) + rhs(m,i2,j,k)=rhs(m,i2,j,k) -lhsm__(1,2)*rhs(m,i,j,k) + endif + + if(i .eq. nx2) then + rhs(4,i1,j,k) = rhs(4,i1,j,k)/lhsp__(3,1) + rhs(5,i1,j,k) = rhs(5,i1,j,k)/lhsm__(3,1) + do m = 1, 3 + rhs(m,i,j,k) = rhs(m,i,j,k)-lhs__(4,0)*rhs(m,i1,j,k) + end do + rhs(4,i,j,k) = rhs(4,i,j,k)-lhsp__(4,0)*rhs(4,i1,j,k) + rhs(5,i,j,k) = rhs(5,i,j,k)-lhsm__(4,0)*rhs(5,i1,j,k) + endif + + + lhs(0,4,i,j,k) = lhs__(4,0) + lhs(1,4,i,j,k) = lhsp__(4,0) + lhs(2,4,i,j,k) = lhsm__(4,0) + + lhs(0,5,i,j,k) = lhs__(5,0) + lhs(1,5,i,j,k) = lhsp__(5,0) + lhs(2,5,i,j,k) = lhsm__(5,0) + + lhs__(1,0) = lhs__(1,1) + lhsp__(1,0) = lhsp__(1,1) + lhsm__(1,0) = lhsm__(1,1) + lhs__(1,1) = lhs__(1,2) + lhsp__(1,1) = lhsp__(1,2) + lhsm__(1,1) = lhsm__(1,2) + + lhs__(2,0) = lhs__(2,1) + lhsp__(2,0) = lhsp__(2,1) + lhsm__(2,0) = lhsm__(2,1) + lhs__(2,1) = lhs__(2,2) + lhsp__(2,1) = lhsp__(2,2) + lhsm__(2,1) = lhsm__(2,2) + + lhs__(3,0) = lhs__(3,1) + lhsp__(3,0) = lhsp__(3,1) + lhsm__(3,0) = lhsm__(3,1) + lhs__(3,1) = lhs__(3,2) + lhsp__(3,1) = lhsp__(3,2) + lhsm__(3,1) = lhsm__(3,2) + + lhs__(4,0) = lhs__(4,1) + lhsp__(4,0) = lhsp__(4,1) + lhsm__(4,0) = lhsm__(4,1) + lhs__(4,1) = lhs__(4,2) + lhsp__(4,1) = lhsp__(4,2) + lhsm__(4,1) = lhsm__(4,2) + + lhs__(5,0) = lhs__(5,1) + lhsp__(5,0) = lhsp__(5,1) + lhsm__(5,0) = lhsm__(5,1) + lhs__(5,1) = lhs__(5,2) + lhsp__(5,1) = lhsp__(5,2) + lhsm__(5,1) = lhsm__(5,2) + enddo + + i = problem_size-3 + rhs__(1,2) = rhs(1,i+2,j,k) + rhs__(2,2) = rhs(2,i+2,j,k) + rhs__(3,2) = rhs(3,i+2,j,k) + rhs__(4,2) = rhs(4,i+2,j,k) + rhs__(5,2) = rhs(5,i+2,j,k) + + rhs__(1,1) = rhs(1,i+1,j,k) + rhs__(2,1) = rhs(2,i+1,j,k) + rhs__(3,1) = rhs(3,i+1,j,k) + rhs__(4,1) = rhs(4,i+1,j,k) + rhs__(5,1) = rhs(5,i+1,j,k) + + rhs__(1,0) = rhs(1,i,j,k) + rhs__(2,0) = rhs(2,i,j,k) + rhs__(3,0) = rhs(3,i,j,k) + rhs__(4,0) = rhs(4,i,j,k) + rhs__(5,0) = rhs(5,i,j,k) + + rhs__(1,0) = rhs__(1,0) - + > lhs(0,4,i,j,k)*rhs__(1,1) - + > lhs(0,5,i,j,k)*rhs__(1,2) + rhs__(2,0) = rhs__(2,0) - + > lhs(0,4,i,j,k)*rhs__(2,1) - + > lhs(0,5,i,j,k)*rhs__(2,2) + rhs__(3,0) = rhs__(3,0) - + > lhs(0,4,i,j,k)*rhs__(3,1) - + > lhs(0,5,i,j,k)*rhs__(3,2) + + rhs__(4,0) = rhs__(4,0) - + > lhs(1,4,i,j,k)*rhs__(4,1) - + > lhs(1,5,i,j,k)*rhs__(4,2) + rhs__(5,0) = rhs__(5,0) - + > lhs(2,4,i,j,k)*rhs__(5,1) - + > lhs(2,5,i,j,k)*rhs__(5,2) + + rhs__(1,2) = rhs__(1,1) + rhs__(2,2) = rhs__(2,1) + rhs__(3,2) = rhs__(3,1) + rhs__(4,2) = rhs__(4,1) + rhs__(5,2) = rhs__(5,1) + + rhs__(1,1) = rhs__(1,0) + rhs__(2,1) = rhs__(2,0) + rhs__(3,1) = rhs__(3,0) + rhs__(4,1) = rhs__(4,0) + rhs__(5,1) = rhs__(5,0) + + do i = problem_size-4, 0, -1 + rhs__(1,0) = rhs(1,i,j,k) + rhs__(2,0) = rhs(2,i,j,k) + rhs__(3,0) = rhs(3,i,j,k) + rhs__(4,0) = rhs(4,i,j,k) + rhs__(5,0) = rhs(5,i,j,k) + + rhs__(1,0) = rhs__(1,0) - + > lhs(0,4,i,j,k)*rhs__(1,1) - + > lhs(0,5,i,j,k)*rhs__(1,2) + rhs__(2,0) = rhs__(2,0) - + > lhs(0,4,i,j,k)*rhs__(2,1) - + > lhs(0,5,i,j,k)*rhs__(2,2) + rhs__(3,0) = rhs__(3,0) - + > lhs(0,4,i,j,k)*rhs__(3,1) - + > lhs(0,5,i,j,k)*rhs__(3,2) + + rhs__(4,0) = rhs__(4,0) - + > lhs(1,4,i,j,k)*rhs__(4,1) - + > lhs(1,5,i,j,k)*rhs__(4,2) + rhs__(5,0) = rhs__(5,0) - + > lhs(2,4,i,j,k)*rhs__(5,1) - + > lhs(2,5,i,j,k)*rhs__(5,2) + + t1 = bt * rhs__(3,2) + t2 = 0.5d0 * ( rhs__(4,2)+rhs__(5,2)) + rhs(1,i+2,j,k) = -rhs__(2,2) + rhs(2,i+2,j,k) = rhs__(1,2) + rhs(3,i+2,j,k) = bt * (rhs__(4,2)-rhs__(5,2)) + rhs(4,i+2,j,k) = -t1 + t2 + rhs(5,i+2,j,k) = t1 + t2 + + rhs__(1,2) = rhs__(1,1) + rhs__(2,2) = rhs__(2,1) + rhs__(3,2) = rhs__(3,1) + rhs__(4,2) = rhs__(4,1) + rhs__(5,2) = rhs__(5,1) + + rhs__(1,1) = rhs__(1,0) + rhs__(2,1) = rhs__(2,0) + rhs__(3,1) = rhs__(3,0) + rhs__(4,1) = rhs__(4,0) + rhs__(5,1) = rhs__(5,0) + end do + t1 = bt * rhs__(3,2) + t2 = 0.5d0 * ( rhs__(4,2)+rhs__(5,2)) + rhs(1,1,j,k) = -rhs__(2,2) + rhs(2,1,j,k) = rhs__(1,2) + rhs(3,1,j,k) = bt * (rhs__(4,2)-rhs__(5,2)) + rhs(4,1,j,k) = -t1 + t2 + rhs(5,1,j,k) = t1 + t2 + enddo + enddo + +!DVM$ end region + if (timeron) call timer_stop(t_xsolve) + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/x_solve_mpi.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/x_solve_mpi.for new file mode 100644 index 0000000..e91802e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/x_solve_mpi.for @@ -0,0 +1,321 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function performs the solution of the approximate factorization +c step in the x-direction for all five matrix components +c simultaneously. The Thomas algorithm is employed to solve the +c systems for the x-lines. Boundary conditions are non-periodic +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, i1, i2, m + double precision ru1, fac1, fac2, t1,t2,t3 + double precision lhs__(5,0:2), lhsm__(5,0:2), lhsp__(5,0:2) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + if (timeron) call timer_start(t_xsolve) + +!DVM$ region local(lhs) + +!DVM$ parallel (k,j,i) on rhs(*,i,j,k) +!DVM$& ,private(m,ru1,i1,i2,fac1,fac2,lhs__, lhsp__, lhsm__) +!DVM$& ,ACROSS(OUT:rhs(0:0,0:2,0:0,0:0), lhs(0:0,0:0,0:2,0:0,0:0)) +!DVM$& ,stage(stage_n) + do k = 1, nz2 + do j = 1, ny2 + do i = 0, problem_size-1 + + if(i .eq. 0) then + lhs__(1,0) = 0.0d0 + lhsp__(1,0) = 0.0d0 + lhsm__(1,0) = 0.0d0 + + lhs__(2,0) = 0.0d0 + lhsp__(2,0) = 0.0d0 + lhsm__(2,0) = 0.0d0 + + lhs__(3,0) = 1.0d0 + lhsp__(3,0) = 1.0d0 + lhsm__(3,0) = 1.0d0 + + lhs__(4,0) = 0.0d0 + lhsp__(4,0) = 0.0d0 + lhsm__(4,0) = 0.0d0 + + lhs__(5,0) = 0.0d0 + lhsp__(5,0) = 0.0d0 + lhsm__(5,0) = 0.0d0 + + lhs__(1,1) = 0.0d0 + ru1 = c3c4*1.0d0/u(1,i,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(2,1) = - dttx2 * us(i,j,k) - dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,i+1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(3,1) = 1.0d0 + c2dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,i+2,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(4,1) = dttx2 * us(i+2,j,k) - dttx1 * ru1 + lhs__(5,1) = 0.0d0 + + lhs__(3,1) = lhs__(3,1) + comz5 + lhs__(4,1) = lhs__(4,1) - comz4 + lhs__(5,1) = lhs__(5,1) + comz1 + + lhsp__(1,1) = lhs__(1,1) + lhsp__(2,1) = lhs__(2,1) - dttx2 * speed(i,j,k) + lhsp__(3,1) = lhs__(3,1) + lhsp__(4,1) = lhs__(4,1) + dttx2 * speed(i+2,j,k) + lhsp__(5,1) = lhs__(5,1) + lhsm__(1,1) = lhs__(1,1) + lhsm__(2,1) = lhs__(2,1) + dttx2 * speed(i,j,k) + lhsm__(3,1) = lhs__(3,1) + lhsm__(4,1) = lhs__(4,1) - dttx2 * speed(i+2,j,k) + lhsm__(5,1) = lhs__(5,1) + else + do m = 1, 5 + lhs__(m,0) = lhs(0,m,i,j,k) + lhsp__(m,0) = lhs(1,m,i,j,k) + lhsm__(m,0) = lhs(2,m,i,j,k) + + lhs__(m,1) = lhs(0,m,i+1,j,k) + lhsp__(m,1) = lhs(1,m,i+1,j,k) + lhsm__(m,1) = lhs(2,m,i+1,j,k) + enddo + endif + + if(i + 2 .lt. problem_size-1) then + m = i + 2 + lhs__(1,2) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,m-1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(2,2) = - dttx2 * us(m-1,j,k) - dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,m,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(3,2) = 1.0d0 + c2dttx1 * ru1 + ru1 = c3c4*1.0d0/u(1,m+1,j,k) + ru1 = dmax1(dx2+con43*ru1, + > dx5+c1c5*ru1, + > dxmax+ru1, + > dx1) + lhs__(4,2) = dttx2 * us(m+1,j,k) - dttx1 * ru1 + lhs__(5,2) = 0.0d0 + + if(m .eq. 1) then + lhs__(3,2) = lhs__(3,2) + comz5 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. 2) then + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .ge. 3 .and. m .le. nx2-2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. nx2-1) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + else if(m .eq. nx2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz5 + endif + + lhsp__(1,2) = lhs__(1,2) + lhsp__(2,2) = lhs__(2,2) - dttx2 * speed(m-1,j,k) + lhsp__(3,2) = lhs__(3,2) + lhsp__(4,2) = lhs__(4,2) + dttx2 * speed(m+1,j,k) + lhsp__(5,2) = lhs__(5,2) + lhsm__(1,2) = lhs__(1,2) + lhsm__(2,2) = lhs__(2,2) + dttx2 * speed(m-1,j,k) + lhsm__(3,2) = lhs__(3,2) + lhsm__(4,2) = lhs__(4,2) - dttx2 * speed(m+1,j,k) + lhsm__(5,2) = lhs__(5,2) + else if(i + 2 .eq. nx2+1) then + lhs__(1,2) = 0.0d0 + lhsp__(1,2) = 0.0d0 + lhsm__(1,2) = 0.0d0 + + lhs__(2,2) = 0.0d0 + lhsp__(2,2) = 0.0d0 + lhsm__(2,2) = 0.0d0 + + lhs__(3,2) = 1.0d0 + lhsp__(3,2) = 1.0d0 + lhsm__(3,2) = 1.0d0 + + lhs__(4,2) = 0.0d0 + lhsp__(4,2) = 0.0d0 + lhsm__(4,2) = 0.0d0 + + lhs__(5,2) = 0.0d0 + lhsp__(5,2) = 0.0d0 + lhsm__(5,2) = 0.0d0 + endif +!********************************** end of init + + i1 = i + 1 + i2 = i + 2 + fac1 = 1.d0/lhs__(3,0) + lhs__(4,0) = fac1*lhs__(4,0) + lhs__(5,0) = fac1*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + end do + + if(i .le. nx2-1) then + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + lhs__(2,2)=lhs__(2,2)-lhs__(1,2)*lhs__(4,0) + lhs__(3,2)=lhs__(3,2)-lhs__(1,2)*lhs__(5,0) + do m = 1, 3 + rhs(m,i1,j,k)=rhs(m,i1,j,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i2,j,k)=rhs(m,i2,j,k)-lhs__(1,2)*rhs(m,i,j,k) + end do + + else + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + if (lhs__(3,1) .ne. 0) then + fac2 = 1.d0/lhs__(3,1) + else + fac2 = 0 + endif + do m = 1, 3 + rhs(m,i1,j,k) = rhs(m,i1,j,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i1,j,k) = fac2*rhs(m,i1,j,k) + end do + endif + + m = 4 + fac1 = 1.d0/lhsp__(3,0) + lhsp__(4,0) = fac1*lhsp__(4,0) + lhsp__(5,0) = fac1*lhsp__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsp__(3,1)=lhsp__(3,1)-lhsp__(2,1)*lhsp__(4,0) + lhsp__(4,1)=lhsp__(4,1)-lhsp__(2,1)*lhsp__(5,0) + rhs(m,i1,j,k) = rhs(m,i1,j,k)-lhsp__(2,1)*rhs(m,i,j,k) + if(i .lt. nx2) then + lhsp__(2,2)=lhsp__(2,2)-lhsp__(1,2)*lhsp__(4,0) + lhsp__(3,2)=lhsp__(3,2)-lhsp__(1,2)*lhsp__(5,0) + rhs(m,i2,j,k)=rhs(m,i2,j,k)-lhsp__(1,2)*rhs(m,i,j,k) + endif + m = 5 + fac1 = 1.d0/lhsm__(3,0) + lhsm__(4,0) = fac1*lhsm__(4,0) + lhsm__(5,0) = fac1*lhsm__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsm__(3,1)=lhsm__(3,1)-lhsm__(2,1)*lhsm__(4,0) + lhsm__(4,1)=lhsm__(4,1)-lhsm__(2,1)*lhsm__(5,0) + rhs(m,i1,j,k)=rhs(m,i1,j,k) -lhsm__(2,1)*rhs(m,i,j,k) + if(i .lt. nx2) then + lhsm__(2,2)=lhsm__(2,2)-lhsm__(1,2)*lhsm__(4,0) + lhsm__(3,2)=lhsm__(3,2)-lhsm__(1,2)*lhsm__(5,0) + rhs(m,i2,j,k)=rhs(m,i2,j,k) -lhsm__(1,2)*rhs(m,i,j,k) + endif + + if(i .eq. nx2) then + rhs(4,i1,j,k) = rhs(4,i1,j,k)/lhsp__(3,1) + rhs(5,i1,j,k) = rhs(5,i1,j,k)/lhsm__(3,1) + do m = 1, 3 + rhs(m,i,j,k) = rhs(m,i,j,k)-lhs__(4,0)*rhs(m,i1,j,k) + end do + rhs(4,i,j,k) = rhs(4,i,j,k)-lhsp__(4,0)*rhs(4,i1,j,k) + rhs(5,i,j,k) = rhs(5,i,j,k)-lhsm__(4,0)*rhs(5,i1,j,k) + endif + + do m = 1, 5 + lhs(0,m,i,j,k) = lhs__(m,0) + lhs(1,m,i,j,k) = lhsp__(m,0) + lhs(2,m,i,j,k) = lhsm__(m,0) + + lhs(0,m,i+1,j,k) = lhs__(m,1) + lhs(1,m,i+1,j,k) = lhsp__(m,1) + lhs(2,m,i+1,j,k) = lhsm__(m,1) + + if (i .lt. nx2) then + lhs(0,m,i+2,j,k) = lhs__(m,2) + lhs(1,m,i+2,j,k) = lhsp__(m,2) + lhs(2,m,i+2,j,k) = lhsm__(m,2) + endif + enddo + enddo + enddo + enddo + +!DVM$ PARALLEL (k,j,i) on rhs(*,i,j,k),ACROSS(rhs(0:0,0:2,0:0,0:0)) +!DVM$& ,stage(stage_n) + do k = 1, nz2 + do j = 1, ny2 + do i = problem_size-3, 0, -1 + + rhs(1,i,j,k) = rhs(1,i,j,k) - + & lhs(0,4,i,j,k)*rhs(1,i+1,j,k) - + & lhs(0,5,i,j,k)*rhs(1,i+2,j,k) + rhs(2,i,j,k) = rhs(2,i,j,k) - + & lhs(0,4,i,j,k)*rhs(2,i+1,j,k) - + & lhs(0,5,i,j,k)*rhs(2,i+2,j,k) + rhs(3,i,j,k) = rhs(3,i,j,k) - + & lhs(0,4,i,j,k)*rhs(3,i+1,j,k) - + & lhs(0,5,i,j,k)*rhs(3,i+2,j,k) + + rhs(4,i,j,k) = rhs(4,i,j,k) - + & lhs(1,4,i,j,k)*rhs(4,i+1,j,k) - + & lhs(1,5,i,j,k)*rhs(4,i+2,j,k) + rhs(5,i,j,k) = rhs(5,i,j,k) - + & lhs(2,4,i,j,k)*rhs(5,i+1,j,k) - + & lhs(2,5,i,j,k)*rhs(5,i+2,j,k) + end do + enddo + enddo + +!DVM$ PARALLEL (k,j,i) on rhs(*,i,j,k),PRIVATE(t1,t2,t3) + do k = 1, nz2 + do j = 1, ny2 + do i = 1, nx2 + t1 = bt * rhs(3,i,j,k) + t2 = 0.5d0 * (rhs(4,i,j,k)+rhs(5,i,j,k)) + t3 = rhs(1,i,j,k) + + rhs(1,i,j,k) = -rhs(2,i,j,k) + rhs(2,i,j,k) = t3 + rhs(3,i,j,k) = bt * (rhs(4,i,j,k)-rhs(5,i,j,k)) + rhs(4,i,j,k) = -t1 + t2 + rhs(5,i,j,k) = t1 + t2 + end do + enddo + enddo +!DVM$ end region + if (timeron) call timer_stop(t_xsolve) + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/y_solve.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/y_solve.for new file mode 100644 index 0000000..83575ef --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/y_solve.for @@ -0,0 +1,396 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function performs the solution of the approximate factorization +c step in the y-direction for all five matrix components +c simultaneously. The Thomas algorithm is employed to solve the +c systems for the y-lines. Boundary conditions are non-periodic +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, j1, j2, m, m1 + double precision ru1, fac1, fac2, rhs__(5,0:2),t1,t2 + double precision lhs__(5,0:2), lhsm__(5,0:2), lhsp__(5,0:2) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + if (timeron) call timer_start(t_ysolve) + +!DVM$ region local(lhs) +!DVM$ parallel (k,i) on u(*,i,*,k) +!DVM$& , CUDA_BLOCK(32,4) +!DVM$& ,private(m,j1,j2,fac1,fac2,ru1,lhs__,lhsp__,lhsm__,j,rhs__, +!DVM$& t1,t2) + do k = 1, nz2 + do i = 1, nx2 + + lhs__(1,0) = 0.0d0 + lhsp__(1,0) = 0.0d0 + lhsm__(1,0) = 0.0d0 + + lhs__(2,0) = 0.0d0 + lhsp__(2,0) = 0.0d0 + lhsm__(2,0) = 0.0d0 + + lhs__(3,0) = 1.0d0 + lhsp__(3,0) = 1.0d0 + lhsm__(3,0) = 1.0d0 + + lhs__(4,0) = 0.0d0 + lhsp__(4,0) = 0.0d0 + lhsm__(4,0) = 0.0d0 + + lhs__(5,0) = 0.0d0 + lhsp__(5,0) = 0.0d0 + lhsm__(5,0) = 0.0d0 + + lhs__(1,1) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,i,1-1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(2,1) = - dtty2 * vs(i,1-1,k) - dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(3,1) = 1.0d0 + c2dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,1+1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(4,1) = dtty2 * vs(i,1+1,k) - dtty1 * ru1 + lhs__(5,1) = 0.0d0 + + lhs__(3,1) = lhs__(3,1) + comz5 + lhs__(4,1) = lhs__(4,1) - comz4 + lhs__(5,1) = lhs__(5,1) + comz1 + + lhsp__(1,1) = lhs__(1,1) + lhsp__(2,1) = lhs__(2,1) - dtty2 * speed(i,1-1,k) + lhsp__(3,1) = lhs__(3,1) + lhsp__(4,1) = lhs__(4,1) + dtty2 * speed(i,1+1,k) + lhsp__(5,1) = lhs__(5,1) + lhsm__(1,1) = lhs__(1,1) + lhsm__(2,1) = lhs__(2,1) + dtty2 * speed(i,1-1,k) + lhsm__(3,1) = lhs__(3,1) + lhsm__(4,1) = lhs__(4,1) - dtty2 * speed(i,1+1,k) + lhsm__(5,1) = lhs__(5,1) + + do j = 0, ny2+1 + if(j + 2 .lt. ny2 + 1) then + m = j + 2 + lhs__(1,2) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,i,m-1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(2,2) = - dtty2 * vs(i,m-1,k) - dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,m,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(3,2) = 1.0d0 + c2dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,m+1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(4,2) = dtty2 * vs(i,m+1,k) - dtty1 * ru1 + lhs__(5,2) = 0.0d0 + + if(m .eq. 1) then + lhs__(3,2) = lhs__(3,2) + comz5 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. 2) then + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .ge. 3 .and. m .le. ny2-2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. ny2-1) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + else if(m .eq. ny2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz5 + endif + + lhsp__(1,2) = lhs__(1,2) + lhsp__(2,2) = lhs__(2,2) - dtty2 * speed(i,m-1,k) + lhsp__(3,2) = lhs__(3,2) + lhsp__(4,2) = lhs__(4,2) + dtty2 * speed(i,m+1,k) + lhsp__(5,2) = lhs__(5,2) + lhsm__(1,2) = lhs__(1,2) + lhsm__(2,2) = lhs__(2,2) + dtty2 * speed(i,m-1,k) + lhsm__(3,2) = lhs__(3,2) + lhsm__(4,2) = lhs__(4,2) - dtty2 * speed(i,m+1,k) + lhsm__(5,2) = lhs__(5,2) + else if(j + 2 .eq. ny2+1) then + + lhs__(1,2) = 0.0d0 + lhsp__(1,2) = 0.0d0 + lhsm__(1,2) = 0.0d0 + + lhs__(2,2) = 0.0d0 + lhsp__(2,2) = 0.0d0 + lhsm__(2,2) = 0.0d0 + + lhs__(3,2) = 1.0d0 + lhsp__(3,2) = 1.0d0 + lhsm__(3,2) = 1.0d0 + + lhs__(4,2) = 0.0d0 + lhsp__(4,2) = 0.0d0 + lhsm__(4,2) = 0.0d0 + + lhs__(5,2) = 0.0d0 + lhsp__(5,2) = 0.0d0 + lhsm__(5,2) = 0.0d0 + + endif +!********************************** end of init + + j1 = j + 1 + j2 = j + 2 + fac1 = 1.d0/lhs__(3,0) + lhs__(4,0) = fac1*lhs__(4,0) + lhs__(5,0) = fac1*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + end do + + if(j .le. ny2-1) then + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + lhs__(2,2)=lhs__(2,2)-lhs__(1,2)*lhs__(4,0) + lhs__(3,2)=lhs__(3,2)-lhs__(1,2)*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j1,k)=rhs(m,i,j1,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j2,k)=rhs(m,i,j2,k)-lhs__(1,2)*rhs(m,i,j,k) + end do + + else + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + fac2 = 1.d0/lhs__(3,1) + do m = 1, 3 + rhs(m,i,j1,k) = rhs(m,i,j1,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j1,k) = fac2*rhs(m,i,j1,k) + end do + endif + + m = 4 + fac1 = 1.d0/lhsp__(3,0) + lhsp__(4,0) = fac1*lhsp__(4,0) + lhsp__(5,0) = fac1*lhsp__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsp__(3,1)=lhsp__(3,1)-lhsp__(2,1)*lhsp__(4,0) + lhsp__(4,1)=lhsp__(4,1)-lhsp__(2,1)*lhsp__(5,0) + rhs(m,i,j1,k) = rhs(m,i,j1,k)-lhsp__(2,1)*rhs(m,i,j,k) + if(j .lt. ny2) then + lhsp__(2,2)=lhsp__(2,2)-lhsp__(1,2)*lhsp__(4,0) + lhsp__(3,2)=lhsp__(3,2)-lhsp__(1,2)*lhsp__(5,0) + rhs(m,i,j2,k)=rhs(m,i,j2,k)-lhsp__(1,2)*rhs(m,i,j,k) + endif + m = 5 + fac1 = 1.d0/lhsm__(3,0) + lhsm__(4,0) = fac1*lhsm__(4,0) + lhsm__(5,0) = fac1*lhsm__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsm__(3,1)=lhsm__(3,1)-lhsm__(2,1)*lhsm__(4,0) + lhsm__(4,1)=lhsm__(4,1)-lhsm__(2,1)*lhsm__(5,0) + rhs(m,i,j1,k)=rhs(m,i,j1,k) -lhsm__(2,1)*rhs(m,i,j,k) + if(j .lt. ny2) then + lhsm__(2,2)=lhsm__(2,2)-lhsm__(1,2)*lhsm__(4,0) + lhsm__(3,2)=lhsm__(3,2)-lhsm__(1,2)*lhsm__(5,0) + rhs(m,i,j2,k)=rhs(m,i,j2,k) -lhsm__(1,2)*rhs(m,i,j,k) + endif + + if(j .eq. ny2) then + rhs(4,i,j1,k) = rhs(4,i,j1,k)/lhsp__(3,1) + rhs(5,i,j1,k) = rhs(5,i,j1,k)/lhsm__(3,1) + do m = 1, 3 + rhs(m,i,j,k) = rhs(m,i,j,k)-lhs__(4,0)*rhs(m,i,j1,k) + end do + rhs(4,i,j,k) = rhs(4,i,j,k)-lhsp__(4,0)*rhs(4,i,j1,k) + rhs(5,i,j,k) = rhs(5,i,j,k)-lhsm__(4,0)*rhs(5,i,j1,k) + endif + lhs(0,4,i,j,k) = lhs__(4,0) + lhs(1,4,i,j,k) = lhsp__(4,0) + lhs(2,4,i,j,k) = lhsm__(4,0) + + lhs(0,5,i,j,k) = lhs__(5,0) + lhs(1,5,i,j,k) = lhsp__(5,0) + lhs(2,5,i,j,k) = lhsm__(5,0) + + lhs__(1,0) = lhs__(1,1) + lhsp__(1,0) = lhsp__(1,1) + lhsm__(1,0) = lhsm__(1,1) + lhs__(1,1) = lhs__(1,2) + lhsp__(1,1) = lhsp__(1,2) + lhsm__(1,1) = lhsm__(1,2) + + lhs__(2,0) = lhs__(2,1) + lhsp__(2,0) = lhsp__(2,1) + lhsm__(2,0) = lhsm__(2,1) + lhs__(2,1) = lhs__(2,2) + lhsp__(2,1) = lhsp__(2,2) + lhsm__(2,1) = lhsm__(2,2) + + lhs__(3,0) = lhs__(3,1) + lhsp__(3,0) = lhsp__(3,1) + lhsm__(3,0) = lhsm__(3,1) + lhs__(3,1) = lhs__(3,2) + lhsp__(3,1) = lhsp__(3,2) + lhsm__(3,1) = lhsm__(3,2) + + lhs__(4,0) = lhs__(4,1) + lhsp__(4,0) = lhsp__(4,1) + lhsm__(4,0) = lhsm__(4,1) + lhs__(4,1) = lhs__(4,2) + lhsp__(4,1) = lhsp__(4,2) + lhsm__(4,1) = lhsm__(4,2) + + lhs__(5,0) = lhs__(5,1) + lhsp__(5,0) = lhsp__(5,1) + lhsm__(5,0) = lhsm__(5,1) + lhs__(5,1) = lhs__(5,2) + lhsp__(5,1) = lhsp__(5,2) + lhsm__(5,1) = lhsm__(5,2) + enddo + + j = problem_size-3 + rhs__(1,2) = rhs(1,i,j+2,k) + rhs__(2,2) = rhs(2,i,j+2,k) + rhs__(3,2) = rhs(3,i,j+2,k) + rhs__(4,2) = rhs(4,i,j+2,k) + rhs__(5,2) = rhs(5,i,j+2,k) + + rhs__(1,1) = rhs(1,i,j+1,k) + rhs__(2,1) = rhs(2,i,j+1,k) + rhs__(3,1) = rhs(3,i,j+1,k) + rhs__(4,1) = rhs(4,i,j+1,k) + rhs__(5,1) = rhs(5,i,j+1,k) + + rhs__(1,0) = rhs(1,i,j,k) + rhs__(2,0) = rhs(2,i,j,k) + rhs__(3,0) = rhs(3,i,j,k) + rhs__(4,0) = rhs(4,i,j,k) + rhs__(5,0) = rhs(5,i,j,k) + + rhs__(1,0) = rhs__(1,0) - + > lhs(0,4,i,j,k)*rhs__(1,1) - + > lhs(0,5,i,j,k)*rhs__(1,2) + rhs__(2,0) = rhs__(2,0) - + > lhs(0,4,i,j,k)*rhs__(2,1) - + > lhs(0,5,i,j,k)*rhs__(2,2) + rhs__(3,0) = rhs__(3,0) - + > lhs(0,4,i,j,k)*rhs__(3,1) - + > lhs(0,5,i,j,k)*rhs__(3,2) + + rhs__(4,0) = rhs__(4,0) - + > lhs(1,4,i,j,k)*rhs__(4,1) - + > lhs(1,5,i,j,k)*rhs__(4,2) + rhs__(5,0) = rhs__(5,0) - + > lhs(2,4,i,j,k)*rhs__(5,1) - + > lhs(2,5,i,j,k)*rhs__(5,2) + + rhs__(1,2) = rhs__(1,1) + rhs__(2,2) = rhs__(2,1) + rhs__(3,2) = rhs__(3,1) + rhs__(4,2) = rhs__(4,1) + rhs__(5,2) = rhs__(5,1) + + rhs__(1,1) = rhs__(1,0) + rhs__(2,1) = rhs__(2,0) + rhs__(3,1) = rhs__(3,0) + rhs__(4,1) = rhs__(4,0) + rhs__(5,1) = rhs__(5,0) + + do j = problem_size-4, 0, -1 + rhs__(1,0) = rhs(1,i,j,k) + rhs__(2,0) = rhs(2,i,j,k) + rhs__(3,0) = rhs(3,i,j,k) + rhs__(4,0) = rhs(4,i,j,k) + rhs__(5,0) = rhs(5,i,j,k) + + rhs__(1,0) = rhs__(1,0) - + > lhs(0,4,i,j,k)*rhs__(1,1) - + > lhs(0,5,i,j,k)*rhs__(1,2) + rhs__(2,0) = rhs__(2,0) - + > lhs(0,4,i,j,k)*rhs__(2,1) - + > lhs(0,5,i,j,k)*rhs__(2,2) + rhs__(3,0) = rhs__(3,0) - + > lhs(0,4,i,j,k)*rhs__(3,1) - + > lhs(0,5,i,j,k)*rhs__(3,2) + + rhs__(4,0) = rhs__(4,0) - + > lhs(1,4,i,j,k)*rhs__(4,1) - + > lhs(1,5,i,j,k)*rhs__(4,2) + rhs__(5,0) = rhs__(5,0) - + > lhs(2,4,i,j,k)*rhs__(5,1) - + > lhs(2,5,i,j,k)*rhs__(5,2) + + t1 = bt * rhs__(1,2) + t2 = 0.5d0 * (rhs__(4,2) + rhs__(5,2)) + rhs(1,i,j+2,k) = bt * (rhs__(4,2) - rhs__(5,2)) + rhs(2,i,j+2,k) = -rhs__(3,2) + rhs(3,i,j+2,k) = rhs__(2,2) + rhs(4,i,j+2,k) = -t1 + t2 + rhs(5,i,j+2,k) = t1 + t2 + + rhs__(1,2) = rhs__(1,1) + rhs__(2,2) = rhs__(2,1) + rhs__(3,2) = rhs__(3,1) + rhs__(4,2) = rhs__(4,1) + rhs__(5,2) = rhs__(5,1) + + rhs__(1,1) = rhs__(1,0) + rhs__(2,1) = rhs__(2,0) + rhs__(3,1) = rhs__(3,0) + rhs__(4,1) = rhs__(4,0) + rhs__(5,1) = rhs__(5,0) + enddo + t1 = bt * rhs__(1,2) + t2 = 0.5d0 * (rhs__(4,2) + rhs__(5,2)) + rhs(1,i,j+2,k) = bt * (rhs__(4,2) - rhs__(5,2)) + rhs(2,i,j+2,k) = -rhs__(3,2) + rhs(3,i,j+2,k) = rhs__(2,2) + rhs(4,i,j+2,k) = -t1 + t2 + rhs(5,i,j+2,k) = t1 + t2 + enddo + enddo + +!DVM$ end region + if (timeron) call timer_stop(t_ysolve) + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/y_solve_mpi.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/y_solve_mpi.for new file mode 100644 index 0000000..3972a68 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/y_solve_mpi.for @@ -0,0 +1,330 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function performs the solution of the approximate factorization +c step in the y-direction for all five matrix components +c simultaneously. The Thomas algorithm is employed to solve the +c systems for the y-lines. Boundary conditions are non-periodic +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, j1, j2, m, m1 + double precision ru1, fac1, fac2, t1,t2,t3 + double precision lhs__(5,0:2), lhsm__(5,0:2), lhsp__(5,0:2) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + if (timeron) call timer_start(t_ysolve) + +!DVM$ region local(lhs) +!DVM$ parallel (k,j,i) on rhs(*,i,j,k) +!DVM$& ,private(m,j1,j2,fac1,fac2,ru1,lhs__,lhsp__,lhsm__) +!DVM$& ,ACROSS(OUT:rhs(0:0,0:0,0:2,0:0), lhs(0:0,0:0,0:0,0:2,0:0)) +!DVM$& ,stage(stage_n) + do k = 1, nz2 + do j = 0, problem_size-1 + do i = 1, nx2 + if (j .eq. 0) then + lhs__(1,0) = 0.0d0 + lhsp__(1,0) = 0.0d0 + lhsm__(1,0) = 0.0d0 + + lhs__(2,0) = 0.0d0 + lhsp__(2,0) = 0.0d0 + lhsm__(2,0) = 0.0d0 + + lhs__(3,0) = 1.0d0 + lhsp__(3,0) = 1.0d0 + lhsm__(3,0) = 1.0d0 + + lhs__(4,0) = 0.0d0 + lhsp__(4,0) = 0.0d0 + lhsm__(4,0) = 0.0d0 + + lhs__(5,0) = 0.0d0 + lhsp__(5,0) = 0.0d0 + lhsm__(5,0) = 0.0d0 + + lhs__(1,1) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,i,j,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(2,1) = - dtty2 * + > u(3,i,0,k) * (1.0d0/u(1,i,j,k))- dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j+1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(3,1) = 1.0d0 + c2dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j+2,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(4,1) = dtty2 * + > u(3,i,2,k) * (1.0d0/u(1,i,j+2,k)) - dtty1 * ru1 + lhs__(5,1) = 0.0d0 + + lhs__(3,1) = lhs__(3,1) + comz5 + lhs__(4,1) = lhs__(4,1) - comz4 + lhs__(5,1) = lhs__(5,1) + comz1 + + lhsp__(1,1) = lhs__(1,1) + lhsp__(2,1) = lhs__(2,1) - dtty2 * speed(i,j,k) + lhsp__(3,1) = lhs__(3,1) + lhsp__(4,1) = lhs__(4,1) + dtty2 * speed(i,j+2,k) + lhsp__(5,1) = lhs__(5,1) + lhsm__(1,1) = lhs__(1,1) + lhsm__(2,1) = lhs__(2,1) + dtty2 * speed(i,j,k) + lhsm__(3,1) = lhs__(3,1) + lhsm__(4,1) = lhs__(4,1) - dtty2 * speed(i,j+2,k) + lhsm__(5,1) = lhs__(5,1) + else + do m = 1, 5 + lhs__(m,0) = lhs(0,m,i,j,k) + lhsp__(m,0) = lhs(1,m,i,j,k) + lhsm__(m,0) = lhs(2,m,i,j,k) + + lhs__(m,1) = lhs(0,m,i,j+1,k) + lhsp__(m,1) = lhs(1,m,i,j+1,k) + lhsm__(m,1) = lhs(2,m,i,j+1,k) + enddo + endif + + if(j + 2 .lt. ny2 + 1) then + m = j + 2 + lhs__(1,2) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,i,m-1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(2,2) = - dtty2 * + > u(3,i,m-1,k) * (1.0d0/u(1,i,m-1,k)) - dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,m,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(3,2) = 1.0d0 + c2dtty1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,m+1,k) + ru1 = dmax1( dy3 + con43 * ru1, + > dy5 + c1c5*ru1, + > dymax + ru1, + > dy1) + lhs__(4,2) = dtty2 * + > u(3,i,m+1,k) * (1.0d0/u(1,i,m+1,k)) - dtty1 * ru1 + lhs__(5,2) = 0.0d0 + + if(m .eq. 1) then + lhs__(3,2) = lhs__(3,2) + comz5 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. 2) then + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .ge. 3 .and. m .le. ny2-2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. ny2-1) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + else if(m .eq. ny2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz5 + endif + + lhsp__(1,2) = lhs__(1,2) + lhsp__(2,2) = lhs__(2,2) - dtty2 * speed(i,m-1,k) + lhsp__(3,2) = lhs__(3,2) + lhsp__(4,2) = lhs__(4,2) + dtty2 * speed(i,m+1,k) + lhsp__(5,2) = lhs__(5,2) + lhsm__(1,2) = lhs__(1,2) + lhsm__(2,2) = lhs__(2,2) + dtty2 * speed(i,m-1,k) + lhsm__(3,2) = lhs__(3,2) + lhsm__(4,2) = lhs__(4,2) - dtty2 * speed(i,m+1,k) + lhsm__(5,2) = lhs__(5,2) + else if(j + 2 .eq. ny2+1) then + + lhs__(1,2) = 0.0d0 + lhsp__(1,2) = 0.0d0 + lhsm__(1,2) = 0.0d0 + + lhs__(2,2) = 0.0d0 + lhsp__(2,2) = 0.0d0 + lhsm__(2,2) = 0.0d0 + + lhs__(3,2) = 1.0d0 + lhsp__(3,2) = 1.0d0 + lhsm__(3,2) = 1.0d0 + + lhs__(4,2) = 0.0d0 + lhsp__(4,2) = 0.0d0 + lhsm__(4,2) = 0.0d0 + + lhs__(5,2) = 0.0d0 + lhsp__(5,2) = 0.0d0 + lhsm__(5,2) = 0.0d0 + + endif +!********************************** end of init + + j1 = j + 1 + j2 = j + 2 + fac1 = 1.d0/lhs__(3,0) + lhs__(4,0) = fac1*lhs__(4,0) + lhs__(5,0) = fac1*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + end do + + if(j .le. ny2-1) then + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + lhs__(2,2)=lhs__(2,2)-lhs__(1,2)*lhs__(4,0) + lhs__(3,2)=lhs__(3,2)-lhs__(1,2)*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j1,k)=rhs(m,i,j1,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j2,k)=rhs(m,i,j2,k)-lhs__(1,2)*rhs(m,i,j,k) + end do + + else + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + if (lhs__(3,1) .ne. 0) then + fac2 = 1.d0/lhs__(3,1) + else + fac2 = 0 + endif + do m = 1, 3 + rhs(m,i,j1,k) = rhs(m,i,j1,k)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j1,k) = fac2*rhs(m,i,j1,k) + end do + endif + + m = 4 + fac1 = 1.d0/lhsp__(3,0) + lhsp__(4,0) = fac1*lhsp__(4,0) + lhsp__(5,0) = fac1*lhsp__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsp__(3,1)=lhsp__(3,1)-lhsp__(2,1)*lhsp__(4,0) + lhsp__(4,1)=lhsp__(4,1)-lhsp__(2,1)*lhsp__(5,0) + rhs(m,i,j1,k) = rhs(m,i,j1,k)-lhsp__(2,1)*rhs(m,i,j,k) + if(j .lt. ny2) then + lhsp__(2,2)=lhsp__(2,2)-lhsp__(1,2)*lhsp__(4,0) + lhsp__(3,2)=lhsp__(3,2)-lhsp__(1,2)*lhsp__(5,0) + rhs(m,i,j2,k)=rhs(m,i,j2,k)-lhsp__(1,2)*rhs(m,i,j,k) + endif + m = 5 + fac1 = 1.d0/lhsm__(3,0) + lhsm__(4,0) = fac1*lhsm__(4,0) + lhsm__(5,0) = fac1*lhsm__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsm__(3,1)=lhsm__(3,1)-lhsm__(2,1)*lhsm__(4,0) + lhsm__(4,1)=lhsm__(4,1)-lhsm__(2,1)*lhsm__(5,0) + rhs(m,i,j1,k)=rhs(m,i,j1,k) -lhsm__(2,1)*rhs(m,i,j,k) + if(j .lt. ny2) then + lhsm__(2,2)=lhsm__(2,2)-lhsm__(1,2)*lhsm__(4,0) + lhsm__(3,2)=lhsm__(3,2)-lhsm__(1,2)*lhsm__(5,0) + rhs(m,i,j2,k)=rhs(m,i,j2,k) -lhsm__(1,2)*rhs(m,i,j,k) + endif + + if(j .eq. ny2) then + rhs(4,i,j1,k) = rhs(4,i,j1,k)/lhsp__(3,1) + rhs(5,i,j1,k) = rhs(5,i,j1,k)/lhsm__(3,1) + do m = 1, 3 + rhs(m,i,j,k) = rhs(m,i,j,k)-lhs__(4,0)*rhs(m,i,j1,k) + end do + rhs(4,i,j,k) = rhs(4,i,j,k)-lhsp__(4,0)*rhs(4,i,j1,k) + rhs(5,i,j,k) = rhs(5,i,j,k)-lhsm__(4,0)*rhs(5,i,j1,k) + endif + + do m = 1,5 + lhs(0,m,i,j,k) = lhs__(m,0) + lhs(1,m,i,j,k) = lhsp__(m,0) + lhs(2,m,i,j,k) = lhsm__(m,0) + + lhs(0,m,i,j+1,k) = lhs__(m,1) + lhs(1,m,i,j+1,k) = lhsp__(m,1) + lhs(2,m,i,j+1,k) = lhsm__(m,1) + if (j .lt. ny2) then + lhs(0,m,i,j+2,k) = lhs__(m,2) + lhs(1,m,i,j+2,k) = lhsp__(m,2) + lhs(2,m,i,j+2,k) = lhsm__(m,2) + endif + enddo + enddo + enddo + enddo + +!DVM$ parallel (k,j,i) on rhs(*,i,j,k),ACROSS(rhs(0:0,0:0,0:2,0:0)) +!DVM$& ,stage(stage_n) + do k = 1, nz2 + do j = problem_size-3, 0, -1 + do i = 1, nx2 + rhs(1,i,j,k) = rhs(1,i,j,k) - + & lhs(0,4,i,j,k)*rhs(1,i,j+1,k) - + & lhs(0,5,i,j,k)*rhs(1,i,j+2,k) + rhs(2,i,j,k) = rhs(2,i,j,k) - + & lhs(0,4,i,j,k)*rhs(2,i,j+1,k) - + & lhs(0,5,i,j,k)*rhs(2,i,j+2,k) + rhs(3,i,j,k) = rhs(3,i,j,k) - + & lhs(0,4,i,j,k)*rhs(3,i,j+1,k) - + & lhs(0,5,i,j,k)*rhs(3,i,j+2,k) + + rhs(4,i,j,k) = rhs(4,i,j,k) - + & lhs(1,4,i,j,k)*rhs(4,i,j+1,k) - + & lhs(1,5,i,j,k)*rhs(4,i,j+2,k) + rhs(5,i,j,k) = rhs(5,i,j,k) - + & lhs(2,4,i,j,k)*rhs(5,i,j+1,k) - + & lhs(2,5,i,j,k)*rhs(5,i,j+2,k) + enddo + enddo + enddo + +!DVM$ parallel (k,j,i) on rhs(*,i,j,k),PRIVATE(t1,t2,t3) + do k = 1, nz2 + do j = 1, ny2 + do i = 1, nx2 + t1 = bt * rhs(1,i,j,k) + t2 = 0.5d0 * (rhs(4,i,j,k) + rhs(5,i,j,k)) + t3 = rhs(2,i,j,k) + + rhs(1,i,j,k) = bt * (rhs(4,i,j,k) - rhs(5,i,j,k)) + rhs(2,i,j,k) = -rhs(3,i,j,k) + rhs(3,i,j,k) = t3 + rhs(4,i,j,k) = -t1 + t2 + rhs(5,i,j,k) = t1 + t2 + enddo + enddo + enddo + +!DVM$ end region + if (timeron) call timer_stop(t_ysolve) + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/z_solve.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/z_solve.for new file mode 100644 index 0000000..d4df857 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/z_solve.for @@ -0,0 +1,433 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function performs the solution of the approximate factorization +c step in the z-direction for all five matrix components +c simultaneously. The Thomas algorithm is employed to solve the +c systems for the z-lines. Boundary conditions are non-periodic +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, k1, k2, m, m1 + double precision ru1, fac1, fac2, rhs__(5,0:2) + double precision lhs__(5,0:2), lhsm__(5,0:2), lhsp__(5,0:2) + double precision t1,t2,t3,ac,xvel,yvel,zvel,btuz,ac2u,uzik1 + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Prepare for z-solve, array redistribution +c--------------------------------------------------------------------- + + if (timeron) call timer_start(t_zsolve) + +!DVM$ region local(lhs) +!DVM$ parallel (j,i) on u(*,i,j,*) +!DVM$& , CUDA_BLOCK(32,4) +!DVM$& ,private(m,k1,k2,ru1,fac1,fac2,k,lhs__,lhsp__,lhsm__,rhs__, +!DVM$& t1,t2,t3,ac,xvel,yvel,zvel,btuz,ac2u,uzik1) + do j = 1, ny2 + do i = 1, nx2 + + lhs__(1,0) = 0.0d0 + lhsp__(1,0) = 0.0d0 + lhsm__(1,0) = 0.0d0 + + lhs__(2,0) = 0.0d0 + lhsp__(2,0) = 0.0d0 + lhsm__(2,0) = 0.0d0 + + lhs__(3,0) = 1.0d0 + lhsp__(3,0) = 1.0d0 + lhsm__(3,0) = 1.0d0 + + lhs__(4,0) = 0.0d0 + lhsp__(4,0) = 0.0d0 + lhsm__(4,0) = 0.0d0 + + lhs__(5,0) = 0.0d0 + lhsp__(5,0) = 0.0d0 + lhsm__(5,0) = 0.0d0 + + + lhs__(1,1) = 0.0d0 + ru1 = c3c4*1.0d0/u(1,i,j,0) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(2,1) = - dttz2 * ws(i,j,0) - dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,1) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(3,1) = 1.0d0 + c2dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,2) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(4,1) = dttz2 * ws(i,j,2) - dttz1 * ru1 + lhs__(5,1) = 0.0d0 + + lhs__(3,1) = lhs__(3,1) + comz5 + lhs__(4,1) = lhs__(4,1) - comz4 + lhs__(5,1) = lhs__(5,1) + comz1 + + lhsp__(1,1) = lhs__(1,1) + lhsp__(2,1) = lhs__(2,1) - dttz2 * speed(i,j,1-1) + lhsp__(3,1) = lhs__(3,1) + lhsp__(4,1) = lhs__(4,1) + dttz2 * speed(i,j,1+1) + lhsp__(5,1) = lhs__(5,1) + lhsm__(1,1) = lhs__(1,1) + lhsm__(2,1) = lhs__(2,1) + dttz2 * speed(i,j,1-1) + lhsm__(3,1) = lhs__(3,1) + lhsm__(4,1) = lhs__(4,1) - dttz2 * speed(i,j,1+1) + lhsm__(5,1) = lhs__(5,1) + + do k = 0, nz2+1 + if(k + 2 .lt. nz2 + 1) then + m = k + 2 + lhs__(1,2) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,i,j,m-1) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(2,2) = - dttz2 * ws(i,j,m-1) - dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,m) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(3,2) = 1.0d0 + c2dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,m+1) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(4,2) = dttz2 * ws(i,j,m+1) - dttz1 * ru1 + lhs__(5,2) = 0.0d0 + + if(m .eq. 1) then + lhs__(3,2) = lhs__(3,2) + comz5 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. 2) then + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .ge. 3 .and. m .le. nz2-2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. nz2-1) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + else if(m .eq. nz2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz5 + endif + + lhsp__(1,2) = lhs__(1,2) + lhsp__(2,2) = lhs__(2,2) - dttz2 * speed(i,j,m-1) + lhsp__(3,2) = lhs__(3,2) + lhsp__(4,2) = lhs__(4,2) + dttz2 * speed(i,j,m+1) + lhsp__(5,2) = lhs__(5,2) + lhsm__(1,2) = lhs__(1,2) + lhsm__(2,2) = lhs__(2,2) + dttz2 * speed(i,j,m-1) + lhsm__(3,2) = lhs__(3,2) + lhsm__(4,2) = lhs__(4,2) - dttz2 * speed(i,j,m+1) + lhsm__(5,2) = lhs__(5,2) + else if(k + 2 .eq. nz2+1) then + + lhs__(1,2) = 0.0d0 + lhsp__(1,2) = 0.0d0 + lhsm__(1,2) = 0.0d0 + + lhs__(2,2) = 0.0d0 + lhsp__(2,2) = 0.0d0 + lhsm__(2,2) = 0.0d0 + + lhs__(3,2) = 1.0d0 + lhsp__(3,2) = 1.0d0 + lhsm__(3,2) = 1.0d0 + + lhs__(4,2) = 0.0d0 + lhsp__(4,2) = 0.0d0 + lhsm__(4,2) = 0.0d0 + + lhs__(5,2) = 0.0d0 + lhsp__(5,2) = 0.0d0 + lhsm__(5,2) = 0.0d0 + + endif +!********************************** end of init + + k1 = k + 1 + k2 = k + 2 + fac1 = 1.d0/lhs__(3,0) + lhs__(4,0) = fac1*lhs__(4,0) + lhs__(5,0) = fac1*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + end do + + if(k .le. nz2-1) then + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + lhs__(2,2)=lhs__(2,2)-lhs__(1,2)*lhs__(4,0) + lhs__(3,2)=lhs__(3,2)-lhs__(1,2)*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k1)=rhs(m,i,j,k1)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j,k2)=rhs(m,i,j,k2)-lhs__(1,2)*rhs(m,i,j,k) + end do + + else + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + fac2 = 1.d0/lhs__(3,1) + do m = 1, 3 + rhs(m,i,j,k1) = rhs(m,i,j,k1)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j,k1) = fac2*rhs(m,i,j,k1) + end do + endif + + m = 4 + fac1 = 1.d0/lhsp__(3,0) + lhsp__(4,0) = fac1*lhsp__(4,0) + lhsp__(5,0) = fac1*lhsp__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsp__(3,1)=lhsp__(3,1)-lhsp__(2,1)*lhsp__(4,0) + lhsp__(4,1)=lhsp__(4,1)-lhsp__(2,1)*lhsp__(5,0) + rhs(m,i,j,k1) = rhs(m,i,j,k1)-lhsp__(2,1)*rhs(m,i,j,k) + if(k .lt. nz2) then + lhsp__(2,2)=lhsp__(2,2)-lhsp__(1,2)*lhsp__(4,0) + lhsp__(3,2)=lhsp__(3,2)-lhsp__(1,2)*lhsp__(5,0) + rhs(m,i,j,k2)=rhs(m,i,j,k2)-lhsp__(1,2)*rhs(m,i,j,k) + endif + m = 5 + fac1 = 1.d0/lhsm__(3,0) + lhsm__(4,0) = fac1*lhsm__(4,0) + lhsm__(5,0) = fac1*lhsm__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsm__(3,1)=lhsm__(3,1)-lhsm__(2,1)*lhsm__(4,0) + lhsm__(4,1)=lhsm__(4,1)-lhsm__(2,1)*lhsm__(5,0) + rhs(m,i,j,k1)=rhs(m,i,j,k1) -lhsm__(2,1)*rhs(m,i,j,k) + if(k .lt. nz2) then + lhsm__(2,2)=lhsm__(2,2)-lhsm__(1,2)*lhsm__(4,0) + lhsm__(3,2)=lhsm__(3,2)-lhsm__(1,2)*lhsm__(5,0) + rhs(m,i,j,k2)=rhs(m,i,j,k2) -lhsm__(1,2)*rhs(m,i,j,k) + endif + + if(k .eq. nz2) then + rhs(4,i,j,k1) = rhs(4,i,j,k1)/lhsp__(3,1) + rhs(5,i,j,k1) = rhs(5,i,j,k1)/lhsm__(3,1) + do m = 1, 3 + rhs(m,i,j,k) = rhs(m,i,j,k)-lhs__(4,0)*rhs(m,i,j,k1) + end do + rhs(4,i,j,k) = rhs(4,i,j,k)-lhsp__(4,0)*rhs(4,i,j,k1) + rhs(5,i,j,k) = rhs(5,i,j,k)-lhsm__(4,0)*rhs(5,i,j,k1) + endif + lhs(0,4,i,j,k) = lhs__(4,0) + lhs(1,4,i,j,k) = lhsp__(4,0) + lhs(2,4,i,j,k) = lhsm__(4,0) + + lhs(0,5,i,j,k) = lhs__(5,0) + lhs(1,5,i,j,k) = lhsp__(5,0) + lhs(2,5,i,j,k) = lhsm__(5,0) + + lhs__(1,0) = lhs__(1,1) + lhsp__(1,0) = lhsp__(1,1) + lhsm__(1,0) = lhsm__(1,1) + lhs__(1,1) = lhs__(1,2) + lhsp__(1,1) = lhsp__(1,2) + lhsm__(1,1) = lhsm__(1,2) + + lhs__(2,0) = lhs__(2,1) + lhsp__(2,0) = lhsp__(2,1) + lhsm__(2,0) = lhsm__(2,1) + lhs__(2,1) = lhs__(2,2) + lhsp__(2,1) = lhsp__(2,2) + lhsm__(2,1) = lhsm__(2,2) + + lhs__(3,0) = lhs__(3,1) + lhsp__(3,0) = lhsp__(3,1) + lhsm__(3,0) = lhsm__(3,1) + lhs__(3,1) = lhs__(3,2) + lhsp__(3,1) = lhsp__(3,2) + lhsm__(3,1) = lhsm__(3,2) + + lhs__(4,0) = lhs__(4,1) + lhsp__(4,0) = lhsp__(4,1) + lhsm__(4,0) = lhsm__(4,1) + lhs__(4,1) = lhs__(4,2) + lhsp__(4,1) = lhsp__(4,2) + lhsm__(4,1) = lhsm__(4,2) + + lhs__(5,0) = lhs__(5,1) + lhsp__(5,0) = lhsp__(5,1) + lhsm__(5,0) = lhsm__(5,1) + lhs__(5,1) = lhs__(5,2) + lhsp__(5,1) = lhsp__(5,2) + lhsm__(5,1) = lhsm__(5,2) + enddo + + + k = problem_size-3 + rhs__(1,2) = rhs(1,i,j,k+2) + rhs__(2,2) = rhs(2,i,j,k+2) + rhs__(3,2) = rhs(3,i,j,k+2) + rhs__(4,2) = rhs(4,i,j,k+2) + rhs__(5,2) = rhs(5,i,j,k+2) + + rhs__(1,1) = rhs(1,i,j,k+1) + rhs__(2,1) = rhs(2,i,j,k+1) + rhs__(3,1) = rhs(3,i,j,k+1) + rhs__(4,1) = rhs(4,i,j,k+1) + rhs__(5,1) = rhs(5,i,j,k+1) + + rhs__(1,0) = rhs(1,i,j,k) + rhs__(2,0) = rhs(2,i,j,k) + rhs__(3,0) = rhs(3,i,j,k) + rhs__(4,0) = rhs(4,i,j,k) + rhs__(5,0) = rhs(5,i,j,k) + + rhs__(1,0) = rhs__(1,0) - + > lhs(0,4,i,j,k)*rhs__(1,1) - + > lhs(0,5,i,j,k)*rhs__(1,2) + rhs__(2,0) = rhs__(2,0) - + > lhs(0,4,i,j,k)*rhs__(2,1) - + > lhs(0,5,i,j,k)*rhs__(2,2) + rhs__(3,0) = rhs__(3,0) - + > lhs(0,4,i,j,k)*rhs__(3,1) - + > lhs(0,5,i,j,k)*rhs__(3,2) + + rhs__(4,0) = rhs__(4,0) - + > lhs(1,4,i,j,k)*rhs__(4,1) - + > lhs(1,5,i,j,k)*rhs__(4,2) + rhs__(5,0) = rhs__(5,0) - + > lhs(2,4,i,j,k)*rhs__(5,1) - + > lhs(2,5,i,j,k)*rhs__(5,2) + + rhs__(1,2) = rhs__(1,1) + rhs__(2,2) = rhs__(2,1) + rhs__(3,2) = rhs__(3,1) + rhs__(4,2) = rhs__(4,1) + rhs__(5,2) = rhs__(5,1) + + rhs__(1,1) = rhs__(1,0) + rhs__(2,1) = rhs__(2,0) + rhs__(3,1) = rhs__(3,0) + rhs__(4,1) = rhs__(4,0) + rhs__(5,1) = rhs__(5,0) + + do k = problem_size-4, 0, -1 + rhs__(1,0) = rhs(1,i,j,k) + rhs__(2,0) = rhs(2,i,j,k) + rhs__(3,0) = rhs(3,i,j,k) + rhs__(4,0) = rhs(4,i,j,k) + rhs__(5,0) = rhs(5,i,j,k) + + rhs__(1,0) = rhs__(1,0) - + > lhs(0,4,i,j,k)*rhs__(1,1) - + > lhs(0,5,i,j,k)*rhs__(1,2) + rhs__(2,0) = rhs__(2,0) - + > lhs(0,4,i,j,k)*rhs__(2,1) - + > lhs(0,5,i,j,k)*rhs__(2,2) + rhs__(3,0) = rhs__(3,0) - + > lhs(0,4,i,j,k)*rhs__(3,1) - + > lhs(0,5,i,j,k)*rhs__(3,2) + + rhs__(4,0) = rhs__(4,0) - + > lhs(1,4,i,j,k)*rhs__(4,1) - + > lhs(1,5,i,j,k)*rhs__(4,2) + rhs__(5,0) = rhs__(5,0) - + > lhs(2,4,i,j,k)*rhs__(5,1) - + > lhs(2,5,i,j,k)*rhs__(5,2) + + xvel = us(i,j,k+2) + yvel = vs(i,j,k+2) + zvel = ws(i,j,k+2) + ac = speed(i,j,k+2) + ac2u = ac*ac + uzik1 = u(1,i,j,k+2) + btuz = bt * uzik1 + t1 = btuz/ac * (rhs__(4,2) + rhs__(5,2)) + t2 = rhs__(3,2) + t1 + t3 = btuz * (rhs__(4,2) - rhs__(5,2)) + + rhs__(3,2) = uzik1*rhs__(1,2) + yvel*t2 + rhs__(4,2) = zvel*t2 + t3 + rhs__(5,2) = uzik1*(-xvel*rhs__(2,2) + + > yvel*rhs__(1,2)) + qs(i,j,k+2)*t2 + + > c2iv*ac2u*t1 + zvel*t3 + rhs__(1,2) = t2 + rhs__(2,2) = -uzik1*rhs__(2,2) + xvel*t2 + + u(1,i,j,k+2) = u(1,i,j,k+2) + rhs__(1,2) + u(2,i,j,k+2) = u(2,i,j,k+2) + rhs__(2,2) + u(3,i,j,k+2) = u(3,i,j,k+2) + rhs__(3,2) + u(4,i,j,k+2) = u(4,i,j,k+2) + rhs__(4,2) + u(5,i,j,k+2) = u(5,i,j,k+2) + rhs__(5,2) + + rhs__(1,2) = rhs__(1,1) + rhs__(2,2) = rhs__(2,1) + rhs__(3,2) = rhs__(3,1) + rhs__(4,2) = rhs__(4,1) + rhs__(5,2) = rhs__(5,1) + + rhs__(1,1) = rhs__(1,0) + rhs__(2,1) = rhs__(2,0) + rhs__(3,1) = rhs__(3,0) + rhs__(4,1) = rhs__(4,0) + rhs__(5,1) = rhs__(5,0) + end do + xvel = us(i,j,k+2) + yvel = vs(i,j,k+2) + zvel = ws(i,j,k+2) + ac = speed(i,j,k+2) + ac2u = ac*ac + uzik1 = u(1,i,j,k+2) + btuz = bt * uzik1 + t1 = btuz/ac * (rhs__(4,2) + rhs__(5,2)) + t2 = rhs__(3,2) + t1 + t3 = btuz * (rhs__(4,2) - rhs__(5,2)) + + rhs__(3,2) = uzik1*rhs__(1,2) + yvel*t2 + rhs__(4,2) = zvel*t2 + t3 + rhs__(5,2) = uzik1*(-xvel*rhs__(2,2) + + > yvel*rhs__(1,2)) + qs(i,j,k+2)*t2 + + > c2iv*ac2u*t1 + zvel*t3 + rhs__(1,2) = t2 + rhs__(2,2) = -uzik1*rhs__(2,2) + xvel*t2 + + u(1,i,j,k+2) = u(1,i,j,k+2) + rhs__(1,2) + u(2,i,j,k+2) = u(2,i,j,k+2) + rhs__(2,2) + u(3,i,j,k+2) = u(3,i,j,k+2) + rhs__(3,2) + u(4,i,j,k+2) = u(4,i,j,k+2) + rhs__(4,2) + u(5,i,j,k+2) = u(5,i,j,k+2) + rhs__(5,2) + enddo + enddo + +!DVM$ end region + if (timeron) call timer_stop(t_zsolve) + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/z_solve_mpi.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/z_solve_mpi.for new file mode 100644 index 0000000..7d45b66 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/SP/z_solve_mpi.for @@ -0,0 +1,338 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function performs the solution of the approximate factorization +c step in the z-direction for all five matrix components +c simultaneously. The Thomas algorithm is employed to solve the +c systems for the z-lines. Boundary conditions are non-periodic +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, k1, k2, m + double precision ru1, fac1, fac2 + double precision lhs__(5,0:2), lhsm__(5,0:2), lhsp__(5,0:2) + double precision t1,t2,t3,ac,xvel,yvel,zvel,btuz,ac2u,uzik1 + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Prepare for z-solve, array redistribution +c--------------------------------------------------------------------- + + if (timeron) call timer_start(t_zsolve) + +!DVM$ region local(lhs) + +!DVM$ parallel (k,j,i) on rhs(*,i,j,k) +!DVM$& ,private(m,k1,k2,ru1,fac1,fac2,k,lhs__,lhsp__,lhsm__) +!DVM$& ,ACROSS(OUT:rhs(0:0,0:0,0:0,0:2), lhs(0:0,0:0,0:0,0:0,0:2)) +!DVM$& ,stage(stage_n) + do k = 0, problem_size-1 + do j = 1, ny2 + do i = 1, nx2 + if (k .eq. 0) then + lhs__(1,0) = 0.0d0 + lhsp__(1,0) = 0.0d0 + lhsm__(1,0) = 0.0d0 + + lhs__(2,0) = 0.0d0 + lhsp__(2,0) = 0.0d0 + lhsm__(2,0) = 0.0d0 + + lhs__(3,0) = 1.0d0 + lhsp__(3,0) = 1.0d0 + lhsm__(3,0) = 1.0d0 + + lhs__(4,0) = 0.0d0 + lhsp__(4,0) = 0.0d0 + lhsm__(4,0) = 0.0d0 + + lhs__(5,0) = 0.0d0 + lhsp__(5,0) = 0.0d0 + lhsm__(5,0) = 0.0d0 + + + lhs__(1,1) = 0.0d0 + ru1 = c3c4*1.0d0/u(1,i,j,k) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(2,1) = - dttz2 * ws(i,j,k) - dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,k+1) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(3,1) = 1.0d0 + c2dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,k+2) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(4,1) = dttz2 * ws(i,j,k+2) - dttz1 * ru1 + lhs__(5,1) = 0.0d0 + + lhs__(3,1) = lhs__(3,1) + comz5 + lhs__(4,1) = lhs__(4,1) - comz4 + lhs__(5,1) = lhs__(5,1) + comz1 + + lhsp__(1,1) = lhs__(1,1) + lhsp__(2,1) = lhs__(2,1) - dttz2 * speed(i,j,k) + lhsp__(3,1) = lhs__(3,1) + lhsp__(4,1) = lhs__(4,1) + dttz2 * speed(i,j,k+2) + lhsp__(5,1) = lhs__(5,1) + lhsm__(1,1) = lhs__(1,1) + lhsm__(2,1) = lhs__(2,1) + dttz2 * speed(i,j,k) + lhsm__(3,1) = lhs__(3,1) + lhsm__(4,1) = lhs__(4,1) - dttz2 * speed(i,j,k+2) + lhsm__(5,1) = lhs__(5,1) + else + do m = 1, 5 + lhs__(m,0) = lhs(0,m,i,j,k) + lhsp__(m,0) = lhs(1,m,i,j,k) + lhsm__(m,0) = lhs(2,m,i,j,k) + + lhs__(m,1) = lhs(0,m,i,j,k+1) + lhsp__(m,1) = lhs(1,m,i,j,k+1) + lhsm__(m,1) = lhs(2,m,i,j,k+1) + enddo + endif + + if(k + 2 .lt. nz2 + 1) then + m = k + 2 + lhs__(1,2) = 0.0d0 + + ru1 = c3c4*1.0d0/u(1,i,j,m-1) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(2,2) = - dttz2 * ws(i,j,m-1) - dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,m) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(3,2) = 1.0d0 + c2dttz1 * ru1 + ru1 = c3c4*1.0d0/u(1,i,j,m+1) + ru1 = dmax1(dz4 + con43 * ru1, + > dz5 + c1c5 * ru1, + > dzmax + ru1, + > dz1) + lhs__(4,2) = dttz2 * ws(i,j,m+1) - dttz1 * ru1 + lhs__(5,2) = 0.0d0 + + if(m .eq. 1) then + lhs__(3,2) = lhs__(3,2) + comz5 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. 2) then + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .ge. 3 .and. m .le. nz2-2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + lhs__(5,2) = lhs__(5,2) + comz1 + else if(m .eq. nz2-1) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz6 + lhs__(4,2) = lhs__(4,2) - comz4 + else if(m .eq. nz2) then + lhs__(1,2) = lhs__(1,2) + comz1 + lhs__(2,2) = lhs__(2,2) - comz4 + lhs__(3,2) = lhs__(3,2) + comz5 + endif + + lhsp__(1,2) = lhs__(1,2) + lhsp__(2,2) = lhs__(2,2) - dttz2 * speed(i,j,m-1) + lhsp__(3,2) = lhs__(3,2) + lhsp__(4,2) = lhs__(4,2) + dttz2 * speed(i,j,m+1) + lhsp__(5,2) = lhs__(5,2) + lhsm__(1,2) = lhs__(1,2) + lhsm__(2,2) = lhs__(2,2) + dttz2 * speed(i,j,m-1) + lhsm__(3,2) = lhs__(3,2) + lhsm__(4,2) = lhs__(4,2) - dttz2 * speed(i,j,m+1) + lhsm__(5,2) = lhs__(5,2) + else if(k + 2 .eq. nz2+1) then + + lhs__(1,2) = 0.0d0 + lhsp__(1,2) = 0.0d0 + lhsm__(1,2) = 0.0d0 + + lhs__(2,2) = 0.0d0 + lhsp__(2,2) = 0.0d0 + lhsm__(2,2) = 0.0d0 + + lhs__(3,2) = 1.0d0 + lhsp__(3,2) = 1.0d0 + lhsm__(3,2) = 1.0d0 + + lhs__(4,2) = 0.0d0 + lhsp__(4,2) = 0.0d0 + lhsm__(4,2) = 0.0d0 + + lhs__(5,2) = 0.0d0 + lhsp__(5,2) = 0.0d0 + lhsm__(5,2) = 0.0d0 + + endif +!********************************** end of init + + k1 = k + 1 + k2 = k + 2 + fac1 = 1.d0/lhs__(3,0) + lhs__(4,0) = fac1*lhs__(4,0) + lhs__(5,0) = fac1*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + end do + + if(k .le. nz2-1) then + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + lhs__(2,2)=lhs__(2,2)-lhs__(1,2)*lhs__(4,0) + lhs__(3,2)=lhs__(3,2)-lhs__(1,2)*lhs__(5,0) + do m = 1, 3 + rhs(m,i,j,k1)=rhs(m,i,j,k1)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j,k2)=rhs(m,i,j,k2)-lhs__(1,2)*rhs(m,i,j,k) + end do + + else + lhs__(3,1)=lhs__(3,1)-lhs__(2,1)*lhs__(4,0) + lhs__(4,1)=lhs__(4,1)-lhs__(2,1)*lhs__(5,0) + if (lhs__(3,1) .ne. 0) then + fac2 = 1.d0/lhs__(3,1) + else + fac2 = 0 + endif + do m = 1, 3 + rhs(m,i,j,k1) = rhs(m,i,j,k1)-lhs__(2,1)*rhs(m,i,j,k) + rhs(m,i,j,k1) = fac2*rhs(m,i,j,k1) + end do + endif + + m = 4 + fac1 = 1.d0/lhsp__(3,0) + lhsp__(4,0) = fac1*lhsp__(4,0) + lhsp__(5,0) = fac1*lhsp__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsp__(3,1)=lhsp__(3,1)-lhsp__(2,1)*lhsp__(4,0) + lhsp__(4,1)=lhsp__(4,1)-lhsp__(2,1)*lhsp__(5,0) + rhs(m,i,j,k1) = rhs(m,i,j,k1)-lhsp__(2,1)*rhs(m,i,j,k) + if(k .lt. nz2) then + lhsp__(2,2)=lhsp__(2,2)-lhsp__(1,2)*lhsp__(4,0) + lhsp__(3,2)=lhsp__(3,2)-lhsp__(1,2)*lhsp__(5,0) + rhs(m,i,j,k2)=rhs(m,i,j,k2)-lhsp__(1,2)*rhs(m,i,j,k) + endif + m = 5 + fac1 = 1.d0/lhsm__(3,0) + lhsm__(4,0) = fac1*lhsm__(4,0) + lhsm__(5,0) = fac1*lhsm__(5,0) + rhs(m,i,j,k) = fac1*rhs(m,i,j,k) + lhsm__(3,1)=lhsm__(3,1)-lhsm__(2,1)*lhsm__(4,0) + lhsm__(4,1)=lhsm__(4,1)-lhsm__(2,1)*lhsm__(5,0) + rhs(m,i,j,k1)=rhs(m,i,j,k1) -lhsm__(2,1)*rhs(m,i,j,k) + if(k .lt. nz2) then + lhsm__(2,2)=lhsm__(2,2)-lhsm__(1,2)*lhsm__(4,0) + lhsm__(3,2)=lhsm__(3,2)-lhsm__(1,2)*lhsm__(5,0) + rhs(m,i,j,k2)=rhs(m,i,j,k2) -lhsm__(1,2)*rhs(m,i,j,k) + endif + + if(k .eq. nz2) then + rhs(4,i,j,k1) = rhs(4,i,j,k1)/lhsp__(3,1) + rhs(5,i,j,k1) = rhs(5,i,j,k1)/lhsm__(3,1) + do m = 1, 3 + rhs(m,i,j,k) = rhs(m,i,j,k)-lhs__(4,0)*rhs(m,i,j,k1) + end do + rhs(4,i,j,k) = rhs(4,i,j,k)-lhsp__(4,0)*rhs(4,i,j,k1) + rhs(5,i,j,k) = rhs(5,i,j,k)-lhsm__(4,0)*rhs(5,i,j,k1) + endif + + do m = 1,5 + lhs(0,m,i,j,k) = lhs__(m,0) + lhs(1,m,i,j,k) = lhsp__(m,0) + lhs(2,m,i,j,k) = lhsm__(m,0) + + lhs(0,m,i,j,k+1) = lhs__(m,1) + lhs(1,m,i,j,k+1) = lhsp__(m,1) + lhs(2,m,i,j,k+1) = lhsm__(m,1) + if (k .lt. nz2) then + lhs(0,m,i,j,k+2) = lhs__(m,2) + lhs(1,m,i,j,k+2) = lhsp__(m,2) + lhs(2,m,i,j,k+2) = lhsm__(m,2) + endif + enddo + enddo + enddo + enddo + +!DVM$ parallel (k,j,i) on rhs(*,i,j,k),ACROSS(rhs(0:0,0:0,0:0,0:2)) +!DVM$& ,stage(stage_n) + do k = problem_size-3, 0, -1 + do j = 1, ny2 + do i = 1, nx2 + rhs(1,i,j,k) = rhs(1,i,j,k) - + & lhs(0,4,i,j,k)*rhs(1,i,j,k+1) - + & lhs(0,5,i,j,k)*rhs(1,i,j,k+2) + rhs(2,i,j,k) = rhs(2,i,j,k) - + & lhs(0,4,i,j,k)*rhs(2,i,j,k+1) - + & lhs(0,5,i,j,k)*rhs(2,i,j,k+2) + rhs(3,i,j,k) = rhs(3,i,j,k) - + & lhs(0,4,i,j,k)*rhs(3,i,j,k+1) - + & lhs(0,5,i,j,k)*rhs(3,i,j,k+2) + + rhs(4,i,j,k) = rhs(4,i,j,k) - + & lhs(1,4,i,j,k)*rhs(4,i,j,k+1) - + & lhs(1,5,i,j,k)*rhs(4,i,j,k+2) + rhs(5,i,j,k) = rhs(5,i,j,k) - + & lhs(2,4,i,j,k)*rhs(5,i,j,k+1) - + & lhs(2,5,i,j,k)*rhs(5,i,j,k+2) + enddo + enddo + enddo + +!DVM$ parallel (k,j,i) on u(*,i,j,k) +!DVM$& ,private(t1,t2,t3,ac,xvel,yvel,zvel,btuz,ac2u,uzik1) + do k = 1, nz2 + do j = 1, ny2 + do i = 1, nx2 + xvel = us(i,j,k) + yvel = vs(i,j,k) + zvel = ws(i,j,k) + ac = speed(i,j,k) + ac2u = ac*ac + uzik1 = u(1,i,j,k) + btuz = bt * uzik1 + t1 = btuz/ac * (rhs(4,i,j,k) + rhs(5,i,j,k)) + t2 = rhs(3,i,j,k) + t1 + t3 = btuz * (rhs(4,i,j,k) - rhs(5,i,j,k)) + + u(1,i,j,k) = u(1,i,j,k) + t2 + u(2,i,j,k) = u(2,i,j,k)-uzik1*rhs(2,i,j,k)+xvel*t2 + u(3,i,j,k) = u(3,i,j,k)+uzik1*rhs(1,i,j,k)+yvel*t2 + u(4,i,j,k) = u(4,i,j,k)+ zvel*t2 + t3 + u(5,i,j,k) = u(5,i,j,k)+ uzik1*(-xvel*rhs(2,i,j,k) + + & yvel*rhs(1,i,j,k)) + qs(i,j,k)*t2 + + & c2iv*ac2u*t1 + zvel*t3 + enddo + enddo + enddo +!DVM$ end region + if (timeron) call timer_stop(t_zsolve) + + return + end \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/clear.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/clear.bat new file mode 100644 index 0000000..13594b8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/clear.bat @@ -0,0 +1,21 @@ +@echo off + +@set TESTS=bt sp lu mg ep cg ft +@set CLASSES=A B C + +if exist err.txt del err.txt +if exist bin rmdir /S /Q bin + +@for %%T in (%TESTS%) do ( + cd %%T + if exist comp.err del comp.err + if exist dvm.err del dvm.err + if exist *.f del *.f + if exist *.cu del *.cu + if exist *info.c del *info.c + @for %%C in (%CLASSES%) do ( + if exist err_%%C.txt del err_%%C.txt + if exist out_%%C.txt del out_%%C.txt + ) + cd ../ +) diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compile.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compile.bat new file mode 100644 index 0000000..65c6572 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compile.bat @@ -0,0 +1,13 @@ +@echo off + +@set TESTS=BT SP LU MG EP CG FT + +@CALL config\make.def.bat + +if not exist bin mkdir bin +cd sys +if not exist setparams.exe CALL %DVM% cc setparams +cd ../ +@for %%T in (%TESTS%) do ( + START compileTest.bat %%T +) \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compile.sh b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compile.sh new file mode 100644 index 0000000..4434f82 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compile.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +TESTS="BT SP LU MG EP CG FT" +CLASSES="A B C" + +compile_one() { + cd $1 + make CLASS=$2 + cd .. +} + +mkdir -p bin + +export FOPT="$*" +for tn in $TESTS; do + for cn in $CLASSES; do + compile_one $tn $cn + done +done + +exit 0 diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compileTest.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compileTest.bat new file mode 100644 index 0000000..5db07de --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/compileTest.bat @@ -0,0 +1,10 @@ +@echo off +@set CLASSES=A B C +@set Test=%1 + @for %%C in (%CLASSES%) do ( + cd %Test% + echo ### compiling test %Test%, class %%C. + CALL make.bat %%C + cd ../ + ) +exit \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/config/make.def b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/config/make.def new file mode 100644 index 0000000..905457b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/config/make.def @@ -0,0 +1,8 @@ +F77 = dvm f -shared-dvm +FLINK = dvm flink -shared-dvm + +FFLAGS = ${FOPT} + +UCC = cc + +BINDIR = ../bin diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/config/make.def.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/config/make.def.bat new file mode 100644 index 0000000..15c8592 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/config/make.def.bat @@ -0,0 +1,8 @@ +rem @echo off +rem ### SET DVM PATH### +set DVMDIR= + +set DVM=%DVMDIR%\dvm +set F77=%DVMDIR%\dvm f +set RUN=%DVMDIR%\dvm run +set BIN=..\bin \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/run.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/run.bat new file mode 100644 index 0000000..137802c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/run.bat @@ -0,0 +1,15 @@ +@echo off + +@set TESTS=bt sp lu mg ep cg ft +@set CLASSES=A B C + +@CALL config\make.def.bat + +if exist res.txt del res.txt +cd bin +@for %%T in (%TESTS%) do ( + @for %%C in (%CLASSES%) do ( + CALL %RUN% %%T.%%C.x.exe 1>>..\res.txt 2>>..\err.txt + ) +) +cd ../ \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/run.sh b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/run.sh new file mode 100644 index 0000000..e820404 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/run.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +TESTS="bt sp lu mg ep cg ft" +CLASSES="A B C" + +ALL_OK=1 + +run_one() { + if [ -f "$1" ]; then + dvm run $PROC_GRID $1 + ALL_OK=$(( ALL_OK && $? == 0 )) + else + ALL_OK=0 + fi +} + +cd bin + +for tn in $TESTS; do + for cn in $CLASSES; do + run_one $tn.$cn.x + done +done + +if [ $ALL_OK -ne 0 ]; then + echo " END OF NPB Benchmarks" +fi + +exit 0 diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/Makefile new file mode 100644 index 0000000..9fd8e5f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/Makefile @@ -0,0 +1,14 @@ +include ../config/make.def + +all: setparams + +# setparams creates an npbparam.h file for each benchmark +# configuration. npbparams.h also contains info about how a benchmark +# was compiled and linked + +setparams: setparams.c ../config/make.def + $(UCC) -o setparams setparams.c + +clean: + -rm -f setparams setparams.h npbparams.h + -rm -f *~ *.o diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/make.common b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/make.common new file mode 100644 index 0000000..959951d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/make.common @@ -0,0 +1,31 @@ +PROGRAM = $(BINDIR)/$(BENCHMARK).$(CLASS).x + +# Class "U" is used internally by the setparams program to mean +# "unknown". This means that if you don't specify CLASS= +# on the command line, you'll get an error. It would be nice +# to be able to avoid this, but we'd have to get information +# from the setparams back to the make program, which isn't easy. +CLASS=U + +default:: ${PROGRAM} + +# This makes sure the configuration utility setparams +# is up to date. +# Note that this must be run every time, which is why the +# target does not exist and is not created. +# If you create a file called "config" you will break things. +config: + @cd ../sys; ${MAKE} all + ../sys/setparams ${BENCHMARK} ${CLASS} + +# Normally setparams updates npbparams.h only if the settings (CLASS) +# have changed. However, we also want to update if the compile options +# may have changed (set in ../config/make.def). +npbparams.h: ../config/make.def + @ echo make.def modified. Rebuilding npbparams.h just in case + rm -f npbparams.h + ../sys/setparams ${BENCHMARK} ${CLASS} + +# So that "make benchmark-name" works +${BENCHMARK}: default +${BENCHMARKU}: default diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/setparams.c b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/setparams.c new file mode 100644 index 0000000..258b845 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/FDVMH.fdv/sys/setparams.c @@ -0,0 +1,1053 @@ +/* + * This utility configures a NPB to be built for a specific class. + * It creates a file "npbparams.h" + * in the source directory. This file keeps state information about + * which size of benchmark is currently being built (so that nothing + * if unnecessarily rebuilt) and defines (through PARAMETER statements) + * the number of nodes and class for which a benchmark is being built. + + * The utility takes 3 arguments: + * setparams benchmark-name class + * benchmark-name is "sp", "bt", etc + * class is the size of the benchmark + * These parameters are checked for the current benchmark. If they + * are invalid, this program prints a message and aborts. + * If the parameters are ok, the current npbsize.h (actually just + * the first line) is read in. If the new parameters are the same as + * the old, nothing is done, but an exit code is returned to force the + * user to specify (otherwise the make procedure succeeds but builds a + * binary of the wrong name). Otherwise the file is rewritten. + * Errors write a message (to stdout) and abort. + * + * This program makes use of two extra benchmark "classes" + * class "X" means an invalid specification. It is returned if + * there is an error parsing the config file. + * class "U" is an external specification meaning "unknown class" + * + * Unfortunately everything has to be case sensitive. This is + * because we can always convert lower to upper or v.v. but + * can't feed this information back to the makefile, so typing + * make CLASS=a and make CLASS=A will produce different binaries. + * + * + */ + +#include +#include +#include +#include +#include +#include + +/* + * This is the master version number for this set of + * NPB benchmarks. It is in an obscure place so people + * won't accidentally change it. + */ + +#define VERSION "3.3.1" + +/* controls verbose output from setparams */ +/* #define VERBOSE */ + +#define FILENAME "npbparams.h" +#define DESC_LINE "! CLASS = %c\n" +#define DEF_CLASS_LINE "#define CLASS '%c'\n" +#define FINDENT " " +#define CONTINUE " > " + +void get_info(char *argv[], int *typep, char *classp); +void check_info(int type, char class); +void read_info(int type, char *classp); +void write_info(int type, char class); +void write_sp_info(FILE *fp, char class); +void write_bt_info(FILE *fp, char class); +void write_lu_info(FILE *fp, char class); +void write_mg_info(FILE *fp, char class); +void write_cg_info(FILE *fp, char class); +void write_ft_info(FILE *fp, char class); +void write_ep_info(FILE *fp, char class); +void write_dc_info(FILE *fp, char class); +void write_is_info(FILE *fp, char class); +void write_ua_info(FILE *fp, char class); +void write_compiler_info(int type, FILE *fp); +void write_convertdouble_info(int type, FILE *fp); +void check_line(char *line, char *label, char *val); +int check_include_line(char *line, char *filename); +void put_string(FILE *fp, char *name, char *val); +void put_def_string(FILE *fp, char *name, char *val); +void put_def_variable(FILE *fp, char *name, char *val); +int ilog2(int i); +double power(double base, int i); + +enum benchmark_types {SP, BT, LU, MG, FT, IS, EP, CG, UA, DC}; + +int main(int argc, char *argv[]) +{ + int type; + char class, class_old; + + if (argc != 3) { + printf("Usage: %s benchmark-name class\n", argv[0]); + exit(1); + } + + /* Get command line arguments. Make sure they're ok. */ + get_info(argv, &type, &class); + if (class != 'U') { +#ifdef VERBOSE + printf("setparams: For benchmark %s: class = %c\n", + argv[1], class); +#endif + check_info(type, class); + } + + /* Get old information. */ + read_info(type, &class_old); + if (class != 'U') { + if (class_old != 'X') { +#ifdef VERBOSE + printf("setparams: old settings: class = %c\n", + class_old); +#endif + } + } else { + printf("setparams:\n\ + *********************************************************************\n\ + * You must specify CLASS to build this benchmark *\n\ + * For example, to build a class A benchmark, type *\n\ + * make {benchmark-name} CLASS=A *\n\ + *********************************************************************\n\n"); + + if (class_old != 'X') { +#ifdef VERBOSE + printf("setparams: Previous settings were CLASS=%c \n", class_old); +#endif + } + exit(1); /* exit on class==U */ + } + + /* Write out new information if it's different. */ + if (class != class_old) { +#ifdef VERBOSE + printf("setparams: Writing %s\n", FILENAME); +#endif + write_info(type, class); + } else { +#ifdef VERBOSE + printf("setparams: Settings unchanged. %s unmodified\n", FILENAME); +#endif + } + + return 0; +} + + +/* + * get_info(): Get parameters from command line + */ + +void get_info(char *argv[], int *typep, char *classp) +{ + + *classp = *argv[2]; + + if (!strcmp(argv[1], "sp") || !strcmp(argv[1], "SP")) *typep = SP; + else if (!strcmp(argv[1], "bt") || !strcmp(argv[1], "BT")) *typep = BT; + else if (!strcmp(argv[1], "ft") || !strcmp(argv[1], "FT")) *typep = FT; + else if (!strcmp(argv[1], "lu") || !strcmp(argv[1], "LU")) *typep = LU; + else if (!strcmp(argv[1], "mg") || !strcmp(argv[1], "MG")) *typep = MG; + else if (!strcmp(argv[1], "is") || !strcmp(argv[1], "IS")) *typep = IS; + else if (!strcmp(argv[1], "ep") || !strcmp(argv[1], "EP")) *typep = EP; + else if (!strcmp(argv[1], "cg") || !strcmp(argv[1], "CG")) *typep = CG; + else if (!strcmp(argv[1], "ua") || !strcmp(argv[1], "UA")) *typep = UA; + else if (!strcmp(argv[1], "dc") || !strcmp(argv[1], "DC")) *typep = DC; + else { + printf("setparams: Error: unknown benchmark type %s\n", argv[1]); + exit(1); + } +} + +/* + * check_info(): Make sure command line data is ok for this benchmark + */ + +void check_info(int type, char class) +{ + + /* check class */ + if (class != 'S' && + class != 'W' && + class != 'A' && + class != 'B' && + class != 'C' && + class != 'D' && + class != 'E') { + printf("setparams: Unknown benchmark class %c\n", class); + printf("setparams: Allowed classes are \"S\", \"W\", and \"A\" through \"E\"\n"); + exit(1); + } + + if (class == 'E' && (type == IS || type == UA || type == DC)) { + printf("setparams: Benchmark class %c not defined for IS, UA, or DC\n", class); + exit(1); + } + if ((class == 'C' || class == 'D') && type == DC) { + printf("setparams: Benchmark class %c not defined for DC\n", class); + exit(1); + } + +} + + +/* + * read_info(): Read previous information from file. + * Not an error if file doesn't exist, because this + * may be the first time we're running. + * Assumes the first line of the file is in a special + * format that we understand (since we wrote it). + */ + +void read_info(int type, char *classp) +{ + int nread; + FILE *fp; + fp = fopen(FILENAME, "r"); + if (fp == NULL) { +#ifdef VERBOSE + printf("setparams: INFO: configuration file %s does not exist (yet)\n", FILENAME); +#endif + goto abort; + } + + /* first line of file contains info (fortran), first two lines (C) */ + + switch(type) { + case SP: + case BT: + case FT: + case MG: + case LU: + case EP: + case CG: + case UA: + nread = fscanf(fp, DESC_LINE, classp); + if (nread != 1) { + printf("setparams: Error parsing config file %s. Ignoring previous settings\n", FILENAME); + goto abort; + } + break; + case IS: + case DC: + nread = fscanf(fp, DEF_CLASS_LINE, classp); + if (nread != 1) { + printf("setparams: Error parsing config file %s. Ignoring previous settings\n", FILENAME); + goto abort; + } + break; + default: + /* never should have gotten this far with a bad name */ + printf("setparams: (Internal Error) Benchmark type %d unknown to this program\n", type); + exit(1); + } + + fclose(fp); + + + return; + + abort: + *classp = 'X'; + return; +} + + +/* + * write_info(): Write new information to config file. + * First line is in a special format so we can read + * it in again. Then comes a warning. The rest is all + * specific to a particular benchmark. + */ + +void write_info(int type, char class) +{ + FILE *fp; + fp = fopen(FILENAME, "w"); + if (fp == NULL) { + printf("setparams: Can't open file %s for writing\n", FILENAME); + exit(1); + } + + switch(type) { + case SP: + case BT: + case FT: + case MG: + case LU: + case EP: + case CG: + case UA: + /* Write out the header */ + fprintf(fp, DESC_LINE, class); + /* Print out a warning so bozos don't mess with the file */ + fprintf(fp, "\ +! \n\ +! \n\ +! This file is generated automatically by the setparams utility.\n\ +! It sets the number of processors and the class of the NPB\n\ +! in this directory. Do not modify it by hand.\n\ +! \n"); + break; + case IS: + fprintf(fp, DEF_CLASS_LINE, class); + fprintf(fp, "\ +/*\n\ + This file is generated automatically by the setparams utility.\n\ + It sets the number of processors and the class of the NPB\n\ + in this directory. Do not modify it by hand. */\n\ + \n"); + break; + case DC: + fprintf(fp, DEF_CLASS_LINE, class); + fprintf(fp, "\ +/*\n\ + This file is generated automatically by the setparams utility.\n\ + It sets the number of processors and the class of the NPB\n\ + in this directory. Do not modify it by hand.\n\ + This file provided for backward compatibility.\n\ + It is not used in DC benchmark. */\n\ + \n"); + break; + default: + printf("setparams: (Internal error): Unknown benchmark type %d\n", + type); + exit(1); + } + + /* Now do benchmark-specific stuff */ + switch(type) { + case SP: + write_sp_info(fp, class); + break; + case BT: + write_bt_info(fp, class); + break; + case DC: + write_dc_info(fp, class); + break; + case LU: + write_lu_info(fp, class); + break; + case MG: + write_mg_info(fp, class); + break; + case IS: + write_is_info(fp, class); + break; + case FT: + write_ft_info(fp, class); + break; + case EP: + write_ep_info(fp, class); + break; + case CG: + write_cg_info(fp, class); + break; + case UA: + write_ua_info(fp, class); + break; + default: + printf("setparams: (Internal error): Unknown benchmark type %d\n", type); + exit(1); + } + write_convertdouble_info(type, fp); + write_compiler_info(type, fp); + fclose(fp); + return; +} + + +/* + * write_sp_info(): Write SP specific info to config file + */ + +void write_sp_info(FILE *fp, char class) +{ + int problem_size, niter; + char *dt; + if (class == 'S') { problem_size = 12; dt = "0.015d0"; niter = 100; } + else if (class == 'W') { problem_size = 36; dt = "0.0015d0"; niter = 400; } + else if (class == 'A') { problem_size = 64; dt = "0.0015d0"; niter = 400; } + else if (class == 'B') { problem_size = 102; dt = "0.001d0"; niter = 400; } + else if (class == 'C') { problem_size = 162; dt = "0.00067d0"; niter = 400; } + else if (class == 'D') { problem_size = 408; dt = "0.00030d0"; niter = 500; } + else if (class == 'E') { problem_size = 1020; dt = "0.0001d0"; niter = 500; } + else { + printf("setparams: Internal error: invalid class %c\n", class); + exit(1); + } + fprintf(fp, "%sinteger problem_size, niter_default\n", FINDENT); + fprintf(fp, "%sparameter (problem_size=%d, niter_default=%d)\n", + FINDENT, problem_size, niter); + fprintf(fp, "%sdouble precision dt_default\n", FINDENT); + fprintf(fp, "%sparameter (dt_default = %s)\n", FINDENT, dt); +} + +/* + * write_bt_info(): Write BT specific info to config file + */ + +void write_bt_info(FILE *fp, char class) +{ + int problem_size, niter; + char *dt; + if (class == 'S') { problem_size = 12; dt = "0.010d0"; niter = 60; } + else if (class == 'W') { problem_size = 24; dt = "0.0008d0"; niter = 200; } + else if (class == 'A') { problem_size = 64; dt = "0.0008d0"; niter = 200; } + else if (class == 'B') { problem_size = 102; dt = "0.0003d0"; niter = 200; } + else if (class == 'C') { problem_size = 162; dt = "0.0001d0"; niter = 200; } + else if (class == 'D') { problem_size = 408; dt = "0.00002d0"; niter = 250; } + else if (class == 'E') { problem_size = 1020; dt = "0.4d-5"; niter = 250; } + else { + printf("setparams: Internal error: invalid class %c\n", class); + exit(1); + } + fprintf(fp, "%sinteger problem_size, niter_default\n", FINDENT); + fprintf(fp, "%sparameter (problem_size=%d, niter_default=%d)\n", + FINDENT, problem_size, niter); + fprintf(fp, "%sdouble precision dt_default\n", FINDENT); + fprintf(fp, "%sparameter (dt_default = %s)\n", FINDENT, dt); +} + +/* + * write_dc_info(): Write DC specific info to config file + */ + + +void write_dc_info(FILE *fp, char class) +{ + long int input_tuples, attrnum; + if (class == 'S') { input_tuples = 1000; attrnum = 5; } + else if (class == 'W') { input_tuples = 100000; attrnum = 10; } + else if (class == 'A') { input_tuples = 1000000; attrnum = 15; } + else if (class == 'B') { input_tuples = 10000000; attrnum = 20; } + else { + printf("setparams: Internal error: invalid class %c\n", class); + exit(1); + } + fprintf(fp, "long long int input_tuples=%ld, attrnum=%ld;\n", + input_tuples, attrnum); +} + +/* + * write_lu_info(): Write LU specific info to config file + */ + +void write_lu_info(FILE *fp, char class) +{ + int isiz1, isiz2, itmax, inorm, problem_size; + char *dt_default; + + if (class == 'S') { problem_size = 12; dt_default = "0.5d0"; itmax = 50; } + else if (class == 'W') { problem_size = 33; dt_default = "1.5d-3"; itmax = 300; } + else if (class == 'A') { problem_size = 64; dt_default = "2.0d0"; itmax = 250; } + else if (class == 'B') { problem_size = 102; dt_default = "2.0d0"; itmax = 250; } + else if (class == 'C') { problem_size = 162; dt_default = "2.0d0"; itmax = 250; } + else if (class == 'D') { problem_size = 408; dt_default = "1.0d0"; itmax = 300; } + else if (class == 'E') { problem_size = 1020; dt_default = "0.5d0"; itmax = 300; } + else { + printf("setparams: Internal error: invalid class %c\n", class); + exit(1); + } + inorm = itmax; + isiz1 = problem_size; + isiz2 = problem_size; + + + fprintf(fp, "\n! full problem size\n"); + fprintf(fp, "%sinteger isiz1, isiz2, isiz3\n", FINDENT); + fprintf(fp, "%sparameter (isiz1=%d, isiz2=%d, isiz3=%d)\n", + FINDENT, isiz1, isiz2, problem_size ); + + fprintf(fp, "\n! number of iterations and how often to print the norm\n"); + fprintf(fp, "%sinteger itmax_default, inorm_default\n", FINDENT); + fprintf(fp, "%sparameter (itmax_default=%d, inorm_default=%d)\n", + FINDENT, itmax, inorm); + + fprintf(fp, "%sdouble precision dt_default\n", FINDENT); + fprintf(fp, "%sparameter (dt_default = %s)\n", FINDENT, dt_default); + +} + +/* + * write_mg_info(): Write MG specific info to config file + */ + +void write_mg_info(FILE *fp, char class) +{ + int problem_size, nit, log2_size, lt_default, lm; + int ndim1, ndim2, ndim3; + if (class == 'S') { problem_size = 32; nit = 4; } +/* else if (class == 'W') { problem_size = 64; nit = 40; }*/ + else if (class == 'W') { problem_size = 128; nit = 4; } + else if (class == 'A') { problem_size = 256; nit = 4; } + else if (class == 'B') { problem_size = 256; nit = 20; } + else if (class == 'C') { problem_size = 512; nit = 20; } + else if (class == 'D') { problem_size = 1024; nit = 50; } + else if (class == 'E') { problem_size = 2048; nit = 50; } + else { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + log2_size = ilog2(problem_size); + /* lt is log of largest total dimension */ + lt_default = log2_size; + /* log of log of maximum dimension on a node */ + lm = log2_size; + ndim1 = lm; + ndim3 = log2_size; + ndim2 = log2_size; + + fprintf(fp, "%sinteger nx_default, ny_default, nz_default\n", FINDENT); + fprintf(fp, "%sparameter (nx_default=%d, ny_default=%d, nz_default=%d)\n", + FINDENT, problem_size, problem_size, problem_size); + fprintf(fp, "%sinteger nit_default, lm, lt_default\n", FINDENT); + fprintf(fp, "%sparameter (nit_default=%d, lm = %d, lt_default=%d)\n", + FINDENT, nit, lm, lt_default); + fprintf(fp, "%sinteger debug_default\n", FINDENT); + fprintf(fp, "%sparameter (debug_default=%d)\n", FINDENT, 0); + fprintf(fp, "%sinteger ndim1, ndim2, ndim3\n", FINDENT); + fprintf(fp, "%sparameter (ndim1 = %d, ndim2 = %d, ndim3 = %d)\n", + FINDENT, ndim1, ndim2, ndim3); + fprintf(fp, "%sinteger%s one, nv, nr, ir\n", + FINDENT, (problem_size > 1024)? "*8" : ""); + fprintf(fp, "%sparameter (one=1)\n", FINDENT); +} + + +/* + * write_is_info(): Write IS specific info to config file + */ + +void write_is_info(FILE *fp, char class) +{ + if( class != 'S' && + class != 'W' && + class != 'A' && + class != 'B' && + class != 'C' && + class != 'D') + { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } +} + + +/* + * write_cg_info(): Write CG specific info to config file + */ + +void write_cg_info(FILE *fp, char class) +{ + int na,nonzer,niter; + char *shift,*rcond="1.0d-1"; + char *shiftS="10.", + *shiftW="12.", + *shiftA="20.", + *shiftB="60.", + *shiftC="110.", + *shiftD="500.", + *shiftE="1.5d3"; + + + if( class == 'S' ) + { na=1400; nonzer=7; niter=15; shift=shiftS; } + else if( class == 'W' ) + { na=7000; nonzer=8; niter=15; shift=shiftW; } + else if( class == 'A' ) + { na=14000; nonzer=11; niter=15; shift=shiftA; } + else if( class == 'B' ) + { na=75000; nonzer=13; niter=75; shift=shiftB; } + else if( class == 'C' ) + { na=150000; nonzer=15; niter=75; shift=shiftC; } + else if( class == 'D' ) + { na=1500000; nonzer=21; niter=100; shift=shiftD; } + else if( class == 'E' ) + { na=9000000; nonzer=26; niter=100; shift=shiftE; } + else + { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + fprintf( fp, "%sinteger na, nonzer, niter\n", FINDENT ); + fprintf( fp, "%sdouble precision shift, rcond\n", FINDENT ); + fprintf( fp, "%sparameter( na=%d,\n", FINDENT, na ); + fprintf( fp, "%s nonzer=%d,\n", CONTINUE, nonzer ); + fprintf( fp, "%s niter=%d,\n", CONTINUE, niter ); + fprintf( fp, "%s shift=%s,\n", CONTINUE, shift ); + fprintf( fp, "%s rcond=%s )\n", CONTINUE, rcond ); + +} + +/* + * write_ua_info(): Write UA specific info to config file + */ + +void write_ua_info(FILE *fp, char class) +{ + int lelt, lmor,refine_max, niter, nmxh, fre; + char *alpha; + + fre = 5; + if( class == 'S' ) + { lelt=250;lmor=11600; refine_max=4; niter=50; nmxh=10; alpha="0.040d0"; } + else if( class == 'W' ) + { lelt=700;lmor=26700; refine_max=5; niter=100; nmxh=10; alpha="0.060d0"; } + else if( class == 'A' ) + { lelt=2400;lmor=92700; refine_max=6; niter=200; nmxh=10; alpha="0.076d0"; } + else if( class == 'B' ) + { lelt=8800; lmor=334600; refine_max=7; niter=200; nmxh=10; alpha="0.076d0"; } + else if( class == 'C' ) + { lelt=33500; lmor=1262100; refine_max=8; niter=200; nmxh=10; alpha="0.067d0"; } + else if( class == 'D' ) + { lelt=515000;lmor=19500000; refine_max=10; niter=250; nmxh=10; alpha="0.046d0"; } + else + { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + + fprintf( fp, "%sinteger lelt, lmor, refine_max, fre_default\n", FINDENT ); + fprintf( fp, "%sinteger niter_default, nmxh_default\n", FINDENT ); + fprintf( fp, "%scharacter class_default\n", FINDENT ); + fprintf( fp, "%sdouble precision alpha_default\n", FINDENT ); + fprintf( fp, "%sparameter( lelt=%d,\n", FINDENT, lelt ); + fprintf( fp, "%s lmor=%d,\n", CONTINUE, lmor ); + fprintf( fp, "%s refine_max=%d,\n", CONTINUE, refine_max ); + fprintf( fp, "%s fre_default=%d,\n", CONTINUE, fre ); + fprintf( fp, "%s niter_default=%d,\n", CONTINUE, niter ); + fprintf( fp, "%s nmxh_default=%d,\n", CONTINUE, nmxh ); + fprintf( fp, "%s class_default=\"%c\",\n", CONTINUE, class ); + fprintf( fp, "%s alpha_default=%s )\n", CONTINUE, alpha ); + +} + +/* + * write_ft_info(): Write FT specific info to config file + */ + +void write_ft_info(FILE *fp, char class) +{ + /* easiest way (given the way the benchmark is written) + * is to specify log of number of grid points in each + * direction m1, m2, m3. nt is the number of iterations + */ + int nx, ny, nz, maxdim, niter; + if (class == 'S') { nx = 64; ny = 64; nz = 64; niter = 6;} + else if (class == 'W') { nx = 128; ny = 128; nz = 32; niter = 6;} + else if (class == 'A') { nx = 256; ny = 256; nz = 128; niter = 6;} + else if (class == 'B') { nx = 512; ny = 256; nz = 256; niter =20;} + else if (class == 'C') { nx = 512; ny = 512; nz = 512; niter =20;} + else if (class == 'D') { nx = 2048; ny = 1024; nz = 1024; niter =25;} + else if (class == 'E') { nx = 4096; ny = 2048; nz = 2048; niter =25;} + else { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + maxdim = nx; + if (ny > maxdim) maxdim = ny; + if (nz > maxdim) maxdim = nz; + fprintf(fp, "%sinteger nx, ny, nz, maxdim, niter_default\n", FINDENT); + fprintf(fp, "%sinteger%s ntotal, nxp, nyp, ntotalp\n", FINDENT, + (nx > 1024)? "*8" : ""); + fprintf(fp, "%sparameter (nx=%d, ny=%d, nz=%d, maxdim=%d)\n", + FINDENT, nx, ny, nz, maxdim); + fprintf(fp, "%sparameter (niter_default=%d)\n", FINDENT, niter); + fprintf(fp, "%sparameter (nxp=nx+1, nyp=ny)\n", FINDENT); + fprintf(fp, "%sparameter (ntotal=nx*nyp*nz)\n", FINDENT); + fprintf(fp, "%sparameter (ntotalp=nxp*nyp*nz)\n", FINDENT); + +} + +/* + * write_ep_info(): Write EP specific info to config file + */ + +void write_ep_info(FILE *fp, char class) +{ + /* easiest way (given the way the benchmark is written) + * is to specify log of number of grid points in each + * direction m1, m2, m3. nt is the number of iterations + */ + int m; + if (class == 'S') { m = 24; } + else if (class == 'W') { m = 25; } + else if (class == 'A') { m = 28; } + else if (class == 'B') { m = 30; } + else if (class == 'C') { m = 32; } + else if (class == 'D') { m = 36; } + else if (class == 'E') { m = 40; } + else { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + + fprintf(fp, "%scharacter class\n",FINDENT); + fprintf(fp, "%sparameter (class =\'%c\')\n", + FINDENT, class); + fprintf(fp, "%sinteger m\n", FINDENT); + fprintf(fp, "%sparameter (m=%d)\n", FINDENT, m); +} + + +/* + * This is a gross hack to allow the benchmarks to + * print out how they were compiled. Various other ways + * of doing this have been tried and they all fail on + * some machine - due to a broken "make" program, or + * F77 limitations, of whatever. Hopefully this will + * always work because it uses very portable C. Unfortunately + * it relies on parsing the make.def file - YUK. + * If your machine doesn't have or , happy hacking! + * + */ + +#define VERBOSE +#define LL 400 +#include +#define DEFFILE "../config/make.def" +#define DEFAULT_MESSAGE "(none)" +FILE *deffile; +void write_compiler_info(int type, FILE *fp) +{ + char line[LL]; + char f77[LL], flink[LL], f_lib[LL], f_inc[LL], fflags[LL], flinkflags[LL]; + char compiletime[LL], randfile[LL]; + char cc[LL], cflags[LL], clink[LL], clinkflags[LL], + c_lib[LL], c_inc[LL]; + struct tm *tmp; + time_t t; + deffile = fopen(DEFFILE, "r"); + if (deffile == NULL) { + printf("\n\ +setparams: File %s doesn't exist. To build the NAS benchmarks\n\ + you need to create it according to the instructions\n\ + in the README in the main directory and comments in \n\ + the file config/make.def.template\n", DEFFILE); + exit(1); + } + strcpy(f77, DEFAULT_MESSAGE); + strcpy(flink, DEFAULT_MESSAGE); + strcpy(f_lib, DEFAULT_MESSAGE); + strcpy(f_inc, DEFAULT_MESSAGE); + strcpy(fflags, DEFAULT_MESSAGE); + strcpy(flinkflags, DEFAULT_MESSAGE); + strcpy(randfile, DEFAULT_MESSAGE); + strcpy(cc, DEFAULT_MESSAGE); + strcpy(cflags, DEFAULT_MESSAGE); + strcpy(clink, DEFAULT_MESSAGE); + strcpy(clinkflags, DEFAULT_MESSAGE); + strcpy(c_lib, DEFAULT_MESSAGE); + strcpy(c_inc, DEFAULT_MESSAGE); + + while (fgets(line, LL, deffile) != NULL) { + if (*line == '#') continue; + /* yes, this is inefficient. but it's simple! */ + check_line(line, "F77", f77); + check_line(line, "FLINK", flink); + check_line(line, "F_LIB", f_lib); + check_line(line, "F_INC", f_inc); + check_line(line, "FFLAGS", fflags); + check_line(line, "FLINKFLAGS", flinkflags); + check_line(line, "RAND", randfile); + check_line(line, "CC", cc); + check_line(line, "CFLAGS", cflags); + check_line(line, "CLINK", clink); + check_line(line, "CLINKFLAGS", clinkflags); + check_line(line, "C_LIB", c_lib); + check_line(line, "C_INC", c_inc); + } + + + (void) time(&t); + tmp = localtime(&t); + (void) strftime(compiletime, (size_t)LL, "%d %b %Y", tmp); + + + switch(type) { + case FT: + case SP: + case BT: + case MG: + case LU: + case EP: + case CG: + case UA: + put_string(fp, "compiletime", compiletime); + put_string(fp, "npbversion", VERSION); + put_string(fp, "cs1", f77); + put_string(fp, "cs2", flink); + put_string(fp, "cs3", f_lib); + put_string(fp, "cs4", f_inc); + put_string(fp, "cs5", fflags); + put_string(fp, "cs6", flinkflags); + put_string(fp, "cs7", randfile); + break; + case IS: + case DC: + put_def_string(fp, "COMPILETIME", compiletime); + put_def_string(fp, "NPBVERSION", VERSION); + put_def_string(fp, "CC", cc); + put_def_string(fp, "CFLAGS", cflags); + put_def_string(fp, "CLINK", clink); + put_def_string(fp, "CLINKFLAGS", clinkflags); + put_def_string(fp, "C_LIB", c_lib); + put_def_string(fp, "C_INC", c_inc); + break; + default: + printf("setparams: (Internal error): Unknown benchmark type %d\n", + type); + exit(1); + } + +} + +void check_line(char *line, char *label, char *val) +{ + char *original_line; + int n; + original_line = line; + /* compare beginning of line and label */ + while (*label != '\0' && *line == *label) { + line++; label++; + } + /* if *label is not EOS, we must have had a mismatch */ + if (*label != '\0') return; + /* if *line is not a space, actual label is longer than test label */ + if (!isspace(*line) && *line != '=') return ; + /* skip over white space */ + while (isspace(*line)) line++; + /* next char should be '=' */ + if (*line != '=') return; + /* skip over white space */ + while (isspace(*++line)); + /* if EOS, nothing was specified */ + if (*line == '\0') return; + /* finally we've come to the value */ + strcpy(val, line); + /* chop off the newline at the end */ + n = strlen(val)-1; + if (n >= 0 && val[n] == '\n') + val[n--] = '\0'; + if (n >= 0 && val[n] == '\r') + val[n--] = '\0'; + /* treat continuation */ + while (val[n] == '\\' && fgets(original_line, LL, deffile)) { + line = original_line; + while (isspace(*line)) line++; + if (isspace(*original_line)) val[n++] = ' '; + while (*line && *line != '\n' && *line != '\r' && n < LL-1) + val[n++] = *line++; + val[n] = '\0'; + n--; + } +/* if (val[n] == '\\') { + printf("\n\ +setparams: Error in file make.def. Because of the way in which\n\ + command line arguments are incorporated into the\n\ + executable benchmark, you can't have any continued\n\ + lines in the file make.def, that is, lines ending\n\ + with the character \"\\\". Although it may be ugly, \n\ + you should be able to reformat without continuation\n\ + lines. The offending line is\n\ + %s\n", original_line); + exit(1); + } */ +} + +int check_include_line(char *line, char *filename) +{ + char *include_string = "include"; + /* compare beginning of line and "include" */ + while (*include_string != '\0' && *line == *include_string) { + line++; include_string++; + } + /* if *include_string is not EOS, we must have had a mismatch */ + if (*include_string != '\0') return(0); + /* if *line is not a space, first word is not "include" */ + if (!isspace(*line)) return(0); + /* skip over white space */ + while (isspace(*++line)); + /* if EOS, nothing was specified */ + if (*line == '\0') return(0); + /* next keyword should be name of include file in *filename */ + while (*filename != '\0' && *line == *filename) { + line++; filename++; + } + if (*filename != '\0' || + (*line != ' ' && *line != '\0' && *line !='\n')) return(0); + else return(1); +} + + +#define MAXL 46 +void put_string(FILE *fp, char *name, char *val) +{ + int len; + len = strlen(val); + if (len > MAXL) { + val[MAXL] = '\0'; + val[MAXL-1] = '.'; + val[MAXL-2] = '.'; + val[MAXL-3] = '.'; + len = MAXL; + } + fprintf(fp, "%scharacter %s*%d\n", FINDENT, name, len); + fprintf(fp, "%sparameter (%s=\'%s\')\n", FINDENT, name, val); +} + +/* need to escape quote (") in val */ +int fix_string_quote(char *val, char *newval, int maxl) +{ + int len; + int i, j; + len = strlen(val); + i = j = 0; + while (i < len && j < maxl) { + if (val[i] == '"') + newval[j++] = '\\'; + if (j < maxl) + newval[j++] = val[i++]; + } + newval[j] = '\0'; + return j; +} + +/* NOTE: is the ... stuff necessary in C? */ +void put_def_string(FILE *fp, char *name, char *val0) +{ + int len; + char val[MAXL+3]; + len = fix_string_quote(val0, val, MAXL+2); + if (len > MAXL) { + val[MAXL] = '\0'; + val[MAXL-1] = '.'; + val[MAXL-2] = '.'; + val[MAXL-3] = '.'; + len = MAXL; + } + fprintf(fp, "#define %s \"%s\"\n", name, val); +} + +void put_def_variable(FILE *fp, char *name, char *val) +{ + int len; + len = strlen(val); + if (len > MAXL) { + val[MAXL] = '\0'; + val[MAXL-1] = '.'; + val[MAXL-2] = '.'; + val[MAXL-3] = '.'; + len = MAXL; + } + fprintf(fp, "#define %s %s\n", name, val); +} + + + +#if 0 + +/* this version allows arbitrarily long lines but + * some compilers don't like that and they're rarely + * useful + */ + +#define LINELEN 65 +void put_string(FILE *fp, char *name, char *val) +{ + int len, nlines, pos, i; + char line[100]; + len = strlen(val); + nlines = len/LINELEN; + if (nlines*LINELEN < len) nlines++; + fprintf(fp, "%scharacter*%d %s\n", FINDENT, nlines*LINELEN, name); + fprintf(fp, "%sparameter (%s = \n", FINDENT, name); + for (i = 0; i < nlines; i++) { + pos = i*LINELEN; + if (i == 0) fprintf(fp, "%s\'", CONTINUE); + else fprintf(fp, "%s", CONTINUE); + /* number should be same as LINELEN */ + fprintf(fp, "%.65s", val+pos); + if (i == nlines-1) fprintf(fp, "\')\n"); + else fprintf(fp, "\n"); + } +} + +#endif + + +/* integer log base two. Return error is argument isn't + * a power of two or is less than or equal to zero + */ + +int ilog2(int i) +{ + int log2; + int exp2 = 1; + if (i <= 0) return(-1); + + for (log2 = 0; log2 < 30; log2++) { + if (exp2 == i) return(log2); + if (exp2 > i) break; + exp2 *= 2; + } + return(-1); +} + + + +/* Power function. We could use pow from the math library, but then + * we would have to insist on always linking with the math library, just + * for this function. Since we only need pow with integer exponents, + * we'll code it ourselves here. + */ + +double power(double base, int i) +{ + double x; + + if (i==0) return (1.0); + else if (i<0) { + base = 1.0/base; + i = -i; + } + x = 1.0; + while (i>0) { + x *=base; + i--; + } + return (x); +} + + +void write_convertdouble_info(int type, FILE *fp) +{ + switch(type) { + case SP: + case BT: + case LU: + case FT: + case MG: + case EP: + case CG: + case UA: + fprintf(fp, "%slogical convertdouble\n", FINDENT); +#ifdef CONVERTDOUBLE + fprintf(fp, "%sparameter (convertdouble = .true.)\n", FINDENT); +#else + fprintf(fp, "%sparameter (convertdouble = .false.)\n", FINDENT); +#endif + break; + } +} diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/Makefile new file mode 100644 index 0000000..fd9b39d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/Makefile @@ -0,0 +1,106 @@ +SHELL=/bin/sh +BENCHMARK=bt +BENCHMARKU=BT +VEC= + +include ../config/make_dvmh.def + + +OBJS = bt.o make_set.o initialize.o exact_solution.o exact_rhs.o \ + set_constants.o adi.o define.o copy_faces.o rhs.o \ + x_solve$(VEC).o add.o error.o \ + verify.o setup_mpi.o \ + ${COMMON}/print_results.o ${COMMON}/timers.o +#y_solve$(VEC).o z_solve$(VEC).o solve_subs.o +include ../sys/make.common + +# npbparams.h is included by header.h +# The following rule should do the trick but many make programs (not gmake) +# will do the wrong thing and rebuild the world every time (because the +# mod time on header.h is not changed. One solution would be to +# touch header.h but this might cause confusion if someone has +# accidentally deleted it. Instead, make the dependency on npbparams.h +# explicit in all the lines below (even though dependence is indirect). + +# header.h: npbparams.h + +${PROGRAM}: config + @if [ x$(VERSION) = xvec ] ; then \ + ${MAKE} VEC=_vec exec; \ + elif [ x$(VERSION) = xVEC ] ; then \ + ${MAKE} VEC=_vec exec; \ + else \ + ${MAKE} exec; \ + fi + +exec: $(OBJS) + @if [ x$(SUBTYPE) = xfull ] ; then \ + ${MAKE} bt-full; \ + elif [ x$(SUBTYPE) = xFULL ] ; then \ + ${MAKE} bt-full; \ + elif [ x$(SUBTYPE) = xsimple ] ; then \ + ${MAKE} bt-simple; \ + elif [ x$(SUBTYPE) = xSIMPLE ] ; then \ + ${MAKE} bt-simple; \ + elif [ x$(SUBTYPE) = xfortran ] ; then \ + ${MAKE} bt-fortran; \ + elif [ x$(SUBTYPE) = xFORTRAN ] ; then \ + ${MAKE} bt-fortran; \ + elif [ x$(SUBTYPE) = xepio ] ; then \ + ${MAKE} bt-epio; \ + elif [ x$(SUBTYPE) = xEPIO ] ; then \ + ${MAKE} bt-epio; \ + else \ + ${MAKE} bt-bt; \ + fi + +bt-bt: ${OBJS} btio.o + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM}_dvmh ${OBJS} btio.o ${FMPI_LIB} + +bt-full: ${OBJS} full_mpiio.o btio_common.o + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM}.mpi_io_full ${OBJS} btio_common.o full_mpiio.o ${FMPI_LIB} + +bt-simple: ${OBJS} simple_mpiio.o btio_common.o + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM}.mpi_io_simple ${OBJS} btio_common.o simple_mpiio.o ${FMPI_LIB} + +bt-fortran: ${OBJS} fortran_io.o btio_common.o + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM}.fortran_io ${OBJS} btio_common.o fortran_io.o ${FMPI_LIB} + +bt-epio: ${OBJS} epio.o btio_common.o + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM}.ep_io ${OBJS} btio_common.o epio.o ${FMPI_LIB} + +.f.o: + ${FCOMPILE} $< + +.c.o: + ${CCOMPILE} $< + + +bt.o: bt.f header.h npbparams.h mpinpb.h +make_set.o: make_set.f header.h npbparams.h mpinpb.h +initialize.o: initialize.f header.h npbparams.h +exact_solution.o: exact_solution.f header.h npbparams.h +exact_rhs.o: exact_rhs.f header.h npbparams.h +set_constants.o: set_constants.f header.h npbparams.h +adi.o: adi.f header.h npbparams.h +define.o: define.f header.h npbparams.h +copy_faces.o: copy_faces.f header.h npbparams.h mpinpb.h +rhs.o: rhs.f header.h npbparams.h +x_solve$(VEC).o: x_solve$(VEC).f header.h work_lhs$(VEC).h npbparams.h mpinpb.h +#y_solve$(VEC).o: y_solve$(VEC).f header.h work_lhs$(VEC).h npbparams.h mpinpb.h +#z_solve$(VEC).o: z_solve$(VEC).f header.h work_lhs$(VEC).h npbparams.h mpinpb.h +#solve_subs.o: solve_subs.f npbparams.h +add.o: add.f header.h npbparams.h +error.o: error.f header.h npbparams.h mpinpb.h +verify.o: verify.f header.h npbparams.h mpinpb.h +setup_mpi.o: setup_mpi.f mpinpb.h npbparams.h +btio.o: btio.f header.h npbparams.h +btio_common.o: btio_common.f mpinpb.h npbparams.h +fortran_io.o: fortran_io.f mpinpb.h npbparams.h +simple_mpiio.o: simple_mpiio.f mpinpb.h npbparams.h +full_mpiio.o: full_mpiio.f mpinpb.h npbparams.h +epio.o: epio.f mpinpb.h npbparams.h + +clean: + - rm -f *.o *~ mputil* + - rm -f npbparams.h core *DVMH* diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/add.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/add.f new file mode 100644 index 0000000..995a667 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/add.f @@ -0,0 +1,38 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine add + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c addition of update to the vector u +c--------------------------------------------------------------------- + + include 'header.h' + + integer c, i, j, k, m + + do c = 1, ncells + +! $omp parallel do private(k,j,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,j,i,m), +!DVM$& TIE(rhs(*,i,j,k,*),u(*,i,j,k,*)) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + u(m,i,j,k,c) = u(m,i,j,k,c) + rhs(m,i,j,k,c) + enddo + enddo + enddo + enddo +!DVM$ end region + + enddo + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/adi.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/adi.f new file mode 100644 index 0000000..310ab84 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/adi.f @@ -0,0 +1,25 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine adi + include 'header.h' +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- +!DVM$ interval 1 + call copy_faces +!DVM$ end interval +!DVM$ interval 2 + call x_solve +!DVM$ end interval +!DVM$ interval 3 + call y_solve +!DVM$ end interval +!DVM$ interval 4 + call z_solve +!DVM$ end interval +!DVM$ interval 5 + call add +!DVM$ end interval + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/bt.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/bt.f new file mode 100644 index 0000000..490e9e0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/bt.f @@ -0,0 +1,330 @@ +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! B T ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is part of the NAS Parallel Benchmark 3.3 suite. ! +! It is described in NAS Technical Reports 95-020 and 02-007. ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 3.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 3.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/Software/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (650) 604-3957 ! +! ! +!-------------------------------------------------------------------------! + +c--------------------------------------------------------------------- +c +c Authors: R. F. Van der Wijngaart +c T. Harris +c M. Yarrow +c +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- + program MPBT +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer i, niter, step, c, error, fstatus + double precision navg, mflops, mbytes, n3 + + external timer_read + double precision t, tmax, tiominv, tpc, timer_read + logical verified + character class, cbuff*40 + double precision t1(t_last+2), tsum(t_last+2), + > tming(t_last+2), tmaxg(t_last+2) + character t_recs(t_last+2)*8 + + integer wr_interval + + data t_recs/'total', 'i/o', 'rhs', 'xsolve', 'ysolve', 'zsolve', + > 'bpack', 'exch', 'xcomm', 'ycomm', 'zcomm', + > ' totcomp', ' totcomm'/ + + call setup_mpi + if (.not. active) goto 999 + +c--------------------------------------------------------------------- +c Root node reads input file (if it exists) else takes +c defaults from parameters +c--------------------------------------------------------------------- + if (node .eq. root) then + + write(*, 1000) + + open (unit=2,file='timer.flag',status='old',iostat=fstatus) + timeron = .false. + if (fstatus .eq. 0) then + timeron = .true. + close(2) + endif + + open (unit=2,file='inputbt.data',status='old', iostat=fstatus) +c + rd_interval = 0 + if (fstatus .eq. 0) then + write(*,233) + 233 format(' Reading from input file inputbt.data') + read (2,*) niter + read (2,*) dt + read (2,*) grid_points(1), grid_points(2), grid_points(3) + if (iotype .ne. 0) then + read (2,'(A)') cbuff + read (cbuff,*,iostat=i) wr_interval, rd_interval + if (i .ne. 0) rd_interval = 0 + if (wr_interval .le. 0) wr_interval = wr_default + endif + if (iotype .eq. 1) then + read (2,*) collbuf_nodes, collbuf_size + write(*,*) 'collbuf_nodes ', collbuf_nodes + write(*,*) 'collbuf_size ', collbuf_size + endif + close(2) + else + write(*,234) + niter = niter_default + dt = dt_default + grid_points(1) = problem_size + grid_points(2) = problem_size + grid_points(3) = problem_size + wr_interval = wr_default + if (iotype .eq. 1) then +c set number of nodes involved in collective buffering to 4, +c unless total number of nodes is smaller than that. +c set buffer size for collective buffering to 1MB per node +c collbuf_nodes = min(4,no_nodes) +c set default to No-File-Hints with a value of 0 + collbuf_nodes = 0 + collbuf_size = 1000000 + endif + endif + 234 format(' No input file inputbt.data. Using compiled defaults') + + write(*, 1001) grid_points(1), grid_points(2), grid_points(3) + write(*, 1002) niter, dt + if (no_nodes .ne. total_nodes) write(*, 1004) total_nodes + if (no_nodes .ne. maxcells*maxcells) + > write(*, 1005) maxcells*maxcells + write(*, 1003) no_nodes + + if (iotype .eq. 1) write(*, 1006) 'FULL MPI-IO', wr_interval + if (iotype .eq. 2) write(*, 1006) 'SIMPLE MPI-IO', wr_interval + if (iotype .eq. 3) write(*, 1006) 'EPIO', wr_interval + if (iotype .eq. 4) write(*, 1006) 'FORTRAN IO', wr_interval + + 1000 format(//, ' NAS Parallel Benchmarks 3.3 -- BT Benchmark ',/) + 1001 format(' Size: ', i4, 'x', i4, 'x', i4) + 1002 format(' Iterations: ', i4, ' dt: ', F11.7) + 1004 format(' Total number of processes: ', i5) + 1005 format(' WARNING: compiled for ', i5, ' processes ') + 1003 format(' Number of active processes: ', i5, /) + 1006 format(' BTIO -- ', A, ' write interval: ', i3 /) + + endif + + call mpi_bcast(niter, 1, MPI_INTEGER, + > root, comm_setup, error) + + call mpi_bcast(dt, 1, dp_type, + > root, comm_setup, error) + + call mpi_bcast(grid_points(1), 3, MPI_INTEGER, + > root, comm_setup, error) + + call mpi_bcast(wr_interval, 1, MPI_INTEGER, + > root, comm_setup, error) + + call mpi_bcast(rd_interval, 1, MPI_INTEGER, + > root, comm_setup, error) + + call mpi_bcast(timeron, 1, MPI_LOGICAL, + > root, comm_setup, error) + + call make_set + + do c = 1, maxcells + if ( (cell_size(1,c) .gt. IMAX) .or. + > (cell_size(2,c) .gt. JMAX) .or. + > (cell_size(3,c) .gt. KMAX) ) then + print *,node, c, (cell_size(i,c),i=1,3) + print *,' Problem size too big for compiled array sizes' + goto 999 + endif + end do + + do i = 1, t_last + call timer_clear(i) + end do + + call set_constants + + call initialize + + call setup_btio + idump = 0 + + call lhsinit + + call exact_rhs + + call compute_buffer_size(5) + +c--------------------------------------------------------------------- +c do one time step to touch all code, and reinitialize +c--------------------------------------------------------------------- +!DVM$ actual(forcing,u) + call adi + call initialize + +c--------------------------------------------------------------------- +c Synchronize before placing time stamp +c--------------------------------------------------------------------- + do i = 1, t_last + call timer_clear(i) + end do + call mpi_barrier(comm_setup, error) + + call timer_start(1) + +!DVM$ actual(forcing,u) + do step = 1, niter + + if (node .eq. root) then + if (mod(step, 20) .eq. 0 .or. step .eq. niter .or. + > step .eq. 1) then + write(*, 200) step + 200 format(' Time step ', i4) + endif + endif + + call adi + + if (iotype .ne. 0) then + if (mod(step, wr_interval).eq.0 .or. step .eq. niter) then + if (node .eq. root) then + print *, 'Writing data set, time step', step + endif + if (step .eq. niter .and. rd_interval .gt. 1) then + rd_interval = 1 + endif + call timer_start(2) + call output_timestep + call timer_stop(2) + idump = idump + 1 + endif + endif + end do + + call timer_start(2) + call btio_cleanup + call timer_stop(2) + + call timer_stop(1) + t = timer_read(1) + + call verify(niter, class, verified) + + call mpi_reduce(t, tmax, 1, + > dp_type, MPI_MAX, + > root, comm_setup, error) + + if (iotype .ne. 0) then + t = timer_read(2) + if (t .ne. 0.d0) t = 1.0d0 / t + call mpi_reduce(t, tiominv, 1, + > dp_type, MPI_SUM, + > root, comm_setup, error) + endif + + if( node .eq. root ) then + n3 = 1.0d0*grid_points(1)*grid_points(2)*grid_points(3) + navg = (grid_points(1)+grid_points(2)+grid_points(3))/3.0 + if( tmax .ne. 0. ) then + mflops = 1.0e-6*float(niter)* + > (3478.8*n3-17655.7*navg**2+28023.7*navg) + > / tmax + else + mflops = 0.0 + endif + + if (iotype .ne. 0) then + mbytes = n3 * 40.0 * idump * 1.0d-6 + tiominv = tiominv / no_nodes + t = 0.0 + if (tiominv .ne. 0.) t = 1.d0 / tiominv + tpc = 0.0 + if (tmax .ne. 0.) tpc = t * 100.0 / tmax + write(*,1100) t, tpc, mbytes, mbytes*tiominv + 1100 format(/' BTIO -- statistics:'/ + > ' I/O timing in seconds : ', f14.2/ + > ' I/O timing percentage : ', f14.2/ + > ' Total data written (MB) : ', f14.2/ + > ' I/O data rate (MB/sec) : ', f14.2) + endif + + call print_results('BT', class, grid_points(1), + > grid_points(2), grid_points(3), niter, maxcells*maxcells, + > total_nodes, tmax, mflops, ' floating point', + > verified, npbversion,compiletime, cs1, cs2, cs3, cs4, cs5, + > cs6, '(none)') + endif + + if (.not.timeron) goto 999 + + do i = 1, t_last + t1(i) = timer_read(i) + end do + t1(t_xsolve) = t1(t_xsolve) - t1(t_xcomm) + t1(t_ysolve) = t1(t_ysolve) - t1(t_ycomm) + t1(t_zsolve) = t1(t_zsolve) - t1(t_zcomm) + t1(t_last+2) = t1(t_xcomm)+t1(t_ycomm)+t1(t_zcomm)+t1(t_exch) + t1(t_last+1) = t1(t_total) - t1(t_last+2) + + call MPI_Reduce(t1, tsum, t_last+2, dp_type, MPI_SUM, + > 0, comm_setup, error) + call MPI_Reduce(t1, tming, t_last+2, dp_type, MPI_MIN, + > 0, comm_setup, error) + call MPI_Reduce(t1, tmaxg, t_last+2, dp_type, MPI_MAX, + > 0, comm_setup, error) + + if (node .eq. 0) then + write(*, 800) total_nodes + do i = 1, t_last+2 + tsum(i) = tsum(i) / total_nodes + write(*, 810) i, t_recs(i), tming(i), tmaxg(i), tsum(i) + end do + endif + 800 format(' nprocs =', i6, 11x, 'minimum', 5x, 'maximum', + > 5x, 'average') + 810 format(' timer ', i2, '(', A8, ') :', 3(2x,f10.4)) + + 999 continue + call mpi_barrier(MPI_COMM_WORLD, error) + call mpi_finalize(error) + + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/btio.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/btio.f new file mode 100644 index 0000000..1fb730b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/btio.f @@ -0,0 +1,72 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine setup_btio + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine output_timestep + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine btio_cleanup + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine btio_verify(verified) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + logical verified + + verified = .true. + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine accumulate_norms(xce_acc) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision xce_acc(5) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine checksum_timestep + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/btio_common.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/btio_common.f new file mode 100644 index 0000000..9227a12 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/btio_common.f @@ -0,0 +1,30 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine clear_timestep + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer cio, kio, jio, ix + + do cio=1,ncells + do kio=0, cell_size(3,cio)-1 + do jio=0, cell_size(2,cio)-1 + do ix=0,cell_size(1,cio)-1 + u(1,ix, jio,kio,cio) = 0 + u(2,ix, jio,kio,cio) = 0 + u(3,ix, jio,kio,cio) = 0 + u(4,ix, jio,kio,cio) = 0 + u(5,ix, jio,kio,cio) = 0 + enddo + enddo + enddo + enddo + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/copy_faces.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/copy_faces.f new file mode 100644 index 0000000..0c4c013 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/copy_faces.f @@ -0,0 +1,408 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine copy_faces + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c This function copies the face values of a variable defined on a set +c of cells to the overlap locations of the adjacent sets of cells. +c Because a set of cells interfaces in each direction with exactly one +c other set, we only need to fill six different buffers. We could try to +c overlap communication with computation, by computing +c some internal values while communicating boundary values, but this +c adds so much overhead that it's not clearly useful. +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer i, j, k, c, m, requests(0:11), p0, p1, pp,ks,ke,is,ie,je, + > p2, p3, p4, p5, b_size(0:5), ss(0:5), js, add, + > sr(0:5), error, statuses(MPI_STATUS_SIZE, 0:11) + +c--------------------------------------------------------------------- +c exit immediately if there are no faces to be copied +c--------------------------------------------------------------------- + if (no_nodes .eq. 1) then + call compute_rhs + return + endif + + ss(0) = start_send_east + ss(1) = start_send_west + ss(2) = start_send_north + ss(3) = start_send_south + ss(4) = start_send_top + ss(5) = start_send_bottom + + sr(0) = start_recv_east + sr(1) = start_recv_west + sr(2) = start_recv_north + sr(3) = start_recv_south + sr(4) = start_recv_top + sr(5) = start_recv_bottom + + b_size(0) = east_size + b_size(1) = west_size + b_size(2) = north_size + b_size(3) = south_size + b_size(4) = top_size + b_size(5) = bottom_size + +c--------------------------------------------------------------------- +c because the difference stencil for the diagonalized scheme is +c orthogonal, we do not have to perform the staged copying of faces, +c but can send all face information simultaneously to the neighboring +c cells in all directions +c--------------------------------------------------------------------- + if (timeron) call timer_start(t_bpack) + p0 = 0 + p1 = 0 + p2 = 0 + p3 = 0 + p4 = 0 + p5 = 0 + + do c = 1, ncells + +c--------------------------------------------------------------------- +c fill the buffer to be sent to eastern neighbors (i-dir) +c--------------------------------------------------------------------- + if (cell_coord(1,c) .ne. ncells) then + ke=cell_size(3,c)-1 + je=cell_size(2,c)-1 + is=cell_size(1,c)-2 + ie=cell_size(1,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0, ke + do j = 0, je + do i = is, ie + pp = p0+k*(je+1)*2*5+j*2*5+(i-is)*5 + do m = 1, 5 + out_buffer(ss(0)+pp+(m-1)) = u(m,i,j,k,c) + end do + end do + end do + end do +!DVM$ end region + p0 = p0+(ke+1)*(je+1)*(ie-is+1)*5 + endif + +c--------------------------------------------------------------------- +c fill the buffer to be sent to western neighbors +c--------------------------------------------------------------------- + if (cell_coord(1,c) .ne. 1) then + ke=cell_size(3,c)-1 + je=cell_size(2,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0, ke + do j = 0,je + do i = 0,1 + pp = p1+k*(je+1)*2*5+j*2*5+(i-0)*5 + do m = 1, 5 + out_buffer(ss(1)+pp+m-1) = u(m,i,j,k,c) + end do + end do + end do + end do +!DVM$ end region + p1=p1+(ke+1)*(je+1)*2*5 + endif + +c--------------------------------------------------------------------- +c fill the buffer to be sent to northern neighbors (j_dir) +c--------------------------------------------------------------------- + if (cell_coord(2,c) .ne. ncells) then + ke=cell_size(3,c)-1 + ie=cell_size(1,c)-1 + js=cell_size(2,c)-2 + je=cell_size(2,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0,ke + do j = js,je + do i = 0,ie + pp = p2+k*(ie+1)*2*5+(j-js)*(ie+1)*5+i*5 + do m = 1, 5 + out_buffer(ss(2)+pp+(m-1)) = u(m,i,j,k,c) + end do + end do + end do + end do +!DVM$ end region + p2=p2+(ke+1)*(je-js+1)*(ie+1)*5 + endif + +c--------------------------------------------------------------------- +c fill the buffer to be sent to southern neighbors +c--------------------------------------------------------------------- + if (cell_coord(2,c).ne. 1) then + ke=cell_size(3,c)-1 + ie=cell_size(1,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0, ke + do j = 0, 1 + do i = 0, ie + pp = p3+k*(ie+1)*2*5+(j-0)*(ie+1)*5 + i*5 + do m = 1, 5 + out_buffer(ss(3)+pp+(m-1)) = u(m,i,j,k,c) + end do + end do + end do + end do +!DVM$ end region + p3=p3+(ke+1)*2*(ie+1)*5 + endif + +c--------------------------------------------------------------------- +c fill the buffer to be sent to top neighbors (k-dir) +c--------------------------------------------------------------------- + if (cell_coord(3,c) .ne. ncells) then + ks=cell_size(3,c)-2 + ke=cell_size(3,c)-1 + je=cell_size(2,c)-1 + ie=cell_size(1,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = ks, ke + do j = 0, je + do i = 0, ie + pp = p4+(k-ks)*(je+1)*(ie+1)*5+j*(ie+1)*5+i*5 + do m = 1, 5 + out_buffer(ss(4)+pp+(m-1)) = u(m,i,j,k,c) + end do + end do + end do + end do +!DVM$ end region + p4=p4+(ke-ks+1)*(je+1)*(ie+1)*5 + endif + +c--------------------------------------------------------------------- +c fill the buffer to be sent to bottom neighbors +c--------------------------------------------------------------------- + if (cell_coord(3,c).ne. 1) then + je=cell_size(2,c)-1 + ie=cell_size(1,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k=0,1 + do j = 0, je + do i = 0, ie + pp = p5+(k-0)*(je+1)*(ie+1)*5+j*(ie+1)*5+i*5 + do m = 1, 5 + out_buffer(ss(5)+pp+(m-1)) = u(m,i,j,k,c) + end do + end do + end do + end do +!DVM$ end region + p5=p5+2*(je+1)*(ie+1)*5 + endif + +c--------------------------------------------------------------------- +c cell loop +c--------------------------------------------------------------------- + end do + if (timeron) call timer_stop(t_bpack) + + if (timeron) call timer_start(t_exch) +!DVM$ get_actual(out_buffer) + + call mpi_irecv(in_buffer(sr(0)), b_size(0), + > dp_type, successor(1), WEST, + > comm_rhs, requests(0), error) + call mpi_irecv(in_buffer(sr(1)), b_size(1), + > dp_type, predecessor(1), EAST, + > comm_rhs, requests(1), error) + call mpi_irecv(in_buffer(sr(2)), b_size(2), + > dp_type, successor(2), SOUTH, + > comm_rhs, requests(2), error) + call mpi_irecv(in_buffer(sr(3)), b_size(3), + > dp_type, predecessor(2), NORTH, + > comm_rhs, requests(3), error) + call mpi_irecv(in_buffer(sr(4)), b_size(4), + > dp_type, successor(3), BOTTOM, + > comm_rhs, requests(4), error) + call mpi_irecv(in_buffer(sr(5)), b_size(5), + > dp_type, predecessor(3), TOP, + > comm_rhs, requests(5), error) + + call mpi_isend(out_buffer(ss(0)), b_size(0), + > dp_type, successor(1), EAST, + > comm_rhs, requests(6), error) + call mpi_isend(out_buffer(ss(1)), b_size(1), + > dp_type, predecessor(1), WEST, + > comm_rhs, requests(7), error) + call mpi_isend(out_buffer(ss(2)), b_size(2), + > dp_type,successor(2), NORTH, + > comm_rhs, requests(8), error) + call mpi_isend(out_buffer(ss(3)), b_size(3), + > dp_type,predecessor(2), SOUTH, + > comm_rhs, requests(9), error) + call mpi_isend(out_buffer(ss(4)), b_size(4), + > dp_type,successor(3), TOP, + > comm_rhs, requests(10), error) + call mpi_isend(out_buffer(ss(5)), b_size(5), + > dp_type,predecessor(3), BOTTOM, + > comm_rhs,requests(11), error) + + + call mpi_waitall(12, requests, statuses, error) + if (timeron) call timer_stop(t_exch) + +c--------------------------------------------------------------------- +c unpack the data that has just been received; +c--------------------------------------------------------------------- + if (timeron) call timer_start(t_bpack) + p0 = 0 + p1 = 0 + p2 = 0 + p3 = 0 + p4 = 0 + p5 = 0 +!DVM$ actual(in_buffer) + + do c = 1, ncells + + if (cell_coord(1,c) .ne. 1) then + ke=cell_size(3,c)-1 + je=cell_size(2,c)-1 + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0, ke + do j = 0, je + do i = -2, -1 + pp = p0+k*(je+1)*2*5+j*2*5+(i+2)*5 + do m = 1, 5 + u(m,i,j,k,c) = in_buffer(sr(1)+pp+(m-1)) + end do + end do + end do + end do +!DVM$ end region + p0=p0+(ke+1)*(je+1)*2*5 + endif + + if (cell_coord(1,c) .ne. ncells) then + ke=cell_size(3,c)-1 + je=cell_size(2,c)-1 + ie=cell_size(1,c)+1 + is=cell_size(1,c) +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0, ke + do j = 0, je + do i = is, ie + pp = p1+k*(je+1)*2*5+j*2*5+(i-is)*5 + do m = 1, 5 + u(m,i,j,k,c) = in_buffer(sr(0)+pp+(m-1)) + end do + end do + end do + end do +!DVM$ end region + p1=p1+(ke+1)*(je+1)*2*5 + end if + + if (cell_coord(2,c) .ne. 1) then + ke=cell_size(3,c)-1 + ie=cell_size(1,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0, ke + do j = -2, -1 + do i = 0, ie + pp = p2+k*(ie+1)*2*5+(j+2)*(ie+1)*5+i*5 + do m = 1, 5 + u(m,i,j,k,c) = in_buffer(sr(3)+pp+(m-1)) + end do + end do + end do + end do +!DVM$ end region + p2=p2+(ke+1)*2*(ie+1)*5 + endif + + if (cell_coord(2,c) .ne. ncells) then + ke=cell_size(3,c)-1 + ie=cell_size(1,c)-1 + js=cell_size(2,c) + je=cell_size(2,c)+1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = 0, ke + do j = js, je + do i = 0, ie + pp = p3+k*(ie+1)*2*5+(j-js)*(ie+1)*5+i*5 + do m = 1, 5 + u(m,i,j,k,c) = in_buffer(sr(2)+pp+(m-1)) + end do + end do + end do + end do +!DVM$ end region + p3=p3+(ke+1)*2*(ie+1)*5 + endif + + if (cell_coord(3,c) .ne. 1) then + je=cell_size(2,c)-1 + ie=cell_size(1,c)-1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = -2, -1 + do j = 0, je + do i = 0, ie + pp = p4+(k+2)*(je+1)*(ie+1)*5+j*(ie+1)*5+i*5 + do m = 1, 5 + u(m,i,j,k,c) = in_buffer(sr(5)+pp+(m-1)) + end do + end do + end do + end do +!DVM$ end region + p4=p4+2*(je+1)*(ie+1)*5 + endif + + if (cell_coord(3,c) .ne. ncells) then + je=cell_size(2,c)-1 + ie=cell_size(1,c)-1 + ks=cell_size(3,c) + ke=cell_size(3,c)+1 +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(pp,m), TIE(u(*,i,j,k,*)) + do k = ks, ke + do j = 0, je + do i = 0, ie + pp=p5+(k-ks)*(je+1)*(ie+1)*5+j*(ie+1)*5+i*5 + do m = 1, 5 + u(m,i,j,k,c) = in_buffer(sr(4)+pp+(m-1)) + end do + end do + end do + end do +!DVM$ end region + p5=p5+2*(je+1)*(ie+1)*5 + endif + +c--------------------------------------------------------------------- +c cells loop +c--------------------------------------------------------------------- + end do + if (timeron) call timer_stop(t_bpack) + +c--------------------------------------------------------------------- +c do the rest of the rhs that uses the copied face values +c--------------------------------------------------------------------- + call compute_rhs + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/define.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/define.f new file mode 100644 index 0000000..03c4c6e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/define.f @@ -0,0 +1,64 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine compute_buffer_size(dim) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + + integer c, dim, face_size + + if (ncells .eq. 1) return + +c--------------------------------------------------------------------- +c compute the actual sizes of the buffers; note that there is +c always one cell face that doesn't need buffer space, because it +c is at the boundary of the grid +c--------------------------------------------------------------------- + west_size = 0 + east_size = 0 + + do c = 1, ncells + face_size = cell_size(2,c) * cell_size(3,c) * dim * 2 + if (cell_coord(1,c).ne.1) west_size = west_size + face_size + if (cell_coord(1,c).ne.ncells) east_size = east_size + + > face_size + end do + + north_size = 0 + south_size = 0 + do c = 1, ncells + face_size = cell_size(1,c)*cell_size(3,c) * dim * 2 + if (cell_coord(2,c).ne.1) south_size = south_size + face_size + if (cell_coord(2,c).ne.ncells) north_size = north_size + + > face_size + end do + + top_size = 0 + bottom_size = 0 + do c = 1, ncells + face_size = cell_size(1,c) * cell_size(2,c) * dim * 2 + if (cell_coord(3,c).ne.1) bottom_size = bottom_size + + > face_size + if (cell_coord(3,c).ne.ncells) top_size = top_size + + > face_size + end do + + start_send_west = 1 + start_send_east = start_send_west + west_size + start_send_south = start_send_east + east_size + start_send_north = start_send_south + south_size + start_send_bottom = start_send_north + north_size + start_send_top = start_send_bottom + bottom_size + start_recv_west = 1 + start_recv_east = start_recv_west + west_size + start_recv_south = start_recv_east + east_size + start_recv_north = start_recv_south + south_size + start_recv_bottom = start_recv_north + north_size + start_recv_top = start_recv_bottom + bottom_size + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/epio.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/epio.f new file mode 100644 index 0000000..52b6309 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/epio.f @@ -0,0 +1,165 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine setup_btio + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + character*(128) newfilenm + integer m + + if (node .lt. 10000) then + write (newfilenm, 996) filenm,node + else + print *, 'error generating file names (> 10000 nodes)' + stop + endif + +996 format (a,'.',i4.4) + + open (unit=99, file=newfilenm, form='unformatted', + $ status='unknown') + + do m = 1, 5 + xce_sub(m) = 0.d0 + end do + + idump_sub = 0 + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine output_timestep + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + include 'header.h' + include 'mpinpb.h' + + integer ix, iio, jio, kio, cio, aio + + do cio=1,ncells + write(99) + $ ((((u(aio,ix, jio,kio,cio),aio=1,5), + $ ix=0, cell_size(1,cio)-1), + $ jio=0, cell_size(2,cio)-1), + $ kio=0, cell_size(3,cio)-1) + enddo + + idump_sub = idump_sub + 1 + if (rd_interval .gt. 0) then + if (idump_sub .ge. rd_interval) then + + rewind(99) + call acc_sub_norms(idump+1) + + rewind(99) + idump_sub = 0 + endif + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine acc_sub_norms(idump_cur) + + include 'header.h' + include 'mpinpb.h' + + integer idump_cur + + integer ix, jio, kio, cio, ii, m, ichunk + double precision xce_single(5) + + ichunk = idump_cur - idump_sub + 1 + do ii=0, idump_sub-1 + do cio=1,ncells + read(99) + $ ((((u(m,ix, jio,kio,cio),m=1,5), + $ ix=0, cell_size(1,cio)-1), + $ jio=0, cell_size(2,cio)-1), + $ kio=0, cell_size(3,cio)-1) + enddo + + if (node .eq. root) print *, 'Reading data set ', ii+ichunk + + call error_norm(xce_single) + do m = 1, 5 + xce_sub(m) = xce_sub(m) + xce_single(m) + end do + enddo + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine btio_cleanup + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + close(unit=99) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine accumulate_norms(xce_acc) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + double precision xce_acc(5) + + character*(128) newfilenm + integer m + + if (rd_interval .gt. 0) goto 20 + + if (node .lt. 10000) then + write (newfilenm, 996) filenm,node + else + print *, 'error generating file names (> 10000 nodes)' + stop + endif + +996 format (a,'.',i4.4) + + open (unit=99, file=newfilenm, + $ form='unformatted') + +c clear the last time step + + call clear_timestep + +c read back the time steps and accumulate norms + + call acc_sub_norms(idump) + + close(unit=99) + + 20 continue + do m = 1, 5 + xce_acc(m) = xce_sub(m) / dble(idump) + end do + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/error.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/error.f new file mode 100644 index 0000000..7993bf1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/error.f @@ -0,0 +1,107 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine error_norm(rms) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function computes the norm of the difference between the +c computed solution and the exact solution +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer c, i, j, k, m, ii, jj, kk, d, error + double precision xi, eta, zeta, u_exact(5), rms(5), rms_work(5), + > add + + do m = 1, 5 + rms_work(m) = 0.0d0 + enddo + +!DVM$ get_actual(u) + do c = 1, ncells + kk = 0 + do k = cell_low(3,c), cell_high(3,c) + zeta = dble(k) * dnzm1 + jj = 0 + do j = cell_low(2,c), cell_high(2,c) + eta = dble(j) * dnym1 + ii = 0 + do i = cell_low(1,c), cell_high(1,c) + xi = dble(i) * dnxm1 + call exact_solution(xi, eta, zeta, u_exact) + + do m = 1, 5 + add = u(m,ii,jj,kk,c)-u_exact(m) + rms_work(m) = rms_work(m) + add*add + enddo + ii = ii + 1 + enddo + jj = jj + 1 + enddo + kk = kk + 1 + enddo + enddo + + call mpi_allreduce(rms_work, rms, 5, dp_type, + > MPI_SUM, comm_setup, error) + + do m = 1, 5 + do d = 1, 3 + rms(m) = rms(m) / dble(grid_points(d)-2) + enddo + rms(m) = dsqrt(rms(m)) + enddo + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine rhs_norm(rms) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer c, i, j, k, d, m, error + double precision rms(5), rms_work(5), add + + do m = 1, 5 + rms_work(m) = 0.0d0 + enddo +!DVM$ get_actual(rhs) + do c = 1, ncells + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + add = rhs(m,i,j,k,c) + rms_work(m) = rms_work(m) + add*add + enddo + enddo + enddo + enddo + enddo + + call mpi_allreduce(rms_work, rms, 5, dp_type, + > MPI_SUM, comm_setup, error) + + do m = 1, 5 + do d = 1, 3 + rms(m) = rms(m) / dble(grid_points(d)-2) + enddo + rms(m) = dsqrt(rms(m)) + enddo + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/exact_rhs.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/exact_rhs.f new file mode 100644 index 0000000..26a2871 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/exact_rhs.f @@ -0,0 +1,360 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine exact_rhs + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c compute the right hand side based on exact solution +c--------------------------------------------------------------------- + + include 'header.h' + + double precision dtemp(5), xi, eta, zeta, dtpp + integer c, m, i, j, k, ip1, im1, jp1, + > jm1, km1, kp1 + + +c--------------------------------------------------------------------- +c loop over all cells owned by this node +c--------------------------------------------------------------------- + do c = 1, ncells + +c--------------------------------------------------------------------- +c initialize +c--------------------------------------------------------------------- + do k= 0, cell_size(3,c)-1 + do j = 0, cell_size(2,c)-1 + do i = 0, cell_size(1,c)-1 + do m = 1, 5 + forcing(m,i,j,k,c) = 0.0d0 + enddo + enddo + enddo + enddo + +c--------------------------------------------------------------------- +c xi-direction flux differences +c--------------------------------------------------------------------- + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + zeta = dble(k+cell_low(3,c)) * dnzm1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + eta = dble(j+cell_low(2,c)) * dnym1 + + do i=-2*(1-start(1,c)), cell_size(1,c)+1-2*end(1,c) + xi = dble(i+cell_low(1,c)) * dnxm1 + + call exact_solution(xi, eta, zeta, dtemp) + do m = 1, 5 + ue(i,m) = dtemp(m) + enddo + + dtpp = 1.0d0 / dtemp(1) + + do m = 2, 5 + buf(i,m) = dtpp * dtemp(m) + enddo + + cuf(i) = buf(i,2) * buf(i,2) + buf(i,1) = cuf(i) + buf(i,3) * buf(i,3) + + > buf(i,4) * buf(i,4) + q(i) = 0.5d0*(buf(i,2)*ue(i,2) + buf(i,3)*ue(i,3) + + > buf(i,4)*ue(i,4)) + + enddo + + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + im1 = i-1 + ip1 = i+1 + + forcing(1,i,j,k,c) = forcing(1,i,j,k,c) - + > tx2*( ue(ip1,2)-ue(im1,2) )+ + > dx1tx1*(ue(ip1,1)-2.0d0*ue(i,1)+ue(im1,1)) + + forcing(2,i,j,k,c) = forcing(2,i,j,k,c) - tx2 * ( + > (ue(ip1,2)*buf(ip1,2)+c2*(ue(ip1,5)-q(ip1)))- + > (ue(im1,2)*buf(im1,2)+c2*(ue(im1,5)-q(im1))))+ + > xxcon1*(buf(ip1,2)-2.0d0*buf(i,2)+buf(im1,2))+ + > dx2tx1*( ue(ip1,2)-2.0d0* ue(i,2)+ue(im1,2)) + + forcing(3,i,j,k,c) = forcing(3,i,j,k,c) - tx2 * ( + > ue(ip1,3)*buf(ip1,2)-ue(im1,3)*buf(im1,2))+ + > xxcon2*(buf(ip1,3)-2.0d0*buf(i,3)+buf(im1,3))+ + > dx3tx1*( ue(ip1,3)-2.0d0*ue(i,3) +ue(im1,3)) + + forcing(4,i,j,k,c) = forcing(4,i,j,k,c) - tx2*( + > ue(ip1,4)*buf(ip1,2)-ue(im1,4)*buf(im1,2))+ + > xxcon2*(buf(ip1,4)-2.0d0*buf(i,4)+buf(im1,4))+ + > dx4tx1*( ue(ip1,4)-2.0d0* ue(i,4)+ ue(im1,4)) + + forcing(5,i,j,k,c) = forcing(5,i,j,k,c) - tx2*( + > buf(ip1,2)*(c1*ue(ip1,5)-c2*q(ip1))- + > buf(im1,2)*(c1*ue(im1,5)-c2*q(im1)))+ + > 0.5d0*xxcon3*(buf(ip1,1)-2.0d0*buf(i,1)+ + > buf(im1,1))+ + > xxcon4*(cuf(ip1)-2.0d0*cuf(i)+cuf(im1))+ + > xxcon5*(buf(ip1,5)-2.0d0*buf(i,5)+buf(im1,5))+ + > dx5tx1*( ue(ip1,5)-2.0d0* ue(i,5)+ ue(im1,5)) + enddo + +c--------------------------------------------------------------------- +c Fourth-order dissipation +c--------------------------------------------------------------------- + if (start(1,c) .gt. 0) then + do m = 1, 5 + i = 1 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (5.0d0*ue(i,m) - 4.0d0*ue(i+1,m) +ue(i+2,m)) + i = 2 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (-4.0d0*ue(i-1,m) + 6.0d0*ue(i,m) - + > 4.0d0*ue(i+1,m) + ue(i+2,m)) + enddo + endif + + do i = start(1,c)*3, cell_size(1,c)-3*end(1,c)-1 + do m = 1, 5 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp* + > (ue(i-2,m) - 4.0d0*ue(i-1,m) + + > 6.0d0*ue(i,m) - 4.0d0*ue(i+1,m) + ue(i+2,m)) + enddo + enddo + + if (end(1,c) .gt. 0) then + do m = 1, 5 + i = cell_size(1,c)-3 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (ue(i-2,m) - 4.0d0*ue(i-1,m) + + > 6.0d0*ue(i,m) - 4.0d0*ue(i+1,m)) + i = cell_size(1,c)-2 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (ue(i-2,m) - 4.0d0*ue(i-1,m) + 5.0d0*ue(i,m)) + enddo + endif + + enddo + enddo + +c--------------------------------------------------------------------- +c eta-direction flux differences +c--------------------------------------------------------------------- + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + zeta = dble(k+cell_low(3,c)) * dnzm1 + do i=start(1,c), cell_size(1,c)-end(1,c)-1 + xi = dble(i+cell_low(1,c)) * dnxm1 + + do j=-2*(1-start(2,c)), cell_size(2,c)+1-2*end(2,c) + eta = dble(j+cell_low(2,c)) * dnym1 + + call exact_solution(xi, eta, zeta, dtemp) + do m = 1, 5 + ue(j,m) = dtemp(m) + enddo + + dtpp = 1.0d0/dtemp(1) + + do m = 2, 5 + buf(j,m) = dtpp * dtemp(m) + enddo + + cuf(j) = buf(j,3) * buf(j,3) + buf(j,1) = cuf(j) + buf(j,2) * buf(j,2) + + > buf(j,4) * buf(j,4) + q(j) = 0.5d0*(buf(j,2)*ue(j,2) + buf(j,3)*ue(j,3) + + > buf(j,4)*ue(j,4)) + enddo + + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + jm1 = j-1 + jp1 = j+1 + + forcing(1,i,j,k,c) = forcing(1,i,j,k,c) - + > ty2*( ue(jp1,3)-ue(jm1,3) )+ + > dy1ty1*(ue(jp1,1)-2.0d0*ue(j,1)+ue(jm1,1)) + + forcing(2,i,j,k,c) = forcing(2,i,j,k,c) - ty2*( + > ue(jp1,2)*buf(jp1,3)-ue(jm1,2)*buf(jm1,3))+ + > yycon2*(buf(jp1,2)-2.0d0*buf(j,2)+buf(jm1,2))+ + > dy2ty1*( ue(jp1,2)-2.0* ue(j,2)+ ue(jm1,2)) + + forcing(3,i,j,k,c) = forcing(3,i,j,k,c) - ty2*( + > (ue(jp1,3)*buf(jp1,3)+c2*(ue(jp1,5)-q(jp1)))- + > (ue(jm1,3)*buf(jm1,3)+c2*(ue(jm1,5)-q(jm1))))+ + > yycon1*(buf(jp1,3)-2.0d0*buf(j,3)+buf(jm1,3))+ + > dy3ty1*( ue(jp1,3)-2.0d0*ue(j,3) +ue(jm1,3)) + + forcing(4,i,j,k,c) = forcing(4,i,j,k,c) - ty2*( + > ue(jp1,4)*buf(jp1,3)-ue(jm1,4)*buf(jm1,3))+ + > yycon2*(buf(jp1,4)-2.0d0*buf(j,4)+buf(jm1,4))+ + > dy4ty1*( ue(jp1,4)-2.0d0*ue(j,4)+ ue(jm1,4)) + + forcing(5,i,j,k,c) = forcing(5,i,j,k,c) - ty2*( + > buf(jp1,3)*(c1*ue(jp1,5)-c2*q(jp1))- + > buf(jm1,3)*(c1*ue(jm1,5)-c2*q(jm1)))+ + > 0.5d0*yycon3*(buf(jp1,1)-2.0d0*buf(j,1)+ + > buf(jm1,1))+ + > yycon4*(cuf(jp1)-2.0d0*cuf(j)+cuf(jm1))+ + > yycon5*(buf(jp1,5)-2.0d0*buf(j,5)+buf(jm1,5))+ + > dy5ty1*(ue(jp1,5)-2.0d0*ue(j,5)+ue(jm1,5)) + enddo + +c--------------------------------------------------------------------- +c Fourth-order dissipation +c--------------------------------------------------------------------- + if (start(2,c) .gt. 0) then + do m = 1, 5 + j = 1 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (5.0d0*ue(j,m) - 4.0d0*ue(j+1,m) +ue(j+2,m)) + j = 2 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (-4.0d0*ue(j-1,m) + 6.0d0*ue(j,m) - + > 4.0d0*ue(j+1,m) + ue(j+2,m)) + enddo + endif + + do j = start(2,c)*3, cell_size(2,c)-3*end(2,c)-1 + do m = 1, 5 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp* + > (ue(j-2,m) - 4.0d0*ue(j-1,m) + + > 6.0d0*ue(j,m) - 4.0d0*ue(j+1,m) + ue(j+2,m)) + enddo + enddo + + if (end(2,c) .gt. 0) then + do m = 1, 5 + j = cell_size(2,c)-3 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (ue(j-2,m) - 4.0d0*ue(j-1,m) + + > 6.0d0*ue(j,m) - 4.0d0*ue(j+1,m)) + j = cell_size(2,c)-2 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (ue(j-2,m) - 4.0d0*ue(j-1,m) + 5.0d0*ue(j,m)) + + enddo + endif + + enddo + enddo + +c--------------------------------------------------------------------- +c zeta-direction flux differences +c--------------------------------------------------------------------- + do j=start(2,c), cell_size(2,c)-end(2,c)-1 + eta = dble(j+cell_low(2,c)) * dnym1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + xi = dble(i+cell_low(1,c)) * dnxm1 + + do k=-2*(1-start(3,c)), cell_size(3,c)+1-2*end(3,c) + zeta = dble(k+cell_low(3,c)) * dnzm1 + + call exact_solution(xi, eta, zeta, dtemp) + do m = 1, 5 + ue(k,m) = dtemp(m) + enddo + + dtpp = 1.0d0/dtemp(1) + + do m = 2, 5 + buf(k,m) = dtpp * dtemp(m) + enddo + + cuf(k) = buf(k,4) * buf(k,4) + buf(k,1) = cuf(k) + buf(k,2) * buf(k,2) + + > buf(k,3) * buf(k,3) + q(k) = 0.5d0*(buf(k,2)*ue(k,2) + buf(k,3)*ue(k,3) + + > buf(k,4)*ue(k,4)) + enddo + + do k=start(3,c), cell_size(3,c)-end(3,c)-1 + km1 = k-1 + kp1 = k+1 + + forcing(1,i,j,k,c) = forcing(1,i,j,k,c) - + > tz2*( ue(kp1,4)-ue(km1,4) )+ + > dz1tz1*(ue(kp1,1)-2.0d0*ue(k,1)+ue(km1,1)) + + forcing(2,i,j,k,c) = forcing(2,i,j,k,c) - tz2 * ( + > ue(kp1,2)*buf(kp1,4)-ue(km1,2)*buf(km1,4))+ + > zzcon2*(buf(kp1,2)-2.0d0*buf(k,2)+buf(km1,2))+ + > dz2tz1*( ue(kp1,2)-2.0d0* ue(k,2)+ ue(km1,2)) + + forcing(3,i,j,k,c) = forcing(3,i,j,k,c) - tz2 * ( + > ue(kp1,3)*buf(kp1,4)-ue(km1,3)*buf(km1,4))+ + > zzcon2*(buf(kp1,3)-2.0d0*buf(k,3)+buf(km1,3))+ + > dz3tz1*(ue(kp1,3)-2.0d0*ue(k,3)+ue(km1,3)) + + forcing(4,i,j,k,c) = forcing(4,i,j,k,c) - tz2 * ( + > (ue(kp1,4)*buf(kp1,4)+c2*(ue(kp1,5)-q(kp1)))- + > (ue(km1,4)*buf(km1,4)+c2*(ue(km1,5)-q(km1))))+ + > zzcon1*(buf(kp1,4)-2.0d0*buf(k,4)+buf(km1,4))+ + > dz4tz1*( ue(kp1,4)-2.0d0*ue(k,4) +ue(km1,4)) + + forcing(5,i,j,k,c) = forcing(5,i,j,k,c) - tz2 * ( + > buf(kp1,4)*(c1*ue(kp1,5)-c2*q(kp1))- + > buf(km1,4)*(c1*ue(km1,5)-c2*q(km1)))+ + > 0.5d0*zzcon3*(buf(kp1,1)-2.0d0*buf(k,1) + > +buf(km1,1))+ + > zzcon4*(cuf(kp1)-2.0d0*cuf(k)+cuf(km1))+ + > zzcon5*(buf(kp1,5)-2.0d0*buf(k,5)+buf(km1,5))+ + > dz5tz1*( ue(kp1,5)-2.0d0*ue(k,5)+ ue(km1,5)) + enddo + +c--------------------------------------------------------------------- +c Fourth-order dissipation +c--------------------------------------------------------------------- + if (start(3,c) .gt. 0) then + do m = 1, 5 + k = 1 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (5.0d0*ue(k,m) - 4.0d0*ue(k+1,m) +ue(k+2,m)) + k = 2 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (-4.0d0*ue(k-1,m) + 6.0d0*ue(k,m) - + > 4.0d0*ue(k+1,m) + ue(k+2,m)) + enddo + endif + + do k = start(3,c)*3, cell_size(3,c)-3*end(3,c)-1 + do m = 1, 5 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp* + > (ue(k-2,m) - 4.0d0*ue(k-1,m) + + > 6.0d0*ue(k,m) - 4.0d0*ue(k+1,m) + ue(k+2,m)) + enddo + enddo + + if (end(3,c) .gt. 0) then + do m = 1, 5 + k = cell_size(3,c)-3 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (ue(k-2,m) - 4.0d0*ue(k-1,m) + + > 6.0d0*ue(k,m) - 4.0d0*ue(k+1,m)) + k = cell_size(3,c)-2 + forcing(m,i,j,k,c) = forcing(m,i,j,k,c) - dssp * + > (ue(k-2,m) - 4.0d0*ue(k-1,m) + 5.0d0*ue(k,m)) + enddo + endif + + enddo + enddo + +c--------------------------------------------------------------------- +c now change the sign of the forcing function, +c--------------------------------------------------------------------- + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + forcing(m,i,j,k,c) = -1.d0 * forcing(m,i,j,k,c) + enddo + enddo + enddo + enddo + + enddo + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/exact_solution.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/exact_solution.f new file mode 100644 index 0000000..b093b46 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/exact_solution.f @@ -0,0 +1,29 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine exact_solution(xi,eta,zeta,dtemp) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c this function returns the exact solution at point xi, eta, zeta +c--------------------------------------------------------------------- + + include 'header.h' + + double precision xi, eta, zeta, dtemp(5) + integer m + + do m = 1, 5 + dtemp(m) = ce(m,1) + + > xi*(ce(m,2) + xi*(ce(m,5) + xi*(ce(m,8) + xi*ce(m,11)))) + + > eta*(ce(m,3) + eta*(ce(m,6) + eta*(ce(m,9) + eta*ce(m,12))))+ + > zeta*(ce(m,4) + zeta*(ce(m,7) + zeta*(ce(m,10) + + > zeta*ce(m,13)))) + enddo + + return + end + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/fortran_io.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/fortran_io.f new file mode 100644 index 0000000..d3085a0 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/fortran_io.f @@ -0,0 +1,174 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine setup_btio + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + character*(128) newfilenm + integer m, ierr + + if (node.eq.root) record_length = 40/fortran_rec_sz + call mpi_bcast(record_length, 1, MPI_INTEGER, + > root, comm_setup, ierr) + + open (unit=99, file=filenm, + $ form='unformatted', access='direct', + $ recl=record_length) + + do m = 1, 5 + xce_sub(m) = 0.d0 + end do + + idump_sub = 0 + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine output_timestep + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + include 'header.h' + include 'mpinpb.h' + + integer ix, jio, kio, cio + + do cio=1,ncells + do kio=0, cell_size(3,cio)-1 + do jio=0, cell_size(2,cio)-1 + iseek=(cell_low(1,cio) + + $ PROBLEM_SIZE*((cell_low(2,cio)+jio) + + $ PROBLEM_SIZE*((cell_low(3,cio)+kio) + + $ PROBLEM_SIZE*idump_sub))) + + do ix=0,cell_size(1,cio)-1 + write(99, rec=iseek+ix+1) + $ u(1,ix, jio,kio,cio), + $ u(2,ix, jio,kio,cio), + $ u(3,ix, jio,kio,cio), + $ u(4,ix, jio,kio,cio), + $ u(5,ix, jio,kio,cio) + enddo + enddo + enddo + enddo + + idump_sub = idump_sub + 1 + if (rd_interval .gt. 0) then + if (idump_sub .ge. rd_interval) then + + call acc_sub_norms(idump+1) + + idump_sub = 0 + endif + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine acc_sub_norms(idump_cur) + + include 'header.h' + include 'mpinpb.h' + + integer idump_cur + + integer ix, jio, kio, cio, ii, m, ichunk + double precision xce_single(5) + + ichunk = idump_cur - idump_sub + 1 + do ii=0, idump_sub-1 + do cio=1,ncells + do kio=0, cell_size(3,cio)-1 + do jio=0, cell_size(2,cio)-1 + iseek=(cell_low(1,cio) + + $ PROBLEM_SIZE*((cell_low(2,cio)+jio) + + $ PROBLEM_SIZE*((cell_low(3,cio)+kio) + + $ PROBLEM_SIZE*ii))) + + + do ix=0,cell_size(1,cio)-1 + read(99, rec=iseek+ix+1) + $ u(1,ix, jio,kio,cio), + $ u(2,ix, jio,kio,cio), + $ u(3,ix, jio,kio,cio), + $ u(4,ix, jio,kio,cio), + $ u(5,ix, jio,kio,cio) + enddo + enddo + enddo + enddo + + if (node .eq. root) print *, 'Reading data set ', ii+ichunk + + call error_norm(xce_single) + do m = 1, 5 + xce_sub(m) = xce_sub(m) + xce_single(m) + end do + enddo + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine btio_cleanup + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + close(unit=99) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine accumulate_norms(xce_acc) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + include 'header.h' + include 'mpinpb.h' + + double precision xce_acc(5) + integer m + + if (rd_interval .gt. 0) goto 20 + + open (unit=99, file=filenm, + $ form='unformatted', access='direct', + $ recl=record_length) + +c clear the last time step + + call clear_timestep + +c read back the time steps and accumulate norms + + call acc_sub_norms(idump) + + close(unit=99) + + 20 continue + do m = 1, 5 + xce_acc(m) = xce_sub(m) / dble(idump) + end do + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/full_mpiio.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/full_mpiio.f new file mode 100644 index 0000000..ecfd41c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/full_mpiio.f @@ -0,0 +1,307 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine setup_btio + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer ierr + integer mstatus(MPI_STATUS_SIZE) + integer sizes(4), starts(4), subsizes(4) + integer cell_btype(maxcells), cell_ftype(maxcells) + integer cell_blength(maxcells) + integer info + character*20 cb_nodes, cb_size + integer c, m + integer cell_disp(maxcells) + + call mpi_bcast(collbuf_nodes, 1, MPI_INTEGER, + > root, comm_setup, ierr) + + call mpi_bcast(collbuf_size, 1, MPI_INTEGER, + > root, comm_setup, ierr) + + if (collbuf_nodes .eq. 0) then + info = MPI_INFO_NULL + else + write (cb_nodes,*) collbuf_nodes + write (cb_size,*) collbuf_size + call MPI_Info_create(info, ierr) + call MPI_Info_set(info, 'cb_nodes', cb_nodes, ierr) + call MPI_Info_set(info, 'cb_buffer_size', cb_size, ierr) + call MPI_Info_set(info, 'collective_buffering', 'true', ierr) + endif + + call MPI_Type_contiguous(5, MPI_DOUBLE_PRECISION, + $ element, ierr) + call MPI_Type_commit(element, ierr) + call MPI_Type_extent(element, eltext, ierr) + + do c = 1, ncells +c +c Outer array dimensions ar same for every cell +c + sizes(1) = IMAX+4 + sizes(2) = JMAX+4 + sizes(3) = KMAX+4 +c +c 4th dimension is cell number, total of maxcells cells +c + sizes(4) = maxcells +c +c Internal dimensions of cells can differ slightly between cells +c + subsizes(1) = cell_size(1, c) + subsizes(2) = cell_size(2, c) + subsizes(3) = cell_size(3, c) +c +c Cell is 4th dimension, 1 cell per cell type to handle varying +c cell sub-array sizes +c + subsizes(4) = 1 + +c +c type constructors use 0-based start addresses +c + starts(1) = 2 + starts(2) = 2 + starts(3) = 2 + starts(4) = c-1 + +c +c Create buftype for a cell +c + call MPI_Type_create_subarray(4, sizes, subsizes, + $ starts, MPI_ORDER_FORTRAN, element, + $ cell_btype(c), ierr) +c +c block length and displacement for joining cells - +c 1 cell buftype per block, cell buftypes have own displacment +c generated from cell number (4th array dimension) +c + cell_blength(c) = 1 + cell_disp(c) = 0 + + enddo +c +c Create combined buftype for all cells +c + call MPI_Type_struct(ncells, cell_blength, cell_disp, + $ cell_btype, combined_btype, ierr) + call MPI_Type_commit(combined_btype, ierr) + + do c = 1, ncells +c +c Entire array size +c + sizes(1) = PROBLEM_SIZE + sizes(2) = PROBLEM_SIZE + sizes(3) = PROBLEM_SIZE + +c +c Size of c'th cell +c + subsizes(1) = cell_size(1, c) + subsizes(2) = cell_size(2, c) + subsizes(3) = cell_size(3, c) + +c +c Starting point in full array of c'th cell +c + starts(1) = cell_low(1,c) + starts(2) = cell_low(2,c) + starts(3) = cell_low(3,c) + + call MPI_Type_create_subarray(3, sizes, subsizes, + $ starts, MPI_ORDER_FORTRAN, + $ element, cell_ftype(c), ierr) + cell_blength(c) = 1 + cell_disp(c) = 0 + enddo + + call MPI_Type_struct(ncells, cell_blength, cell_disp, + $ cell_ftype, combined_ftype, ierr) + call MPI_Type_commit(combined_ftype, ierr) + + iseek=0 + if (node .eq. root) then + call MPI_File_delete(filenm, MPI_INFO_NULL, ierr) + endif + + + call MPI_Barrier(comm_solve, ierr) + + call MPI_File_open(comm_solve, + $ filenm, + $ MPI_MODE_RDWR+MPI_MODE_CREATE, + $ MPI_INFO_NULL, fp, ierr) + + if (ierr .ne. MPI_SUCCESS) then + print *, 'Error opening file' + stop + endif + + call MPI_File_set_view(fp, iseek, element, + $ combined_ftype, 'native', info, ierr) + + if (ierr .ne. MPI_SUCCESS) then + print *, 'Error setting file view' + stop + endif + + do m = 1, 5 + xce_sub(m) = 0.d0 + end do + + idump_sub = 0 + + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine output_timestep + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + include 'header.h' + include 'mpinpb.h' + + integer mstatus(MPI_STATUS_SIZE) + integer ierr + + call MPI_File_write_at_all(fp, iseek, u, + $ 1, combined_btype, mstatus, ierr) + if (ierr .ne. MPI_SUCCESS) then + print *, 'Error writing to file' + stop + endif + + call MPI_Type_size(combined_btype, iosize, ierr) + iseek = iseek + iosize/eltext + + idump_sub = idump_sub + 1 + if (rd_interval .gt. 0) then + if (idump_sub .ge. rd_interval) then + + iseek = 0 + call acc_sub_norms(idump+1) + + iseek = 0 + idump_sub = 0 + endif + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine acc_sub_norms(idump_cur) + + include 'header.h' + include 'mpinpb.h' + + integer idump_cur + + integer ii, m, ichunk + integer ierr + integer mstatus(MPI_STATUS_SIZE) + double precision xce_single(5) + + ichunk = idump_cur - idump_sub + 1 + do ii=0, idump_sub-1 + + call MPI_File_read_at_all(fp, iseek, u, + $ 1, combined_btype, mstatus, ierr) + if (ierr .ne. MPI_SUCCESS) then + print *, 'Error reading back file' + call MPI_File_close(fp, ierr) + stop + endif + + call MPI_Type_size(combined_btype, iosize, ierr) + iseek = iseek + iosize/eltext + + if (node .eq. root) print *, 'Reading data set ', ii+ichunk + + call error_norm(xce_single) + do m = 1, 5 + xce_sub(m) = xce_sub(m) + xce_single(m) + end do + enddo + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine btio_cleanup + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + include 'header.h' + include 'mpinpb.h' + + integer ierr + + call MPI_File_close(fp, ierr) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + + subroutine accumulate_norms(xce_acc) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + double precision xce_acc(5) + integer m, ierr + + if (rd_interval .gt. 0) goto 20 + + call MPI_File_open(comm_solve, + $ filenm, + $ MPI_MODE_RDONLY, + $ MPI_INFO_NULL, + $ fp, + $ ierr) + + iseek = 0 + call MPI_File_set_view(fp, iseek, element, combined_ftype, + $ 'native', MPI_INFO_NULL, ierr) + +c clear the last time step + + call clear_timestep + +c read back the time steps and accumulate norms + + call acc_sub_norms(idump) + + call MPI_File_close(fp, ierr) + + 20 continue + do m = 1, 5 + xce_acc(m) = xce_sub(m) / dble(idump) + end do + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/header.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/header.h new file mode 100644 index 0000000..cb815eb --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/header.h @@ -0,0 +1,146 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- +c +c header.h +c +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + implicit none + +c--------------------------------------------------------------------- +c The following include file is generated automatically by the +c "setparams" utility. It defines +c maxcells: the square root of the maximum number of processors +c problem_size: 12, 64, 102, 162 (for class T, A, B, C) +c dt_default: default time step for this problem size if no +c config file +c niter_default: default number of iterations for this problem size +c--------------------------------------------------------------------- + + include 'npbparams.h' + + integer aa, bb, cc, BLOCK_SIZE + parameter (aa=1, bb=2, cc=3, BLOCK_SIZE=5) + + integer ncells, grid_points(3) + double precision elapsed_time + common /global/ elapsed_time, ncells, grid_points + + double precision tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3, + > dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4, + > dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt, + > ce(5,13), dxmax, dymax, dzmax, xxcon1, xxcon2, + > xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1, + > dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4, + > yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1, + > zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1, + > dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1, + > dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2, + > c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1, bt, + > dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1, + > c2dtty1, c2dttz1, comz1, comz4, comz5, comz6, + > c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16 + + common /constants/ tx1, tx2, tx3, ty1, ty2, ty3, tz1, tz2, tz3, + > dx1, dx2, dx3, dx4, dx5, dy1, dy2, dy3, dy4, + > dy5, dz1, dz2, dz3, dz4, dz5, dssp, dt, + > ce, dxmax, dymax, dzmax, xxcon1, xxcon2, + > xxcon3, xxcon4, xxcon5, dx1tx1, dx2tx1, dx3tx1, + > dx4tx1, dx5tx1, yycon1, yycon2, yycon3, yycon4, + > yycon5, dy1ty1, dy2ty1, dy3ty1, dy4ty1, dy5ty1, + > zzcon1, zzcon2, zzcon3, zzcon4, zzcon5, dz1tz1, + > dz2tz1, dz3tz1, dz4tz1, dz5tz1, dnxm1, dnym1, + > dnzm1, c1c2, c1c5, c3c4, c1345, conz1, c1, c2, + > c3, c4, c5, c4dssp, c5dssp, dtdssp, dttx1, bt, + > dttx2, dtty1, dtty2, dttz1, dttz2, c2dttx1, + > c2dtty1, c2dttz1, comz1, comz4, comz5, comz6, + > c3c4tx3, c3c4ty3, c3c4tz3, c2iv, con43, con16 + + integer EAST, WEST, NORTH, SOUTH, + > BOTTOM, TOP + + parameter (EAST=2000, WEST=3000, NORTH=4000, SOUTH=5000, + > BOTTOM=6000, TOP=7000) + + integer cell_coord (3,maxcells), cell_low (3,maxcells), + > cell_high (3,maxcells), cell_size(3,maxcells), + > predecessor(3), slice (3,maxcells), + > grid_size (3), successor(3) , + > start (3,maxcells), end (3,maxcells) + common /partition/ cell_coord, cell_low, cell_high, cell_size, + > grid_size, successor, predecessor, slice, + > start, end + + integer IMAX, JMAX, KMAX, MAX_CELL_DIM, BUF_SIZE + + parameter (MAX_CELL_DIM = (problem_size/maxcells)+1) + + parameter (IMAX=MAX_CELL_DIM,JMAX=MAX_CELL_DIM,KMAX=MAX_CELL_DIM) + + parameter (BUF_SIZE=MAX_CELL_DIM*MAX_CELL_DIM*(maxcells-1)*60+1) + + double precision + > us ( -1:IMAX, -1:JMAX, -1:KMAX, maxcells), + > vs ( -1:IMAX, -1:JMAX, -1:KMAX, maxcells), + > ws ( -1:IMAX, -1:JMAX, -1:KMAX, maxcells), + > qs ( -1:IMAX, -1:JMAX, -1:KMAX, maxcells), + > rho_i ( -1:IMAX, -1:JMAX, -1:KMAX, maxcells), + > square ( -1:IMAX, -1:JMAX, -1:KMAX, maxcells), + > forcing (5, 0:IMAX-1, 0:JMAX-1, 0:KMAX-1, maxcells), + > u (5, -2:IMAX+1,-2:JMAX+1,-2:KMAX+1, maxcells), + > rhs (5, -1:IMAX-1,-1:JMAX-1,-1:KMAX-1, maxcells), + > lhsc (5,5,-1:IMAX-1,-1:JMAX-1,-1:KMAX-1, maxcells), + > backsub_info (5, 0:MAX_CELL_DIM, 0:MAX_CELL_DIM, maxcells), + > in_buffer(BUF_SIZE), out_buffer(BUF_SIZE) + common /fields/ u, us, vs, ws, qs, rho_i, square, + > rhs, forcing, lhsc, in_buffer, out_buffer, + > backsub_info + + double precision cv(-2:MAX_CELL_DIM+1), rhon(-2:MAX_CELL_DIM+1), + > rhos(-2:MAX_CELL_DIM+1), rhoq(-2:MAX_CELL_DIM+1), + > cuf(-2:MAX_CELL_DIM+1), q(-2:MAX_CELL_DIM+1), + > ue(-2:MAX_CELL_DIM+1,5), buf(-2:MAX_CELL_DIM+1,5) + common /work_1d/ cv, rhon, rhos, rhoq, cuf, q, ue, buf + + integer west_size, east_size, bottom_size, top_size, + > north_size, south_size, start_send_west, + > start_send_east, start_send_south, start_send_north, + > start_send_bottom, start_send_top, start_recv_west, + > start_recv_east, start_recv_south, start_recv_north, + > start_recv_bottom, start_recv_top + common /box/ west_size, east_size, bottom_size, + > top_size, north_size, south_size, + > start_send_west, start_send_east, start_send_south, + > start_send_north, start_send_bottom, start_send_top, + > start_recv_west, start_recv_east, start_recv_south, + > start_recv_north, start_recv_bottom, start_recv_top + + double precision tmp_block(5,5), b_inverse(5,5), tmp_vec(5) + common /work_solve/ tmp_block, b_inverse, tmp_vec + +c +c These are used by btio +c + integer collbuf_nodes, collbuf_size, iosize, eltext, + $ combined_btype, fp, idump, record_length, element, + $ combined_ftype, idump_sub, rd_interval + common /btio/ collbuf_nodes, collbuf_size, iosize, eltext, + $ combined_btype, fp, idump, record_length, + $ idump_sub, rd_interval + double precision sum(niter_default), xce_sub(5) + common /btio/ sum, xce_sub + integer*8 iseek + common /btio/ iseek, element, combined_ftype + + + integer t_total, t_io, t_rhs, t_xsolve, t_ysolve, t_zsolve, + > t_bpack, t_exch, t_xcomm, t_ycomm, t_zcomm, t_last + parameter (t_total=1, t_io=2, t_rhs=3, t_xsolve=4, t_ysolve=5, + > t_zsolve=6, t_bpack=7, t_exch=8, t_xcomm=9, + > t_ycomm=10, t_zcomm=11, t_last=11) + logical timeron + common /tflags/ timeron + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/initialize.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/initialize.f new file mode 100644 index 0000000..f18f662 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/initialize.f @@ -0,0 +1,283 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine initialize + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c This subroutine initializes the field variable u using +c tri-linear transfinite interpolation of the boundary values +c--------------------------------------------------------------------- + + include 'header.h' + + integer c, i, j, k, m, ii, jj, kk, ix, iy, iz + double precision xi, eta, zeta, Pface(5,3,2), Pxi, Peta, + > Pzeta, temp(5) + +c--------------------------------------------------------------------- +c Later (in compute_rhs) we compute 1/u for every element. A few of +c the corner elements are not used, but it convenient (and faster) +c to compute the whole thing with a simple loop. Make sure those +c values are nonzero by initializing the whole thing here. +c--------------------------------------------------------------------- + do c = 1, ncells + do kk = -1, KMAX + do jj = -1, JMAX + do ii = -1, IMAX + do m = 1, 5 + u(m, ii, jj, kk, c) = 1.0 + end do + end do + end do + end do + end do +c--------------------------------------------------------------------- + + + +c--------------------------------------------------------------------- +c first store the "interpolated" values everywhere on the grid +c--------------------------------------------------------------------- + do c=1, ncells + kk = 0 + do k = cell_low(3,c), cell_high(3,c) + zeta = dble(k) * dnzm1 + jj = 0 + do j = cell_low(2,c), cell_high(2,c) + eta = dble(j) * dnym1 + ii = 0 + do i = cell_low(1,c), cell_high(1,c) + xi = dble(i) * dnxm1 + + do ix = 1, 2 + call exact_solution(dble(ix-1), eta, zeta, + > Pface(1,1,ix)) + enddo + + do iy = 1, 2 + call exact_solution(xi, dble(iy-1) , zeta, + > Pface(1,2,iy)) + enddo + + do iz = 1, 2 + call exact_solution(xi, eta, dble(iz-1), + > Pface(1,3,iz)) + enddo + + do m = 1, 5 + Pxi = xi * Pface(m,1,2) + + > (1.0d0-xi) * Pface(m,1,1) + Peta = eta * Pface(m,2,2) + + > (1.0d0-eta) * Pface(m,2,1) + Pzeta = zeta * Pface(m,3,2) + + > (1.0d0-zeta) * Pface(m,3,1) + + u(m,ii,jj,kk,c) = Pxi + Peta + Pzeta - + > Pxi*Peta - Pxi*Pzeta - Peta*Pzeta + + > Pxi*Peta*Pzeta + + enddo + ii = ii + 1 + enddo + jj = jj + 1 + enddo + kk = kk+1 + enddo + enddo + +c--------------------------------------------------------------------- +c now store the exact values on the boundaries +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c west face +c--------------------------------------------------------------------- + c = slice(1,1) + ii = 0 + xi = 0.0d0 + kk = 0 + do k = cell_low(3,c), cell_high(3,c) + zeta = dble(k) * dnzm1 + jj = 0 + do j = cell_low(2,c), cell_high(2,c) + eta = dble(j) * dnym1 + call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + u(m,ii,jj,kk,c) = temp(m) + enddo + jj = jj + 1 + enddo + kk = kk + 1 + enddo + +c--------------------------------------------------------------------- +c east face +c--------------------------------------------------------------------- + c = slice(1,ncells) + ii = cell_size(1,c)-1 + xi = 1.0d0 + kk = 0 + do k = cell_low(3,c), cell_high(3,c) + zeta = dble(k) * dnzm1 + jj = 0 + do j = cell_low(2,c), cell_high(2,c) + eta = dble(j) * dnym1 + call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + u(m,ii,jj,kk,c) = temp(m) + enddo + jj = jj + 1 + enddo + kk = kk + 1 + enddo + +c--------------------------------------------------------------------- +c south face +c--------------------------------------------------------------------- + c = slice(2,1) + jj = 0 + eta = 0.0d0 + kk = 0 + do k = cell_low(3,c), cell_high(3,c) + zeta = dble(k) * dnzm1 + ii = 0 + do i = cell_low(1,c), cell_high(1,c) + xi = dble(i) * dnxm1 + call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + u(m,ii,jj,kk,c) = temp(m) + enddo + ii = ii + 1 + enddo + kk = kk + 1 + enddo + + +c--------------------------------------------------------------------- +c north face +c--------------------------------------------------------------------- + c = slice(2,ncells) + jj = cell_size(2,c)-1 + eta = 1.0d0 + kk = 0 + do k = cell_low(3,c), cell_high(3,c) + zeta = dble(k) * dnzm1 + ii = 0 + do i = cell_low(1,c), cell_high(1,c) + xi = dble(i) * dnxm1 + call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + u(m,ii,jj,kk,c) = temp(m) + enddo + ii = ii + 1 + enddo + kk = kk + 1 + enddo + +c--------------------------------------------------------------------- +c bottom face +c--------------------------------------------------------------------- + c = slice(3,1) + kk = 0 + zeta = 0.0d0 + jj = 0 + do j = cell_low(2,c), cell_high(2,c) + eta = dble(j) * dnym1 + ii = 0 + do i =cell_low(1,c), cell_high(1,c) + xi = dble(i) *dnxm1 + call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + u(m,ii,jj,kk,c) = temp(m) + enddo + ii = ii + 1 + enddo + jj = jj + 1 + enddo + +c--------------------------------------------------------------------- +c top face +c--------------------------------------------------------------------- + c = slice(3,ncells) + kk = cell_size(3,c)-1 + zeta = 1.0d0 + jj = 0 + do j = cell_low(2,c), cell_high(2,c) + eta = dble(j) * dnym1 + ii = 0 + do i =cell_low(1,c), cell_high(1,c) + xi = dble(i) * dnxm1 + call exact_solution(xi, eta, zeta, temp) + do m = 1, 5 + u(m,ii,jj,kk,c) = temp(m) + enddo + ii = ii + 1 + enddo + jj = jj + 1 + enddo + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine lhsinit + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + + integer i, j, k, d, c, m, n + +c--------------------------------------------------------------------- +c loop over all cells +c--------------------------------------------------------------------- + do c = 1, ncells + +c--------------------------------------------------------------------- +c first, initialize the start and end arrays +c--------------------------------------------------------------------- + do d = 1, 3 + if (cell_coord(d,c) .eq. 1) then + start(d,c) = 1 + else + start(d,c) = 0 + endif + if (cell_coord(d,c) .eq. ncells) then + end(d,c) = 1 + else + end(d,c) = 0 + endif + enddo + +c--------------------------------------------------------------------- +c zero the whole left hand side for starters +c--------------------------------------------------------------------- + do k = 0, cell_size(3,c)-1 + do j = 0, cell_size(2,c)-1 + do i = 0, cell_size(1,c)-1 + do m = 1,5 + do n = 1, 5 + lhsc(m,n,i,j,k,c) = 0.0d0 + enddo + enddo + enddo + enddo + enddo + + enddo + + return + end + + + + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/make_set.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/make_set.f new file mode 100644 index 0000000..ffab37c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/make_set.f @@ -0,0 +1,125 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine make_set + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c This function allocates space for a set of cells and fills the set +c such that communication between cells on different nodes is only +c nearest neighbor +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + + integer p, i, j, c, dir, size, excess, ierr,ierrcode + +c--------------------------------------------------------------------- +c compute square root; add small number to allow for roundoff +c (note: this is computed in setup_mpi.f also, but prefer to do +c it twice because of some include file problems). +c--------------------------------------------------------------------- + ncells = dint(dsqrt(dble(no_nodes) + 0.00001d0)) + +c--------------------------------------------------------------------- +c this makes coding easier +c--------------------------------------------------------------------- + p = ncells + +c--------------------------------------------------------------------- +c determine the location of the cell at the bottom of the 3D +c array of cells +c--------------------------------------------------------------------- + cell_coord(1,1) = mod(node,p) + cell_coord(2,1) = node/p + cell_coord(3,1) = 0 + +c--------------------------------------------------------------------- +c set the cell_coords for cells in the rest of the z-layers; +c this comes down to a simple linear numbering in the z-direct- +c ion, and to the doubly-cyclic numbering in the other dirs +c--------------------------------------------------------------------- + do c=2, p + cell_coord(1,c) = mod(cell_coord(1,c-1)+1,p) + cell_coord(2,c) = mod(cell_coord(2,c-1)-1+p,p) + cell_coord(3,c) = c-1 + end do + +c--------------------------------------------------------------------- +c offset all the coordinates by 1 to adjust for Fortran arrays +c--------------------------------------------------------------------- + do dir = 1, 3 + do c = 1, p + cell_coord(dir,c) = cell_coord(dir,c) + 1 + end do + end do + +c--------------------------------------------------------------------- +c slice(dir,n) contains the sequence number of the cell that is in +c coordinate plane n in the dir direction +c--------------------------------------------------------------------- + do dir = 1, 3 + do c = 1, p + slice(dir,cell_coord(dir,c)) = c + end do + end do + + +c--------------------------------------------------------------------- +c fill the predecessor and successor entries, using the indices +c of the bottom cells (they are the same at each level of k +c anyway) acting as if full periodicity pertains; note that p is +c added to those arguments to the mod functions that might +c otherwise return wrong values when using the modulo function +c--------------------------------------------------------------------- + i = cell_coord(1,1)-1 + j = cell_coord(2,1)-1 + + predecessor(1) = mod(i-1+p,p) + p*j + predecessor(2) = i + p*mod(j-1+p,p) + predecessor(3) = mod(i+1,p) + p*mod(j-1+p,p) + successor(1) = mod(i+1,p) + p*j + successor(2) = i + p*mod(j+1,p) + successor(3) = mod(i-1+p,p) + p*mod(j+1,p) + +c--------------------------------------------------------------------- +c now compute the sizes of the cells +c--------------------------------------------------------------------- + do dir= 1, 3 +c--------------------------------------------------------------------- +c set cell_coord range for each direction +c--------------------------------------------------------------------- + size = grid_points(dir)/p + excess = mod(grid_points(dir),p) + do c=1, ncells + if (cell_coord(dir,c) .le. excess) then + cell_size(dir,c) = size+1 + cell_low(dir,c) = (cell_coord(dir,c)-1)*(size+1) + cell_high(dir,c) = cell_low(dir,c)+size + else + cell_size(dir,c) = size + cell_low(dir,c) = excess*(size+1)+ + > (cell_coord(dir,c)-excess-1)*size + cell_high(dir,c) = cell_low(dir,c)+size-1 + endif + if (cell_size(dir, c) .le. 2) then + write(*,50) + 50 format(' Error: Cell size too small. Min size is 3') + ierrcode = 1 + call MPI_Abort(mpi_comm_world,ierrcode,ierr) + stop + endif + end do + end do + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/mpinpb.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/mpinpb.h new file mode 100644 index 0000000..f621f08 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/mpinpb.h @@ -0,0 +1,12 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'mpif.h' + + integer node, no_nodes, total_nodes, root, comm_setup, + > comm_solve, comm_rhs, dp_type + logical active + common /mpistuff/ node, no_nodes, total_nodes, root, comm_setup, + > comm_solve, comm_rhs, dp_type, active + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/rhs.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/rhs.f new file mode 100644 index 0000000..e4a43a8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/rhs.f @@ -0,0 +1,542 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine compute_rhs + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + + integer c, i, j, k, m + double precision rho_inv, uijk, up1, um1, vijk, vp1, vm1, + > wijk, wp1, wm1 + + + if (timeron) call timer_start(t_rhs) +c--------------------------------------------------------------------- +c loop over all cells owned by this node +c--------------------------------------------------------------------- + + do c = 1, ncells + +c--------------------------------------------------------------------- +c compute the reciprocal of density, and the kinetic energy, +c and the speed of sound. +c--------------------------------------------------------------------- +!1$omp parallel do private(k,j,i,rho_inv) collapse(2) + +!DVM$ region out (rho_i,us,vs,ws,square,qs) +!DVM$ PARALLEL(k,j,i), PRIVATE(k,j,i,rho_inv), +!DVM$& TIE(u(*,i,j,k,*),vs(i,j,k,*),ws(i,j,k,*), +!DVM$& qs(i,j,k,*),square(i,j,k,*),rho_i(i,j,k,*),us(i,j,k,*)) + do k = -1, cell_size(3,c) + do j = -1, cell_size(2,c) + do i = -1, cell_size(1,c) + rho_inv = 1.0d0/u(1,i,j,k,c) + rho_i(i,j,k,c) = rho_inv + us(i,j,k,c) = u(2,i,j,k,c) * rho_inv + vs(i,j,k,c) = u(3,i,j,k,c) * rho_inv + ws(i,j,k,c) = u(4,i,j,k,c) * rho_inv + square(i,j,k,c) = 0.5d0* ( + > u(2,i,j,k,c)*u(2,i,j,k,c) + + > u(3,i,j,k,c)*u(3,i,j,k,c) + + > u(4,i,j,k,c)*u(4,i,j,k,c) ) * rho_inv + qs(i,j,k,c) = square(i,j,k,c) * rho_inv + enddo + enddo + enddo +!DVM$ end region +c--------------------------------------------------------------------- +c copy the exact forcing term to the right hand side; because +c this forcing term is known, we can store it on the whole of every +c cell, including the boundary +c--------------------------------------------------------------------- +!1$omp parallel do private(k,j,i) collapse(2) + +!DVM$ region out (rhs) +!DVM$ PARALLEL(k,j,i), PRIVATE(k,j,i,m), +!DVM$& TIE(rhs(*,i,j,k,*),forcing(*,i,j,k,*)) + do k = 0, cell_size(3,c)-1 + do j = 0, cell_size(2,c)-1 + do i = 0, cell_size(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = forcing(m,i,j,k,c) + enddo + enddo + enddo + enddo +!DVM$ end region + +c--------------------------------------------------------------------- +c compute xi-direction fluxes +c--------------------------------------------------------------------- +!1$omp parallel do private(k,j,i,uijk,up1,um1) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,j,i,uijk,up1,um1), +!DVM$& TIE(rhs(*,i,j,k,*),u(*,i,j,k,*),vs(i,j,k,*),ws(i,j,k,*), +!DVM$& qs(i,j,k,*),square(i,j,k,*),rho_i(i,j,k,*),us(i,j,k,*)) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + uijk = us(i,j,k,c) + up1 = us(i+1,j,k,c) + um1 = us(i-1,j,k,c) + + rhs(1,i,j,k,c) = rhs(1,i,j,k,c) + dx1tx1 * + > (u(1,i+1,j,k,c) - 2.0d0*u(1,i,j,k,c) + + > u(1,i-1,j,k,c)) - + > tx2 * (u(2,i+1,j,k,c) - u(2,i-1,j,k,c)) + + rhs(2,i,j,k,c) = rhs(2,i,j,k,c) + dx2tx1 * + > (u(2,i+1,j,k,c) - 2.0d0*u(2,i,j,k,c) + + > u(2,i-1,j,k,c)) + + > xxcon2*con43 * (up1 - 2.0d0*uijk + um1) - + > tx2 * (u(2,i+1,j,k,c)*up1 - + > u(2,i-1,j,k,c)*um1 + + > (u(5,i+1,j,k,c)- square(i+1,j,k,c)- + > u(5,i-1,j,k,c)+ square(i-1,j,k,c))* + > c2) + + rhs(3,i,j,k,c) = rhs(3,i,j,k,c) + dx3tx1 * + > (u(3,i+1,j,k,c) - 2.0d0*u(3,i,j,k,c) + + > u(3,i-1,j,k,c)) + + > xxcon2 * (vs(i+1,j,k,c) - 2.0d0*vs(i,j,k,c) + + > vs(i-1,j,k,c)) - + > tx2 * (u(3,i+1,j,k,c)*up1 - + > u(3,i-1,j,k,c)*um1) + + rhs(4,i,j,k,c) = rhs(4,i,j,k,c) + dx4tx1 * + > (u(4,i+1,j,k,c) - 2.0d0*u(4,i,j,k,c) + + > u(4,i-1,j,k,c)) + + > xxcon2 * (ws(i+1,j,k,c) - 2.0d0*ws(i,j,k,c) + + > ws(i-1,j,k,c)) - + > tx2 * (u(4,i+1,j,k,c)*up1 - + > u(4,i-1,j,k,c)*um1) + + rhs(5,i,j,k,c) = rhs(5,i,j,k,c) + dx5tx1 * + > (u(5,i+1,j,k,c) - 2.0d0*u(5,i,j,k,c) + + > u(5,i-1,j,k,c)) + + > xxcon3 * (qs(i+1,j,k,c) - 2.0d0*qs(i,j,k,c) + + > qs(i-1,j,k,c)) + + > xxcon4 * (up1*up1 - 2.0d0*uijk*uijk + + > um1*um1) + + > xxcon5 * (u(5,i+1,j,k,c)*rho_i(i+1,j,k,c) - + > 2.0d0*u(5,i,j,k,c)*rho_i(i,j,k,c) + + > u(5,i-1,j,k,c)*rho_i(i-1,j,k,c)) - + > tx2 * ( (c1*u(5,i+1,j,k,c) - + > c2*square(i+1,j,k,c))*up1 - + > (c1*u(5,i-1,j,k,c) - + > c2*square(i-1,j,k,c))*um1 ) + enddo + enddo + enddo +!DVM$ end region +c--------------------------------------------------------------------- +c add fourth order xi-direction dissipation +c--------------------------------------------------------------------- + if (start(1,c) .gt. 0) then + i = 1 +!DVM$ region +!1$omp parallel do private(k,j,m) collapse(2) +!DVM$ PARALLEL(k,j), PRIVATE(k,j,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c)- dssp * + > ( 5.0d0*u(m,i,j,k,c) - 4.0d0*u(m,i+1,j,k,c) + + > u(m,i+2,j,k,c)) + enddo + enddo + enddo +!DVM$ end region + i = 2 +!DVM$ region +!1$omp parallel do private(k,j,m) collapse(2) +!DVM$ PARALLEL(k,j), PRIVATE(k,j,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > (-4.0d0*u(m,i-1,j,k,c) + 6.0d0*u(m,i,j,k,c) - + > 4.0d0*u(m,i+1,j,k,c) + u(m,i+2,j,k,c)) + enddo + enddo + enddo +!DVM$ end region + endif + +!1$omp parallel do private(k,j,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,j,i,m), +!DVM$& TIE(rhs(*,i,j,k,*),u(*,i,j,k,*)) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = 3*start(1,c),cell_size(1,c)-3*end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i-2,j,k,c) - 4.0d0*u(m,i-1,j,k,c) + + > 6.0*u(m,i,j,k,c) - 4.0d0*u(m,i+1,j,k,c) + + > u(m,i+2,j,k,c) ) + enddo + enddo + enddo + enddo +!DVM$ end region + + if (end(1,c) .gt. 0) then + i = cell_size(1,c)-3 +!1$omp parallel do private(k,j,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j), PRIVATE(k,j,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i-2,j,k,c) - 4.0d0*u(m,i-1,j,k,c) + + > 6.0d0*u(m,i,j,k,c) - 4.0d0*u(m,i+1,j,k,c) ) + enddo + enddo + enddo +!DVM$ end region + i = cell_size(1,c)-2 + +!1$omp parallel do private(k,j,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j), PRIVATE(k,j,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i-2,j,k,c) - 4.d0*u(m,i-1,j,k,c) + + > 5.d0*u(m,i,j,k,c) ) + enddo + enddo + enddo +!DVM$ end region + endif + +c--------------------------------------------------------------------- +c compute eta-direction fluxes +c--------------------------------------------------------------------- +!1$omp parallel do private(k,j,i,vijk,vp1,vm1) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,j,i,vijk,vp1,vm1), +!DVM$& TIE(rhs(*,i,j,k,*),u(*,i,j,k,*),vs(i,j,k,*),ws(i,j,k,*), +!DVM$& qs(i,j,k,*),square(i,j,k,*),rho_i(i,j,k,*),us(i,j,k,*)) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + vijk = vs(i,j,k,c) + vp1 = vs(i,j+1,k,c) + vm1 = vs(i,j-1,k,c) + rhs(1,i,j,k,c) = rhs(1,i,j,k,c) + dy1ty1 * + > (u(1,i,j+1,k,c) - 2.0d0*u(1,i,j,k,c) + + > u(1,i,j-1,k,c)) - + > ty2 * (u(3,i,j+1,k,c) - u(3,i,j-1,k,c)) + rhs(2,i,j,k,c) = rhs(2,i,j,k,c) + dy2ty1 * + > (u(2,i,j+1,k,c) - 2.0d0*u(2,i,j,k,c) + + > u(2,i,j-1,k,c)) + + > yycon2 * (us(i,j+1,k,c) - 2.0d0*us(i,j,k,c) + + > us(i,j-1,k,c)) - + > ty2 * (u(2,i,j+1,k,c)*vp1 - + > u(2,i,j-1,k,c)*vm1) + rhs(3,i,j,k,c) = rhs(3,i,j,k,c) + dy3ty1 * + > (u(3,i,j+1,k,c) - 2.0d0*u(3,i,j,k,c) + + > u(3,i,j-1,k,c)) + + > yycon2*con43 * (vp1 - 2.0d0*vijk + vm1) - + > ty2 * (u(3,i,j+1,k,c)*vp1 - + > u(3,i,j-1,k,c)*vm1 + + > (u(5,i,j+1,k,c) - square(i,j+1,k,c) - + > u(5,i,j-1,k,c) + square(i,j-1,k,c)) + > *c2) + rhs(4,i,j,k,c) = rhs(4,i,j,k,c) + dy4ty1 * + > (u(4,i,j+1,k,c) - 2.0d0*u(4,i,j,k,c) + + > u(4,i,j-1,k,c)) + + > yycon2 * (ws(i,j+1,k,c) - 2.0d0*ws(i,j,k,c) + + > ws(i,j-1,k,c)) - + > ty2 * (u(4,i,j+1,k,c)*vp1 - + > u(4,i,j-1,k,c)*vm1) + rhs(5,i,j,k,c) = rhs(5,i,j,k,c) + dy5ty1 * + > (u(5,i,j+1,k,c) - 2.0d0*u(5,i,j,k,c) + + > u(5,i,j-1,k,c)) + + > yycon3 * (qs(i,j+1,k,c) - 2.0d0*qs(i,j,k,c) + + > qs(i,j-1,k,c)) + + > yycon4 * (vp1*vp1 - 2.0d0*vijk*vijk + + > vm1*vm1) + + > yycon5 * (u(5,i,j+1,k,c)*rho_i(i,j+1,k,c) - + > 2.0d0*u(5,i,j,k,c)*rho_i(i,j,k,c) + + > u(5,i,j-1,k,c)*rho_i(i,j-1,k,c)) - + > ty2 * ((c1*u(5,i,j+1,k,c) - + > c2*square(i,j+1,k,c)) * vp1 - + > (c1*u(5,i,j-1,k,c) - + > c2*square(i,j-1,k,c)) * vm1) + enddo + enddo + enddo +!DVM$ end region +c--------------------------------------------------------------------- +c add fourth order eta-direction dissipation +c--------------------------------------------------------------------- + if (start(2,c) .gt. 0) then + j = 1 +!1$omp parallel do private(k,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,i), PRIVATE(k,i,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c)- dssp * + > ( 5.0d0*u(m,i,j,k,c) - 4.0d0*u(m,i,j+1,k,c) + + > u(m,i,j+2,k,c)) + enddo + enddo + enddo +!DVM$ end region + j = 2 +!1$omp parallel do private(k,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,i), PRIVATE(k,i,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > (-4.0d0*u(m,i,j-1,k,c) + 6.0d0*u(m,i,j,k,c) - + > 4.0d0*u(m,i,j+1,k,c) + u(m,i,j+2,k,c)) + enddo + enddo + enddo +!DVM$ end region + endif + +!1$omp parallel do private(k,j,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,i,j,m), +!DVM$& TIE(rhs(*,i,j,k,*),u(*,i,j,k,*)) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = 3*start(2,c), cell_size(2,c)-3*end(2,c)-1 + do i = start(1,c),cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i,j-2,k,c) - 4.0d0*u(m,i,j-1,k,c) + + > 6.0*u(m,i,j,k,c) - 4.0d0*u(m,i,j+1,k,c) + + > u(m,i,j+2,k,c) ) + enddo + enddo + enddo + enddo +!DVM$ end region + if (end(2,c) .gt. 0) then + + j = cell_size(2,c)-3 +!1$omp parallel do private(k,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,i), PRIVATE(k,i,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i,j-2,k,c) - 4.0d0*u(m,i,j-1,k,c) + + > 6.0d0*u(m,i,j,k,c) - 4.0d0*u(m,i,j+1,k,c) ) + enddo + enddo + enddo +!DVM$ end region + j = cell_size(2,c)-2 +!1$omp parallel do private(k,i,m) collapse(2) +!DVM$ region +!DVM$ PARALLEL(k,i), PRIVATE(k,i,m) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i,j-2,k,c) - 4.d0*u(m,i,j-1,k,c) + + > 5.d0*u(m,i,j,k,c) ) + enddo + enddo + enddo +!DVM$ end region + endif + +c--------------------------------------------------------------------- +c compute zeta-direction fluxes +c--------------------------------------------------------------------- + +!1$omp parallel do private(k,j,i,wijk,wp1,wm1) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,j,i,wijk,wp1,wm1), +!DVM$& TIE(rhs(*,i,j,k,*),u(*,i,j,k,*),vs(i,j,k,*),ws(i,j,k,*), +!DVM$& qs(i,j,k,*),square(i,j,k,*),rho_i(i,j,k,*),us(i,j,k,*)) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + wijk = ws(i,j,k,c) + wp1 = ws(i,j,k+1,c) + wm1 = ws(i,j,k-1,c) + + rhs(1,i,j,k,c) = rhs(1,i,j,k,c) + dz1tz1 * + > (u(1,i,j,k+1,c) - 2.0d0*u(1,i,j,k,c) + + > u(1,i,j,k-1,c)) - + > tz2 * (u(4,i,j,k+1,c) - u(4,i,j,k-1,c)) + rhs(2,i,j,k,c) = rhs(2,i,j,k,c) + dz2tz1 * + > (u(2,i,j,k+1,c) - 2.0d0*u(2,i,j,k,c) + + > u(2,i,j,k-1,c)) + + > zzcon2 * (us(i,j,k+1,c) - 2.0d0*us(i,j,k,c) + + > us(i,j,k-1,c)) - + > tz2 * (u(2,i,j,k+1,c)*wp1 - + > u(2,i,j,k-1,c)*wm1) + rhs(3,i,j,k,c) = rhs(3,i,j,k,c) + dz3tz1 * + > (u(3,i,j,k+1,c) - 2.0d0*u(3,i,j,k,c) + + > u(3,i,j,k-1,c)) + + > zzcon2 * (vs(i,j,k+1,c) - 2.0d0*vs(i,j,k,c) + + > vs(i,j,k-1,c)) - + > tz2 * (u(3,i,j,k+1,c)*wp1 - + > u(3,i,j,k-1,c)*wm1) + rhs(4,i,j,k,c) = rhs(4,i,j,k,c) + dz4tz1 * + > (u(4,i,j,k+1,c) - 2.0d0*u(4,i,j,k,c) + + > u(4,i,j,k-1,c)) + + > zzcon2*con43 * (wp1 - 2.0d0*wijk + wm1) - + > tz2 * (u(4,i,j,k+1,c)*wp1 - + > u(4,i,j,k-1,c)*wm1 + + > (u(5,i,j,k+1,c) - square(i,j,k+1,c) - + > u(5,i,j,k-1,c) + square(i,j,k-1,c)) + > *c2) + rhs(5,i,j,k,c) = rhs(5,i,j,k,c) + dz5tz1 * + > (u(5,i,j,k+1,c) - 2.0d0*u(5,i,j,k,c) + + > u(5,i,j,k-1,c)) + + > zzcon3 * (qs(i,j,k+1,c) - 2.0d0*qs(i,j,k,c) + + > qs(i,j,k-1,c)) + + > zzcon4 * (wp1*wp1 - 2.0d0*wijk*wijk + + > wm1*wm1) + + > zzcon5 * (u(5,i,j,k+1,c)*rho_i(i,j,k+1,c) - + > 2.0d0*u(5,i,j,k,c)*rho_i(i,j,k,c) + + > u(5,i,j,k-1,c)*rho_i(i,j,k-1,c)) - + > tz2 * ( (c1*u(5,i,j,k+1,c) - + > c2*square(i,j,k+1,c))*wp1 - + > (c1*u(5,i,j,k-1,c) - + > c2*square(i,j,k-1,c))*wm1) + enddo + enddo + enddo +!DVM$ end region +c--------------------------------------------------------------------- +c add fourth order zeta-direction dissipation +c--------------------------------------------------------------------- + if (start(3,c) .gt. 0) then + k = 1 +!1$omp parallel do private(j,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(j,i), PRIVATE(i,j,m) + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c)- dssp * + > ( 5.0d0*u(m,i,j,k,c) - 4.0d0*u(m,i,j,k+1,c) + + > u(m,i,j,k+2,c)) + enddo + enddo + enddo +!DVM$ end region + k = 2 +!1$omp parallel do private(j,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(j,i), PRIVATE(i,j,m) + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > (-4.0d0*u(m,i,j,k-1,c) + 6.0d0*u(m,i,j,k,c) - + > 4.0d0*u(m,i,j,k+1,c) + u(m,i,j,k+2,c)) + enddo + enddo + enddo +!DVM$ end region + endif + +!1$omp parallel do private(k,j,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,i,j,m), +!DVM$& TIE(rhs(*,i,j,k,*),u(*,i,j,k,*)) + do k = 3*start(3,c), cell_size(3,c)-3*end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c),cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i,j,k-2,c) - 4.0d0*u(m,i,j,k-1,c) + + > 6.0*u(m,i,j,k,c) - 4.0d0*u(m,i,j,k+1,c) + + > u(m,i,j,k+2,c) ) + enddo + enddo + enddo + enddo +!DVM$ end region + if (end(3,c) .gt. 0) then + k = cell_size(3,c)-3 + +!1$omp parallel do private(j,i,m) collapse(2) +!DVM$ region +!DVM$ PARALLEL(j,i), PRIVATE(i,j,m) + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i,j,k-2,c) - 4.0d0*u(m,i,j,k-1,c) + + > 6.0d0*u(m,i,j,k,c) - 4.0d0*u(m,i,j,k+1,c) ) + enddo + enddo + enddo +!DVM$ end region + k = cell_size(3,c)-2 +!1$omp parallel do private(j,i,m) collapse(2) +!DVM$ region +!DVM$ PARALLEL(j,i), PRIVATE(i,j,m) + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) - dssp * + > ( u(m,i,j,k-2,c) - 4.d0*u(m,i,j,k-1,c) + + > 5.d0*u(m,i,j,k,c) ) + enddo + enddo + enddo +!DVM$ end region + endif + +!1$omp parallel do private(k,j,i,m) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j,i), PRIVATE(k,i,j,m), +!DVM$& TIE(rhs(*,i,j,k,*)) + do k = start(3,c), cell_size(3,c)-end(3,c)-1 + do j = start(2,c), cell_size(2,c)-end(2,c)-1 + do i = start(1,c), cell_size(1,c)-end(1,c)-1 + do m = 1, 5 + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) * dt + enddo + enddo + enddo + enddo +!DVM$ end region + enddo + + if (timeron) call timer_stop(t_rhs) + + return + end + + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/set_constants.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/set_constants.f new file mode 100644 index 0000000..81397d4 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/set_constants.f @@ -0,0 +1,202 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine set_constants + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + + ce(1,1) = 2.0d0 + ce(1,2) = 0.0d0 + ce(1,3) = 0.0d0 + ce(1,4) = 4.0d0 + ce(1,5) = 5.0d0 + ce(1,6) = 3.0d0 + ce(1,7) = 0.5d0 + ce(1,8) = 0.02d0 + ce(1,9) = 0.01d0 + ce(1,10) = 0.03d0 + ce(1,11) = 0.5d0 + ce(1,12) = 0.4d0 + ce(1,13) = 0.3d0 + + ce(2,1) = 1.0d0 + ce(2,2) = 0.0d0 + ce(2,3) = 0.0d0 + ce(2,4) = 0.0d0 + ce(2,5) = 1.0d0 + ce(2,6) = 2.0d0 + ce(2,7) = 3.0d0 + ce(2,8) = 0.01d0 + ce(2,9) = 0.03d0 + ce(2,10) = 0.02d0 + ce(2,11) = 0.4d0 + ce(2,12) = 0.3d0 + ce(2,13) = 0.5d0 + + ce(3,1) = 2.0d0 + ce(3,2) = 2.0d0 + ce(3,3) = 0.0d0 + ce(3,4) = 0.0d0 + ce(3,5) = 0.0d0 + ce(3,6) = 2.0d0 + ce(3,7) = 3.0d0 + ce(3,8) = 0.04d0 + ce(3,9) = 0.03d0 + ce(3,10) = 0.05d0 + ce(3,11) = 0.3d0 + ce(3,12) = 0.5d0 + ce(3,13) = 0.4d0 + + ce(4,1) = 2.0d0 + ce(4,2) = 2.0d0 + ce(4,3) = 0.0d0 + ce(4,4) = 0.0d0 + ce(4,5) = 0.0d0 + ce(4,6) = 2.0d0 + ce(4,7) = 3.0d0 + ce(4,8) = 0.03d0 + ce(4,9) = 0.05d0 + ce(4,10) = 0.04d0 + ce(4,11) = 0.2d0 + ce(4,12) = 0.1d0 + ce(4,13) = 0.3d0 + + ce(5,1) = 5.0d0 + ce(5,2) = 4.0d0 + ce(5,3) = 3.0d0 + ce(5,4) = 2.0d0 + ce(5,5) = 0.1d0 + ce(5,6) = 0.4d0 + ce(5,7) = 0.3d0 + ce(5,8) = 0.05d0 + ce(5,9) = 0.04d0 + ce(5,10) = 0.03d0 + ce(5,11) = 0.1d0 + ce(5,12) = 0.3d0 + ce(5,13) = 0.2d0 + + c1 = 1.4d0 + c2 = 0.4d0 + c3 = 0.1d0 + c4 = 1.0d0 + c5 = 1.4d0 + + bt = dsqrt(0.5d0) + + dnxm1 = 1.0d0 / dble(grid_points(1)-1) + dnym1 = 1.0d0 / dble(grid_points(2)-1) + dnzm1 = 1.0d0 / dble(grid_points(3)-1) + + c1c2 = c1 * c2 + c1c5 = c1 * c5 + c3c4 = c3 * c4 + c1345 = c1c5 * c3c4 + + conz1 = (1.0d0-c1c5) + + tx1 = 1.0d0 / (dnxm1 * dnxm1) + tx2 = 1.0d0 / (2.0d0 * dnxm1) + tx3 = 1.0d0 / dnxm1 + + ty1 = 1.0d0 / (dnym1 * dnym1) + ty2 = 1.0d0 / (2.0d0 * dnym1) + ty3 = 1.0d0 / dnym1 + + tz1 = 1.0d0 / (dnzm1 * dnzm1) + tz2 = 1.0d0 / (2.0d0 * dnzm1) + tz3 = 1.0d0 / dnzm1 + + dx1 = 0.75d0 + dx2 = 0.75d0 + dx3 = 0.75d0 + dx4 = 0.75d0 + dx5 = 0.75d0 + + dy1 = 0.75d0 + dy2 = 0.75d0 + dy3 = 0.75d0 + dy4 = 0.75d0 + dy5 = 0.75d0 + + dz1 = 1.0d0 + dz2 = 1.0d0 + dz3 = 1.0d0 + dz4 = 1.0d0 + dz5 = 1.0d0 + + dxmax = dmax1(dx3, dx4) + dymax = dmax1(dy2, dy4) + dzmax = dmax1(dz2, dz3) + + dssp = 0.25d0 * dmax1(dx1, dmax1(dy1, dz1) ) + + c4dssp = 4.0d0 * dssp + c5dssp = 5.0d0 * dssp + + dttx1 = dt*tx1 + dttx2 = dt*tx2 + dtty1 = dt*ty1 + dtty2 = dt*ty2 + dttz1 = dt*tz1 + dttz2 = dt*tz2 + + c2dttx1 = 2.0d0*dttx1 + c2dtty1 = 2.0d0*dtty1 + c2dttz1 = 2.0d0*dttz1 + + dtdssp = dt*dssp + + comz1 = dtdssp + comz4 = 4.0d0*dtdssp + comz5 = 5.0d0*dtdssp + comz6 = 6.0d0*dtdssp + + c3c4tx3 = c3c4*tx3 + c3c4ty3 = c3c4*ty3 + c3c4tz3 = c3c4*tz3 + + dx1tx1 = dx1*tx1 + dx2tx1 = dx2*tx1 + dx3tx1 = dx3*tx1 + dx4tx1 = dx4*tx1 + dx5tx1 = dx5*tx1 + + dy1ty1 = dy1*ty1 + dy2ty1 = dy2*ty1 + dy3ty1 = dy3*ty1 + dy4ty1 = dy4*ty1 + dy5ty1 = dy5*ty1 + + dz1tz1 = dz1*tz1 + dz2tz1 = dz2*tz1 + dz3tz1 = dz3*tz1 + dz4tz1 = dz4*tz1 + dz5tz1 = dz5*tz1 + + c2iv = 2.5d0 + con43 = 4.0d0/3.0d0 + con16 = 1.0d0/6.0d0 + + xxcon1 = c3c4tx3*con43*tx3 + xxcon2 = c3c4tx3*tx3 + xxcon3 = c3c4tx3*conz1*tx3 + xxcon4 = c3c4tx3*con16*tx3 + xxcon5 = c3c4tx3*c1c5*tx3 + + yycon1 = c3c4ty3*con43*ty3 + yycon2 = c3c4ty3*ty3 + yycon3 = c3c4ty3*conz1*ty3 + yycon4 = c3c4ty3*con16*ty3 + yycon5 = c3c4ty3*c1c5*ty3 + + zzcon1 = c3c4tz3*con43*tz3 + zzcon2 = c3c4tz3*tz3 + zzcon3 = c3c4tz3*conz1*tz3 + zzcon4 = c3c4tz3*con16*tz3 + zzcon5 = c3c4tz3*c1c5*tz3 + + return + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/setup_mpi.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/setup_mpi.f new file mode 100644 index 0000000..987c6bf --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/setup_mpi.f @@ -0,0 +1,64 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine setup_mpi + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c set up MPI stuff +c--------------------------------------------------------------------- + + implicit none + include 'mpinpb.h' + include 'npbparams.h' + integer error, color, nc + + call mpi_init(error) + + call mpi_comm_size(MPI_COMM_WORLD, total_nodes, error) + call mpi_comm_rank(MPI_COMM_WORLD, node, error) + + if (.not. convertdouble) then + dp_type = MPI_DOUBLE_PRECISION + else + dp_type = MPI_REAL + endif + +c--------------------------------------------------------------------- +c compute square root; add small number to allow for roundoff +c--------------------------------------------------------------------- + nc = dint(dsqrt(dble(total_nodes) + 0.00001d0)) + +c--------------------------------------------------------------------- +c We handle a non-square number of nodes by making the excess nodes +c inactive. However, we can never handle more cells than were compiled +c in. +c--------------------------------------------------------------------- + + if (nc .gt. maxcells) nc = maxcells + if (node .ge. nc*nc) then + active = .false. + color = 1 + else + active = .true. + color = 0 + end if + + call mpi_comm_split(MPI_COMM_WORLD,color,node,comm_setup,error) + if (.not. active) return + + call mpi_comm_size(comm_setup, no_nodes, error) + call mpi_comm_dup(comm_setup, comm_solve, error) + call mpi_comm_dup(comm_setup, comm_rhs, error) + +c--------------------------------------------------------------------- +c let node 0 be the root for the group (there is only one) +c--------------------------------------------------------------------- + root = 0 + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/simple_mpiio.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/simple_mpiio.f new file mode 100644 index 0000000..02e2700 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/simple_mpiio.f @@ -0,0 +1,213 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine setup_btio + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer m, ierr + + iseek=0 + + if (node .eq. root) then + call MPI_File_delete(filenm, MPI_INFO_NULL, ierr) + endif + + call MPI_Barrier(comm_solve, ierr) + + call MPI_File_open(comm_solve, + $ filenm, + $ MPI_MODE_RDWR + MPI_MODE_CREATE, + $ MPI_INFO_NULL, + $ fp, + $ ierr) + + call MPI_File_set_view(fp, + $ iseek, MPI_DOUBLE_PRECISION, MPI_DOUBLE_PRECISION, + $ 'native', MPI_INFO_NULL, ierr) + + if (ierr .ne. MPI_SUCCESS) then + print *, 'Error opening file' + stop + endif + + do m = 1, 5 + xce_sub(m) = 0.d0 + end do + + idump_sub = 0 + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine output_timestep + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + include 'header.h' + include 'mpinpb.h' + + integer count, jio, kio, cio, aio + integer ierr + integer mstatus(MPI_STATUS_SIZE) + + do cio=1,ncells + do kio=0, cell_size(3,cio)-1 + do jio=0, cell_size(2,cio)-1 + iseek=5*(cell_low(1,cio) + + $ PROBLEM_SIZE*((cell_low(2,cio)+jio) + + $ PROBLEM_SIZE*((cell_low(3,cio)+kio) + + $ PROBLEM_SIZE*idump_sub))) + + count=5*cell_size(1,cio) + + call MPI_File_write_at(fp, iseek, + $ u(1,0,jio,kio,cio), + $ count, MPI_DOUBLE_PRECISION, + $ mstatus, ierr) + + if (ierr .ne. MPI_SUCCESS) then + print *, 'Error writing to file' + stop + endif + enddo + enddo + enddo + + idump_sub = idump_sub + 1 + if (rd_interval .gt. 0) then + if (idump_sub .ge. rd_interval) then + + call acc_sub_norms(idump+1) + + idump_sub = 0 + endif + endif + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine acc_sub_norms(idump_cur) + + include 'header.h' + include 'mpinpb.h' + + integer idump_cur + + integer count, jio, kio, cio, ii, m, ichunk + integer ierr + integer mstatus(MPI_STATUS_SIZE) + double precision xce_single(5) + + ichunk = idump_cur - idump_sub + 1 + do ii=0, idump_sub-1 + do cio=1,ncells + do kio=0, cell_size(3,cio)-1 + do jio=0, cell_size(2,cio)-1 + iseek=5*(cell_low(1,cio) + + $ PROBLEM_SIZE*((cell_low(2,cio)+jio) + + $ PROBLEM_SIZE*((cell_low(3,cio)+kio) + + $ PROBLEM_SIZE*ii))) + + count=5*cell_size(1,cio) + + call MPI_File_read_at(fp, iseek, + $ u(1,0,jio,kio,cio), + $ count, MPI_DOUBLE_PRECISION, + $ mstatus, ierr) + + if (ierr .ne. MPI_SUCCESS) then + print *, 'Error reading back file' + call MPI_File_close(fp, ierr) + stop + endif + enddo + enddo + enddo + + if (node .eq. root) print *, 'Reading data set ', ii+ichunk + + call error_norm(xce_single) + do m = 1, 5 + xce_sub(m) = xce_sub(m) + xce_single(m) + end do + enddo + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine btio_cleanup + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer ierr + + call MPI_File_close(fp, ierr) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine accumulate_norms(xce_acc) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + double precision xce_acc(5) + integer m, ierr + + if (rd_interval .gt. 0) goto 20 + + call MPI_File_open(comm_solve, + $ filenm, + $ MPI_MODE_RDONLY, + $ MPI_INFO_NULL, + $ fp, + $ ierr) + + iseek = 0 + call MPI_File_set_view(fp, + $ iseek, MPI_DOUBLE_PRECISION, MPI_DOUBLE_PRECISION, + $ 'native', MPI_INFO_NULL, ierr) + +c clear the last time step + + call clear_timestep + +c read back the time steps and accumulate norms + + call acc_sub_norms(idump) + + call MPI_File_close(fp, ierr) + + 20 continue + do m = 1, 5 + xce_acc(m) = xce_sub(m) / dble(idump) + end do + + return + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/verify.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/verify.f new file mode 100644 index 0000000..d1863f2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/verify.f @@ -0,0 +1,434 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine verify(no_time_steps, class, verified) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c verification routine +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + double precision xcrref(5),xceref(5),xcrdif(5),xcedif(5), + > epsilon, xce(5), xcr(5), dtref + integer m, no_time_steps + character class + logical verified + +c--------------------------------------------------------------------- +c tolerance level +c--------------------------------------------------------------------- + epsilon = 1.0d-08 + verified = .true. + +c--------------------------------------------------------------------- +c compute the error norm and the residual norm, and exit if not printing +c--------------------------------------------------------------------- + + if (iotype .ne. 0) then + call accumulate_norms(xce) + else + call error_norm(xce) + endif + + call copy_faces + + call rhs_norm(xcr) + + do m = 1, 5 + xcr(m) = xcr(m) / dt + enddo + + if (node .ne. 0) return + + class = 'U' + + do m = 1,5 + xcrref(m) = 1.0 + xceref(m) = 1.0 + end do + +c--------------------------------------------------------------------- +c reference data for 12X12X12 grids after 60 time steps, with DT = 1.0d-02 +c--------------------------------------------------------------------- + if ( (grid_points(1) .eq. 12 ) .and. + > (grid_points(2) .eq. 12 ) .and. + > (grid_points(3) .eq. 12 ) .and. + > (no_time_steps .eq. 60 )) then + + class = 'S' + dtref = 1.0d-2 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 1.7034283709541311d-01 + xcrref(2) = 1.2975252070034097d-02 + xcrref(3) = 3.2527926989486055d-02 + xcrref(4) = 2.6436421275166801d-02 + xcrref(5) = 1.9211784131744430d-01 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + + if (iotype .eq. 0) then + xceref(1) = 4.9976913345811579d-04 + xceref(2) = 4.5195666782961927d-05 + xceref(3) = 7.3973765172921357d-05 + xceref(4) = 7.3821238632439731d-05 + xceref(5) = 8.9269630987491446d-04 + else + xceref(1) = 0.1149036328945d+02 + xceref(2) = 0.9156788904727d+00 + xceref(3) = 0.2857899428614d+01 + xceref(4) = 0.2598273346734d+01 + xceref(5) = 0.2652795397547d+02 + endif + +c--------------------------------------------------------------------- +c reference data for 24X24X24 grids after 200 time steps, with DT = 0.8d-3 +c--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 24) .and. + > (grid_points(2) .eq. 24) .and. + > (grid_points(3) .eq. 24) .and. + > (no_time_steps . eq. 200) ) then + + class = 'W' + dtref = 0.8d-3 +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.1125590409344d+03 + xcrref(2) = 0.1180007595731d+02 + xcrref(3) = 0.2710329767846d+02 + xcrref(4) = 0.2469174937669d+02 + xcrref(5) = 0.2638427874317d+03 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + + if (iotype .eq. 0) then + xceref(1) = 0.4419655736008d+01 + xceref(2) = 0.4638531260002d+00 + xceref(3) = 0.1011551749967d+01 + xceref(4) = 0.9235878729944d+00 + xceref(5) = 0.1018045837718d+02 + else + xceref(1) = 0.6729594398612d+02 + xceref(2) = 0.5264523081690d+01 + xceref(3) = 0.1677107142637d+02 + xceref(4) = 0.1508721463436d+02 + xceref(5) = 0.1477018363393d+03 + endif + + +c--------------------------------------------------------------------- +c reference data for 64X64X64 grids after 200 time steps, with DT = 0.8d-3 +c--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 64) .and. + > (grid_points(2) .eq. 64) .and. + > (grid_points(3) .eq. 64) .and. + > (no_time_steps . eq. 200) ) then + + class = 'A' + dtref = 0.8d-3 +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 1.0806346714637264d+02 + xcrref(2) = 1.1319730901220813d+01 + xcrref(3) = 2.5974354511582465d+01 + xcrref(4) = 2.3665622544678910d+01 + xcrref(5) = 2.5278963211748344d+02 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + + if (iotype .eq. 0) then + xceref(1) = 4.2348416040525025d+00 + xceref(2) = 4.4390282496995698d-01 + xceref(3) = 9.6692480136345650d-01 + xceref(4) = 8.8302063039765474d-01 + xceref(5) = 9.7379901770829278d+00 + else + xceref(1) = 0.6482218724961d+02 + xceref(2) = 0.5066461714527d+01 + xceref(3) = 0.1613931961359d+02 + xceref(4) = 0.1452010201481d+02 + xceref(5) = 0.1420099377681d+03 + endif + +c--------------------------------------------------------------------- +c reference data for 102X102X102 grids after 200 time steps, +c with DT = 3.0d-04 +c--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 102) .and. + > (grid_points(2) .eq. 102) .and. + > (grid_points(3) .eq. 102) .and. + > (no_time_steps . eq. 200) ) then + + class = 'B' + dtref = 3.0d-4 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 1.4233597229287254d+03 + xcrref(2) = 9.9330522590150238d+01 + xcrref(3) = 3.5646025644535285d+02 + xcrref(4) = 3.2485447959084092d+02 + xcrref(5) = 3.2707541254659363d+03 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + + if (iotype .eq. 0) then + xceref(1) = 5.2969847140936856d+01 + xceref(2) = 4.4632896115670668d+00 + xceref(3) = 1.3122573342210174d+01 + xceref(4) = 1.2006925323559144d+01 + xceref(5) = 1.2459576151035986d+02 + else + xceref(1) = 0.1477545106464d+03 + xceref(2) = 0.1108895555053d+02 + xceref(3) = 0.3698065590331d+02 + xceref(4) = 0.3310505581440d+02 + xceref(5) = 0.3157928282563d+03 + endif + +c--------------------------------------------------------------------- +c reference data for 162X162X162 grids after 200 time steps, +c with DT = 1.0d-04 +c--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 162) .and. + > (grid_points(2) .eq. 162) .and. + > (grid_points(3) .eq. 162) .and. + > (no_time_steps . eq. 200) ) then + + class = 'C' + dtref = 1.0d-4 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.62398116551764615d+04 + xcrref(2) = 0.50793239190423964d+03 + xcrref(3) = 0.15423530093013596d+04 + xcrref(4) = 0.13302387929291190d+04 + xcrref(5) = 0.11604087428436455d+05 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + + if (iotype .eq. 0) then + xceref(1) = 0.16462008369091265d+03 + xceref(2) = 0.11497107903824313d+02 + xceref(3) = 0.41207446207461508d+02 + xceref(4) = 0.37087651059694167d+02 + xceref(5) = 0.36211053051841265d+03 + else + xceref(1) = 0.2597156483475d+03 + xceref(2) = 0.1985384289495d+02 + xceref(3) = 0.6517950485788d+02 + xceref(4) = 0.5757235541520d+02 + xceref(5) = 0.5215668188726d+03 + endif + + +c--------------------------------------------------------------------- +c reference data for 408x408x408 grids after 250 time steps, +c with DT = 0.2d-04 +c--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 408) .and. + > (grid_points(2) .eq. 408) .and. + > (grid_points(3) .eq. 408) .and. + > (no_time_steps . eq. 250) ) then + + class = 'D' + dtref = 0.2d-4 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.2533188551738d+05 + xcrref(2) = 0.2346393716980d+04 + xcrref(3) = 0.6294554366904d+04 + xcrref(4) = 0.5352565376030d+04 + xcrref(5) = 0.3905864038618d+05 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + + if (iotype .eq. 0) then + xceref(1) = 0.3100009377557d+03 + xceref(2) = 0.2424086324913d+02 + xceref(3) = 0.7782212022645d+02 + xceref(4) = 0.6835623860116d+02 + xceref(5) = 0.6065737200368d+03 + else + xceref(1) = 0.3813781566713d+03 + xceref(2) = 0.3160872966198d+02 + xceref(3) = 0.9593576357290d+02 + xceref(4) = 0.8363391989815d+02 + xceref(5) = 0.7063466087423d+03 + endif + + +c--------------------------------------------------------------------- +c reference data for 1020x1020x1020 grids after 250 time steps, +c with DT = 0.4d-05 +c--------------------------------------------------------------------- + elseif ( (grid_points(1) .eq. 1020) .and. + > (grid_points(2) .eq. 1020) .and. + > (grid_points(3) .eq. 1020) .and. + > (no_time_steps . eq. 250) ) then + + class = 'E' + dtref = 0.4d-5 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of residual. +c--------------------------------------------------------------------- + xcrref(1) = 0.9795372484517d+05 + xcrref(2) = 0.9739814511521d+04 + xcrref(3) = 0.2467606342965d+05 + xcrref(4) = 0.2092419572860d+05 + xcrref(5) = 0.1392138856939d+06 + +c--------------------------------------------------------------------- +c Reference values of RMS-norms of solution error. +c--------------------------------------------------------------------- + + if (iotype .eq. 0) then + xceref(1) = 0.4327562208414d+03 + xceref(2) = 0.3699051964887d+02 + xceref(3) = 0.1089845040954d+03 + xceref(4) = 0.9462517622043d+02 + xceref(5) = 0.7765512765309d+03 + else +c wr_interval = 5 + xceref(1) = 0.4729898413058d+03 + xceref(2) = 0.4145899331704d+02 + xceref(3) = 0.1192850917138d+03 + xceref(4) = 0.1032746026932d+03 + xceref(5) = 0.8270322177634d+03 +c wr_interval = 10 +c xceref(1) = 0.4718135916251d+03 +c xceref(2) = 0.4132620259096d+02 +c xceref(3) = 0.1189831133503d+03 +c xceref(4) = 0.1030212798803d+03 +c xceref(5) = 0.8255924078458d+03 + endif + + else + verified = .false. + endif + +c--------------------------------------------------------------------- +c verification test for residuals if gridsize is one of +c the defined grid sizes above (class .ne. 'U') +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Compute the difference of solution values and the known reference +c values. +c--------------------------------------------------------------------- + do m = 1, 5 + + xcrdif(m) = dabs((xcr(m)-xcrref(m))/xcrref(m)) + xcedif(m) = dabs((xce(m)-xceref(m))/xceref(m)) + + enddo + +c--------------------------------------------------------------------- +c Output the comparison of computed results to known cases. +c--------------------------------------------------------------------- + + if (class .ne. 'U') then + write(*, 1990) class + 1990 format(' Verification being performed for class ', a) + write (*,2000) epsilon + 2000 format(' accuracy setting for epsilon = ', E20.13) + verified = (dabs(dt-dtref) .le. epsilon) + if (.not.verified) then + class = 'U' + write (*,1000) dtref + 1000 format(' DT does not match the reference value of ', + > E15.8) + endif + else + write(*, 1995) + 1995 format(' Unknown class') + endif + + + if (class .ne. 'U') then + write (*,2001) + else + write (*, 2005) + endif + + 2001 format(' Comparison of RMS-norms of residual') + 2005 format(' RMS-norms of residual') + do m = 1, 5 + if (class .eq. 'U') then + write(*, 2015) m, xcr(m) + else if (xcrdif(m) .le. epsilon) then + write (*,2011) m,xcr(m),xcrref(m),xcrdif(m) + else + verified = .false. + write (*,2010) m,xcr(m),xcrref(m),xcrdif(m) + endif + enddo + + if (class .ne. 'U') then + write (*,2002) + else + write (*,2006) + endif + 2002 format(' Comparison of RMS-norms of solution error') + 2006 format(' RMS-norms of solution error') + + do m = 1, 5 + if (class .eq. 'U') then + write(*, 2015) m, xce(m) + else if (xcedif(m) .le. epsilon) then + write (*,2011) m,xce(m),xceref(m),xcedif(m) + else + verified = .false. + write (*,2010) m,xce(m),xceref(m),xcedif(m) + endif + enddo + + 2010 format(' FAILURE: ', i2, E20.13, E20.13, E20.13) + 2011 format(' ', i2, E20.13, E20.13, E20.13) + 2015 format(' ', i2, E20.13) + + if (class .eq. 'U') then + write(*, 2022) + write(*, 2023) + 2022 format(' No reference values provided') + 2023 format(' No verification performed') + else if (verified) then + write(*, 2020) + 2020 format(' Verification Successful') + else + write(*, 2021) + 2021 format(' Verification failed') + endif + + return + + + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/work_lhs.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/work_lhs.h new file mode 100644 index 0000000..d9bc9e4 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/work_lhs.h @@ -0,0 +1,14 @@ +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- +c +c work_lhs.h +c +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + double precision fjac(5, 5, -2:MAX_CELL_DIM+1), + > njac(5, 5, -2:MAX_CELL_DIM+1), + > lhsa(5, 5, -1:MAX_CELL_DIM), + > lhsb(5, 5, -1:MAX_CELL_DIM), + > tmp1, tmp2, tmp3 + common /work_lhs/ fjac, njac, lhsa, lhsb, tmp1, tmp2, tmp3 diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/x_solve.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/x_solve.f new file mode 100644 index 0000000..e0daab3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/BT_dvmh/x_solve.f @@ -0,0 +1,3547 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + pure subroutine lhsabinit(lhsa, lhsb, size) + implicit none + intent (out)::lhsa, lhsb + intent (in)::size + integer size + double precision lhsa(5, 5, -1:size), lhsb(5, 5, -1:size) + + integer i, m, n + +c--------------------------------------------------------------------- +c next, set all diagonal values to 1. This is overkill, but convenient +c--------------------------------------------------------------------- + do i = 0, size + do m = 1, 5 + do n = 1, 5 + lhsa(m,n,i) = 0.0d0 + lhsb(m,n,i) = 0.0d0 + enddo + lhsb(m,m,i) = 1.0d0 + enddo + enddo + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + pure subroutine matvec_sub(ablock,avec,bvec) +!DVM$ routine +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c subtracts bvec=bvec - ablock*avec +c--------------------------------------------------------------------- + + implicit none + intent (inout)::ablock,avec,bvec + double precision ablock,avec,bvec + dimension ablock(5,5),avec(5),bvec(5) + +c--------------------------------------------------------------------- +c rhs(i,ic,jc,kc,ccell) = rhs(i,ic,jc,kc,ccell) +c $ - lhs(i,1,ablock,ia,ja,ka,acell)* +c--------------------------------------------------------------------- + bvec(1) = bvec(1) - ablock(1,1)*avec(1) + > - ablock(1,2)*avec(2) + > - ablock(1,3)*avec(3) + > - ablock(1,4)*avec(4) + > - ablock(1,5)*avec(5) + bvec(2) = bvec(2) - ablock(2,1)*avec(1) + > - ablock(2,2)*avec(2) + > - ablock(2,3)*avec(3) + > - ablock(2,4)*avec(4) + > - ablock(2,5)*avec(5) + bvec(3) = bvec(3) - ablock(3,1)*avec(1) + > - ablock(3,2)*avec(2) + > - ablock(3,3)*avec(3) + > - ablock(3,4)*avec(4) + > - ablock(3,5)*avec(5) + bvec(4) = bvec(4) - ablock(4,1)*avec(1) + > - ablock(4,2)*avec(2) + > - ablock(4,3)*avec(3) + > - ablock(4,4)*avec(4) + > - ablock(4,5)*avec(5) + bvec(5) = bvec(5) - ablock(5,1)*avec(1) + > - ablock(5,2)*avec(2) + > - ablock(5,3)*avec(3) + > - ablock(5,4)*avec(4) + > - ablock(5,5)*avec(5) + + + return + end +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + pure subroutine matmul_sub(ablock, bblock, cblock) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c subtracts a(i,j,k) X b(i,j,k) from c(i,j,k) +c--------------------------------------------------------------------- + + implicit none + intent (inout)::cblock + intent (in)::ablock, bblock + double precision ablock, bblock, cblock + dimension ablock(5,5), bblock(5,5), cblock(5,5) + + + cblock(1,1) = cblock(1,1) - ablock(1,1)*bblock(1,1) + > - ablock(1,2)*bblock(2,1) + > - ablock(1,3)*bblock(3,1) + > - ablock(1,4)*bblock(4,1) + > - ablock(1,5)*bblock(5,1) + cblock(2,1) = cblock(2,1) - ablock(2,1)*bblock(1,1) + > - ablock(2,2)*bblock(2,1) + > - ablock(2,3)*bblock(3,1) + > - ablock(2,4)*bblock(4,1) + > - ablock(2,5)*bblock(5,1) + cblock(3,1) = cblock(3,1) - ablock(3,1)*bblock(1,1) + > - ablock(3,2)*bblock(2,1) + > - ablock(3,3)*bblock(3,1) + > - ablock(3,4)*bblock(4,1) + > - ablock(3,5)*bblock(5,1) + cblock(4,1) = cblock(4,1) - ablock(4,1)*bblock(1,1) + > - ablock(4,2)*bblock(2,1) + > - ablock(4,3)*bblock(3,1) + > - ablock(4,4)*bblock(4,1) + > - ablock(4,5)*bblock(5,1) + cblock(5,1) = cblock(5,1) - ablock(5,1)*bblock(1,1) + > - ablock(5,2)*bblock(2,1) + > - ablock(5,3)*bblock(3,1) + > - ablock(5,4)*bblock(4,1) + > - ablock(5,5)*bblock(5,1) + cblock(1,2) = cblock(1,2) - ablock(1,1)*bblock(1,2) + > - ablock(1,2)*bblock(2,2) + > - ablock(1,3)*bblock(3,2) + > - ablock(1,4)*bblock(4,2) + > - ablock(1,5)*bblock(5,2) + cblock(2,2) = cblock(2,2) - ablock(2,1)*bblock(1,2) + > - ablock(2,2)*bblock(2,2) + > - ablock(2,3)*bblock(3,2) + > - ablock(2,4)*bblock(4,2) + > - ablock(2,5)*bblock(5,2) + cblock(3,2) = cblock(3,2) - ablock(3,1)*bblock(1,2) + > - ablock(3,2)*bblock(2,2) + > - ablock(3,3)*bblock(3,2) + > - ablock(3,4)*bblock(4,2) + > - ablock(3,5)*bblock(5,2) + cblock(4,2) = cblock(4,2) - ablock(4,1)*bblock(1,2) + > - ablock(4,2)*bblock(2,2) + > - ablock(4,3)*bblock(3,2) + > - ablock(4,4)*bblock(4,2) + > - ablock(4,5)*bblock(5,2) + cblock(5,2) = cblock(5,2) - ablock(5,1)*bblock(1,2) + > - ablock(5,2)*bblock(2,2) + > - ablock(5,3)*bblock(3,2) + > - ablock(5,4)*bblock(4,2) + > - ablock(5,5)*bblock(5,2) + cblock(1,3) = cblock(1,3) - ablock(1,1)*bblock(1,3) + > - ablock(1,2)*bblock(2,3) + > - ablock(1,3)*bblock(3,3) + > - ablock(1,4)*bblock(4,3) + > - ablock(1,5)*bblock(5,3) + cblock(2,3) = cblock(2,3) - ablock(2,1)*bblock(1,3) + > - ablock(2,2)*bblock(2,3) + > - ablock(2,3)*bblock(3,3) + > - ablock(2,4)*bblock(4,3) + > - ablock(2,5)*bblock(5,3) + cblock(3,3) = cblock(3,3) - ablock(3,1)*bblock(1,3) + > - ablock(3,2)*bblock(2,3) + > - ablock(3,3)*bblock(3,3) + > - ablock(3,4)*bblock(4,3) + > - ablock(3,5)*bblock(5,3) + cblock(4,3) = cblock(4,3) - ablock(4,1)*bblock(1,3) + > - ablock(4,2)*bblock(2,3) + > - ablock(4,3)*bblock(3,3) + > - ablock(4,4)*bblock(4,3) + > - ablock(4,5)*bblock(5,3) + cblock(5,3) = cblock(5,3) - ablock(5,1)*bblock(1,3) + > - ablock(5,2)*bblock(2,3) + > - ablock(5,3)*bblock(3,3) + > - ablock(5,4)*bblock(4,3) + > - ablock(5,5)*bblock(5,3) + cblock(1,4) = cblock(1,4) - ablock(1,1)*bblock(1,4) + > - ablock(1,2)*bblock(2,4) + > - ablock(1,3)*bblock(3,4) + > - ablock(1,4)*bblock(4,4) + > - ablock(1,5)*bblock(5,4) + cblock(2,4) = cblock(2,4) - ablock(2,1)*bblock(1,4) + > - ablock(2,2)*bblock(2,4) + > - ablock(2,3)*bblock(3,4) + > - ablock(2,4)*bblock(4,4) + > - ablock(2,5)*bblock(5,4) + cblock(3,4) = cblock(3,4) - ablock(3,1)*bblock(1,4) + > - ablock(3,2)*bblock(2,4) + > - ablock(3,3)*bblock(3,4) + > - ablock(3,4)*bblock(4,4) + > - ablock(3,5)*bblock(5,4) + cblock(4,4) = cblock(4,4) - ablock(4,1)*bblock(1,4) + > - ablock(4,2)*bblock(2,4) + > - ablock(4,3)*bblock(3,4) + > - ablock(4,4)*bblock(4,4) + > - ablock(4,5)*bblock(5,4) + cblock(5,4) = cblock(5,4) - ablock(5,1)*bblock(1,4) + > - ablock(5,2)*bblock(2,4) + > - ablock(5,3)*bblock(3,4) + > - ablock(5,4)*bblock(4,4) + > - ablock(5,5)*bblock(5,4) + cblock(1,5) = cblock(1,5) - ablock(1,1)*bblock(1,5) + > - ablock(1,2)*bblock(2,5) + > - ablock(1,3)*bblock(3,5) + > - ablock(1,4)*bblock(4,5) + > - ablock(1,5)*bblock(5,5) + cblock(2,5) = cblock(2,5) - ablock(2,1)*bblock(1,5) + > - ablock(2,2)*bblock(2,5) + > - ablock(2,3)*bblock(3,5) + > - ablock(2,4)*bblock(4,5) + > - ablock(2,5)*bblock(5,5) + cblock(3,5) = cblock(3,5) - ablock(3,1)*bblock(1,5) + > - ablock(3,2)*bblock(2,5) + > - ablock(3,3)*bblock(3,5) + > - ablock(3,4)*bblock(4,5) + > - ablock(3,5)*bblock(5,5) + cblock(4,5) = cblock(4,5) - ablock(4,1)*bblock(1,5) + > - ablock(4,2)*bblock(2,5) + > - ablock(4,3)*bblock(3,5) + > - ablock(4,4)*bblock(4,5) + > - ablock(4,5)*bblock(5,5) + cblock(5,5) = cblock(5,5) - ablock(5,1)*bblock(1,5) + > - ablock(5,2)*bblock(2,5) + > - ablock(5,3)*bblock(3,5) + > - ablock(5,4)*bblock(4,5) + > - ablock(5,5)*bblock(5,5) + + + return + end + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + pure subroutine binvcrhs( lhs,c,r ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c--------------------------------------------------------------------- + + implicit none + intent (inout)::lhs,c,r + double precision pivot, coeff, lhs + dimension lhs(5,5) + double precision c(5,5), r(5) + +c--------------------------------------------------------------------- +c +c--------------------------------------------------------------------- + + pivot = 1.00d0/lhs(1,1) + lhs(1,2) = lhs(1,2)*pivot + lhs(1,3) = lhs(1,3)*pivot + lhs(1,4) = lhs(1,4)*pivot + lhs(1,5) = lhs(1,5)*pivot + c(1,1) = c(1,1)*pivot + c(1,2) = c(1,2)*pivot + c(1,3) = c(1,3)*pivot + c(1,4) = c(1,4)*pivot + c(1,5) = c(1,5)*pivot + r(1) = r(1) *pivot + + coeff = lhs(2,1) + lhs(2,2)= lhs(2,2) - coeff*lhs(1,2) + lhs(2,3)= lhs(2,3) - coeff*lhs(1,3) + lhs(2,4)= lhs(2,4) - coeff*lhs(1,4) + lhs(2,5)= lhs(2,5) - coeff*lhs(1,5) + c(2,1) = c(2,1) - coeff*c(1,1) + c(2,2) = c(2,2) - coeff*c(1,2) + c(2,3) = c(2,3) - coeff*c(1,3) + c(2,4) = c(2,4) - coeff*c(1,4) + c(2,5) = c(2,5) - coeff*c(1,5) + r(2) = r(2) - coeff*r(1) + + coeff = lhs(3,1) + lhs(3,2)= lhs(3,2) - coeff*lhs(1,2) + lhs(3,3)= lhs(3,3) - coeff*lhs(1,3) + lhs(3,4)= lhs(3,4) - coeff*lhs(1,4) + lhs(3,5)= lhs(3,5) - coeff*lhs(1,5) + c(3,1) = c(3,1) - coeff*c(1,1) + c(3,2) = c(3,2) - coeff*c(1,2) + c(3,3) = c(3,3) - coeff*c(1,3) + c(3,4) = c(3,4) - coeff*c(1,4) + c(3,5) = c(3,5) - coeff*c(1,5) + r(3) = r(3) - coeff*r(1) + + coeff = lhs(4,1) + lhs(4,2)= lhs(4,2) - coeff*lhs(1,2) + lhs(4,3)= lhs(4,3) - coeff*lhs(1,3) + lhs(4,4)= lhs(4,4) - coeff*lhs(1,4) + lhs(4,5)= lhs(4,5) - coeff*lhs(1,5) + c(4,1) = c(4,1) - coeff*c(1,1) + c(4,2) = c(4,2) - coeff*c(1,2) + c(4,3) = c(4,3) - coeff*c(1,3) + c(4,4) = c(4,4) - coeff*c(1,4) + c(4,5) = c(4,5) - coeff*c(1,5) + r(4) = r(4) - coeff*r(1) + + coeff = lhs(5,1) + lhs(5,2)= lhs(5,2) - coeff*lhs(1,2) + lhs(5,3)= lhs(5,3) - coeff*lhs(1,3) + lhs(5,4)= lhs(5,4) - coeff*lhs(1,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(1,5) + c(5,1) = c(5,1) - coeff*c(1,1) + c(5,2) = c(5,2) - coeff*c(1,2) + c(5,3) = c(5,3) - coeff*c(1,3) + c(5,4) = c(5,4) - coeff*c(1,4) + c(5,5) = c(5,5) - coeff*c(1,5) + r(5) = r(5) - coeff*r(1) + + + pivot = 1.00d0/lhs(2,2) + lhs(2,3) = lhs(2,3)*pivot + lhs(2,4) = lhs(2,4)*pivot + lhs(2,5) = lhs(2,5)*pivot + c(2,1) = c(2,1)*pivot + c(2,2) = c(2,2)*pivot + c(2,3) = c(2,3)*pivot + c(2,4) = c(2,4)*pivot + c(2,5) = c(2,5)*pivot + r(2) = r(2) *pivot + + coeff = lhs(1,2) + lhs(1,3)= lhs(1,3) - coeff*lhs(2,3) + lhs(1,4)= lhs(1,4) - coeff*lhs(2,4) + lhs(1,5)= lhs(1,5) - coeff*lhs(2,5) + c(1,1) = c(1,1) - coeff*c(2,1) + c(1,2) = c(1,2) - coeff*c(2,2) + c(1,3) = c(1,3) - coeff*c(2,3) + c(1,4) = c(1,4) - coeff*c(2,4) + c(1,5) = c(1,5) - coeff*c(2,5) + r(1) = r(1) - coeff*r(2) + + coeff = lhs(3,2) + lhs(3,3)= lhs(3,3) - coeff*lhs(2,3) + lhs(3,4)= lhs(3,4) - coeff*lhs(2,4) + lhs(3,5)= lhs(3,5) - coeff*lhs(2,5) + c(3,1) = c(3,1) - coeff*c(2,1) + c(3,2) = c(3,2) - coeff*c(2,2) + c(3,3) = c(3,3) - coeff*c(2,3) + c(3,4) = c(3,4) - coeff*c(2,4) + c(3,5) = c(3,5) - coeff*c(2,5) + r(3) = r(3) - coeff*r(2) + + coeff = lhs(4,2) + lhs(4,3)= lhs(4,3) - coeff*lhs(2,3) + lhs(4,4)= lhs(4,4) - coeff*lhs(2,4) + lhs(4,5)= lhs(4,5) - coeff*lhs(2,5) + c(4,1) = c(4,1) - coeff*c(2,1) + c(4,2) = c(4,2) - coeff*c(2,2) + c(4,3) = c(4,3) - coeff*c(2,3) + c(4,4) = c(4,4) - coeff*c(2,4) + c(4,5) = c(4,5) - coeff*c(2,5) + r(4) = r(4) - coeff*r(2) + + coeff = lhs(5,2) + lhs(5,3)= lhs(5,3) - coeff*lhs(2,3) + lhs(5,4)= lhs(5,4) - coeff*lhs(2,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(2,5) + c(5,1) = c(5,1) - coeff*c(2,1) + c(5,2) = c(5,2) - coeff*c(2,2) + c(5,3) = c(5,3) - coeff*c(2,3) + c(5,4) = c(5,4) - coeff*c(2,4) + c(5,5) = c(5,5) - coeff*c(2,5) + r(5) = r(5) - coeff*r(2) + + + pivot = 1.00d0/lhs(3,3) + lhs(3,4) = lhs(3,4)*pivot + lhs(3,5) = lhs(3,5)*pivot + c(3,1) = c(3,1)*pivot + c(3,2) = c(3,2)*pivot + c(3,3) = c(3,3)*pivot + c(3,4) = c(3,4)*pivot + c(3,5) = c(3,5)*pivot + r(3) = r(3) *pivot + + coeff = lhs(1,3) + lhs(1,4)= lhs(1,4) - coeff*lhs(3,4) + lhs(1,5)= lhs(1,5) - coeff*lhs(3,5) + c(1,1) = c(1,1) - coeff*c(3,1) + c(1,2) = c(1,2) - coeff*c(3,2) + c(1,3) = c(1,3) - coeff*c(3,3) + c(1,4) = c(1,4) - coeff*c(3,4) + c(1,5) = c(1,5) - coeff*c(3,5) + r(1) = r(1) - coeff*r(3) + + coeff = lhs(2,3) + lhs(2,4)= lhs(2,4) - coeff*lhs(3,4) + lhs(2,5)= lhs(2,5) - coeff*lhs(3,5) + c(2,1) = c(2,1) - coeff*c(3,1) + c(2,2) = c(2,2) - coeff*c(3,2) + c(2,3) = c(2,3) - coeff*c(3,3) + c(2,4) = c(2,4) - coeff*c(3,4) + c(2,5) = c(2,5) - coeff*c(3,5) + r(2) = r(2) - coeff*r(3) + + coeff = lhs(4,3) + lhs(4,4)= lhs(4,4) - coeff*lhs(3,4) + lhs(4,5)= lhs(4,5) - coeff*lhs(3,5) + c(4,1) = c(4,1) - coeff*c(3,1) + c(4,2) = c(4,2) - coeff*c(3,2) + c(4,3) = c(4,3) - coeff*c(3,3) + c(4,4) = c(4,4) - coeff*c(3,4) + c(4,5) = c(4,5) - coeff*c(3,5) + r(4) = r(4) - coeff*r(3) + + coeff = lhs(5,3) + lhs(5,4)= lhs(5,4) - coeff*lhs(3,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(3,5) + c(5,1) = c(5,1) - coeff*c(3,1) + c(5,2) = c(5,2) - coeff*c(3,2) + c(5,3) = c(5,3) - coeff*c(3,3) + c(5,4) = c(5,4) - coeff*c(3,4) + c(5,5) = c(5,5) - coeff*c(3,5) + r(5) = r(5) - coeff*r(3) + + + pivot = 1.00d0/lhs(4,4) + lhs(4,5) = lhs(4,5)*pivot + c(4,1) = c(4,1)*pivot + c(4,2) = c(4,2)*pivot + c(4,3) = c(4,3)*pivot + c(4,4) = c(4,4)*pivot + c(4,5) = c(4,5)*pivot + r(4) = r(4) *pivot + + coeff = lhs(1,4) + lhs(1,5)= lhs(1,5) - coeff*lhs(4,5) + c(1,1) = c(1,1) - coeff*c(4,1) + c(1,2) = c(1,2) - coeff*c(4,2) + c(1,3) = c(1,3) - coeff*c(4,3) + c(1,4) = c(1,4) - coeff*c(4,4) + c(1,5) = c(1,5) - coeff*c(4,5) + r(1) = r(1) - coeff*r(4) + + coeff = lhs(2,4) + lhs(2,5)= lhs(2,5) - coeff*lhs(4,5) + c(2,1) = c(2,1) - coeff*c(4,1) + c(2,2) = c(2,2) - coeff*c(4,2) + c(2,3) = c(2,3) - coeff*c(4,3) + c(2,4) = c(2,4) - coeff*c(4,4) + c(2,5) = c(2,5) - coeff*c(4,5) + r(2) = r(2) - coeff*r(4) + + coeff = lhs(3,4) + lhs(3,5)= lhs(3,5) - coeff*lhs(4,5) + c(3,1) = c(3,1) - coeff*c(4,1) + c(3,2) = c(3,2) - coeff*c(4,2) + c(3,3) = c(3,3) - coeff*c(4,3) + c(3,4) = c(3,4) - coeff*c(4,4) + c(3,5) = c(3,5) - coeff*c(4,5) + r(3) = r(3) - coeff*r(4) + + coeff = lhs(5,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(4,5) + c(5,1) = c(5,1) - coeff*c(4,1) + c(5,2) = c(5,2) - coeff*c(4,2) + c(5,3) = c(5,3) - coeff*c(4,3) + c(5,4) = c(5,4) - coeff*c(4,4) + c(5,5) = c(5,5) - coeff*c(4,5) + r(5) = r(5) - coeff*r(4) + + + pivot = 1.00d0/lhs(5,5) + c(5,1) = c(5,1)*pivot + c(5,2) = c(5,2)*pivot + c(5,3) = c(5,3)*pivot + c(5,4) = c(5,4)*pivot + c(5,5) = c(5,5)*pivot + r(5) = r(5) *pivot + + coeff = lhs(1,5) + c(1,1) = c(1,1) - coeff*c(5,1) + c(1,2) = c(1,2) - coeff*c(5,2) + c(1,3) = c(1,3) - coeff*c(5,3) + c(1,4) = c(1,4) - coeff*c(5,4) + c(1,5) = c(1,5) - coeff*c(5,5) + r(1) = r(1) - coeff*r(5) + + coeff = lhs(2,5) + c(2,1) = c(2,1) - coeff*c(5,1) + c(2,2) = c(2,2) - coeff*c(5,2) + c(2,3) = c(2,3) - coeff*c(5,3) + c(2,4) = c(2,4) - coeff*c(5,4) + c(2,5) = c(2,5) - coeff*c(5,5) + r(2) = r(2) - coeff*r(5) + + coeff = lhs(3,5) + c(3,1) = c(3,1) - coeff*c(5,1) + c(3,2) = c(3,2) - coeff*c(5,2) + c(3,3) = c(3,3) - coeff*c(5,3) + c(3,4) = c(3,4) - coeff*c(5,4) + c(3,5) = c(3,5) - coeff*c(5,5) + r(3) = r(3) - coeff*r(5) + + coeff = lhs(4,5) + c(4,1) = c(4,1) - coeff*c(5,1) + c(4,2) = c(4,2) - coeff*c(5,2) + c(4,3) = c(4,3) - coeff*c(5,3) + c(4,4) = c(4,4) - coeff*c(5,4) + c(4,5) = c(4,5) - coeff*c(5,5) + r(4) = r(4) - coeff*r(5) + + + return + end + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + pure subroutine binvrhs( lhs,r ) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c--------------------------------------------------------------------- + + implicit none + intent (inout)::lhs,r + double precision pivot, coeff, lhs + dimension lhs(5,5) + double precision r(5) + +c--------------------------------------------------------------------- +c +c--------------------------------------------------------------------- + + + pivot = 1.00d0/lhs(1,1) + lhs(1,2) = lhs(1,2)*pivot + lhs(1,3) = lhs(1,3)*pivot + lhs(1,4) = lhs(1,4)*pivot + lhs(1,5) = lhs(1,5)*pivot + r(1) = r(1) *pivot + + coeff = lhs(2,1) + lhs(2,2)= lhs(2,2) - coeff*lhs(1,2) + lhs(2,3)= lhs(2,3) - coeff*lhs(1,3) + lhs(2,4)= lhs(2,4) - coeff*lhs(1,4) + lhs(2,5)= lhs(2,5) - coeff*lhs(1,5) + r(2) = r(2) - coeff*r(1) + + coeff = lhs(3,1) + lhs(3,2)= lhs(3,2) - coeff*lhs(1,2) + lhs(3,3)= lhs(3,3) - coeff*lhs(1,3) + lhs(3,4)= lhs(3,4) - coeff*lhs(1,4) + lhs(3,5)= lhs(3,5) - coeff*lhs(1,5) + r(3) = r(3) - coeff*r(1) + + coeff = lhs(4,1) + lhs(4,2)= lhs(4,2) - coeff*lhs(1,2) + lhs(4,3)= lhs(4,3) - coeff*lhs(1,3) + lhs(4,4)= lhs(4,4) - coeff*lhs(1,4) + lhs(4,5)= lhs(4,5) - coeff*lhs(1,5) + r(4) = r(4) - coeff*r(1) + + coeff = lhs(5,1) + lhs(5,2)= lhs(5,2) - coeff*lhs(1,2) + lhs(5,3)= lhs(5,3) - coeff*lhs(1,3) + lhs(5,4)= lhs(5,4) - coeff*lhs(1,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(1,5) + r(5) = r(5) - coeff*r(1) + + + pivot = 1.00d0/lhs(2,2) + lhs(2,3) = lhs(2,3)*pivot + lhs(2,4) = lhs(2,4)*pivot + lhs(2,5) = lhs(2,5)*pivot + r(2) = r(2) *pivot + + coeff = lhs(1,2) + lhs(1,3)= lhs(1,3) - coeff*lhs(2,3) + lhs(1,4)= lhs(1,4) - coeff*lhs(2,4) + lhs(1,5)= lhs(1,5) - coeff*lhs(2,5) + r(1) = r(1) - coeff*r(2) + + coeff = lhs(3,2) + lhs(3,3)= lhs(3,3) - coeff*lhs(2,3) + lhs(3,4)= lhs(3,4) - coeff*lhs(2,4) + lhs(3,5)= lhs(3,5) - coeff*lhs(2,5) + r(3) = r(3) - coeff*r(2) + + coeff = lhs(4,2) + lhs(4,3)= lhs(4,3) - coeff*lhs(2,3) + lhs(4,4)= lhs(4,4) - coeff*lhs(2,4) + lhs(4,5)= lhs(4,5) - coeff*lhs(2,5) + r(4) = r(4) - coeff*r(2) + + coeff = lhs(5,2) + lhs(5,3)= lhs(5,3) - coeff*lhs(2,3) + lhs(5,4)= lhs(5,4) - coeff*lhs(2,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(2,5) + r(5) = r(5) - coeff*r(2) + + + pivot = 1.00d0/lhs(3,3) + lhs(3,4) = lhs(3,4)*pivot + lhs(3,5) = lhs(3,5)*pivot + r(3) = r(3) *pivot + + coeff = lhs(1,3) + lhs(1,4)= lhs(1,4) - coeff*lhs(3,4) + lhs(1,5)= lhs(1,5) - coeff*lhs(3,5) + r(1) = r(1) - coeff*r(3) + + coeff = lhs(2,3) + lhs(2,4)= lhs(2,4) - coeff*lhs(3,4) + lhs(2,5)= lhs(2,5) - coeff*lhs(3,5) + r(2) = r(2) - coeff*r(3) + + coeff = lhs(4,3) + lhs(4,4)= lhs(4,4) - coeff*lhs(3,4) + lhs(4,5)= lhs(4,5) - coeff*lhs(3,5) + r(4) = r(4) - coeff*r(3) + + coeff = lhs(5,3) + lhs(5,4)= lhs(5,4) - coeff*lhs(3,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(3,5) + r(5) = r(5) - coeff*r(3) + + + pivot = 1.00d0/lhs(4,4) + lhs(4,5) = lhs(4,5)*pivot + r(4) = r(4) *pivot + + coeff = lhs(1,4) + lhs(1,5)= lhs(1,5) - coeff*lhs(4,5) + r(1) = r(1) - coeff*r(4) + + coeff = lhs(2,4) + lhs(2,5)= lhs(2,5) - coeff*lhs(4,5) + r(2) = r(2) - coeff*r(4) + + coeff = lhs(3,4) + lhs(3,5)= lhs(3,5) - coeff*lhs(4,5) + r(3) = r(3) - coeff*r(4) + + coeff = lhs(5,4) + lhs(5,5)= lhs(5,5) - coeff*lhs(4,5) + r(5) = r(5) - coeff*r(4) + + + pivot = 1.00d0/lhs(5,5) + r(5) = r(5) *pivot + + coeff = lhs(1,5) + r(1) = r(1) - coeff*r(5) + + coeff = lhs(2,5) + r(2) = r(2) - coeff*r(5) + + coeff = lhs(3,5) + r(3) = r(3) - coeff*r(5) + + coeff = lhs(4,5) + r(4) = r(4) - coeff*r(5) + + + return + end + + + + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c +c Performs line solves in X direction by first factoring +c the block-tridiagonal matrix into an upper triangular matrix, +c and then performing back substitution to solve for the unknow +c vectors of each line. +c +c Make sure we treat elements zero to cell_size in the direction +c of the sweep. +c +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer c, istart, stage, + > first, last, recv_id, error, r_status(MPI_STATUS_SIZE), + > isize,jsize,ksize,send_id,k,j,i + + istart = 0 + + if (timeron) call timer_start(t_xsolve) +c--------------------------------------------------------------------- +c in our terminology stage is the number of the cell in the x-direction +c i.e. stage = 1 means the start of the line stage=ncells means end +c--------------------------------------------------------------------- + call x_first() + do stage = 1,ncells + c = slice(1,stage) + isize = cell_size(1,c) - 1 + jsize = cell_size(2,c) - 1 + ksize = cell_size(3,c) - 1 + +c--------------------------------------------------------------------- +c set last-cell flag +c--------------------------------------------------------------------- + if (stage .eq. ncells) then + last = 1 + else + last = 0 + endif + + if (stage .eq. 1) then +c--------------------------------------------------------------------- +c This is the first cell, so solve without receiving data +c--------------------------------------------------------------------- + first = 1 +c call lhsx(c) + call x_solve_cell(first,last,c) + else +c--------------------------------------------------------------------- +c Not the first cell of this line, so receive info from +c processor working on preceeding cell +c--------------------------------------------------------------------- + first = 0 + if (timeron) call timer_start(t_xcomm) + call x_receive_solve_info(recv_id,c) +c--------------------------------------------------------------------- +c overlap computations and communications +c--------------------------------------------------------------------- +c call lhsx(c) +c--------------------------------------------------------------------- +c wait for completion +c--------------------------------------------------------------------- + call mpi_wait(send_id,r_status,error) + call mpi_wait(recv_id,r_status,error) + if (timeron) call timer_stop(t_xcomm) +c--------------------------------------------------------------------- +c install C'(istart) and rhs'(istart) to be used in this cell +c--------------------------------------------------------------------- + call x_unpack_solve_info(c) + call x_solve_cell(first,last,c) + endif + + if (last .eq. 0) call x_send_solve_info(send_id,c) + enddo +c--------------------------------------------------------------------- +c now perform backsubstitution in reverse direction +c--------------------------------------------------------------------- + do stage = ncells, 1, -1 + c = slice(1,stage) + first = 0 + last = 0 + if (stage .eq. 1) first = 1 + if (stage .eq. ncells) then + last = 1 +c--------------------------------------------------------------------- +c last cell, so perform back substitute without waiting +c--------------------------------------------------------------------- + call x_backsubstitute(first, last,c) + else + if (timeron) call timer_start(t_xcomm) + call x_receive_backsub_info(recv_id,c) + call mpi_wait(send_id,r_status,error) + call mpi_wait(recv_id,r_status,error) + if (timeron) call timer_stop(t_xcomm) + call x_unpack_backsub_info(c) + call x_backsubstitute(first,last,c) + endif + if (first .eq. 0) call x_send_backsub_info(send_id,c) + enddo + if (timeron) call timer_stop(t_xsolve) + + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_unpack_solve_info(c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c unpack C'(-1) and rhs'(-1) for +c all j and k +c--------------------------------------------------------------------- + + include 'header.h' + integer j,k,m,n,ptr,c,istart + + istart = 0 + ptr = 0 +!DVM$ actual(out_buffer) +!DVM$ region +!DVM$ PARALLEL(k,j), PRIVATE(ptr,m,n), +!DVM$& TIE(lhsc(*,*,*,j,k,*), rhs(*,*,j,k,c)) + do k=0,KMAX-1 + do j=0,JMAX-1 + ptr = (k * JMAX + J) * (BLOCK_SIZE +BLOCK_SIZE*BLOCK_SIZE) + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + lhsc(m,n,istart-1,j,k,c) = out_buffer(ptr+n+(m-1)*BLOCK_SIZE) + enddo + enddo + + do n=1,BLOCK_SIZE + rhs(n,istart-1,j,k,c) = out_buffer(ptr+n+BLOCK_SIZE*BLOCK_SIZE) + enddo + enddo + enddo +!DVM$ end region + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_send_solve_info(send_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c pack up and send C'(iend) and rhs'(iend) for +c all j and k +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer j,k,m,n,isize,ptr,c,jp,kp + integer error,send_id,buffer_size + + isize = cell_size(1,c)-1 + jp = cell_coord(2,c) - 1 + kp = cell_coord(3,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM* + > (BLOCK_SIZE*BLOCK_SIZE + BLOCK_SIZE) + +c--------------------------------------------------------------------- +c pack up buffer +c--------------------------------------------------------------------- + ptr = 0 +!DVM$ region out(in_buffer) +!DVM$ PARALLEL(k,j), PRIVATE(ptr,m,n), +!DVM$& TIE(lhsc(*,*,*,j,k,*), rhs(*,*,j,k,c)) + do k=0,KMAX-1 + do j=0,JMAX-1 + ptr = (k * JMAX + J) * (BLOCK_SIZE +BLOCK_SIZE*BLOCK_SIZE) + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + in_buffer(ptr+n+(m-1)*BLOCK_SIZE) = lhsc(m,n,isize,j,k,c) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + do n=1,BLOCK_SIZE + in_buffer(ptr+n+BLOCK_SIZE*BLOCK_SIZE) = rhs(n,isize,j,k,c) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + enddo +!DVM$ end region +!DVM$ get_actual(in_buffer) +c--------------------------------------------------------------------- +c send buffer +c--------------------------------------------------------------------- + if (timeron) call timer_start(t_xcomm) + call mpi_isend(in_buffer, buffer_size, + > dp_type, successor(1), + > WEST+jp+kp*NCELLS, comm_solve, + > send_id,error) + if (timeron) call timer_stop(t_xcomm) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_send_backsub_info(send_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c pack up and send U(istart) for all j and k +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer j,k,n,ptr,c,istart,jp,kp + integer error,send_id,buffer_size + +c--------------------------------------------------------------------- +c Send element 0 to previous processor +c--------------------------------------------------------------------- + istart = 0 + jp = cell_coord(2,c)-1 + kp = cell_coord(3,c)-1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM*BLOCK_SIZE + ptr = 0 + +!DVM$ region out(in_buffer) +!DVM$ PARALLEL(k,j), PRIVATE(n,ptr), +!DVM$& TIE(rhs(*,*,j,k,*)) + do k=0,KMAX-1 + do j=0,JMAX-1 + ptr = (k * JMAX + j) * BLOCK_SIZE + do n=1,BLOCK_SIZE + in_buffer(ptr+n) = rhs(n,istart,j,k,c) + enddo + enddo + enddo +!DVM$ end region +!DVM$ get_actual(in_buffer) + + if (timeron) call timer_start(t_xcomm) + call mpi_isend(in_buffer, buffer_size, + > dp_type, predecessor(1), + > EAST+jp+kp*NCELLS, comm_solve, + > send_id,error) + if (timeron) call timer_stop(t_xcomm) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_unpack_backsub_info(c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c unpack U(isize) for all j and k +c--------------------------------------------------------------------- + + include 'header.h' + integer j,k,n,ptr,c + + ptr = 0 + +!DVM$ actual(out_buffer) + +!DVM$ region out(backsub_info) +!DVM$ PARALLEL(k,j), PRIVATE(n,ptr), +!DVM$& TIE(backsub_info(*,j,k,*)) + do k=0,KMAX-1 + do j=0,JMAX-1 + ptr = (k * JMAX + j) * BLOCK_SIZE + do n=1,BLOCK_SIZE + backsub_info(n,j,k,c) = out_buffer(ptr+n) + enddo + enddo + enddo +!DVM$ end region + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_receive_backsub_info(recv_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c post mpi receives +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer error,recv_id,jp,kp,c,buffer_size + jp = cell_coord(2,c) - 1 + kp = cell_coord(3,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM*BLOCK_SIZE + call mpi_irecv(out_buffer, buffer_size, + > dp_type, successor(1), + > EAST+jp+kp*NCELLS, comm_solve, + > recv_id, error) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_receive_solve_info(recv_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c post mpi receives +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer jp,kp,recv_id,error,c,buffer_size + jp = cell_coord(2,c) - 1 + kp = cell_coord(3,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM* + > (BLOCK_SIZE*BLOCK_SIZE + BLOCK_SIZE) + call mpi_irecv(out_buffer, buffer_size, + > dp_type, predecessor(1), + > WEST+jp+kp*NCELLS, comm_solve, + > recv_id, error) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_backsubstitute(first, last, c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c back solve: if last cell, then generate U(isize)=rhs(isize) +c else assume U(isize) is loaded in un pack backsub_info +c so just use it +c after call u(istart) will be sent to next cell +c--------------------------------------------------------------------- + + include 'header.h' + + integer first, last, c, i, j, k + integer m,n,isize,jsize,ksize,istart + + istart = 0 + isize = cell_size(1,c)-1 + jsize = cell_size(2,c)-end(2,c)-1 + ksize = cell_size(3,c)-end(3,c)-1 + if (last .eq. 0) then + +!1$omp parallel do private(k,j,m,n) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j), PRIVATE(k,j,m,n), +!DVM$& TIE(lhsc(*,*,*,j,k,*), rhs(*,*,j,k,*),backsub_info(*,j,k,*)) + do k=start(3,c),ksize + do j=start(2,c),jsize +c--------------------------------------------------------------------- +c U(isize) uses info from previous cell if not last cell +c--------------------------------------------------------------------- + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + rhs(m,isize,j,k,c) = rhs(m,isize,j,k,c) + > - lhsc(m,n,isize,j,k,c)* + > backsub_info(n,j,k,c) +c--------------------------------------------------------------------- +c rhs(m,isize,j,k,c) = rhs(m,isize,j,k,c) +c $ - lhsc(m,n,isize,j,k,c)*rhs(n,isize+1,j,k,c) +c--------------------------------------------------------------------- + enddo + enddo + enddo + enddo +!DVM$ end region + endif + +!1$omp parallel do private(k,j,i,m,n) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,j), PRIVATE(k,j,i,m,n), +!DVM$& TIE(lhsc(*,*,*,j,k,*), rhs(*,*,j,k,*)) + do k=start(3,c),ksize + do j=start(2,c),jsize + do i=isize-1,istart,-1 + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) + > - lhsc(m,n,i,j,k,c)*rhs(n,i+1,j,k,c) + enddo + enddo + enddo + enddo + enddo +!DVM$ end region + return + end + + pure subroutine fjac_x_solve(fjac,u_,rho_i_,qs_,c1,c2) + implicit none + INTENT (out) :: fjac + INTENT (in) :: u_,rho_i_,qs_,c1,c2 + double precision fjac(5,5),tmp1,tmp2,u_(5),rho_i_,qs_ + double precision c1,c2 + tmp1 = rho_i_ + tmp2 = tmp1 * tmp1 + + fjac(1,1) = 0.0d+00 + fjac(1,2) = 1.0d+00 + fjac(1,3) = 0.0d+00 + fjac(1,4) = 0.0d+00 + fjac(1,5) = 0.0d+00 + + fjac(2,1) = -(u_(2) * tmp2 * u_(2)) + c2 * qs_ + fjac(2,2) = ( 2.0d+00 - c2 ) * ( u_(2) * tmp1 ) + fjac(2,3) = - c2 * ( u_(3) * tmp1 ) + fjac(2,4) = - c2 * ( u_(4) * tmp1 ) + fjac(2,5) = c2 + + fjac(3,1) = - (u_(2)*u_(3)) * tmp2 + fjac(3,2) = u_(3) * tmp1 + fjac(3,3) = u_(2) * tmp1 + fjac(3,4) = 0.0d+00 + fjac(3,5) = 0.0d+00 + + fjac(4,1) = - ( u_(2)*u_(4) ) * tmp2 + fjac(4,2) = u_(4) * tmp1 + fjac(4,3) = 0.0d+00 + fjac(4,4) = u_(2) * tmp1 + fjac(4,5) = 0.0d+00 + + fjac(5,1) = ( c2 * 2.0d0 * qs_ + > - c1 * ( u_(5) * tmp1)) * (u_(2) * tmp1) + fjac(5,2) = c1 * u_(5) * tmp1 - c2 + > * ( u_(2)*u_(2) * tmp2 + qs_ ) + fjac(5,3) = - c2 * ( u_(3)*u_(2) )* tmp2 + fjac(5,4) = - c2 * ( u_(4)*u_(2) )* tmp2 + fjac(5,5) = c1 * ( u_(2) * tmp1 ) + end + + pure subroutine njac_x_solve(njac,u,rho_i,con43,c3c4,c1345) + implicit none + INTENT (out) :: njac + INTENT (in) :: u,rho_i,con43,c3c4,c1345 + double precision njac(5,5),tmp1,tmp2,tmp3,rho_i,u(5) + double precision con43,c3c4,c1345 + + tmp1 = rho_i + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + + njac(1,1) = 0.0d+00 + njac(1,2) = 0.0d+00 + njac(1,3) = 0.0d+00 + njac(1,4) = 0.0d+00 + njac(1,5) = 0.0d+00 + + njac(2,1) = - con43 * c3c4 * tmp2 * u(2) + njac(2,2) = con43 * c3c4 * tmp1 + njac(2,3) = 0.0d+00 + njac(2,4) = 0.0d+00 + njac(2,5) = 0.0d+00 + + njac(3,1) = - c3c4 * tmp2 * u(3) + njac(3,2) = 0.0d+00 + njac(3,3) = c3c4 * tmp1 + njac(3,4) = 0.0d+00 + njac(3,5) = 0.0d+00 + + njac(4,1) = - c3c4 * tmp2 * u(4) + njac(4,2) = 0.0d+00 + njac(4,3) = 0.0d+00 + njac(4,4) = c3c4 * tmp1 + njac(4,5) = 0.0d+00 + + njac(5,1) = - ( con43 * c3c4 + > - c1345 ) * tmp3 * (u(2)**2) + > - ( c3c4 - c1345 ) * tmp3 * (u(3)**2) + > - ( c3c4 - c1345 ) * tmp3 * (u(4)**2) + > - c1345 * tmp2 * u(5) + + njac(5,2) = ( con43 * c3c4 + > - c1345 ) * tmp2 * u(2) + njac(5,3) = ( c3c4 - c1345 ) * tmp2 * u(3) + njac(5,4) = ( c3c4 - c1345 ) * tmp2 * u(4) + njac(5,5) = ( c1345 ) * tmp1 + end + + pure subroutine lhsa_x_solve(lhsa,u_,rho_i_,qs_, + >dt,dx1,dx2,dx3,dx4,dx5,c1,c2,con43,c3c4,c1345,tx1,tx2) + implicit none + + INTENT (out) :: lhsa + INTENT (in) :: u_,rho_i_,qs_ + INTENT(in)::dt,dx1,dx2,dx3,dx4,dx5,c1,c2,con43,c3c4,c1345,tx1,tx2 + + double precision lhsa(5,5),tmp1,tmp2,rho_i_,qs_ + double precision fjac_(5,5,1),njac_(5,5,1),u_(5),tx1,tx2 + double precision dt,dx1,dx2,dx3,dx4,dx5,c1,c2,con43,c3c4,c1345 + interface + pure subroutine fjac_x_solve(fjac,u_,rho_i_,qs_,c1,c2) + INTENT (out) :: fjac + INTENT (in) :: rho_i_,qs_,u_,c1,c2 + double precision fjac(5,5),tmp1,tmp2,tmp3,u_(5) + double precision rho_i_,qs_,c1,c2 + end subroutine + + pure subroutine njac_x_solve(njac,u_,rho_i_,con43,c3c4,c1345) + INTENT (out) :: njac + INTENT (in) :: u_,rho_i_,con43,c3c4,c1345 + double precision njac(5,5),tmp1,tmp2,tmp3 + double precision u_(5),rho_i_,con43,c3c4,c1345 + end subroutine + end interface + + tmp1 = dt * tx1 + tmp2 = dt * tx2 + + call fjac_x_solve(fjac_(1,1,1),u_,rho_i_,qs_,c1,c2) + call njac_x_solve(njac_(1,1,1),u_,rho_i_,con43,c3c4,c1345) + + lhsa(1,1) = - tmp2 * fjac_(1,1,1) + > - tmp1 * njac_(1,1,1) + > - tmp1 * dx1 + lhsa(1,2) = - tmp2 * fjac_(1,2,1) + > - tmp1 * njac_(1,2,1) + lhsa(1,3) = - tmp2 * fjac_(1,3,1) + > - tmp1 * njac_(1,3,1) + lhsa(1,4) = - tmp2 * fjac_(1,4,1) + > - tmp1 * njac_(1,4,1) + lhsa(1,5) = - tmp2 * fjac_(1,5,1) + > - tmp1 * njac_(1,5,1) + + lhsa(2,1) = - tmp2 * fjac_(2,1,1) + > - tmp1 * njac_(2,1,1) + lhsa(2,2) = - tmp2 * fjac_(2,2,1) + > - tmp1 * njac_(2,2,1) + > - tmp1 * dx2 + lhsa(2,3) = - tmp2 * fjac_(2,3,1) + > - tmp1 * njac_(2,3,1) + lhsa(2,4) = - tmp2 * fjac_(2,4,1) + > - tmp1 * njac_(2,4,1) + lhsa(2,5) = - tmp2 * fjac_(2,5,1) + > - tmp1 * njac_(2,5,1) + + lhsa(3,1) = - tmp2 * fjac_(3,1,1) + > - tmp1 * njac_(3,1,1) + lhsa(3,2) = - tmp2 * fjac_(3,2,1) + > - tmp1 * njac_(3,2,1) + lhsa(3,3) = - tmp2 * fjac_(3,3,1) + > - tmp1 * njac_(3,3,1) + > - tmp1 * dx3 + lhsa(3,4) = - tmp2 * fjac_(3,4,1) + > - tmp1 * njac_(3,4,1) + lhsa(3,5) = - tmp2 * fjac_(3,5,1) + > - tmp1 * njac_(3,5,1) + + lhsa(4,1) = - tmp2 * fjac_(4,1,1) + > - tmp1 * njac_(4,1,1) + lhsa(4,2) = - tmp2 * fjac_(4,2,1) + > - tmp1 * njac_(4,2,1) + lhsa(4,3) = - tmp2 * fjac_(4,3,1) + > - tmp1 * njac_(4,3,1) + lhsa(4,4) = - tmp2 * fjac_(4,4,1) + > - tmp1 * njac_(4,4,1) + > - tmp1 * dx4 + lhsa(4,5) = - tmp2 * fjac_(4,5,1) + > - tmp1 * njac_(4,5,1) + + lhsa(5,1) = - tmp2 * fjac_(5,1,1) + > - tmp1 * njac_(5,1,1) + lhsa(5,2) = - tmp2 * fjac_(5,2,1) + > - tmp1 * njac_(5,2,1) + lhsa(5,3) = - tmp2 * fjac_(5,3,1) + > - tmp1 * njac_(5,3,1) + lhsa(5,4) = - tmp2 * fjac_(5,4,1) + > - tmp1 * njac_(5,4,1) + lhsa(5,5) = - tmp2 * fjac_(5,5,1) + > - tmp1 * njac_(5,5,1) + > - tmp1 * dx5 + end + + pure subroutine lhsb_x_solve(lhsb,u_,rho_i_, + >dt,tx1,dx1,dx2,dx3,dx4,dx5,con43,c3c4,c1345) + implicit none + INTENT (out) :: lhsb + INTENT (in) :: u_,rho_i_ + INTENT (in)::dt,tx1,dx1,dx2,dx3,dx4,dx5,con43,c3c4,c1345 + double precision lhsb(5,5),tmp1,njac_(5,5,2:2) + double precision u_(5),rho_i_ + double precision dt,tx1,dx1,dx2,dx3,dx4,dx5,con43,c3c4,c1345 + interface + pure subroutine njac_x_solve(njac,u_,rho_i_,con43,c3c4,c1345) + INTENT (out) :: njac + INTENT (in) :: u_,rho_i_,con43,c3c4,c1345 + double precision njac(5,5),tmp1,tmp2,tmp3 + double precision u_(5),rho_i_,con43,c3c4,c1345 + end subroutine + end interface + + tmp1 = dt * tx1 + + call njac_x_solve(njac_(1,1,2),u_,rho_i_,con43,c3c4,c1345) + + lhsb(1,1) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(1,1,2) + > + tmp1 * 2.0d+00 * dx1 + lhsb(1,2) = tmp1 * 2.0d+00 * njac_(1,2,2) + lhsb(1,3) = tmp1 * 2.0d+00 * njac_(1,3,2) + lhsb(1,4) = tmp1 * 2.0d+00 * njac_(1,4,2) + lhsb(1,5) = tmp1 * 2.0d+00 * njac_(1,5,2) + + lhsb(2,1) = tmp1 * 2.0d+00 * njac_(2,1,2) + lhsb(2,2) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(2,2,2) + > + tmp1 * 2.0d+00 * dx2 + lhsb(2,3) = tmp1 * 2.0d+00 * njac_(2,3,2) + lhsb(2,4) = tmp1 * 2.0d+00 * njac_(2,4,2) + lhsb(2,5) = tmp1 * 2.0d+00 * njac_(2,5,2) + + lhsb(3,1) = tmp1 * 2.0d+00 * njac_(3,1,2) + lhsb(3,2) = tmp1 * 2.0d+00 * njac_(3,2,2) + lhsb(3,3) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(3,3,2) + > + tmp1 * 2.0d+00 * dx3 + lhsb(3,4) = tmp1 * 2.0d+00 * njac_(3,4,2) + lhsb(3,5) = tmp1 * 2.0d+00 * njac_(3,5,2) + + lhsb(4,1) = tmp1 * 2.0d+00 * njac_(4,1,2) + lhsb(4,2) = tmp1 * 2.0d+00 * njac_(4,2,2) + lhsb(4,3) = tmp1 * 2.0d+00 * njac_(4,3,2) + lhsb(4,4) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(4,4,2) + > + tmp1 * 2.0d+00 * dx4 + lhsb(4,5) = tmp1 * 2.0d+00 * njac_(4,5,2) + + lhsb(5,1) = tmp1 * 2.0d+00 * njac_(5,1,2) + lhsb(5,2) = tmp1 * 2.0d+00 * njac_(5,2,2) + lhsb(5,3) = tmp1 * 2.0d+00 * njac_(5,3,2) + lhsb(5,4) = tmp1 * 2.0d+00 * njac_(5,4,2) + lhsb(5,5) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(5,5,2) + > + tmp1 * 2.0d+00 * dx5 + end + + pure subroutine lhsc_x_solve(lhsc,u_,rho_i_,qs_, + >dt,dx1,dx2,dx3,dx4,dx5,c1,c2,con43,c3c4,c1345,tx1,tx2) + implicit none + + INTENT (out) :: lhsc + INTENT (in) :: u_,rho_i_,qs_ + INTENT(in)::dt,dx1,dx2,dx3,dx4,dx5,c1,c2,con43,c3c4,c1345,tx1,tx2 + + double precision lhsc(5,5),tmp1,tmp2,rho_i_,qs_ + double precision fjac_(5,5,2:2),njac_(5,5,3:3),u_(5),tx1,tx2 + double precision dt,dx1,dx2,dx3,dx4,dx5,c1,c2,con43,c3c4,c1345 + interface + pure subroutine fjac_x_solve(fjac,u_,rho_i_,qs_,c1,c2) + INTENT (out) :: fjac + INTENT (in) :: rho_i_,qs_,u_,c1,c2 + double precision fjac(5,5),tmp1,tmp2,tmp3,u_(5) + double precision rho_i_,qs_,c1,c2 + end subroutine + + pure subroutine njac_x_solve(njac,u_,rho_i_,con43,c3c4,c1345) + INTENT (out) :: njac + INTENT (in) :: u_,rho_i_,con43,c3c4,c1345 + double precision njac(5,5),tmp1,tmp2,tmp3 + double precision u_(5),rho_i_,con43,c3c4,c1345 + end subroutine + end interface + + tmp1 = dt * tx1 + tmp2 = dt * tx2 + + call fjac_x_solve(fjac_(1,1,2),u_,rho_i_,qs_,c1,c2) + call njac_x_solve(njac_(1,1,3),u_,rho_i_,con43,c3c4,c1345) + + lhsc(1,1) = tmp2 * fjac_(1,1,2) + > - tmp1 * njac_(1,1,3) + > - tmp1 * dx1 + lhsc(1,2) = tmp2 * fjac_(1,2,2) + > - tmp1 * njac_(1,2,3) + lhsc(1,3) = tmp2 * fjac_(1,3,2) + > - tmp1 * njac_(1,3,3) + lhsc(1,4) = tmp2 * fjac_(1,4,2) + > - tmp1 * njac_(1,4,3) + lhsc(1,5) = tmp2 * fjac_(1,5,2) + > - tmp1 * njac_(1,5,3) + + lhsc(2,1) = tmp2 * fjac_(2,1,2) + > - tmp1 * njac_(2,1,3) + lhsc(2,2) = tmp2 * fjac_(2,2,2) + > - tmp1 * njac_(2,2,3) + > - tmp1 * dx2 + lhsc(2,3) = tmp2 * fjac_(2,3,2) + > - tmp1 * njac_(2,3,3) + lhsc(2,4) = tmp2 * fjac_(2,4,2) + > - tmp1 * njac_(2,4,3) + lhsc(2,5) = tmp2 * fjac_(2,5,2) + > - tmp1 * njac_(2,5,3) + + lhsc(3,1) = tmp2 * fjac_(3,1,2) + > - tmp1 * njac_(3,1,3) + lhsc(3,2) = tmp2 * fjac_(3,2,2) + > - tmp1 * njac_(3,2,3) + lhsc(3,3) = tmp2 * fjac_(3,3,2) + > - tmp1 * njac_(3,3,3) + > - tmp1 * dx3 + lhsc(3,4) = tmp2 * fjac_(3,4,2) + > - tmp1 * njac_(3,4,3) + lhsc(3,5) = tmp2 * fjac_(3,5,2) + > - tmp1 * njac_(3,5,3) + + lhsc(4,1) = tmp2 * fjac_(4,1,2) + > - tmp1 * njac_(4,1,3) + lhsc(4,2) = tmp2 * fjac_(4,2,2) + > - tmp1 * njac_(4,2,3) + lhsc(4,3) = tmp2 * fjac_(4,3,2) + > - tmp1 * njac_(4,3,3) + lhsc(4,4) = tmp2 * fjac_(4,4,2) + > - tmp1 * njac_(4,4,3) + > - tmp1 * dx4 + lhsc(4,5) = tmp2 * fjac_(4,5,2) + > - tmp1 * njac_(4,5,3) + + lhsc(5,1) = tmp2 * fjac_(5,1,2) + > - tmp1 * njac_(5,1,3) + lhsc(5,2) = tmp2 * fjac_(5,2,2) + > - tmp1 * njac_(5,2,3) + lhsc(5,3) = tmp2 * fjac_(5,3,2) + > - tmp1 * njac_(5,3,3) + lhsc(5,4) = tmp2 * fjac_(5,4,2) + > - tmp1 * njac_(5,4,3) + lhsc(5,5) = tmp2 * fjac_(5,5,2) + > - tmp1 * njac_(5,5,3) + > - tmp1 * dx5 + end +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine x_first() + + include 'header.h' + include 'work_lhs.h' + + integer j,k + +!DVM$ region out(lhsc) +!DVM$ PARALLEL(k,j), TIE(lhsc(*,*,*,j,k,*)) + do k=0,1 + do j=0,1 + if (j .eq. 2) lhsc(1,1,1,j,k,1) = 0 + enddo + enddo +!DVM$ end region + end + + subroutine x_solve_cell(first,last,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c performs guaussian elimination on this cell. +c +c assumes that unpacking routines for non-first cells +c preload C' and rhs' from previous cell. +c +c assumed send happens outside this routine, but that +c c'(IMAX) and rhs'(IMAX) will be sent to next cell +c--------------------------------------------------------------------- + + include 'header.h' + include 'work_lhs.h' + + integer first,last,c,m,n + integer i,j,k,isize,ksize,jsize,istart + double precision fjac_(5,5,2:2),njac_(5,5,3:3),lhscP_(5,5) + double precision diff(5,5),lhsa_(5,5),lhsb_(5,5),lhsc_(5,5) + double precision rhs_(5), rhsP_(5),qs_(0:3),u_(5),uP_(5),uM_(5) + + interface + pure subroutine matvec_sub(ablock,avec,bvec) +!DVM$ routine + intent (inout)::ablock,avec,bvec + double precision ablock(5,5),avec(5),bvec(5) + end + end interface + + istart = 0 + isize = cell_size(1,c)-1 + jsize = cell_size(2,c)-end(2,c)-1 + ksize = cell_size(3,c)-end(3,c)-1 +! call lhsabinit(lhsa, lhsb, isize) + +!1$omp parallel do private(k,j),private(fjac_,njac_,lhsa_,lhsb_, +!1$omp& tmp1,tmp2,tmp3,i) collapse(2) + +!DVM$ region + +!DVM$ PARALLEL(k,j),PRIVATE(i,lhsa_,lhsb_,lhsc_,lhscP_,n,m,rhs_,rhsP_, +!DVM$& qs_,u_,uP_,uM_) +!DVM$& ,TIE(lhsc(*,*,*,j,k,*),u(*,*,j,k,*),qs(*,j,k,*) +!DVM$& ,rhs(*,*,j,k,*)) + do k=start(3,c),ksize + do j=start(2,c),jsize + do i=istart,isize + + if (i.eq.istart) then + do m = 1, 5 + do n = 1, 5 + lhscP_(m,n) = lhsc(m,n,i-1,j,k,c) + enddo + rhsP_(m) = rhs(m,i-1,j,k,c) + uM_(m) = u(m,i-1,j,k,c) + u_(m) = u(m,i,j,k,c) + enddo + qs_(0) = qs(i-1,j,k,c) + qs_(1) = qs(i,j,k,c) + endif + do m = 1, 5 + rhs_(m) = rhs(m,i,j,k,c) + uP_(m) = u(m,i+1,j,k,c) + enddo + qs_(2) = qs(i+1,j,k,c) + if (i .eq. istart .and. first .eq. 1) then + do m = 1, 5 + do n = 1, 5 + lhsb_(m,n) = 0.0d0 + lhsc_(m,n) = 0.0d0 + enddo + lhsb_(m,m) = 1.0d0 + enddo + call binvcrhs(lhsb_,lhsc_,rhs_) + + else if (i .eq. isize .and. last .eq. 1) then + do m = 1, 5 + do n = 1, 5 + lhsa_(m,n) = 0.0d0 + lhsb_(m,n) = 0.0d0 + enddo + lhsb_(m,m) = 1.0d0 + enddo + + call matvec_sub(lhsa_,rhsP_,rhs_) + call matmul_sub(lhsa_,lhscP_,lhsb_) + call binvrhs(lhsb_,rhs_) + + else + + call lhsa_x_solve(lhsa_,uM_,1.0d0/uM_(1), + > qs_(0),dt,dx1,dx2,dx3, + > dx4,dx5,c1,c2,con43,c3c4,c1345,tx1,tx2) + call lhsb_x_solve(lhsb_,u_,1.0d0/u_(1), + > dt,tx1,dx1,dx2,dx3,dx4,dx5,con43,c3c4,c1345) + call lhsc_x_solve(lhsc_,uP_,1.0d0/uP_(1), + > qs_(2),dt,dx1,dx2,dx3, + > dx4,dx5,c1,c2,con43,c3c4,c1345,tx1,tx2) + + call matvec_sub(lhsa_,rhsP_,rhs_) + call matmul_sub(lhsa_,lhscP_,lhsb_) + call binvcrhs(lhsb_,lhsc_,rhs_) + + endif + + do m = 1, 5 + do n = 1, 5 + lhscP_(m,n) = lhsc_(m,n) + enddo + rhs(m,i-1,j,k,c) = rhsP_(m) + rhsP_(m) = rhs_(m) + uM_(m)=u_(m) + u_(m)=uP_(m) + enddo + + if (.not. (i .eq. isize .and. last .eq. 1)) then + do m = 1, 5 + do n = 1, 5 + lhsc(m,n,i,j,k,c) = lhsc_(m,n) + enddo + enddo + endif + qs_(0) = qs_(1) + qs_(1) = qs_(2) + if (i.eq.isize) then + do m = 1, 5 + rhs(m,i,j,k,c) = rhs_(m) + enddo + endif + enddo + enddo + enddo +!DVM$ end region + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Performs line solves in Z direction by first factoring +c the block-tridiagonal matrix into an upper triangular matrix, +c and then performing back substitution to solve for the unknow +c vectors of each line. +c +c Make sure we treat elements zero to cell_size in the direction +c of the sweep. +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer c, kstart, stage, + > first, last, recv_id, error, r_status(MPI_STATUS_SIZE), + > isize,jsize,ksize,send_id + + kstart = 0 + + if (timeron) call timer_start(t_zsolve) +c--------------------------------------------------------------------- +c in our terminology stage is the number of the cell in the y-direction +c i.e. stage = 1 means the start of the line stage=ncells means end +c--------------------------------------------------------------------- + call z_first() + do stage = 1,ncells + c = slice(3,stage) + isize = cell_size(1,c) - 1 + jsize = cell_size(2,c) - 1 + ksize = cell_size(3,c) - 1 +c--------------------------------------------------------------------- +c set last-cell flag +c--------------------------------------------------------------------- + if (stage .eq. ncells) then + last = 1 + else + last = 0 + endif + + if (stage .eq. 1) then +c--------------------------------------------------------------------- +c This is the first cell, so solve without receiving data +c--------------------------------------------------------------------- + first = 1 +c call lhsz(c) + call z_solve_cell(first,last,c) + else +c--------------------------------------------------------------------- +c Not the first cell of this line, so receive info from +c processor working on preceeding cell +c--------------------------------------------------------------------- + first = 0 + if (timeron) call timer_start(t_zcomm) + call z_receive_solve_info(recv_id,c) +c--------------------------------------------------------------------- +c overlap computations and communications +c--------------------------------------------------------------------- +c call lhsz(c) +c--------------------------------------------------------------------- +c wait for completion +c--------------------------------------------------------------------- + call mpi_wait(send_id,r_status,error) + call mpi_wait(recv_id,r_status,error) + if (timeron) call timer_stop(t_zcomm) +c--------------------------------------------------------------------- +c install C'(kstart+1) and rhs'(kstart+1) to be used in this cell +c--------------------------------------------------------------------- + call z_unpack_solve_info(c) + call z_solve_cell(first,last,c) + endif + + if (last .eq. 0) call z_send_solve_info(send_id,c) + enddo + +c--------------------------------------------------------------------- +c now perform backsubstitution in reverse direction +c--------------------------------------------------------------------- + do stage = ncells, 1, -1 + c = slice(3,stage) + first = 0 + last = 0 + if (stage .eq. 1) first = 1 + if (stage .eq. ncells) then + last = 1 +c--------------------------------------------------------------------- +c last cell, so perform back substitute without waiting +c--------------------------------------------------------------------- + call z_backsubstitute(first, last,c) + else + if (timeron) call timer_start(t_zcomm) + call z_receive_backsub_info(recv_id,c) + call mpi_wait(send_id,r_status,error) + call mpi_wait(recv_id,r_status,error) + if (timeron) call timer_stop(t_zcomm) + call z_unpack_backsub_info(c) + call z_backsubstitute(first,last,c) + endif + if (first .eq. 0) call z_send_backsub_info(send_id,c) + enddo + + if (timeron) call timer_stop(t_zsolve) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_unpack_solve_info(c) +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c unpack C'(-1) and rhs'(-1) for +c all i and j +c--------------------------------------------------------------------- + + include 'header.h' + + integer i,j,m,n,ptr,c,kstart + + kstart = 0 + ptr = 0 +!DVM$ actual(out_buffer) + +!DVM$ region +!DVM$ PARALLEL(j,i), PRIVATE(ptr,m,n), +!DVM$& TIE(rhs(*,i,j,*,*),lhsc(*,*,i,j,*,*)) + do j=0,JMAX-1 + do i=0,IMAX-1 + ptr = (j * IMAX + I) * (BLOCK_SIZE+BLOCK_SIZE*BLOCK_SIZE) + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + lhsc(m,n,i,j,kstart-1,c) = out_buffer(ptr+n+(m-1)*BLOCK_SIZE) + enddo + enddo + do n=1,BLOCK_SIZE + rhs(n,i,j,kstart-1,c) = out_buffer(ptr+n+BLOCK_SIZE*BLOCK_SIZE) + enddo + enddo + enddo +!DVM$ end region + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_send_solve_info(send_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c pack up and send C'(kend) and rhs'(kend) for +c all i and j +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer i,j,m,n,ksize,ptr,c,ip,jp + integer error,send_id,buffer_size + + ksize = cell_size(3,c)-1 + ip = cell_coord(1,c) - 1 + jp = cell_coord(2,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM* + > (BLOCK_SIZE*BLOCK_SIZE + BLOCK_SIZE) + +c--------------------------------------------------------------------- +c pack up buffer +c--------------------------------------------------------------------- + + ptr = 0 +!DVM$ region out(in_buffer) +!DVM$ PARALLEL(j,i), PRIVATE(ptr,m,n), +!DVM$& TIE(rhs(*,i,j,*,*),lhsc(*,*,i,j,*,*)) + do j=0,JMAX-1 + do i=0,IMAX-1 + ptr = (j * IMAX + I) * (BLOCK_SIZE+BLOCK_SIZE*BLOCK_SIZE) + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + in_buffer(ptr+n+(m-1)*BLOCK_SIZE) = lhsc(m,n,i,j,ksize,c) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + do n=1,BLOCK_SIZE + in_buffer(ptr+n+BLOCK_SIZE*BLOCK_SIZE) = rhs(n,i,j,ksize,c) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + enddo +!DVM$ end region + +!DVM$ get_actual(in_buffer) +c--------------------------------------------------------------------- +c send buffer +c--------------------------------------------------------------------- + if (timeron) call timer_start(t_zcomm) + call mpi_isend(in_buffer, buffer_size, + > dp_type, successor(3), + > BOTTOM+ip+jp*NCELLS, comm_solve, + > send_id,error) + if (timeron) call timer_stop(t_zcomm) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_send_backsub_info(send_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c pack up and send U(jstart) for all i and j +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer i,j,n,ptr,c,kstart,ip,jp + integer error,send_id,buffer_size + +c--------------------------------------------------------------------- +c Send element 0 to previous processor +c--------------------------------------------------------------------- + kstart = 0 + ip = cell_coord(1,c)-1 + jp = cell_coord(2,c)-1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM*BLOCK_SIZE + ptr = 0 + +!DVM$ region out(in_buffer) +!DVM$ PARALLEL(j,i), PRIVATE(n,ptr),TIE(rhs(*,i,j,*,*)) + do j=0,JMAX-1 + do i=0,IMAX-1 + ptr=(j*IMAX+i)*BLOCK_SIZE + do n=1,BLOCK_SIZE + in_buffer(ptr+n) = rhs(n,i,j,kstart,c) + enddo + enddo + enddo +!DVM$ end region + +!DVM$ get_actual(in_buffer) + if (timeron) call timer_start(t_zcomm) + call mpi_isend(in_buffer, buffer_size, + > dp_type, predecessor(3), + > TOP+ip+jp*NCELLS, comm_solve, + > send_id,error) + if (timeron) call timer_stop(t_zcomm) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_unpack_backsub_info(c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c unpack U(ksize) for all i and j +c--------------------------------------------------------------------- + + include 'header.h' + + integer i,j,n,ptr,c + + ptr = 0 +!DVM$ actual(out_buffer) + +!DVM$ region out(backsub_info) +!DVM$ PARALLEL(j,i), PRIVATE(ptr,n),TIE(backsub_info(*,i,j,*)) + do j=0,JMAX-1 + do i=0,IMAX-1 + ptr=(j*IMAX+i)*BLOCK_SIZE + do n=1,BLOCK_SIZE + backsub_info(n,i,j,c) = out_buffer(ptr+n) + enddo + enddo + enddo +!DVM$ end region + return + end + + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_receive_backsub_info(recv_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c post mpi receives +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer error,recv_id,ip,jp,c,buffer_size + ip = cell_coord(1,c) - 1 + jp = cell_coord(2,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM*BLOCK_SIZE + call mpi_irecv(out_buffer, buffer_size, + > dp_type, successor(3), + > TOP+ip+jp*NCELLS, comm_solve, + > recv_id, error) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_receive_solve_info(recv_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c post mpi receives +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer ip,jp,recv_id,error,c,buffer_size + ip = cell_coord(1,c) - 1 + jp = cell_coord(2,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM* + > (BLOCK_SIZE*BLOCK_SIZE + BLOCK_SIZE) + call mpi_irecv(out_buffer, buffer_size, + > dp_type, predecessor(3), + > BOTTOM+ip+jp*NCELLS, comm_solve, + > recv_id, error) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine z_backsubstitute(first, last, c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c back solve: if last cell, then generate U(ksize)=rhs(ksize) +c else assume U(ksize) is loaded in un pack backsub_info +c so just use it +c after call u(kstart) will be sent to next cell +c--------------------------------------------------------------------- + + include 'header.h' + + integer first, last, c, i, k + integer m,n,j,jsize,isize,ksize,kstart + + kstart = 0 + isize = cell_size(1,c)-end(1,c)-1 + jsize = cell_size(2,c)-end(2,c)-1 + ksize = cell_size(3,c)-1 + if (last .eq. 0) then + +!1$omp parallel do private(k,j,i,m,n) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(j,i), PRIVATE(j,i,m,n), +!DVM$& TIE(rhs(*,i,j,*,*),lhsc(*,*,i,j,*,*),backsub_info(*,i,j,*)) + do j=start(2,c),jsize + do i=start(1,c),isize +c--------------------------------------------------------------------- +c U(jsize) uses info from previous cell if not last cell +c--------------------------------------------------------------------- + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + rhs(m,i,j,ksize,c) = rhs(m,i,j,ksize,c) + > - lhsc(m,n,i,j,ksize,c)* + > backsub_info(n,i,j,c) + enddo + enddo + enddo + enddo +!DVM$ end region + endif + +! $omp parallel do private(k,j,i,m,n) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(j,i), PRIVATE(k,j,i,m,n), +!DVM$& TIE(rhs(*,i,j,*,*),lhsc(*,*,i,j,*,*)) + do j=start(2,c),jsize + do i=start(1,c),isize + do k=ksize-1,kstart,-1 + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) + > - lhsc(m,n,i,j,k,c)*rhs(n,i,j,k+1,c) + enddo + enddo + enddo + enddo + enddo +!DVM$ end region + return + end + + pure subroutine fjac_z_solve(fjac,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + implicit none + double precision utmp(6),tmp1,tmp2 + double precision u1_,u2_,u3_,u4_,u5_,qs_,fjac(5,5),c1,c2 + INTENT(in) :: u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + INTENT(out) :: fjac + utmp(1) = 1.0d0 / u1_ + utmp(2) = u2_ + utmp(3) = u3_ + utmp(4) = u4_ + utmp(5) = u5_ + utmp(6) = qs_ + + tmp1 = utmp(1) + tmp2 = tmp1 * tmp1 + + fjac(1,1) = 0.0d+00 + fjac(1,2) = 0.0d+00 + fjac(1,3) = 0.0d+00 + fjac(1,4) = 1.0d+00 + fjac(1,5) = 0.0d+00 + + fjac(2,1) = - ( utmp(2)*utmp(4) ) + > * tmp2 + fjac(2,2) = utmp(4) * tmp1 + fjac(2,3) = 0.0d+00 + fjac(2,4) = utmp(2) * tmp1 + fjac(2,5) = 0.0d+00 + + fjac(3,1) = - ( utmp(3)*utmp(4) ) + > * tmp2 + fjac(3,2) = 0.0d+00 + fjac(3,3) = utmp(4) * tmp1 + fjac(3,4) = utmp(3) * tmp1 + fjac(3,5) = 0.0d+00 + + fjac(4,1) = - (utmp(4)*utmp(4) * tmp2 ) + > + c2 * utmp(6) + fjac(4,2) = - c2 * utmp(2) * tmp1 + fjac(4,3) = - c2 * utmp(3) * tmp1 + fjac(4,4) = ( 2.0d+00 - c2 ) + > * utmp(4) * tmp1 + fjac(4,5) = c2 + + fjac(5,1) = ( c2 * 2.0d0 * utmp(6) + > - c1 * ( utmp(5) * tmp1 ) ) + > * ( utmp(4) * tmp1 ) + fjac(5,2) = - c2 * ( utmp(2)*utmp(4) ) + > * tmp2 + fjac(5,3) = - c2 * ( utmp(3)*utmp(4) ) + > * tmp2 + fjac(5,4) = c1 * ( utmp(5) * tmp1 ) + > - c2 * ( utmp(6) + > + utmp(4)*utmp(4) * tmp2 ) + fjac(5,5) = c1 * utmp(4) * tmp1 + + end + + pure subroutine njac_z_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345,c3,c4) + implicit none + double precision utmp(6),tmp1,tmp2,tmp3,c1345,c3,c4 + double precision u1_,u2_,u3_,u4_,u5_,qs_,njac(5,5),c3c4,con43 + INTENT(in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345,c3,c4 + INTENT(out) :: njac + + utmp(1) = 1.0d0 / u1_ + utmp(2) = u2_ + utmp(3) = u3_ + utmp(4) = u4_ + utmp(5) = u5_ + utmp(6) = qs_ + + tmp1 = utmp(1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + + njac(1,1) = 0.0d+00 + njac(1,2) = 0.0d+00 + njac(1,3) = 0.0d+00 + njac(1,4) = 0.0d+00 + njac(1,5) = 0.0d+00 + + njac(2,1) = - c3c4 * tmp2 * utmp(2) + njac(2,2) = c3c4 * tmp1 + njac(2,3) = 0.0d+00 + njac(2,4) = 0.0d+00 + njac(2,5) = 0.0d+00 + + njac(3,1) = - c3c4 * tmp2 * utmp(3) + njac(3,2) = 0.0d+00 + njac(3,3) = c3c4 * tmp1 + njac(3,4) = 0.0d+00 + njac(3,5) = 0.0d+00 + + njac(4,1) = - con43 * c3c4 * tmp2 * utmp(4) + njac(4,2) = 0.0d+00 + njac(4,3) = 0.0d+00 + njac(4,4) = con43 * c3 * c4 * tmp1 + njac(4,5) = 0.0d+00 + + njac(5,1) = - ( c3c4 + > - c1345 ) * tmp3 * (utmp(2)**2) + > - ( c3c4 - c1345 ) * tmp3 * (utmp(3)**2) + > - ( con43 * c3c4 + > - c1345 ) * tmp3 * (utmp(4)**2) + > - c1345 * tmp2 * utmp(5) + + njac(5,2) = ( c3c4 - c1345 ) * tmp2 * utmp(2) + njac(5,3) = ( c3c4 - c1345 ) * tmp2 * utmp(3) + njac(5,4) = ( con43 * c3c4 + > - c1345 ) * tmp2 * utmp(4) + njac(5,5) = ( c1345 )* tmp1 + + end + + pure subroutine lhsa_z_solve(lhsa,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2, + & c3c4,con43,c1345,tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4) + implicit none + double precision u1_,u2_,u3_,u4_,u5_,qs_,c1,c2, c3c4,con43,c1345 + INTENT(IN)::u1_,u2_,u3_,u4_,u5_,qs_,c1,c2,c3c4,con43,c1345 + double precision lhsa(5,5),c3,c4 + INTENT(out)::lhsa + + double precision tmp1, tmp2,fjac_(5,5),njac_(5,5) + double precision tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt + INTENT(IN):: tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4 + + interface + pure subroutine fjac_z_solve(fjac,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + INTENT (out) :: fjac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + double precision fjac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + end subroutine + + pure subroutine njac_z_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345,c3,c4) + INTENT (out) :: njac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345,c3,c4 + double precision njac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c3c4,c3,c4 + & ,con43,c1345 + end subroutine + end interface + + call fjac_z_solve(fjac_,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + call njac_z_solve(njac_,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345,c3,c4) + + tmp1 = dt * tz1 + tmp2 = dt * tz2 + + lhsa(1,1) = - tmp2 * fjac_(1,1) + > - tmp1 * njac_(1,1) + > - tmp1 * dz1 + lhsa(1,2) = - tmp2 * fjac_(1,2) + > - tmp1 * njac_(1,2) + lhsa(1,3) = - tmp2 * fjac_(1,3) + > - tmp1 * njac_(1,3) + lhsa(1,4) = - tmp2 * fjac_(1,4) + > - tmp1 * njac_(1,4) + lhsa(1,5) = - tmp2 * fjac_(1,5) + > - tmp1 * njac_(1,5) + + lhsa(2,1) = - tmp2 * fjac_(2,1) + > - tmp1 * njac_(2,1) + lhsa(2,2) = - tmp2 * fjac_(2,2) + > - tmp1 * njac_(2,2) + > - tmp1 * dz2 + lhsa(2,3) = - tmp2 * fjac_(2,3) + > - tmp1 * njac_(2,3) + lhsa(2,4) = - tmp2 * fjac_(2,4) + > - tmp1 * njac_(2,4) + lhsa(2,5) = - tmp2 * fjac_(2,5) + > - tmp1 * njac_(2,5) + + lhsa(3,1) = - tmp2 * fjac_(3,1) + > - tmp1 * njac_(3,1) + lhsa(3,2) = - tmp2 * fjac_(3,2) + > - tmp1 * njac_(3,2) + lhsa(3,3) = - tmp2 * fjac_(3,3) + > - tmp1 * njac_(3,3) + > - tmp1 * dz3 + lhsa(3,4) = - tmp2 * fjac_(3,4) + > - tmp1 * njac_(3,4) + lhsa(3,5) = - tmp2 * fjac_(3,5) + > - tmp1 * njac_(3,5) + + lhsa(4,1) = - tmp2 * fjac_(4,1) + > - tmp1 * njac_(4,1) + lhsa(4,2) = - tmp2 * fjac_(4,2) + > - tmp1 * njac_(4,2) + lhsa(4,3) = - tmp2 * fjac_(4,3) + > - tmp1 * njac_(4,3) + lhsa(4,4) = - tmp2 * fjac_(4,4) + > - tmp1 * njac_(4,4) + > - tmp1 * dz4 + lhsa(4,5) = - tmp2 * fjac_(4,5) + > - tmp1 * njac_(4,5) + + lhsa(5,1) = - tmp2 * fjac_(5,1) + > - tmp1 * njac_(5,1) + lhsa(5,2) = - tmp2 * fjac_(5,2) + > - tmp1 * njac_(5,2) + lhsa(5,3) = - tmp2 * fjac_(5,3) + > - tmp1 * njac_(5,3) + lhsa(5,4) = - tmp2 * fjac_(5,4) + > - tmp1 * njac_(5,4) + lhsa(5,5) = - tmp2 * fjac_(5,5) + > - tmp1 * njac_(5,5) + > - tmp1 * dz5 + end + + pure subroutine lhsb_z_solve(lhsb,u1_,u2_,u3_,u4_,u5_,qs_, + & c3c4,con43,c1345,tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4) + implicit none + double precision u1_,u2_,u3_,u4_,u5_,qs_, c3c4,con43,c1345 + INTENT(IN)::u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345,c3,c4 + double precision lhsb(5,5) + INTENT(out)::lhsb + + double precision tmp1, njac_(5,5),c3,c4 + double precision tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt + INTENT(IN)::tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt + + interface + pure subroutine njac_z_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345,c3,c4) + INTENT (out) :: njac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345,c3,c4 + double precision njac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c3c4,c3,c4 + & ,con43,c1345 + end subroutine + end interface + + call njac_z_solve(njac_,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345,c3,c4) + + tmp1 = dt * tz1 + + lhsb(1,1) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(1,1) + > + tmp1 * 2.0d+00 * dz1 + lhsb(1,2) = tmp1 * 2.0d+00 * njac_(1,2) + lhsb(1,3) = tmp1 * 2.0d+00 * njac_(1,3) + lhsb(1,4) = tmp1 * 2.0d+00 * njac_(1,4) + lhsb(1,5) = tmp1 * 2.0d+00 * njac_(1,5) + + lhsb(2,1) = tmp1 * 2.0d+00 * njac_(2,1) + lhsb(2,2) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(2,2) + > + tmp1 * 2.0d+00 * dz2 + lhsb(2,3) = tmp1 * 2.0d+00 * njac_(2,3) + lhsb(2,4) = tmp1 * 2.0d+00 * njac_(2,4) + lhsb(2,5) = tmp1 * 2.0d+00 * njac_(2,5) + + lhsb(3,1) = tmp1 * 2.0d+00 * njac_(3,1) + lhsb(3,2) = tmp1 * 2.0d+00 * njac_(3,2) + lhsb(3,3) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(3,3) + > + tmp1 * 2.0d+00 * dz3 + lhsb(3,4) = tmp1 * 2.0d+00 * njac_(3,4) + lhsb(3,5) = tmp1 * 2.0d+00 * njac_(3,5) + + lhsb(4,1) = tmp1 * 2.0d+00 * njac_(4,1) + lhsb(4,2) = tmp1 * 2.0d+00 * njac_(4,2) + lhsb(4,3) = tmp1 * 2.0d+00 * njac_(4,3) + lhsb(4,4) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(4,4) + > + tmp1 * 2.0d+00 * dz4 + lhsb(4,5) = tmp1 * 2.0d+00 * njac_(4,5) + + lhsb(5,1) = tmp1 * 2.0d+00 * njac_(5,1) + lhsb(5,2) = tmp1 * 2.0d+00 * njac_(5,2) + lhsb(5,3) = tmp1 * 2.0d+00 * njac_(5,3) + lhsb(5,4) = tmp1 * 2.0d+00 * njac_(5,4) + lhsb(5,5) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(5,5) + > + tmp1 * 2.0d+00 * dz5 + + end + + pure subroutine lhsc_z_solve(lhsc,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2, + & c3c4,con43,c1345,tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4) + implicit none + double precision u1_,u2_,u3_,u4_,u5_,qs_,c1,c2, c3c4,con43,c1345 + INTENT(IN)::u1_,u2_,u3_,u4_,u5_,qs_,c1,c2,c3c4,con43,c1345 + double precision lhsc(5,5),c3,c4 + INTENT(out)::lhsc + + double precision tmp1, tmp2,fjac_(5,5),njac_(5,5) + double precision tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt + INTENT(IN):: tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4 + + interface + pure subroutine fjac_z_solve(fjac,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + INTENT (out) :: fjac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + double precision fjac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + end subroutine + + pure subroutine njac_z_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345,c3,c4) + INTENT (out) :: njac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345,c3,c4 + double precision njac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c3c4,c3,c4 + & ,con43,c1345 + end subroutine + end interface + + call fjac_z_solve(fjac_,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + call njac_z_solve(njac_,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345,c3,c4) + + tmp1 = dt * tz1 + tmp2 = dt * tz2 + + lhsc(1,1) = tmp2 * fjac_(1,1) + > - tmp1 * njac_(1,1) + > - tmp1 * dz1 + lhsc(1,2) = tmp2 * fjac_(1,2) + > - tmp1 * njac_(1,2) + lhsc(1,3) = tmp2 * fjac_(1,3) + > - tmp1 * njac_(1,3) + lhsc(1,4) = tmp2 * fjac_(1,4) + > - tmp1 * njac_(1,4) + lhsc(1,5) = tmp2 * fjac_(1,5) + > - tmp1 * njac_(1,5) + + lhsc(2,1) = tmp2 * fjac_(2,1) + > - tmp1 * njac_(2,1) + lhsc(2,2) = tmp2 * fjac_(2,2) + > - tmp1 * njac_(2,2) + > - tmp1 * dz2 + lhsc(2,3) = tmp2 * fjac_(2,3) + > - tmp1 * njac_(2,3) + lhsc(2,4) = tmp2 * fjac_(2,4) + > - tmp1 * njac_(2,4) + lhsc(2,5) = tmp2 * fjac_(2,5) + > - tmp1 * njac_(2,5) + + lhsc(3,1) = tmp2 * fjac_(3,1) + > - tmp1 * njac_(3,1) + lhsc(3,2) = tmp2 * fjac_(3,2) + > - tmp1 * njac_(3,2) + lhsc(3,3) = tmp2 * fjac_(3,3) + > - tmp1 * njac_(3,3) + > - tmp1 * dz3 + lhsc(3,4) = tmp2 * fjac_(3,4) + > - tmp1 * njac_(3,4) + lhsc(3,5) = tmp2 * fjac_(3,5) + > - tmp1 * njac_(3,5) + + lhsc(4,1) = tmp2 * fjac_(4,1) + > - tmp1 * njac_(4,1) + lhsc(4,2) = tmp2 * fjac_(4,2) + > - tmp1 * njac_(4,2) + lhsc(4,3) = tmp2 * fjac_(4,3) + > - tmp1 * njac_(4,3) + lhsc(4,4) = tmp2 * fjac_(4,4) + > - tmp1 * njac_(4,4) + > - tmp1 * dz4 + lhsc(4,5) = tmp2 * fjac_(4,5) + > - tmp1 * njac_(4,5) + + lhsc(5,1) = tmp2 * fjac_(5,1) + > - tmp1 * njac_(5,1) + lhsc(5,2) = tmp2 * fjac_(5,2) + > - tmp1 * njac_(5,2) + lhsc(5,3) = tmp2 * fjac_(5,3) + > - tmp1 * njac_(5,3) + lhsc(5,4) = tmp2 * fjac_(5,4) + > - tmp1 * njac_(5,4) + lhsc(5,5) = tmp2 * fjac_(5,5) + > - tmp1 * njac_(5,5) + > - tmp1 * dz5 + end +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + subroutine z_first() + + include 'header.h' + include 'work_lhs.h' + + integer i,j,k + +!DVM$ region out(lhsc) +!DVM$ PARALLEL(j,i), TIE(lhsc(*,*,i,j,*,*)) + do j=0,1 + do i=0,1 + if (i .eq. 2) lhsc(1,1,i,j,1,1) = 0 + enddo + enddo +!DVM$ end region + end + + subroutine z_solve_cell(first,last,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c performs guaussian elimination on this cell. +c +c assumes that unpacking routines for non-first cells +c preload C' and rhs' from previous cell. +c +c assumed send happens outside this routine, but that +c c'(KMAX) and rhs'(KMAX) will be sent to next cell. +c--------------------------------------------------------------------- + + include 'header.h' + include 'work_lhs.h' + + integer first,last,c,j_start,m,n,js,is,ks,ke + integer i,j,k,isize,ksize,jsize,kstart + double precision utmp(6,-2:KMAX+1),lhsa_(5,5),lhsb_(5,5) + double precision fjac_(5,5), njac_(5,5),lhsc_(5,5),lhscP_(5,5) + double precision rhs_(5), rhsP_(5),qs_(0:3),u_(5),uP_(5),uM_(5) + + interface + pure subroutine matvec_sub(ablock,avec,bvec) +!DVM$ routine + intent (inout)::ablock,avec,bvec + double precision ablock(5,5),avec(5),bvec(5) + end + end interface + + kstart = 0 + isize = cell_size(1,c)-end(1,c)-1 + jsize = cell_size(2,c)-end(2,c)-1 + ksize = cell_size(3,c)-1 + js = start(2,c) + is = start(1,c) + ks = start(3,c) + ke = ksize-end(3,c) +!1$omp parallel do private(k,i),private(fjac,njac,lhsa,lhsb,tmp1,tmp2 +!1$omp& ,tmp3,utmp,j) collapse(2) + +!DVM$ interval 12 +!DVM$ region +!DVM$ PARALLEL(j,i),PRIVATE(k,m,n,lhsa_,lhsb_,lhsc_,lhscP_,rhs_,rhsP_, +!DVM$& qs_,u_,uP_,uM_) +!DVM$& ,TIE(rhs(*,i,j,*,*),lhsc(*,*,i,j,*,*),u(*,i,j,*,*),qs(i,j,*,*)) + do j=js,jsize + do i=is,isize + + do k=kstart,ksize + if (k.eq.kstart) then + do m = 1, 5 + do n = 1, 5 + lhscP_(m,n) = lhsc(m,n,i,j,k-1,c) + enddo + enddo + do m = 1, 5 + rhsP_(m) = rhs(m,i,j,k-1,c) + uM_(m)=u(m,i,j,k-1,c) + u_(m)=u(m,i,j,k,c) + enddo + qs_(0)=qs(i,j,k-1,c) + qs_(1)=qs(i,j,k,c) + endif + qs_(2)=qs(i,j,k+1,c) + do m = 1, 5 + rhs_(m) = rhs(m,i,j,k,c) + uP_(m)=u(m,i,j,k+1,c) + enddo + + if (k.eq.kstart .and. first.eq.1) then + do m = 1, 5 + do n = 1, 5 + lhsb_(m,n) = 0.0d0 + lhsc_(m,n) = 0.0d0 + enddo + lhsb_(m,m) = 1.0d0 + enddo + + call binvcrhs( lhsb_, lhsc_, rhs_) + else if (k.eq.ksize .and. last.eq.1) then + do m = 1, 5 + do n = 1, 5 + lhsa_(m,n) = 0.0d0 + lhsb_(m,n) = 0.0d0 + enddo + lhsb_(m,m) = 1.0d0 + enddo + + call matvec_sub(lhsa_,rhsP_,rhs_) + call matmul_sub(lhsa_,lhscP_,lhsb_) + call binvrhs( lhsb_,rhs_) + else + + call lhsa_z_solve(lhsa_,uM_(1),uM_(2) + &,uM_(3),uM_(4),uM_(5),qs_(0), + & c1,c2,c3c4,con43,c1345,tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4) + + call lhsb_z_solve(lhsb_,u_(1),u_(2) + &,u_(3),u_(4),u_(5),qs_(1), + & c3c4,con43,c1345,tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4) + + call lhsc_z_solve(lhsc_,uP_(1),uP_(2) + &,uP_(3),uP_(4),uP_(5),qs_(2), + & c1,c2,c3c4,con43,c1345,tz1,tz2,dz1,dz2,dz3,dz4,dz5,dt,c3,c4) + + call matvec_sub(lhsa_,rhsP_,rhs_) + call matmul_sub(lhsa_,lhscP_,lhsb_) + call binvcrhs( lhsb_,lhsc_,rhs_) + endif + + do m = 1, 5 + do n = 1, 5 + lhscP_(m,n) = lhsc_(m,n) + enddo + rhs(m,i,j,k-1,c) = rhsP_(m) + rhsP_(m) = rhs_(m) + uM_(m) = u_(m) + u_(m) = uP_(m) + enddo + qs_(0) = qs_(1) + qs_(1) = qs_(2) + + if (.not. (k.eq.ksize .and. last.eq.1)) then + do m = 1, 5 + do n = 1, 5 + lhsc(m,n,i,j,k,c) = lhsc_(m,n) + enddo + enddo + endif + + if (k.eq.ksize) then + do m = 1, 5 + rhs(m,i,j,k,c) = rhs_(m) + enddo + endif + enddo + enddo + enddo +!DVM$ end region +!DVM$ end interval + return + end +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_solve + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c Performs line solves in Y direction by first factoring +c the block-tridiagonal matrix into an upper triangular matrix, +c and then performing back substitution to solve for the unknow +c vectors of each line. +c +c Make sure we treat elements zero to cell_size in the direction +c of the sweep. +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer + > c, jstart, stage, + > first, last, recv_id, error, r_status(MPI_STATUS_SIZE), + > isize,jsize,ksize,send_id + + jstart = 0 + + if (timeron) call timer_start(t_ysolve) +c--------------------------------------------------------------------- +c in our terminology stage is the number of the cell in the y-direction +c i.e. stage = 1 means the start of the line stage=ncells means end +c--------------------------------------------------------------------- + call y_first() + do stage = 1,ncells + c = slice(2,stage) + isize = cell_size(1,c) - 1 + jsize = cell_size(2,c) - 1 + ksize = cell_size(3,c) - 1 + +c--------------------------------------------------------------------- +c set last-cell flag +c--------------------------------------------------------------------- + if (stage .eq. ncells) then + last = 1 + else + last = 0 + endif + + if (stage .eq. 1) then +c--------------------------------------------------------------------- +c This is the first cell, so solve without receiving data +c--------------------------------------------------------------------- + first = 1 +c call lhsy(c) + call y_solve_cell(first,last,c) + else +c--------------------------------------------------------------------- +c Not the first cell of this line, so receive info from +c processor working on preceeding cell +c--------------------------------------------------------------------- + first = 0 + if (timeron) call timer_start(t_ycomm) + call y_receive_solve_info(recv_id,c) +c--------------------------------------------------------------------- +c overlap computations and communications +c--------------------------------------------------------------------- +c call lhsy(c) +c--------------------------------------------------------------------- +c wait for completion +c--------------------------------------------------------------------- + call mpi_wait(send_id,r_status,error) + call mpi_wait(recv_id,r_status,error) + if (timeron) call timer_stop(t_ycomm) +c--------------------------------------------------------------------- +c install C'(jstart+1) and rhs'(jstart+1) to be used in this cell +c--------------------------------------------------------------------- + call y_unpack_solve_info(c) + call y_solve_cell(first,last,c) + endif + + if (last .eq. 0) call y_send_solve_info(send_id,c) + enddo + +c--------------------------------------------------------------------- +c now perform backsubstitution in reverse direction +c--------------------------------------------------------------------- + do stage = ncells, 1, -1 + c = slice(2,stage) + first = 0 + last = 0 + if (stage .eq. 1) first = 1 + if (stage .eq. ncells) then + last = 1 +c--------------------------------------------------------------------- +c last cell, so perform back substitute without waiting +c--------------------------------------------------------------------- + call y_backsubstitute(first, last,c) + else + if (timeron) call timer_start(t_ycomm) + call y_receive_backsub_info(recv_id,c) + call mpi_wait(send_id,r_status,error) + call mpi_wait(recv_id,r_status,error) + if (timeron) call timer_stop(t_ycomm) + call y_unpack_backsub_info(c) + call y_backsubstitute(first,last,c) + endif + if (first .eq. 0) call y_send_backsub_info(send_id,c) + enddo + + if (timeron) call timer_stop(t_ysolve) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_unpack_solve_info(c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c unpack C'(-1) and rhs'(-1) for +c all i and k +c--------------------------------------------------------------------- + + include 'header.h' + + integer i,k,m,n,ptr,c,jstart + + jstart = 0 + ptr = 0 +!DVM$ actual(out_buffer) + +!DVM$ region +!DVM$ PARALLEL(k,i),PRIVATE(m,n,ptr), +!DVM$& TIE(lhsc(*,*,i,*,k,*),rhs(*,i,*,k,*)) + do k=0,KMAX-1 + do i=0,IMAX-1 + ptr=(k*IMAX+I)*(BLOCK_SIZE+BLOCK_SIZE*BLOCK_SIZE) + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + lhsc(m,n,i,jstart-1,k,c) = out_buffer(ptr+n+(m-1)*BLOCK_SIZE) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + do n=1,BLOCK_SIZE + rhs(n,i,jstart-1,k,c) = out_buffer(ptr+n+BLOCK_SIZE*BLOCK_SIZE) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + enddo +!DVM$ end region + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_send_solve_info(send_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c pack up and send C'(jend) and rhs'(jend) for +c all i and k +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer i,k,m,n,jsize,ptr,c,ip,kp + integer error,send_id,buffer_size + + jsize = cell_size(2,c)-1 + ip = cell_coord(1,c) - 1 + kp = cell_coord(3,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM* + > (BLOCK_SIZE*BLOCK_SIZE + BLOCK_SIZE) + +c--------------------------------------------------------------------- +c pack up buffer +c--------------------------------------------------------------------- + ptr = 0 + +!DVM$ region out(in_buffer) +!DVM$ PARALLEL(k,i),PRIVATE(m,n,ptr), +!DVM$& TIE(lhsc(*,*,i,*,k,*),rhs(*,i,*,k,*)) + do k=0,KMAX-1 + do i=0,IMAX-1 + ptr=(k*IMAX+I)*(BLOCK_SIZE+BLOCK_SIZE*BLOCK_SIZE) + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + in_buffer(ptr+n+(m-1)*BLOCK_SIZE) = lhsc(m,n,i,jsize,k,c) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + do n=1,BLOCK_SIZE + in_buffer(ptr+n+BLOCK_SIZE*BLOCK_SIZE) = rhs(n,i,jsize,k,c) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + enddo +!DVM$ end region +!DVM$ get_actual(in_buffer) +c--------------------------------------------------------------------- +c send buffer +c--------------------------------------------------------------------- + if (timeron) call timer_start(t_ycomm) + call mpi_isend(in_buffer, buffer_size, + > dp_type, successor(2), + > SOUTH+ip+kp*NCELLS, comm_solve, + > send_id,error) + if (timeron) call timer_stop(t_ycomm) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_send_backsub_info(send_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c pack up and send U(jstart) for all i and k +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer i,k,n,ptr,c,jstart,ip,kp + integer error,send_id,buffer_size + +c--------------------------------------------------------------------- +c Send element 0 to previous processor +c--------------------------------------------------------------------- + jstart = 0 + ip = cell_coord(1,c)-1 + kp = cell_coord(3,c)-1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM*BLOCK_SIZE + ptr = 0 + +!DVM$ region out(in_buffer) +!DVM$ PARALLEL(k,i), PRIVATE(ptr,n),TIE(rhs(*,i,*,k,*)) + do k=0,KMAX-1 + do i=0,IMAX-1 + ptr = (k*IMAX+i) * BLOCK_SIZE + do n=1,BLOCK_SIZE + in_buffer(ptr+n) = rhs(n,i,jstart,k,c) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + enddo +!DVM$ end region +!DVM$ get_actual(in_buffer) + if (timeron) call timer_start(t_ycomm) + call mpi_isend(in_buffer, buffer_size, + > dp_type, predecessor(2), + > NORTH+ip+kp*NCELLS, comm_solve, + > send_id,error) + if (timeron) call timer_stop(t_ycomm) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_unpack_backsub_info(c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c unpack U(jsize) for all i and k +c--------------------------------------------------------------------- + + include 'header.h' + + integer i,k,n,ptr,c + + ptr = 0 +!DVM$ actual(out_buffer) + +!DVM$ region out(backsub_info) +!DVM$ PARALLEL(k,i), PRIVATE(ptr,n),TIE(backsub_info(*,i,k,*)) + do k=0,KMAX-1 + do i=0,IMAX-1 + ptr = (k*IMAX+i) * BLOCK_SIZE + do n=1,BLOCK_SIZE + backsub_info(n,i,k,c) = out_buffer(ptr+n) + enddo +! ptr = ptr+BLOCK_SIZE + enddo + enddo +!DVM$ end region + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_receive_backsub_info(recv_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c post mpi receives +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer error,recv_id,ip,kp,c,buffer_size + ip = cell_coord(1,c) - 1 + kp = cell_coord(3,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM*BLOCK_SIZE + call mpi_irecv(out_buffer, buffer_size, + > dp_type, successor(2), + > NORTH+ip+kp*NCELLS, comm_solve, + > recv_id, error) + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_receive_solve_info(recv_id,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c post mpi receives +c--------------------------------------------------------------------- + + include 'header.h' + include 'mpinpb.h' + + integer ip,kp,recv_id,error,c,buffer_size + ip = cell_coord(1,c) - 1 + kp = cell_coord(3,c) - 1 + buffer_size=MAX_CELL_DIM*MAX_CELL_DIM* + > (BLOCK_SIZE*BLOCK_SIZE + BLOCK_SIZE) + call mpi_irecv(out_buffer, buffer_size, + > dp_type, predecessor(2), + > SOUTH+ip+kp*NCELLS, comm_solve, + > recv_id, error) + + return + end + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + subroutine y_backsubstitute(first, last, c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c back solve: if last cell, then generate U(jsize)=rhs(jsize) +c else assume U(jsize) is loaded in un pack backsub_info +c so just use it +c after call u(jstart) will be sent to next cell +c--------------------------------------------------------------------- + + include 'header.h' + + integer first, last, c, i, k + integer m,n,j,jsize,isize,ksize,jstart + + jstart = 0 + isize = cell_size(1,c)-end(1,c)-1 + jsize = cell_size(2,c)-1 + ksize = cell_size(3,c)-end(3,c)-1 + if (last .eq. 0) then + +!1$omp parallel do private(k,i,m,n) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,i), PRIVATE(k,i,m,n), +!DVM$& TIE(rhs(*,i,*,k,*),lhsc(*,*,i,*,k,*),backsub_info(*,i,k,*)) + do k=start(3,c),ksize + do i=start(1,c),isize +c--------------------------------------------------------------------- +c U(jsize) uses info from previous cell if not last cell +c--------------------------------------------------------------------- + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + rhs(m,i,jsize,k,c) = rhs(m,i,jsize,k,c) + > - lhsc(m,n,i,jsize,k,c)* + > backsub_info(n,i,k,c) + enddo + enddo + enddo + enddo +!DVM$ end region + endif + +!1$omp parallel do private(k,j,i,m,n) collapse(2) + +!DVM$ region +!DVM$ PARALLEL(k,i), PRIVATE(k,j,i,m,n), +!DVM$& TIE(rhs(*,i,*,k,*),lhsc(*,*,i,*,k,*)) + do k=start(3,c),ksize + do i=start(1,c),isize + do j=jsize-1,jstart,-1 + do m=1,BLOCK_SIZE + do n=1,BLOCK_SIZE + rhs(m,i,j,k,c) = rhs(m,i,j,k,c) + > - lhsc(m,n,i,j,k,c)*rhs(n,i,j+1,k,c) + enddo + enddo + enddo + enddo + enddo +!DVM$ end region + return + end + + pure subroutine fjac_y_solve(fjac,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + implicit none + double precision utmp(6),tmp1,tmp2 + double precision u1_,u2_,u3_,u4_,u5_,qs_,fjac(5,5),c1,c2 + INTENT(in) :: u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + INTENT(out) :: fjac + + utmp(1) = 1.0d0 / u1_ + utmp(2) = u2_ + utmp(3) = u3_ + utmp(4) = u4_ + utmp(5) = u5_ + utmp(6) = qs_ + + tmp1 = utmp(1) + tmp2 = tmp1 * tmp1 + + fjac(1,1) = 0.0d+00 + fjac(1,2) = 0.0d+00 + fjac(1,3) = 1.0d+00 + fjac(1,4) = 0.0d+00 + fjac(1,5) = 0.0d+00 + + fjac(2,1) = - ( utmp(2)*utmp(3) ) + > * tmp2 + fjac(2,2) = utmp(3) * tmp1 + fjac(2,3) = utmp(2) * tmp1 + fjac(2,4) = 0.0d+00 + fjac(2,5) = 0.0d+00 + + fjac(3,1) = - ( utmp(3)*utmp(3)*tmp2) + > + c2 * utmp(6) + fjac(3,2) = - c2 * utmp(2) * tmp1 + fjac(3,3) = ( 2.0d+00 - c2 ) + > * utmp(3) * tmp1 + fjac(3,4) = - c2 * utmp(4) * tmp1 + fjac(3,5) = c2 + + fjac(4,1) = - ( utmp(3)*utmp(4) ) + > * tmp2 + fjac(4,2) = 0.0d+00 + fjac(4,3) = utmp(4) * tmp1 + fjac(4,4) = utmp(3) * tmp1 + fjac(4,5) = 0.0d+00 + + fjac(5,1) = ( c2 * 2.0d0 * utmp(6) + > - c1 * utmp(5) * tmp1 ) + > * utmp(3) * tmp1 + fjac(5,2) = - c2 * utmp(2)*utmp(3) + > * tmp2 + fjac(5,3) = c1 * utmp(5) * tmp1 + > - c2 * ( utmp(6) + > + utmp(3)*utmp(3) * tmp2 ) + fjac(5,4) = - c2 * ( utmp(3)*utmp(4) ) + > * tmp2 + fjac(5,5) = c1 * utmp(3) * tmp1 + end +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + pure subroutine njac_y_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345) + implicit none + double precision utmp(6),tmp1,tmp2,tmp3,c1345 + double precision u1_,u2_,u3_,u4_,u5_,qs_,njac(5,5),c3c4,con43 + INTENT(in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345 + INTENT(out) :: njac + utmp(1) = 1.0d0 / u1_ + utmp(2) = u2_ + utmp(3) = u3_ + utmp(4) = u4_ + utmp(5) = u5_ + utmp(6) = qs_ + + tmp1 = utmp(1) + tmp2 = tmp1 * tmp1 + tmp3 = tmp1 * tmp2 + + njac(1,1) = 0.0d+00 + njac(1,2) = 0.0d+00 + njac(1,3) = 0.0d+00 + njac(1,4) = 0.0d+00 + njac(1,5) = 0.0d+00 + + njac(2,1) = - c3c4 * tmp2 * utmp(2) + njac(2,2) = c3c4 * tmp1 + njac(2,3) = 0.0d+00 + njac(2,4) = 0.0d+00 + njac(2,5) = 0.0d+00 + + njac(3,1) = - con43 * c3c4 * tmp2 * utmp(3) + njac(3,2) = 0.0d+00 + njac(3,3) = con43 * c3c4 * tmp1 + njac(3,4) = 0.0d+00 + njac(3,5) = 0.0d+00 + + njac(4,1) = - c3c4 * tmp2 * utmp(4) + njac(4,2) = 0.0d+00 + njac(4,3) = 0.0d+00 + njac(4,4) = c3c4 * tmp1 + njac(4,5) = 0.0d+00 + + njac(5,1) = - ( c3c4 + > - c1345 ) * tmp3 * (utmp(2)**2) + > - ( con43 * c3c4 + > - c1345 ) * tmp3 * (utmp(3)**2) + > - ( c3c4 - c1345 ) * tmp3 * (utmp(4)**2) + > - c1345 * tmp2 * utmp(5) + + njac(5,2) = ( c3c4 - c1345 ) * tmp2 * utmp(2) + njac(5,3) = ( con43 * c3c4 + > - c1345 ) * tmp2 * utmp(3) + njac(5,4) = ( c3c4 - c1345 ) * tmp2 * utmp(4) + njac(5,5) = ( c1345 ) * tmp1 + end + + pure subroutine lhsa_y_solve(lhsa,u,qs_,c1,c2, + & c3c4,con43,c1345,ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt) + implicit none + double precision u1_,u2_,u3_,u4_,u5_,qs_,c1,c2, c3c4,con43,c1345 + INTENT(IN)::u,qs_,c1,c2,c3c4,con43,c1345 + double precision lhsa(5,5),u(5) + INTENT(out)::lhsa + + double precision tmp1, tmp2,fjac_(5,5),njac_(5,5) + double precision ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt + INTENT(IN)::ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt + + interface + pure subroutine fjac_y_solve(fjac,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + INTENT (out) :: fjac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + double precision fjac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + end subroutine + + pure subroutine njac_y_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345) + INTENT (out) :: njac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345 + double precision njac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345 + end subroutine + end interface + u1_=u(1) + u2_=u(2) + u3_=u(3) + u4_=u(4) + u5_=u(5) + + call fjac_y_solve(fjac_,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + call njac_y_solve(njac_,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345) + tmp1 = dt * ty1 + tmp2 = dt * ty2 + + lhsa(1,1) = - tmp2 * fjac_(1,1) + > - tmp1 * njac_(1,1) + > - tmp1 * dy1 + lhsa(1,2) = - tmp2 * fjac_(1,2) + > - tmp1 * njac_(1,2) + lhsa(1,3) = - tmp2 * fjac_(1,3) + > - tmp1 * njac_(1,3) + lhsa(1,4) = - tmp2 * fjac_(1,4) + > - tmp1 * njac_(1,4) + lhsa(1,5) = - tmp2 * fjac_(1,5) + > - tmp1 * njac_(1,5) + + lhsa(2,1) = - tmp2 * fjac_(2,1) + > - tmp1 * njac_(2,1) + lhsa(2,2) = - tmp2 * fjac_(2,2) + > - tmp1 * njac_(2,2) + > - tmp1 * dy2 + lhsa(2,3) = - tmp2 * fjac_(2,3) + > - tmp1 * njac_(2,3) + lhsa(2,4) = - tmp2 * fjac_(2,4) + > - tmp1 * njac_(2,4) + lhsa(2,5) = - tmp2 * fjac_(2,5) + > - tmp1 * njac_(2,5) + + lhsa(3,1) = - tmp2 * fjac_(3,1) + > - tmp1 * njac_(3,1) + lhsa(3,2) = - tmp2 * fjac_(3,2) + > - tmp1 * njac_(3,2) + lhsa(3,3) = - tmp2 * fjac_(3,3) + > - tmp1 * njac_(3,3) + > - tmp1 * dy3 + lhsa(3,4) = - tmp2 * fjac_(3,4) + > - tmp1 * njac_(3,4) + lhsa(3,5) = - tmp2 * fjac_(3,5) + > - tmp1 * njac_(3,5) + + lhsa(4,1) = - tmp2 * fjac_(4,1) + > - tmp1 * njac_(4,1) + lhsa(4,2) = - tmp2 * fjac_(4,2) + > - tmp1 * njac_(4,2) + lhsa(4,3) = - tmp2 * fjac_(4,3) + > - tmp1 * njac_(4,3) + lhsa(4,4) = - tmp2 * fjac_(4,4) + > - tmp1 * njac_(4,4) + > - tmp1 * dy4 + lhsa(4,5) = - tmp2 * fjac_(4,5) + > - tmp1 * njac_(4,5) + + lhsa(5,1) = - tmp2 * fjac_(5,1) + > - tmp1 * njac_(5,1) + lhsa(5,2) = - tmp2 * fjac_(5,2) + > - tmp1 * njac_(5,2) + lhsa(5,3) = - tmp2 * fjac_(5,3) + > - tmp1 * njac_(5,3) + lhsa(5,4) = - tmp2 * fjac_(5,4) + > - tmp1 * njac_(5,4) + lhsa(5,5) = - tmp2 * fjac_(5,5) + > - tmp1 * njac_(5,5) + > - tmp1 * dy5 + end + + pure subroutine lhsb_y_solve(lhsb,u,qs_, + & c3c4,con43,c1345,ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt) + implicit none + double precision u1_,u2_,u3_,u4_,u5_,qs_, c3c4,con43,c1345 + INTENT(IN)::u,qs_,c3c4,con43,c1345 + double precision lhsb(5,5),u(5) + INTENT(out)::lhsb + + double precision tmp1, njac_(5,5) + double precision ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt + INTENT(IN)::ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt + + interface + pure subroutine njac_y_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345) + INTENT (out) :: njac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345 + double precision njac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345 + end subroutine + end interface + u1_=u(1) + u2_=u(2) + u3_=u(3) + u4_=u(4) + u5_=u(5) + tmp1 = dt * ty1 + + call njac_y_solve(njac_,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345) + lhsb(1,1) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(1,1) + > + tmp1 * 2.0d+00 * dy1 + lhsb(1,2) = tmp1 * 2.0d+00 * njac_(1,2) + lhsb(1,3) = tmp1 * 2.0d+00 * njac_(1,3) + lhsb(1,4) = tmp1 * 2.0d+00 * njac_(1,4) + lhsb(1,5) = tmp1 * 2.0d+00 * njac_(1,5) + + lhsb(2,1) = tmp1 * 2.0d+00 * njac_(2,1) + lhsb(2,2) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(2,2) + > + tmp1 * 2.0d+00 * dy2 + lhsb(2,3) = tmp1 * 2.0d+00 * njac_(2,3) + lhsb(2,4) = tmp1 * 2.0d+00 * njac_(2,4) + lhsb(2,5) = tmp1 * 2.0d+00 * njac_(2,5) + + lhsb(3,1) = tmp1 * 2.0d+00 * njac_(3,1) + lhsb(3,2) = tmp1 * 2.0d+00 * njac_(3,2) + lhsb(3,3) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(3,3) + > + tmp1 * 2.0d+00 * dy3 + lhsb(3,4) = tmp1 * 2.0d+00 * njac_(3,4) + lhsb(3,5) = tmp1 * 2.0d+00 * njac_(3,5) + + lhsb(4,1) = tmp1 * 2.0d+00 * njac_(4,1) + lhsb(4,2) = tmp1 * 2.0d+00 * njac_(4,2) + lhsb(4,3) = tmp1 * 2.0d+00 * njac_(4,3) + lhsb(4,4) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(4,4) + > + tmp1 * 2.0d+00 * dy4 + lhsb(4,5) = tmp1 * 2.0d+00 * njac_(4,5) + + lhsb(5,1) = tmp1 * 2.0d+00 * njac_(5,1) + lhsb(5,2) = tmp1 * 2.0d+00 * njac_(5,2) + lhsb(5,3) = tmp1 * 2.0d+00 * njac_(5,3) + lhsb(5,4) = tmp1 * 2.0d+00 * njac_(5,4) + lhsb(5,5) = 1.0d+00 + > + tmp1 * 2.0d+00 * njac_(5,5) + > + tmp1 * 2.0d+00 * dy5 + + end + + pure subroutine lhsc_y_solve(lhsc,u,qs_,c1,c2, + & c3c4,con43,c1345,ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt) + implicit none + double precision u1_,u2_,u3_,u4_,u5_,qs_,c1,c2, c3c4,con43,c1345 + INTENT(IN)::u,qs_,c1,c2,c3c4,con43,c1345 + double precision lhsc(5,5),u(5) + INTENT(out)::lhsc + + double precision tmp1, tmp2,fjac_(5,5),njac_(5,5) + double precision ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt + INTENT(IN)::ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt + + interface + pure subroutine fjac_y_solve(fjac,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + INTENT (out) :: fjac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + double precision fjac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c1,c2 + end subroutine + + pure subroutine njac_y_solve(njac,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345) + INTENT (out) :: njac + INTENT (in) :: u1_,u2_,u3_,u4_,u5_,qs_,c3c4,con43,c1345 + double precision njac(5,5),u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345 + end subroutine + end interface + u1_=u(1) + u2_=u(2) + u3_=u(3) + u4_=u(4) + u5_=u(5) + + call fjac_y_solve(fjac_,u1_,u2_,u3_,u4_,u5_,qs_,c1,c2) + call njac_y_solve(njac_,u1_,u2_,u3_,u4_,u5_,qs_,c3c4 + & ,con43,c1345) + tmp1 = dt * ty1 + tmp2 = dt * ty2 + + lhsc(1,1) = tmp2 * fjac_(1,1) + > - tmp1 * njac_(1,1) + > - tmp1 * dy1 + lhsc(1,2) = tmp2 * fjac_(1,2) + > - tmp1 * njac_(1,2) + lhsc(1,3) = tmp2 * fjac_(1,3) + > - tmp1 * njac_(1,3) + lhsc(1,4) = tmp2 * fjac_(1,4) + > - tmp1 * njac_(1,4) + lhsc(1,5) = tmp2 * fjac_(1,5) + > - tmp1 * njac_(1,5) + + lhsc(2,1) = tmp2 * fjac_(2,1) + > - tmp1 * njac_(2,1) + lhsc(2,2) = tmp2 * fjac_(2,2) + > - tmp1 * njac_(2,2) + > - tmp1 * dy2 + lhsc(2,3) = tmp2 * fjac_(2,3) + > - tmp1 * njac_(2,3) + lhsc(2,4) = tmp2 * fjac_(2,4) + > - tmp1 * njac_(2,4) + lhsc(2,5) = tmp2 * fjac_(2,5) + > - tmp1 * njac_(2,5) + + lhsc(3,1) = tmp2 * fjac_(3,1) + > - tmp1 * njac_(3,1) + lhsc(3,2) = tmp2 * fjac_(3,2) + > - tmp1 * njac_(3,2) + lhsc(3,3) = tmp2 * fjac_(3,3) + > - tmp1 * njac_(3,3) + > - tmp1 * dy3 + lhsc(3,4) = tmp2 * fjac_(3,4) + > - tmp1 * njac_(3,4) + lhsc(3,5) = tmp2 * fjac_(3,5) + > - tmp1 * njac_(3,5) + + lhsc(4,1) = tmp2 * fjac_(4,1) + > - tmp1 * njac_(4,1) + lhsc(4,2) = tmp2 * fjac_(4,2) + > - tmp1 * njac_(4,2) + lhsc(4,3) = tmp2 * fjac_(4,3) + > - tmp1 * njac_(4,3) + lhsc(4,4) = tmp2 * fjac_(4,4) + > - tmp1 * njac_(4,4) + > - tmp1 * dy4 + lhsc(4,5) = tmp2 * fjac_(4,5) + > - tmp1 * njac_(4,5) + + lhsc(5,1) = tmp2 * fjac_(5,1) + > - tmp1 * njac_(5,1) + lhsc(5,2) = tmp2 * fjac_(5,2) + > - tmp1 * njac_(5,2) + lhsc(5,3) = tmp2 * fjac_(5,3) + > - tmp1 * njac_(5,3) + lhsc(5,4) = tmp2 * fjac_(5,4) + > - tmp1 * njac_(5,4) + lhsc(5,5) = tmp2 * fjac_(5,5) + > - tmp1 * njac_(5,5) + > - tmp1 * dy5 + end + + subroutine y_first() + + include 'header.h' + include 'work_lhs.h' + + integer i,j,k + +!DVM$ region out(lhsc) +!DVM$ PARALLEL(k,i), TIE(lhsc(*,*,i,*,k,*)) + do k=0,1 + do i=0,1 + if (i .eq. 2) lhsc(1,1,i,1,k,1) = 0 + enddo + enddo +!DVM$ end region + end + + subroutine y_solve_cell(first,last,c) + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + +c--------------------------------------------------------------------- +c performs guaussian elimination on this cell. +c +c assumes that unpacking routines for non-first cells +c preload C' and rhs' from previous cell. +c +c assumed send happens outside this routine, but that +c c'(JMAX) and rhs'(JMAX) will be sent to next cell +c--------------------------------------------------------------------- + + include 'header.h' + include 'work_lhs.h' + + integer first,last,c,m1,m2 + integer i,j,k,isize,ksize,jsize,jstart,m,n + double precision fjac_(5,5),njac_(5,5), lhscP_(5,5) + double precision lhsb_(5,5), lhsa_(5,5), lhsc_(5,5) + double precision rhs_(5), rhsP_(5),uM_(5),u_(5),uP_(5),qs_(0:3) + + interface + pure subroutine matvec_sub(ablock,avec,bvec) +!DVM$ routine + intent (inout)::ablock,avec,bvec + double precision ablock(5,5),avec(5),bvec(5) + end + end interface + + jstart = 0 + isize = cell_size(1,c)-end(1,c)-1 + jsize = cell_size(2,c)-1 + ksize = cell_size(3,c)-end(3,c)-1 + +!1$omp parallel do private(k,i),private(fjac,njac,lhsa,lhsb,tmp1,tmp2 +!1$omp& ,tmp3,utmp,j) collapse(2) + +!DVM$ region + +!DVM$ PARALLEL(k,i),PRIVATE(j,m,n,lhsa_,lhsb_,lhsc_,lhscP_,rhs_,rhsP_ +!DVM$& ,uM_,u_,uP_,qs_) +!DVM$& ,TIE(rhs(*,i,*,k,*),lhsc(*,*,i,*,k,*),u(*,i,*,k,*),qs(i,*,k,*)) + do k=start(3,c),ksize + do i=start(1,c),isize + do j=jstart,jsize + + if (j.eq.jstart) then + do m = 1, 5 + do n = 1, 5 + lhscP_(m,n) = lhsc(m,n,i,j-1,k,c) + enddo + rhsP_(m) = rhs(m,i,j-1,k,c) + uM_(m) = u(m,i,j-1,k,c) + u_(m) = u(m,i,j,k,c) + enddo + qs_(0) = qs(i,j-1,k,c) + qs_(1) = qs(i,j,k,c) + endif + do m = 1, 5 + rhs_(m) = rhs(m,i,j,k,c) + uP_(m) = u(m,i,j+1,k,c) + enddo + qs_(2) = qs(i,j+1,k,c) + + if (first .eq. 1 .and. jstart .eq. j) then + do m = 1, 5 + do n = 1, 5 + lhsb_(m,n) = 0.0d0 + lhsc_(m,n) = 0.0d0 + enddo + lhsb_(m,m) = 1.0d0 + enddo + + call binvcrhs( lhsb_,lhsc_,rhs_) + + else if (last .eq. 1 .and. j .eq. jsize) then + do m = 1, 5 + do n = 1, 5 + lhsa_(m,n) = 0.0d0 + lhsb_(m,n) = 0.0d0 + enddo + lhsb_(m,m) = 1.0d0 + enddo + + call matvec_sub(lhsa_,rhsP_,rhs_) + call matmul_sub(lhsa_,lhscP_,lhsb_) + call binvrhs(lhsb_,rhs_) + + else + + call lhsa_y_solve(lhsa_,uM_,qs_(0),c1,c2, + > c3c4,con43,c1345,ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt) + + call lhsb_y_solve(lhsb_,u_,qs_(1),c3c4 + > ,con43,c1345,ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt) + + call lhsc_y_solve(lhsc_,uP_,qs_(2),c1,c2, + > c3c4,con43,c1345,ty1,ty2,dy1,dy2,dy3,dy4,dy5,dt) + + call matvec_sub(lhsa_,rhsP_,rhs_) + call matmul_sub(lhsa_,lhscP_,lhsb_) + call binvcrhs( lhsb_,lhsc_,rhs_) + + endif + + do m = 1, 5 + do n = 1, 5 + lhscP_(m,n) = lhsc_(m,n) + enddo + rhs(m,i,j-1,k,c) = rhsP_(m) + rhsP_(m) = rhs_(m) + uM_(m) = u_(m) + u_(m) = uP_(m) + enddo + qs_(0) = qs_(1) + qs_(1) = qs_(2) + + if (.not. (last .eq. 1 .and. j .eq. jsize)) then + do m = 1, 5 + do n = 1, 5 + lhsc(m,n,i,j,k,c) = lhsc_(m,n) + enddo + enddo + endif + + if (j.eq.jsize) then + do m = 1, 5 + rhs(m,i,j,k,c) = rhs_(m) + enddo + endif + enddo + enddo + enddo +!DVM$ end region + return + end + + + + + + + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/Makefile new file mode 100644 index 0000000..eae547f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/Makefile @@ -0,0 +1,23 @@ +SHELL=/bin/sh +BENCHMARK=cg +BENCHMARKU=CG + +include ../config/make_dvmh.def + +OBJS = cg.o ${COMMON}/print_results.o \ + ${COMMON}/${RAND}.o ${COMMON}/timers.o + +include ../sys/make.common + +${PROGRAM}: config ${OBJS} + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM}_dvmh ${OBJS} ${FMPI_LIB} + +cg.o: cg.f mpinpb.h npbparams.h timing.h + ${FCOMPILE} -dvmIrregAnalysis cg.f + +clean: + - rm -f *.o *~ + - rm -f npbparams.h core + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/cg.f b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/cg.f new file mode 100644 index 0000000..7ac2642 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/cg.f @@ -0,0 +1,1623 @@ + +! *** generated by SAPFOR with version 1757 and build date: Mar 26 2021 10:17:52 + +! *** generated by SAPFOR with version 1651 and build date: Oct 5 2020 10:15:03 +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! C G ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is part of the NAS Parallel Benchmark 3.3 suite. ! +! It is described in NAS Technical Reports 95-020 and 02-007 ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 3.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 3.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/Software/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (650) 604-3957 ! +! ! +!-------------------------------------------------------------------------! +!--------------------------------------------------------------------- +! +! Authors: M. Yarrow +! C. Kuszmaul +! R. F. Van der Wijngaart +! H. Jin +! +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + PROGRAM CG + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + + INCLUDE 'mpinpb.h' + INCLUDE 'timing.h' + INTEGER :: STATUS(MPI_STATUS_SIZE),REQUEST,IERR + + INCLUDE 'npbparams.h' + INTEGER :: NUM_PROCS + PARAMETER (NUM_PROCS = NUM_PROC_COLS * NUM_PROC_ROWS) + +!--------------------------------------------------------------------- +! Class specific parameters: +! It appears here for reference only. +! These are their values, however, this info is imported in the npbparams.h +! include file, which is written by the sys/setparams.c program. +!--------------------------------------------------------------------- +!---------- +! Class S: +!---------- +!C parameter( na=1400, +!C > nonzer=7, +!C > shift=10., +!C > niter=15, +!C > rcond=1.0d-1 ) +!---------- +! Class W: +!---------- +!C parameter( na=7000, +!C > nonzer=8, +!C > shift=12., +!C > niter=15, +!C > rcond=1.0d-1 ) +!---------- +! Class A: +!---------- +!C parameter( na=14000, +!C > nonzer=11, +!C > shift=20., +!C > niter=15, +!C > rcond=1.0d-1 ) +!---------- +! Class B: +!---------- +!C parameter( na=75000, +!C > nonzer=13, +!C > shift=60., +!C > niter=75, +!C > rcond=1.0d-1 ) +!---------- +! Class C: +!---------- +!C parameter( na=150000, +!C > nonzer=15, +!C > shift=110., +!C > niter=75, +!C > rcond=1.0d-1 ) +!---------- +! Class D: +!---------- +!C parameter( na=1500000, +!C > nonzer=21, +!C > shift=500., +!C > niter=100, +!C > rcond=1.0d-1 ) +!---------- +! Class E: +!---------- +!C parameter( na=9000000, +!C > nonzer=26, +!C > shift=1500., +!C > niter=100, +!C > rcond=1.0d-1 ) + INTEGER :: NZ + PARAMETER (NZ = NA * (NONZER + 1) / NUM_PROCS * (NONZER + 1) + + &NONZER + NA * (NONZER + 2 + NUM_PROCS / 256) / NUM_PROC_COLS) + COMMON /PARTIT_SIZE/NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIR + &STROW,LASTROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_STA + &RT,SEND_LEN + INTEGER :: NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIRSTROW,LA + &STROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_START,SEND_ + &LEN + COMMON /MAIN_INT_MEM/COLIDX,ROWSTR,IV,AROW,ACOL + INTEGER :: COLIDX(NZ),ROWSTR(NA + 1),IV(2 * NA + 1),AROW(NZ),A + &COL(NZ) + COMMON /MAIN_FLT_MEM/V,AELT,A,X,Z,P,Q,R,W + DOUBLE PRECISION :: V(NA + 1),AELT(NZ),A(NZ),X(NA / NUM_PROC_R + &OWS + 2),Z(NA / NUM_PROC_ROWS + 2),P(NA / NUM_PROC_ROWS + 2),Q(NA + &/ NUM_PROC_ROWS + 2),R(NA / NUM_PROC_ROWS + 2),W(NA / NUM_PROC_ROW + &S + 2) + COMMON /URANDO/AMULT,TRAN + DOUBLE PRECISION :: AMULT,TRAN + INTEGER :: L2NPCOLS + INTEGER :: REDUCE_EXCH_PROC(NUM_PROC_COLS) + INTEGER :: REDUCE_SEND_STARTS(NUM_PROC_COLS) + INTEGER :: REDUCE_SEND_LENGTHS(NUM_PROC_COLS) + INTEGER :: REDUCE_RECV_STARTS(NUM_PROC_COLS) + INTEGER :: REDUCE_RECV_LENGTHS(NUM_PROC_COLS) + INTEGER :: I,J,K,IT + DOUBLE PRECISION :: ZETA,RANDLC + EXTERNAL RANDLC + DOUBLE PRECISION :: RNORM + DOUBLE PRECISION :: NORM_TEMP1(2),NORM_TEMP2(2) + DOUBLE PRECISION :: T,TMAX,MFLOPS + EXTERNAL TIMER_READ + DOUBLE PRECISION :: TIMER_READ + CHARACTER :: CLASS + LOGICAL :: VERIFIED + DOUBLE PRECISION :: ZETA_VERIFY_VALUE,EPSILON,ERR + DOUBLE PRECISION :: TSUM(T_LAST + 2),T1(T_LAST + 2),TMING(T_LA + &ST + 2),TMAXG(T_LAST + 2) + CHARACTER :: T_RECS(T_LAST + 2)*8 + DATA T_RECS/'total', 'conjg', 'rcomm', 'ncomm', ' to + &tcomp', ' totcomm'/ + INTERFACE + SUBROUTINE CONJ_GRAD (COLIDX, ROWSTR, X, Z, A, P, Q, R, W, R + &NORM, L2NPCOLS, REDUCE_EXCH_PROC, REDUCE_SEND_STARTS, REDUCE_SEND_ + &LENGTHS, REDUCE_RECV_STARTS, REDUCE_RECV_LENGTHS) + IMPLICIT NONE + COMMON /PARTIT_SIZE/NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW, + &FIRSTROW,LASTROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_ + &START,SEND_LEN + INTEGER :: NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIRSTROW + &,LASTROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_START,SE + &ND_LEN + DOUBLE PRECISION :: X(:),Z(:),P(:),Q(:),R(:),W(:) + DOUBLE PRECISION :: A(NZZ) + INTEGER :: COLIDX(NZZ),ROWSTR(NAA + 1) + INTEGER :: L2NPCOLS + INTEGER :: REDUCE_EXCH_PROC(L2NPCOLS) + INTEGER :: REDUCE_SEND_STARTS(L2NPCOLS) + INTEGER :: REDUCE_SEND_LENGTHS(L2NPCOLS) + INTEGER :: REDUCE_RECV_STARTS(L2NPCOLS) + INTEGER :: REDUCE_RECV_LENGTHS(L2NPCOLS) + DOUBLE PRECISION :: D,SUM,RHO,RHO0,ALPHA,BETA,RNORM + END SUBROUTINE + END INTERFACE + +!--------------------------------------------------------------------- +! Set up mpi initialization and number of proc testing +!--------------------------------------------------------------------- + CALL INITIALIZE_MPI() + IF (NA .EQ. 1400 .AND. NONZER .EQ. 7 .AND. NITER .EQ. 15 .AND. + &SHIFT .EQ. 10.D0) THEN + CLASS = 'S' + ZETA_VERIFY_VALUE = 8.5971775078648D0 + ELSE IF (NA .EQ. 7000 .AND. NONZER .EQ. 8 .AND. NITER .EQ. 15 . + &AND. SHIFT .EQ. 12.D0) THEN + CLASS = 'W' + ZETA_VERIFY_VALUE = 10.362595087124D0 + ELSE IF (NA .EQ. 14000 .AND. NONZER .EQ. 11 .AND. NITER .EQ. 15 + & .AND. SHIFT .EQ. 20.D0) THEN + CLASS = 'A' + ZETA_VERIFY_VALUE = 17.130235054029D0 + ELSE IF (NA .EQ. 75000 .AND. NONZER .EQ. 13 .AND. NITER .EQ. 75 + & .AND. SHIFT .EQ. 60.D0) THEN + CLASS = 'B' + ZETA_VERIFY_VALUE = 22.712745482631D0 + ELSE IF (NA .EQ. 150000 .AND. NONZER .EQ. 15 .AND. NITER .EQ. 7 + &5 .AND. SHIFT .EQ. 110.D0) THEN + CLASS = 'C' + ZETA_VERIFY_VALUE = 28.973605592845D0 + ELSE IF (NA .EQ. 1500000 .AND. NONZER .EQ. 21 .AND. NITER .EQ. + &100 .AND. SHIFT .EQ. 500.D0) THEN + CLASS = 'D' + ZETA_VERIFY_VALUE = 52.514532105794D0 + ELSE IF (NA .EQ. 9000000 .AND. NONZER .EQ. 26 .AND. NITER .EQ. + &100 .AND. SHIFT .EQ. 1.5D3) THEN + CLASS = 'E' + ZETA_VERIFY_VALUE = 77.522164599383D0 + ELSE + CLASS = 'U' + ENDIF + IF (ME .EQ. ROOT) THEN + WRITE (UNIT = *,FMT = 1000) + WRITE (UNIT = *,FMT = 1001) NA + WRITE (UNIT = *,FMT = 1002) NITER + WRITE (UNIT = *,FMT = 1003) NPROCS + WRITE (UNIT = *,FMT = 1004) NONZER + WRITE (UNIT = *,FMT = 1005) SHIFT +1000 FORMAT(//,' NAS Parallel Benchmarks 3.3 -- CG Benchmar + &k', /) +1001 FORMAT(' Size: ', I10 ) +1002 FORMAT(' Iterations: ', I5 ) +1003 FORMAT(' Number of active processes: ', I5 ) +1004 FORMAT(' Number of nonzeroes per row: ', I8) +1005 FORMAT(' Eigenvalue shift: ', E8.3) + ENDIF + IF (.NOT.(CONVERTDOUBLE)) THEN + DP_TYPE = MPI_DOUBLE_PRECISION + ELSE + DP_TYPE = MPI_REAL + ENDIF + NAA = NA + NZZ = NZ + +!--------------------------------------------------------------------- +! Set up processor info, such as whether sq num of procs, etc +!--------------------------------------------------------------------- + CALL SETUP_PROC_INFO(NUM_PROCS,NUM_PROC_ROWS,NUM_PROC_COLS) + +!--------------------------------------------------------------------- +! Set up partition's submatrix info: firstcol, lastcol, firstrow, lastrow +!--------------------------------------------------------------------- + CALL SETUP_SUBMATRIX_INFO(L2NPCOLS,REDUCE_EXCH_PROC,REDUCE_SEND + &_STARTS,REDUCE_SEND_LENGTHS,REDUCE_RECV_STARTS,REDUCE_RECV_LENGTHS + &) + DO I = 1,T_LAST + CALL TIMER_CLEAR(I) + ENDDO + +!--------------------------------------------------------------------- +! Inialize random number generator +!--------------------------------------------------------------------- + TRAN = 314159265.0D0 + AMULT = 1220703125.0D0 + ZETA = RANDLC (TRAN,AMULT) + +!--------------------------------------------------------------------- +! Set up partition's sparse random matrix for given class size +!--------------------------------------------------------------------- + CALL MAKEA(NAA,NZZ,A,COLIDX,ROWSTR,NONZER,FIRSTROW,LASTROW,FIRS + &TCOL,LASTCOL,RCOND,AROW,ACOL,AELT,V,IV,SHIFT) + +!--------------------------------------------------------------------- +! Note: as a result of the above call to makea: +! values of j used in indexing rowstr go from 1 --> lastrow-firstrow+1 +! values of colidx which are col indexes go from firstcol --> lastcol +! So: +! Shift the col index vals from actual (firstcol --> lastcol ) +! to local, i.e., (1 --> lastcol-firstcol+1) +!--------------------------------------------------------------------- +!DVM$ GET_ACTUAL (COLIDX,ROWSTR) + DO J = 1,LASTROW - FIRSTROW + 1 + DO K = ROWSTR(J),ROWSTR(J + 1) - 1 + COLIDX(K) = COLIDX(K) - FIRSTCOL + 1 + ENDDO + ENDDO +!DVM$ ACTUAL (COLIDX) + +!--------------------------------------------------------------------- +! set starting vector to (1, 1, .... 1) +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (I), PRIVATE (I),TIE (X(I)) + DO I = 1,NA / NUM_PROC_ROWS + 1 + X(I) = 1.0D0 + ENDDO +!DVM$ END REGION + ZETA = 0.0D0 + +!--------------------------------------------------------------------- +!----> +! Do one iteration untimed to init all code and data page tables +!----> (then reinit, start timing, to niter its) +!--------------------------------------------------------------------- + DO IT = 1,1 + +!--------------------------------------------------------------------- +! The call to the conjugate gradient routine: +!--------------------------------------------------------------------- + CALL CONJ_GRAD(COLIDX,ROWSTR,X,Z,A,P,Q,R,W,RNORM,L2NPCOLS,RE + &DUCE_EXCH_PROC,REDUCE_SEND_STARTS,REDUCE_SEND_LENGTHS,REDUCE_RECV_ + &STARTS,REDUCE_RECV_LENGTHS) + +!--------------------------------------------------------------------- +! zeta = shift + 1/(x.z) +! So, first: (x.z) +! Also, find norm of z +! So, first: (z.z) +!--------------------------------------------------------------------- + NORM_TEMP1(1) = 0.0D0 + NORM_TEMP1(2) = 0.0D0 +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (X(J),Z(J)),REDUCTION (SUM (NO +!DVM$&RM_TEMP1)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + NORM_TEMP1(1) = NORM_TEMP1(1) + X(J) * Z(J) + NORM_TEMP1(2) = NORM_TEMP1(2) + Z(J) * Z(J) + ENDDO +!DVM$ END REGION + DO I = 1,L2NPCOLS + IF (TIMERON) CALL TIMER_START(T_NCOMM) + CALL MPI_IRECV(NORM_TEMP2,2,DP_TYPE,REDUCE_EXCH_PROC(I),I + &,MPI_COMM_WORLD,REQUEST,IERR) + CALL MPI_SEND(NORM_TEMP1,2,DP_TYPE,REDUCE_EXCH_PROC(I),I, + &MPI_COMM_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_NCOMM) + NORM_TEMP1(1) = NORM_TEMP1(1) + NORM_TEMP2(1) + NORM_TEMP1(2) = NORM_TEMP1(2) + NORM_TEMP2(2) + ENDDO +!DVM$ GET_ACTUAL (NORM_TEMP1) + NORM_TEMP1(2) = 1.0D0 / SQRT (NORM_TEMP1(2)) +!DVM$ ACTUAL (NORM_TEMP1(2)) + +!--------------------------------------------------------------------- +! Normalize z to obtain x +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (X(J),Z(J)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + X(J) = NORM_TEMP1(2) * Z(J) + ENDDO +!DVM$ END REGION + +! end of do one iteration untimed + ENDDO + +!--------------------------------------------------------------------- +! set starting vector to (1, 1, .... 1) +!--------------------------------------------------------------------- +! +! NOTE: a questionable limit on size: should this be na/num_proc_cols+1 ? +! +!DVM$ REGION +!DVM$ PARALLEL (I), PRIVATE (I),TIE (X(I)) + DO I = 1,NA / NUM_PROC_ROWS + 1 + X(I) = 1.0D0 + ENDDO +!DVM$ END REGION + ZETA = 0.0D0 + +!--------------------------------------------------------------------- +! Synchronize and start timing +!--------------------------------------------------------------------- + DO I = 1,T_LAST + CALL TIMER_CLEAR(I) + ENDDO + CALL MPI_BARRIER(MPI_COMM_WORLD,IERR) + CALL TIMER_CLEAR(1) + CALL TIMER_START(1) + +!--------------------------------------------------------------------- +!----> +! Main Iteration for inverse power method +!----> +!--------------------------------------------------------------------- + DO IT = 1,NITER + +!--------------------------------------------------------------------- +! The call to the conjugate gradient routine: +!--------------------------------------------------------------------- + CALL CONJ_GRAD(COLIDX,ROWSTR,X,Z,A,P,Q,R,W,RNORM,L2NPCOLS,RE + &DUCE_EXCH_PROC,REDUCE_SEND_STARTS,REDUCE_SEND_LENGTHS,REDUCE_RECV_ + &STARTS,REDUCE_RECV_LENGTHS) + +!--------------------------------------------------------------------- +! zeta = shift + 1/(x.z) +! So, first: (x.z) +! Also, find norm of z +! So, first: (z.z) +!--------------------------------------------------------------------- + NORM_TEMP1(1) = 0.0D0 + NORM_TEMP1(2) = 0.0D0 +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (X(J),Z(J)),REDUCTION (SUM (NO +!DVM$&RM_TEMP1)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + NORM_TEMP1(1) = NORM_TEMP1(1) + X(J) * Z(J) + NORM_TEMP1(2) = NORM_TEMP1(2) + Z(J) * Z(J) + ENDDO +!DVM$ END REGION + DO I = 1,L2NPCOLS + IF (TIMERON) CALL TIMER_START(T_NCOMM) + CALL MPI_IRECV(NORM_TEMP2,2,DP_TYPE,REDUCE_EXCH_PROC(I),I + &,MPI_COMM_WORLD,REQUEST,IERR) + CALL MPI_SEND(NORM_TEMP1,2,DP_TYPE,REDUCE_EXCH_PROC(I),I, + &MPI_COMM_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_NCOMM) + NORM_TEMP1(1) = NORM_TEMP1(1) + NORM_TEMP2(1) + NORM_TEMP1(2) = NORM_TEMP1(2) + NORM_TEMP2(2) + ENDDO +!DVM$ GET_ACTUAL (NORM_TEMP1) + NORM_TEMP1(2) = 1.0D0 / SQRT (NORM_TEMP1(2)) +!DVM$ ACTUAL (NORM_TEMP1(2)) + IF (ME .EQ. ROOT) THEN + ZETA = SHIFT + 1.0D0 / NORM_TEMP1(1) + IF (IT .EQ. 1) WRITE (UNIT = *,FMT = 9000) + WRITE (UNIT = *,FMT = 9001) IT,RNORM,ZETA + ENDIF +9000 FORMAT( /,' iteration ||r|| + & zeta' ) +9001 FORMAT( 4X, I5, 7X, E20.14, F20.13 ) + +!--------------------------------------------------------------------- +! Normalize z to obtain x +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (X(J),Z(J)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + X(J) = NORM_TEMP1(2) * Z(J) + ENDDO +!DVM$ END REGION + +! end of main iter inv pow meth + ENDDO + CALL TIMER_STOP(1) + +!--------------------------------------------------------------------- +! End of timed section +!--------------------------------------------------------------------- + T = TIMER_READ (1) + CALL MPI_REDUCE(T,TMAX,1,DP_TYPE,MPI_MAX,ROOT,MPI_COMM_WORLD,IE + &RR) + IF (ME .EQ. ROOT) THEN + WRITE (UNIT = *,FMT = 100) +100 FORMAT(' Benchmark completed ') + EPSILON = 1.D-10 + IF (CLASS .NE. 'U') THEN + ERR = ABS (ZETA - ZETA_VERIFY_VALUE) / ZETA_VERIFY_VALUE + IF (ERR .LE. EPSILON) THEN + VERIFIED = .TRUE. + WRITE (UNIT = *,FMT = 200) + WRITE (UNIT = *,FMT = 201) ZETA + WRITE (UNIT = *,FMT = 202) ERR +200 FORMAT(' VERIFICATION SUCCE + &SSFUL ') +201 FORMAT(' Zeta is ', E20. + &13) +202 FORMAT(' Error is ', E20. + &13) + ELSE + VERIFIED = .FALSE. + WRITE (UNIT = *,FMT = 300) + WRITE (UNIT = *,FMT = 301) ZETA + WRITE (UNIT = *,FMT = 302) ZETA_VERIFY_VALUE +300 FORMAT(' VERIFICATION FAILE + &D') +301 FORMAT(' Zeta + & ', E20.13) +302 FORMAT(' The correct zeta i + &s ', E20.13) + ENDIF + ELSE + VERIFIED = .FALSE. + WRITE (UNIT = *,FMT = 400) + WRITE (UNIT = *,FMT = 401) + WRITE (UNIT = *,FMT = 201) ZETA +400 FORMAT(' Problem size unknown') +401 FORMAT(' NO VERIFICATION PERFORMED') + ENDIF + IF (TMAX .NE. 0.) THEN + MFLOPS = FLOAT (2 * 75 * 150000) * (3. + FLOAT (15 * (15 + &+ 1)) + 25. * (5. + FLOAT (15 * (15 + 1))) + 3.) / TMAX / 1000000. + &0 + ELSE + MFLOPS = 0.0 + ENDIF + CALL PRINT_RESULTS('CG',CLASS,NA,0,0,NITER,NNODES_COMPILED,N + &PROCS,TMAX,MFLOPS,' floating point',VERIFIED,NPBVERSION,C + &OMPILETIME,CS1,CS2,CS3,CS4,CS5,CS6,CS7) + ENDIF + IF (.NOT.(TIMERON)) GOTO 999 +!DVM$ GET_ACTUAL (T1) + DO I = 1,T_LAST + T1(I) = TIMER_READ (I) + ENDDO +!DVM$ ACTUAL (T1) + T1(T_CONJG) = T1(T_CONJG) - T1(T_RCOMM) +!DVM$ ACTUAL (T1(T_CONJG)) + T1(T_LAST + 2) = T1(T_RCOMM) + T1(T_NCOMM) +!DVM$ ACTUAL (T1(T_LAST + 2)) + T1(T_LAST + 1) = T1(T_TOTAL) - T1(T_LAST + 2) +!DVM$ ACTUAL (T1(T_LAST + 1)) + CALL MPI_REDUCE(T1,TSUM,4 + 2,DP_TYPE,MPI_SUM,0,MPI_COMM_WORLD, + &IERR) +!DVM$ GET_ACTUAL (T1) + CALL MPI_REDUCE(T1,TMING,4 + 2,DP_TYPE,MPI_MIN,0,MPI_COMM_WORLD + &,IERR) +!DVM$ GET_ACTUAL (T1) + CALL MPI_REDUCE(T1,TMAXG,4 + 2,DP_TYPE,MPI_MAX,0,MPI_COMM_WORLD + &,IERR) + IF (ME .EQ. 0) THEN + WRITE (UNIT = *,FMT = 800) NPROCS +!DVM$ GET_ACTUAL (T_RECS,TMAXG,TMING,TSUM) + DO I = 1,T_LAST + 2 + TSUM(I) = TSUM(I) / NPROCS + WRITE (UNIT = *,FMT = 810) I,T_RECS(I),TMING(I),TMAXG(I), + &TSUM(I) + ENDDO +!DVM$ ACTUAL (TSUM) + ENDIF +800 FORMAT(' nprocs =', I6, 11X, 'minimum', 5X, 'maximum', 5 + &X, 'average') +810 FORMAT(' timer ', I2, '(', A8, ') :', 3(2X,F10.4)) +999 CONTINUE + CALL MPI_FINALIZE(IERR) + +! end main + END + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE INITIALIZE_MPI () + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + + INCLUDE 'mpinpb.h' + INCLUDE 'timing.h' + INTEGER :: IERR,FSTATUS + CALL MPI_INIT(IERR) + CALL MPI_COMM_RANK(MPI_COMM_WORLD,ME,IERR) + CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NPROCS,IERR) + ROOT = 0 + IF (ME .EQ. ROOT) THEN + OPEN (UNIT = 2,FILE = 'timer.flag',STATUS = 'old',IOSTAT = F + &STATUS) + TIMERON = .FALSE. + IF (FSTATUS .EQ. 0) THEN + TIMERON = .TRUE. + CLOSE (UNIT = 2) + ENDIF + ENDIF + CALL MPI_BCAST(TIMERON,1,MPI_LOGICAL,0,MPI_COMM_WORLD,IERR) + RETURN + END + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE SETUP_PROC_INFO (NUM_PROCS, NUM_PROC_ROWS, NUM_PROC_ + &COLS) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + + INCLUDE 'mpinpb.h' + COMMON /PARTIT_SIZE/NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIR + &STROW,LASTROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_STA + &RT,SEND_LEN + INTEGER :: NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIRSTROW,LA + &STROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_START,SEND_ + &LEN + INTEGER :: NUM_PROCS,NUM_PROC_COLS,NUM_PROC_ROWS + INTEGER :: I,IERR + INTEGER :: LOG2NPROCS + INTENT(IN) NUM_PROC_COLS,NUM_PROC_ROWS,NUM_PROCS + +!--------------------------------------------------------------------- +! num_procs must be a power of 2, and num_procs=num_proc_cols*num_proc_rows +! When num_procs is not square, then num_proc_cols = 2*num_proc_rows +!--------------------------------------------------------------------- +! First, number of procs must be power of two. +!--------------------------------------------------------------------- + IF (NPROCS .NE. NUM_PROCS) THEN + IF (ME .EQ. ROOT) WRITE (UNIT = *,FMT = 9000) NPROCS,NUM_PR + &OCS +9000 FORMAT( /,'Error: ',/,'num of procs allocated + & (', I4, ' )', /,'is not equal + &to',/, 'compiled number of procs (', + & I4, ' )',/ ) + CALL MPI_FINALIZE(IERR) + STOP + ENDIF + I = NUM_PROC_COLS +100 CONTINUE + IF (I .NE. 1 .AND. I / 2 * 2 .NE. I) THEN + IF (ME .EQ. ROOT) THEN + WRITE (UNIT = *,FMT = *) 'Error: num_proc_cols is ',NUM_P + &ROC_COLS,' which is not a power of two' + ENDIF + CALL MPI_FINALIZE(IERR) + STOP + ENDIF + I = I / 2 + IF (I .NE. 0) THEN + GOTO 100 + ENDIF + I = NUM_PROC_ROWS +200 CONTINUE + IF (I .NE. 1 .AND. I / 2 * 2 .NE. I) THEN + IF (ME .EQ. ROOT) THEN + WRITE (UNIT = *,FMT = *) 'Error: num_proc_rows is ',NUM_P + &ROC_ROWS,' which is not a power of two' + ENDIF + CALL MPI_FINALIZE(IERR) + STOP + ENDIF + I = I / 2 + IF (I .NE. 0) THEN + GOTO 200 + ENDIF + LOG2NPROCS = 0 + I = NPROCS +300 CONTINUE + IF (I .NE. 1 .AND. I / 2 * 2 .NE. I) THEN + WRITE (UNIT = *,FMT = *) 'Error: nprocs is ',NPROCS,' which + &is not a power of two' + CALL MPI_FINALIZE(IERR) + STOP + ENDIF + I = I / 2 + IF (I .NE. 0) THEN + LOG2NPROCS = LOG2NPROCS + 1 + GOTO 300 + ENDIF + +!C write( *,* ) 'nprocs, log2nprocs: ',nprocs,log2nprocs + NPCOLS = NUM_PROC_COLS + NPROWS = NUM_PROC_ROWS + RETURN + END + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE SETUP_SUBMATRIX_INFO (L2NPCOLS, REDUCE_EXCH_PROC, RE + &DUCE_SEND_STARTS, REDUCE_SEND_LENGTHS, REDUCE_RECV_STARTS, REDUCE_ + &RECV_LENGTHS) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + + INCLUDE 'mpinpb.h' + INCLUDE 'npbparams.h' + INTEGER :: COL_SIZE,ROW_SIZE + COMMON /PARTIT_SIZE/NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIR + &STROW,LASTROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_STA + &RT,SEND_LEN + INTEGER :: NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIRSTROW,LA + &STROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_START,SEND_ + &LEN + INTEGER :: REDUCE_EXCH_PROC(NUM_PROC_COLS) + INTEGER :: REDUCE_SEND_STARTS(NUM_PROC_COLS) + INTEGER :: REDUCE_SEND_LENGTHS(NUM_PROC_COLS) + INTEGER :: REDUCE_RECV_STARTS(NUM_PROC_COLS) + INTEGER :: REDUCE_RECV_LENGTHS(NUM_PROC_COLS) + INTEGER :: I,J + INTEGER :: DIV_FACTOR + INTEGER :: L2NPCOLS + INTENT(INOUT) L2NPCOLS + INTENT(OUT) REDUCE_RECV_LENGTHS,REDUCE_RECV_STARTS,REDUCE_SEND_ + &LENGTHS,REDUCE_SEND_STARTS,REDUCE_EXCH_PROC + PROC_ROW = ME / NPCOLS + PROC_COL = ME - PROC_ROW * NPCOLS + +!--------------------------------------------------------------------- +! If naa evenly divisible by npcols, then it is evenly divisible +! by nprows +!--------------------------------------------------------------------- + IF (NAA / NPCOLS * NPCOLS .EQ. NAA) THEN + COL_SIZE = NAA / NPCOLS + FIRSTCOL = PROC_COL * COL_SIZE + 1 + LASTCOL = FIRSTCOL - 1 + COL_SIZE + ROW_SIZE = NAA / NPROWS + FIRSTROW = PROC_ROW * ROW_SIZE + 1 + LASTROW = FIRSTROW - 1 + ROW_SIZE + +!--------------------------------------------------------------------- +! If naa not evenly divisible by npcols, then first subdivide for nprows +! and then, if npcols not equal to nprows (i.e., not a sq number of procs), +! get col subdivisions by dividing by 2 each row subdivision. +!--------------------------------------------------------------------- + ELSE + IF (PROC_ROW .LT. NAA - NAA / NPROWS * NPROWS) THEN + ROW_SIZE = NAA / NPROWS + 1 + FIRSTROW = PROC_ROW * ROW_SIZE + 1 + LASTROW = FIRSTROW - 1 + ROW_SIZE + ELSE + ROW_SIZE = NAA / NPROWS + FIRSTROW = (NAA - NAA / NPROWS * NPROWS) * (ROW_SIZE + 1) + & + (PROC_ROW - (NAA - NAA / NPROWS * NPROWS)) * ROW_SIZE + 1 + LASTROW = FIRSTROW - 1 + ROW_SIZE + ENDIF + IF (NPCOLS .EQ. NPROWS) THEN + IF (PROC_COL .LT. NAA - NAA / NPCOLS * NPCOLS) THEN + COL_SIZE = NAA / NPCOLS + 1 + FIRSTCOL = PROC_COL * COL_SIZE + 1 + LASTCOL = FIRSTCOL - 1 + COL_SIZE + ELSE + COL_SIZE = NAA / NPCOLS + FIRSTCOL = (NAA - NAA / NPCOLS * NPCOLS) * (COL_SIZE + + & 1) + (PROC_COL - (NAA - NAA / NPCOLS * NPCOLS)) * COL_SIZE + 1 + LASTCOL = FIRSTCOL - 1 + COL_SIZE + ENDIF + ELSE + IF (PROC_COL / 2 .LT. NAA - NAA / (NPCOLS / 2) * (NPCOLS + &/ 2)) THEN + COL_SIZE = NAA / (NPCOLS / 2) + 1 + FIRSTCOL = PROC_COL / 2 * COL_SIZE + 1 + LASTCOL = FIRSTCOL - 1 + COL_SIZE + ELSE + COL_SIZE = NAA / (NPCOLS / 2) + FIRSTCOL = (NAA - NAA / (NPCOLS / 2) * (NPCOLS / 2)) * + & (COL_SIZE + 1) + (PROC_COL / 2 - (NAA - NAA / (NPCOLS / 2) * (NPC + &OLS / 2))) * COL_SIZE + 1 + LASTCOL = FIRSTCOL - 1 + COL_SIZE + ENDIF + +!C write( *,* ) col_size,firstcol,lastcol + IF (MOD (ME,2) .EQ. 0) THEN + LASTCOL = FIRSTCOL - 1 + (COL_SIZE - 1) / 2 + 1 + ELSE + FIRSTCOL = FIRSTCOL + (COL_SIZE - 1) / 2 + 1 + LASTCOL = FIRSTCOL - 1 + COL_SIZE / 2 + +!C write( *,* ) firstcol,lastcol + ENDIF + ENDIF + ENDIF + IF (NPCOLS .EQ. NPROWS) THEN + SEND_START = 1 + SEND_LEN = LASTROW - FIRSTROW + 1 + ELSE + IF (MOD (ME,2) .EQ. 0) THEN + SEND_START = 1 + SEND_LEN = (1 + LASTROW - FIRSTROW + 1) / 2 + ELSE + SEND_START = (1 + LASTROW - FIRSTROW + 1) / 2 + 1 + SEND_LEN = (LASTROW - FIRSTROW + 1) / 2 + ENDIF + ENDIF + +!--------------------------------------------------------------------- +! Transpose exchange processor +!--------------------------------------------------------------------- + IF (NPCOLS .EQ. NPROWS) THEN + EXCH_PROC = MOD (ME,NPROWS) * NPROWS + ME / NPROWS + ELSE + EXCH_PROC = 2 * (MOD (ME / 2,NPROWS) * NPROWS + ME / 2 / NPR + &OWS) + MOD (ME,2) + ENDIF + I = NPCOLS / 2 + L2NPCOLS = 0 + DO WHILE (I .GT. 0) + L2NPCOLS = L2NPCOLS + 1 + I = I / 2 + ENDDO + +!--------------------------------------------------------------------- +! Set up the reduce phase schedules... +!--------------------------------------------------------------------- + DIV_FACTOR = NPCOLS +!DVM$ GET_ACTUAL (REDUCE_EXCH_PROC) + DO I = 1,L2NPCOLS + J = MOD (PROC_COL + DIV_FACTOR / 2,DIV_FACTOR) + PROC_COL / + &DIV_FACTOR * DIV_FACTOR + REDUCE_EXCH_PROC(I) = PROC_ROW * NPCOLS + J + DIV_FACTOR = DIV_FACTOR / 2 + ENDDO +!DVM$ ACTUAL (REDUCE_EXCH_PROC) +!DVM$ GET_ACTUAL (REDUCE_RECV_LENGTHS,REDUCE_RECV_STARTS,REDUCE_SEND_ +!DVM$&LENGTHS,REDUCE_SEND_STARTS) + DO I = L2NPCOLS,1,(-(1)) + IF (NPROWS .EQ. NPCOLS) THEN + REDUCE_SEND_STARTS(I) = SEND_START + REDUCE_SEND_LENGTHS(I) = SEND_LEN + REDUCE_RECV_LENGTHS(I) = LASTROW - FIRSTROW + 1 + ELSE + REDUCE_RECV_LENGTHS(I) = SEND_LEN + IF (I .EQ. L2NPCOLS) THEN + REDUCE_SEND_LENGTHS(I) = LASTROW - FIRSTROW + 1 - SEND + &_LEN + IF (ME / 2 * 2 .EQ. ME) THEN + REDUCE_SEND_STARTS(I) = SEND_START + SEND_LEN + ELSE + REDUCE_SEND_STARTS(I) = 1 + ENDIF + ELSE + REDUCE_SEND_LENGTHS(I) = SEND_LEN + REDUCE_SEND_STARTS(I) = SEND_START + ENDIF + ENDIF + REDUCE_RECV_STARTS(I) = SEND_START + ENDDO +!DVM$ ACTUAL (REDUCE_RECV_LENGTHS,REDUCE_RECV_STARTS,REDUCE_SEND_LENG +!DVM$&THS,REDUCE_SEND_STARTS) + EXCH_RECV_LENGTH = LASTCOL - FIRSTCOL + 1 + RETURN + END + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE CONJ_GRAD (COLIDX, ROWSTR, X, Z, A, P, Q, R, W, RNOR + &M, L2NPCOLS, REDUCE_EXCH_PROC, REDUCE_SEND_STARTS, REDUCE_SEND_LEN + >HS, REDUCE_RECV_STARTS, REDUCE_RECV_LENGTHS) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! Floaging point arrays here are named as in NPB1 spec discussion of +! CG algorithm +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + + INCLUDE 'mpinpb.h' + INCLUDE 'timing.h' + INTEGER :: STATUS(MPI_STATUS_SIZE),REQUEST + COMMON /PARTIT_SIZE/NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIR + &STROW,LASTROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_STA + &RT,SEND_LEN + INTEGER :: NAA,NZZ,NPCOLS,NPROWS,PROC_COL,PROC_ROW,FIRSTROW,LA + &STROW,FIRSTCOL,LASTCOL,EXCH_PROC,EXCH_RECV_LENGTH,SEND_START,SEND_ + &LEN + DOUBLE PRECISION :: X(:),Z(:),A(NZZ) + INTEGER :: COLIDX(NZZ),ROWSTR(NAA + 1) + +! used as work temporary + DOUBLE PRECISION :: P(:),Q(:),R(:),W(:) + INTEGER :: L2NPCOLS + INTEGER :: REDUCE_EXCH_PROC(L2NPCOLS) + INTEGER :: REDUCE_SEND_STARTS(L2NPCOLS) + INTEGER :: REDUCE_SEND_LENGTHS(L2NPCOLS) + INTEGER :: REDUCE_RECV_STARTS(L2NPCOLS) + INTEGER :: REDUCE_RECV_LENGTHS(L2NPCOLS) + INTEGER :: I,J,K,IERR + INTEGER :: CGIT,CGITMAX + DOUBLE PRECISION :: D,SUM,RHO,RHO0,ALPHA,BETA,RNORM + EXTERNAL TIMER_READ + DOUBLE PRECISION :: TIMER_READ + DATA CGITMAX / 25 / + INTENT(INOUT) W,R,Q,P,Z + INTENT(IN) REDUCE_RECV_LENGTHS,REDUCE_RECV_STARTS,REDUCE_SEND_L + &ENGTHS,REDUCE_SEND_STARTS,REDUCE_EXCH_PROC,L2NPCOLS,A,X,ROWSTR,COL + &IDX + INTENT(OUT) RNORM + IF (TIMERON) CALL TIMER_START(T_CONJG) + +!--------------------------------------------------------------------- +! Initialize the CG algorithm: +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (P(J),Q(J),R(J),W(J),X(J),Z(J)) + DO J = 1,NAA / NPROWS + 1 + Q(J) = 0.0D0 + Z(J) = 0.0D0 + R(J) = X(J) + P(J) = R(J) + W(J) = 0.0D0 + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! rho = r.r +! Now, obtain the norm of r: First, sum squares of r elements locally... +!--------------------------------------------------------------------- + SUM = 0.0D0 +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (R(J)),REDUCTION (SUM (SUM)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + SUM = SUM + R(J) * R(J) + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! Exchange and sum with procs identified in reduce_exch_proc +! (This is equivalent to mpi_allreduce.) +! Sum the partial sums of rho, leaving rho on all processors +!--------------------------------------------------------------------- + DO I = 1,L2NPCOLS + IF (TIMERON) CALL TIMER_START(T_RCOMM) + CALL MPI_IRECV(RHO,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_ + &WORLD,REQUEST,IERR) + CALL MPI_SEND(SUM,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_W + &ORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) + SUM = SUM + RHO + ENDDO + RHO = SUM + +!--------------------------------------------------------------------- +!----> +! The conj grad iteration loop +!----> +!--------------------------------------------------------------------- + DO CGIT = 1,CGITMAX + +!--------------------------------------------------------------------- +! q = A.p +! The partition submatrix-vector multiply: use workspace w +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J,K,SUM),TIE (W(J)) + DO J = 1,LASTROW - FIRSTROW + 1 + SUM = 0.D0 + DO K = ROWSTR(J),ROWSTR(J + 1) - 1 + SUM = SUM + A(K) * P(COLIDX(K)) + ENDDO + W(J) = SUM + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! Sum the partition submatrix-vec A.p's across rows +! Exchange and sum piece of w with procs identified in reduce_exch_proc +!--------------------------------------------------------------------- + DO I = L2NPCOLS,1,(-(1)) + IF (TIMERON) CALL TIMER_START(T_RCOMM) + + CALL MPI_IRECV(Q(REDUCE_RECV_STARTS(I)),REDUCE_RECV_LENGT + &HS(I),DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_WORLD,REQUEST,IERR) +!DVM$ ACTUAL (Q(REDUCE_RECV_STARTS(I):REDUCE_RECV_STARTS(I)+ +!DVM$& REDUCE_RECV_LENGTHS(I))) +!DVM$ GET_ACTUAL (W(REDUCE_SEND_STARTS(I):REDUCE_SEND_STARTS(I) +!DVM$& +REDUCE_SEND_LENGTHS(I))) + CALL MPI_SEND(W(REDUCE_SEND_STARTS(I)),REDUCE_SEND_LENGTH + &S(I),DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (Q(J),W(J)) + DO J = SEND_START,SEND_START + REDUCE_RECV_LENGTHS(I) - + &1 + W(J) = W(J) + Q(J) + ENDDO +!DVM$ END REGION + ENDDO + +!--------------------------------------------------------------------- +! Exchange piece of q with transpose processor: +!--------------------------------------------------------------------- + IF (L2NPCOLS .NE. 0) THEN + IF (TIMERON) CALL TIMER_START(T_RCOMM) + + CALL MPI_IRECV(Q,EXCH_RECV_LENGTH,DP_TYPE,EXCH_PROC,1,MPI + &_COMM_WORLD,REQUEST,IERR) +!DVM$ ACTUAL (Q(1:EXCH_RECV_LENGTH)) +!DVM$ GET_ACTUAL (W(SEND_START:SEND_START+SEND_LEN)) + CALL MPI_SEND(W(SEND_START),SEND_LEN,DP_TYPE,EXCH_PROC,1, + &MPI_COMM_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) + ELSE +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (Q(J),W(J)) + DO J = 1,EXCH_RECV_LENGTH + Q(J) = W(J) + ENDDO +!DVM$ END REGION + ENDIF + +!--------------------------------------------------------------------- +! Clear w for reuse... +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (W(J)) + DO J = 1,MAX (LASTROW - FIRSTROW + 1,LASTCOL - FIRSTCOL + 1 + &) + W(J) = 0.0D0 + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! Obtain p.q +!--------------------------------------------------------------------- + SUM = 0.0D0 +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (P(J),Q(J)),REDUCTION (SUM (SU +!DVM$&M)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + SUM = SUM + P(J) * Q(J) + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! Obtain d with a sum-reduce +!--------------------------------------------------------------------- + DO I = 1,L2NPCOLS + IF (TIMERON) CALL TIMER_START(T_RCOMM) + CALL MPI_IRECV(D,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM + &_WORLD,REQUEST,IERR) + CALL MPI_SEND(SUM,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COM + &M_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) + SUM = SUM + D + ENDDO + D = SUM + +!--------------------------------------------------------------------- +! Obtain alpha = rho / (p.q) +!--------------------------------------------------------------------- + ALPHA = RHO / D + +!--------------------------------------------------------------------- +! Save a temporary of rho +!--------------------------------------------------------------------- + RHO0 = RHO + +!--------------------------------------------------------------------- +! Obtain z = z + alpha*p +! and r = r - alpha*q +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (P(J),Q(J),R(J),Z(J)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + Z(J) = Z(J) + ALPHA * P(J) + R(J) = R(J) - ALPHA * Q(J) + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! rho = r.r +! Now, obtain the norm of r: First, sum squares of r elements locally... +!--------------------------------------------------------------------- + SUM = 0.0D0 +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (R(J)),REDUCTION (SUM (SUM)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + SUM = SUM + R(J) * R(J) + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! Obtain rho with a sum-reduce +!--------------------------------------------------------------------- + DO I = 1,L2NPCOLS + IF (TIMERON) CALL TIMER_START(T_RCOMM) + CALL MPI_IRECV(RHO,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_CO + &MM_WORLD,REQUEST,IERR) + CALL MPI_SEND(SUM,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COM + &M_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) + SUM = SUM + RHO + ENDDO + RHO = SUM + +!--------------------------------------------------------------------- +! Obtain beta: +!--------------------------------------------------------------------- + BETA = RHO / RHO0 + +!--------------------------------------------------------------------- +! p = r + beta*p +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (P(J),R(J)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + P(J) = R(J) + BETA * P(J) + ENDDO +!DVM$ END REGION + +! end of do cgit=1,cgitmax + ENDDO + +!--------------------------------------------------------------------- +! Compute residual norm explicitly: ||r|| = ||x - A.z|| +! First, form A.z +! The partition submatrix-vector multiply +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J,K,SUM),TIE (W(J)) + DO J = 1,LASTROW - FIRSTROW + 1 + SUM = 0.D0 + DO K = ROWSTR(J),ROWSTR(J + 1) - 1 + SUM = SUM + A(K) * Z(COLIDX(K)) + ENDDO + W(J) = SUM + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! Sum the partition submatrix-vec A.z's across rows +!--------------------------------------------------------------------- + DO I = L2NPCOLS,1,(-(1)) + IF (TIMERON) CALL TIMER_START(T_RCOMM) + + CALL MPI_IRECV(R(REDUCE_RECV_STARTS(I)),REDUCE_RECV_LENGTHS( + &I),DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_WORLD,REQUEST,IERR) +!DVM$ ACTUAL (R(REDUCE_RECV_STARTS(I):REDUCE_RECV_STARTS(I)+ +!DVM$& REDUCE_RECV_LENGTHS(I))) + +!DVM$ GET_ACTUAL (W(REDUCE_SEND_STARTS(I):REDUCE_SEND_STARTS(I)+ +!DVM$& REDUCE_SEND_LENGTHS(I))) + CALL MPI_SEND(W(REDUCE_SEND_STARTS(I)),REDUCE_SEND_LENGTHS(I + &),DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (R(J),W(J)) + DO J = SEND_START,SEND_START + REDUCE_RECV_LENGTHS(I) - 1 + W(J) = W(J) + R(J) + ENDDO +!DVM$ END REGION + ENDDO + +!--------------------------------------------------------------------- +! Exchange piece of q with transpose processor: +!--------------------------------------------------------------------- + IF (L2NPCOLS .NE. 0) THEN + IF (TIMERON) CALL TIMER_START(T_RCOMM) + + CALL MPI_IRECV(R,EXCH_RECV_LENGTH,DP_TYPE,EXCH_PROC,1,MPI_CO + &MM_WORLD,REQUEST,IERR) +!DVM$ ACTUAL (R(1:EXCH_RECV_LENGTH)) +!DVM$ GET_ACTUAL (W(SEND_START:SEND_START+SEND_LEN)) + CALL MPI_SEND(W(SEND_START),SEND_LEN,DP_TYPE,EXCH_PROC,1,MPI + &_COMM_WORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) + ELSE +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (R(J),W(J)) + DO J = 1,EXCH_RECV_LENGTH + R(J) = W(J) + ENDDO +!DVM$ END REGION + ENDIF + +!--------------------------------------------------------------------- +! At this point, r contains A.z +!--------------------------------------------------------------------- + SUM = 0.0D0 +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (D,J),TIE (R(J),X(J)),REDUCTION (SUM (SUM +!DVM$&)) + DO J = 1,LASTCOL - FIRSTCOL + 1 + D = X(J) - R(J) + SUM = SUM + D * D + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! Obtain d with a sum-reduce +!--------------------------------------------------------------------- + DO I = 1,L2NPCOLS + IF (TIMERON) CALL TIMER_START(T_RCOMM) + CALL MPI_IRECV(D,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_WO + &RLD,REQUEST,IERR) + CALL MPI_SEND(SUM,1,DP_TYPE,REDUCE_EXCH_PROC(I),I,MPI_COMM_W + &ORLD,IERR) + CALL MPI_WAIT(REQUEST,STATUS,IERR) + IF (TIMERON) CALL TIMER_STOP(T_RCOMM) + SUM = SUM + D + ENDDO + D = SUM + IF (ME .EQ. ROOT) RNORM = SQRT (D) + IF (TIMERON) CALL TIMER_STOP(T_CONJG) + RETURN + +! end of routine conj_grad + END + + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE MAKEA (N, NZ, A, COLIDX, ROWSTR, NONZER, FIRSTROW, L + &ASTROW, FIRSTCOL, LASTCOL, RCOND, AROW, ACOL, AELT, V, IV, SHIFT) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + INTEGER :: N,NZ,NONZER + INTEGER :: FIRSTROW,LASTROW,FIRSTCOL,LASTCOL + INTEGER :: COLIDX(NZ),ROWSTR(N + 1) + INTEGER :: IV(2 * N + 1),AROW(NZ),ACOL(NZ) + DOUBLE PRECISION :: V(N + 1),AELT(NZ) + DOUBLE PRECISION :: RCOND,A(NZ),SHIFT + +!--------------------------------------------------------------------- +! generate the test problem for benchmark 6 +! makea generates a sparse matrix with a +! prescribed sparsity distribution +! +! parameter type usage +! +! input +! +! n i number of cols/rows of matrix +! nz i nonzeros as declared array size +! rcond r*8 condition number +! shift r*8 main diagonal shift +! +! output +! +! a r*8 array for nonzeros +! colidx i col indices +! rowstr i row pointers +! +! workspace +! +! iv, arow, acol i +! v, aelt r*8 +!--------------------------------------------------------------------- + INTEGER :: I,NNZA,IOUTER,IVELT,IVELT1,IROW,NZV,JCOL + +!--------------------------------------------------------------------- +! nonzer is approximately (int(sqrt(nnza /n))); +!--------------------------------------------------------------------- + DOUBLE PRECISION :: SIZE,RATIO,SCALE + EXTERNAL SPARSE,SPRNVC,VECSET + INTENT(INOUT) IV,V,AELT,ACOL,AROW,ROWSTR,COLIDX,A + INTENT(IN) SHIFT,RCOND,LASTCOL,FIRSTCOL,LASTROW,FIRSTROW,NONZER + &,NZ,N + SIZE = 1.0D0 + RATIO = RCOND** (1.0D0 / DFLOAT (N)) + NNZA = 0 + +!--------------------------------------------------------------------- +! Initialize iv(n+1 .. 2n) to zero. +! Used by sprnvc to mark nonzero positions +!--------------------------------------------------------------------- +!DVM$ GET_ACTUAL (IV) + DO I = 1,N + IV(N + I) = 0 + ENDDO +!DVM$ ACTUAL (IV) + DO IOUTER = 1,N + NZV = NONZER +!DVM$ GET_ACTUAL (IV) + CALL SPRNVC(N,NZV,V,COLIDX,IV(1),IV(N + 1)) +!DVM$ ACTUAL (IV) + CALL VECSET(N,V,COLIDX,NZV,IOUTER,.5D0) +!DVM$ GET_ACTUAL (ACOL,AELT,AROW,COLIDX,V) + DO IVELT = 1,NZV + JCOL = COLIDX(IVELT) + IF (JCOL .GE. FIRSTCOL .AND. JCOL .LE. LASTCOL) THEN + SCALE = SIZE * V(IVELT) + DO IVELT1 = 1,NZV + IROW = COLIDX(IVELT1) + IF (IROW .GE. FIRSTROW .AND. IROW .LE. LASTROW) THE + &N + NNZA = NNZA + 1 + IF (NNZA .GT. NZ) GOTO 9999 + ACOL(NNZA) = JCOL + AROW(NNZA) = IROW + AELT(NNZA) = V(IVELT1) * SCALE + ENDIF + ENDDO + ENDIF + ENDDO +!DVM$ ACTUAL (ACOL,AELT,AROW) + SIZE = SIZE * RATIO + ENDDO + +!--------------------------------------------------------------------- +! ... add the identity * rcond to the generated matrix to bound +! the smallest eigenvalue from below by rcond +!--------------------------------------------------------------------- +!DVM$ GET_ACTUAL (ACOL,AELT,AROW) + DO I = FIRSTROW,LASTROW + IF (I .GE. FIRSTCOL .AND. I .LE. LASTCOL) THEN + IOUTER = N + I + NNZA = NNZA + 1 + IF (NNZA .GT. NZ) GOTO 9999 + ACOL(NNZA) = I + AROW(NNZA) = I + AELT(NNZA) = RCOND - SHIFT + ENDIF + ENDDO +!DVM$ ACTUAL (ACOL,AELT,AROW) + +!--------------------------------------------------------------------- +! ... make the sparse matrix from list of elements with duplicates +! (v and iv are used as workspace) +!--------------------------------------------------------------------- +!DVM$ GET_ACTUAL (IV) + CALL SPARSE(A,COLIDX,ROWSTR,N,AROW,ACOL,AELT,FIRSTROW,LASTROW,V + &,IV(1),IV(N + 1),NNZA) +!DVM$ ACTUAL (IV) + RETURN +9999 CONTINUE + WRITE (UNIT = *,FMT = *) 'Space for matrix elements exceeded in + & makea' + WRITE (UNIT = *,FMT = *) 'nnza, nzmax = ',NNZA,NZ + WRITE (UNIT = *,FMT = *) ' iouter = ',IOUTER + STOP + END + + +!-------end of makea------------------------------ +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE SPARSE (A, COLIDX, ROWSTR, N, AROW, ACOL, AELT, FIRS + &TROW, LASTROW, X, MARK, NZLOC, NNZA) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + + INCLUDE 'npbparams.h' + INTEGER :: COLIDX(*),ROWSTR(NA + 1) + INTEGER :: FIRSTROW,LASTROW + INTEGER :: N,AROW(*),ACOL(*),NNZA + DOUBLE PRECISION :: A(*),AELT(*) + +!--------------------------------------------------------------------- +! rows range from firstrow to lastrow +! the rowstr pointers are defined for nrows = lastrow-firstrow+1 values +!--------------------------------------------------------------------- + INTEGER :: NZLOC(N),NROWS + DOUBLE PRECISION :: X(N) + LOGICAL :: MARK(N) + +!--------------------------------------------------- +! generate a sparse matrix from a list of +! [col, row, element] tri +!--------------------------------------------------- + INTEGER :: I,J,JAJP1,NZA,K,NZROW + DOUBLE PRECISION :: XI + INTENT(INOUT) NZLOC,MARK,X,ROWSTR,COLIDX,A + INTENT(IN) NNZA,LASTROW,FIRSTROW,AELT,ACOL,AROW,N + +!--------------------------------------------------------------------- +! how many rows of result +!--------------------------------------------------------------------- + NROWS = LASTROW - FIRSTROW + 1 + +!--------------------------------------------------------------------- +! ...count the number of triples in each row +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (ROWSTR(J)) + DO J = 1,N + ROWSTR(J) = 0 + MARK(J) = .FALSE. + ENDDO +!DVM$ END REGION + ROWSTR(N + 1) = 0 +!DVM$ ACTUAL (ROWSTR(N + 1)) +!DVM$ GET_ACTUAL (AROW,ROWSTR) + DO NZA = 1,NNZA + J = AROW(NZA) - FIRSTROW + 1 + 1 + ROWSTR(J) = ROWSTR(J) + 1 + ENDDO +!DVM$ ACTUAL (ROWSTR) + ROWSTR(1) = 1 +!DVM$ ACTUAL (ROWSTR(1)) +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (ROWSTR(J)),ACROSS (ROWSTR(1:0)) + DO J = 2,NROWS + 1 + ROWSTR(J) = ROWSTR(J) + ROWSTR(J - 1) + ENDDO +!DVM$ END REGION + +!--------------------------------------------------------------------- +! ... rowstr(j) now is the location of the first nonzero +! of row j of a +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +! ... do a bucket sort of the triples on the row index +!--------------------------------------------------------------------- +!DVM$ GET_ACTUAL (A,ACOL,AELT,AROW,COLIDX,ROWSTR) + DO NZA = 1,NNZA + J = AROW(NZA) - FIRSTROW + 1 + K = ROWSTR(J) + A(K) = AELT(NZA) + COLIDX(K) = ACOL(NZA) + ROWSTR(J) = ROWSTR(J) + 1 + ENDDO +!DVM$ ACTUAL (A,COLIDX,ROWSTR) + +!--------------------------------------------------------------------- +! ... rowstr(j) now points to the first element of row j+1 +!--------------------------------------------------------------------- +!DVM$ REGION +!DVM$ PARALLEL (J), PRIVATE (J),TIE (ROWSTR(J)),ACROSS (ROWSTR(1:0)) + DO J = NROWS,1,(-(1)) + ROWSTR(J + 1) = ROWSTR(J) + ENDDO +!DVM$ END REGION + ROWSTR(1) = 1 +!DVM$ ACTUAL (ROWSTR(1)) + +!--------------------------------------------------------------------- +! ... generate the actual output rows by adding elements +!--------------------------------------------------------------------- + NZA = 0 +!DVM$ GET_ACTUAL (MARK,X) + DO I = 1,N + X(I) = 0.0 + MARK(I) = .FALSE. + ENDDO +!DVM$ ACTUAL (MARK,X) +!DVM$ GET_ACTUAL (ROWSTR) + JAJP1 = ROWSTR(1) +!DVM$ GET_ACTUAL (A,COLIDX,MARK,NZLOC,ROWSTR,X) + DO J = 1,NROWS + NZROW = 0 + +!--------------------------------------------------------------------- +! ...loop over the jth row of a +!--------------------------------------------------------------------- + DO K = JAJP1,ROWSTR(J + 1) - 1 + I = COLIDX(K) + X(I) = X(I) + A(K) + IF (.NOT.(MARK(I)) .AND. X(I) .NE. 0.D0) THEN + MARK(I) = .TRUE. + NZROW = NZROW + 1 + NZLOC(NZROW) = I + ENDIF + ENDDO + +!--------------------------------------------------------------------- +! ... extract the nonzeros of this row +!--------------------------------------------------------------------- + DO K = 1,NZROW + I = NZLOC(K) + MARK(I) = .FALSE. + XI = X(I) + X(I) = 0.D0 + IF (XI .NE. 0.D0) THEN + NZA = NZA + 1 + A(NZA) = XI + COLIDX(NZA) = I + ENDIF + ENDDO + JAJP1 = ROWSTR(J + 1) + ROWSTR(J + 1) = NZA + ROWSTR(1) + ENDDO +!DVM$ ACTUAL (A,COLIDX,MARK,NZLOC,ROWSTR,X) + +!C write (*, 11000) nza + RETURN +11000 FORMAT ( //,'final nonzero count in sparse ', /,'n + &umber of nonzeros = ', I16 ) + END + + +!-------end of sparse----------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE SPRNVC (N, NZ, V, IV, NZLOC, MARK) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + DOUBLE PRECISION :: V(*) + INTEGER :: N,NZ,IV(*),NZLOC(N),NN1 + INTEGER :: MARK(N) + COMMON /URANDO/AMULT,TRAN + DOUBLE PRECISION :: AMULT,TRAN + +!--------------------------------------------------------------------- +! generate a sparse n-vector (v, iv) +! having nzv nonzeros +! +! mark(i) is set to 1 if position i is nonzero. +! mark is all zero on entry and is reset to all zero before exit +! this corrects a performance bug found by John G. Lewis, caused by +! reinitialization of mark on every one of the n calls to sprnvc +!--------------------------------------------------------------------- + INTEGER :: NZROW,NZV,II,I,ICNVRT + EXTERNAL RANDLC,ICNVRT + DOUBLE PRECISION :: RANDLC,VECELT,VECLOC + INTENT(INOUT) MARK,NZLOC + INTENT(IN) NZ,N + INTENT(OUT) IV,V + NZV = 0 + NZROW = 0 + NN1 = 1 +50 CONTINUE + NN1 = 2 * NN1 + IF (NN1 .LT. N) GOTO 50 + +!--------------------------------------------------------------------- +! nn1 is the smallest power of two not less than n +!--------------------------------------------------------------------- +100 CONTINUE + IF (NZV .GE. NZ) GOTO 110 + VECELT = RANDLC (TRAN,AMULT) + +!--------------------------------------------------------------------- +! generate an integer between 1 and n in a portable manner +!--------------------------------------------------------------------- + VECLOC = RANDLC (TRAN,AMULT) + I = ICNVRT (VECLOC,NN1) + 1 + IF (I .GT. N) GOTO 100 + +!--------------------------------------------------------------------- +! was this integer generated already? +!--------------------------------------------------------------------- + IF (MARK(I) .EQ. 0) THEN + MARK(I) = 1 +!DVM$ ACTUAL (MARK(I)) + NZROW = NZROW + 1 + NZLOC(NZROW) = I +!DVM$ ACTUAL (NZLOC(NZROW)) + NZV = NZV + 1 + V(NZV) = VECELT + IV(NZV) = I + ENDIF + GOTO 100 +110 CONTINUE +!DVM$ GET_ACTUAL (MARK,NZLOC) + DO II = 1,NZROW + I = NZLOC(II) + MARK(I) = 0 + ENDDO +!DVM$ ACTUAL (MARK) + RETURN + END + + +!-------end of sprnvc----------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + FUNCTION ICNVRT (X, IPWR2) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + DOUBLE PRECISION :: X + INTEGER :: IPWR2,ICNVRT + INTENT(IN) IPWR2,X + +!--------------------------------------------------------------------- +! scale a double precision number x in (0,1) by a power of 2 and chop it +!--------------------------------------------------------------------- + ICNVRT = INT (IPWR2 * X) + RETURN + END + + +!-------end of icnvrt----------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + SUBROUTINE VECSET (N, V, IV, NZV, I, VAL) + +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + IMPLICIT NONE + INTEGER :: N,IV(*),NZV,I,K + DOUBLE PRECISION :: V(*),VAL + +!--------------------------------------------------------------------- +! set ith element of sparse vector (v, iv) with +! nzv nonzeros to val +!--------------------------------------------------------------------- + LOGICAL :: SET + INTENT(INOUT) NZV,IV + INTENT(IN) VAL,I + INTENT(OUT) V + SET = .FALSE. +!DVM$ GET_ACTUAL (IV,V) + DO K = 1,NZV + IF (IV(K) .EQ. I) THEN + V(K) = VAL + SET = .TRUE. + ENDIF + ENDDO +!DVM$ ACTUAL (V) + IF (.NOT.(SET)) THEN + NZV = NZV + 1 + V(NZV) = VAL + IV(NZV) = I + ENDIF + RETURN + +!-------end of vecset----------------------------- + END + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/mpinpb.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/mpinpb.h new file mode 100644 index 0000000..1f0368c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/mpinpb.h @@ -0,0 +1,9 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'mpif.h' + + integer me, nprocs, root, dp_type + common /mpistuff/ me, nprocs, root, dp_type + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/npbparams.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/npbparams.h new file mode 100644 index 0000000..bfac73d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/npbparams.h @@ -0,0 +1,40 @@ +c NPROCS = 4 CLASS = D +c +c +c This file is generated automatically by the setparams utility. +c It sets the number of processors and the class of the NPB +c in this directory. Do not modify it by hand. +c + integer na, nonzer, niter + double precision shift, rcond + parameter( na=1500000, + > nonzer=21, + > niter=100, + > shift=500., + > rcond=1.0d-1 ) + +c number of nodes for which this version is compiled + integer nnodes_compiled + parameter( nnodes_compiled = 4) + integer num_proc_cols, num_proc_rows + parameter( num_proc_cols=2, num_proc_rows=2 ) + logical convertdouble + parameter (convertdouble = .false.) + character*11 compiletime + parameter (compiletime='23 Nov 2022') + character*5 npbversion + parameter (npbversion='3.3.1') + character*36 cs1 + parameter (cs1='mpiifort -qopenmp -O3 -mcmodel=large') + character*37 cs2 + parameter (cs2='mpiifort -qopenmp -O3 -mcmodel=large') + character*6 cs3 + parameter (cs3='(none)') + character*6 cs4 + parameter (cs4='(none)') + character*6 cs5 + parameter (cs5='(none)') + character*6 cs6 + parameter (cs6='(none)') + character*6 cs7 + parameter (cs7='randdp') diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/timing.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/timing.h new file mode 100644 index 0000000..2000af1 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/CG_dvmh/timing.h @@ -0,0 +1,5 @@ + integer t_total, t_conjg, t_rcomm, t_ncomm, t_last + parameter (t_total=1, t_conjg=2, t_rcomm=3, t_ncomm=4, t_last=4) + + logical timeron + common /timers/ timeron diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/Makefile new file mode 100644 index 0000000..fd0bd56 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/Makefile @@ -0,0 +1,23 @@ +SHELL=/bin/sh +BENCHMARK=ep +BENCHMARKU=EP + +include ../config/make_dvmh.def + +OBJS = ep.o ${COMMON}/print_results.o ${COMMON}/${RAND}.o ${COMMON}/timers.o + +include ../sys/make.common + +${PROGRAM}: config ${OBJS} + ${FLINK} ${FLINKFLAGS} -o ${PROGRAM}_dvmh ${OBJS} ${FMPI_LIB} + + +ep.o: ep.for mpinpb.h npbparams.h + ${FCOMPILE} ep.for + +clean: + - rm -f *.o *~ + - rm -f npbparams.h core + + + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/README b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/README new file mode 100644 index 0000000..6eb3657 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/README @@ -0,0 +1,6 @@ +This code implements the random-number generator described in the +NAS Parallel Benchmark document RNR Technical Report RNR-94-007. +The code is "embarrassingly" parallel in that no communication is +required for the generation of the random numbers itself. There is +no special requirement on the number of processors used for running +the benchmark. diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/ep.for b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/ep.for new file mode 100644 index 0000000..9c76689 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/ep.for @@ -0,0 +1,405 @@ + +! *** generated by SAPFOR with version 1756 and build date: Mar 23 2021 12:41:48 + +!-------------------------------------------------------------------------! +! ! +! N A S P A R A L L E L B E N C H M A R K S 3.3 ! +! ! +! E P ! +! ! +!-------------------------------------------------------------------------! +! ! +! This benchmark is part of the NAS Parallel Benchmark 3.3 suite. ! +! It is described in NAS Technical Reports 95-020 and 02-007 ! +! ! +! Permission to use, copy, distribute and modify this software ! +! for any purpose with or without fee is hereby granted. We ! +! request, however, that all derived work reference the NAS ! +! Parallel Benchmarks 3.3. This software is provided "as is" ! +! without express or implied warranty. ! +! ! +! Information on NPB 3.3, including the technical report, the ! +! original specifications, source code, results and information ! +! on how to submit new results, is available at: ! +! ! +! http://www.nas.nasa.gov/Software/NPB/ ! +! ! +! Send comments or suggestions to npb@nas.nasa.gov ! +! ! +! NAS Parallel Benchmarks Group ! +! NASA Ames Research Center ! +! Mail Stop: T27A-1 ! +! Moffett Field, CA 94035-1000 ! +! ! +! E-mail: npb@nas.nasa.gov ! +! Fax: (650) 604-3957 ! +! ! +!-------------------------------------------------------------------------! +!--------------------------------------------------------------------- +! +! Authors: P. O. Frederickson +! D. H. Bailey +! A. C. Woo +! R. F. Van der Wijngaart +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + program embar + +!--------------------------------------------------------------------- +! +! This is the MPI version of the APP Benchmark 1, +! the "embarassingly parallel" benchmark. +! +! +! M is the Log_2 of the number of complex pairs of uniform (0, 1) random +! numbers. MK is the Log_2 of the size of each batch of uniform random +! numbers. MK can be set for convenience on a given system, since it does +! not affect the results. +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- +!--------------------------------------------------------------------- + implicit none + + include 'mpinpb.h' + include 'npbparams.h' + double precision :: mops,epsilon,a,s,t1,t2,t3,t4,x,x1,x2,q,sx,sy, + &tm,an,tt,gc,dum(3),timer_read + double precision :: sx_verify_value,sy_verify_value,sx_err,sy_err + integer :: mk,mm,nn,nk,nq,np,ierr,node,no_nodes,i,ik,kk,l,k,nit,i + &errcode,no_large_nodes,np_add,k_offset,j + logical :: verified,timers_enabled + external randlc,timer_read + double precision :: randlc,qq + character*15 :: size + integer :: fstatus + integer :: t_total,t_gpairs,t_randn,t_rcomm,t_last + parameter (t_total = 1,t_gpairs = 2,t_randn = 3,t_rcomm = 4,t_last + & = 4) + double precision :: tsum(t_last + 2),t1m(t_last + 2),tming(t_last + & + 2),tmaxg(t_last + 2) + character :: t_recs(t_last + 2)*8 + parameter (mk = 16,mm = m - mk,nn = 2** mm,nk = 2** mk,nq = 10,eps + &ilon = 1.d-8,a = 1220703125.d0,s = 271828183.d0) + common /storage/x(2 * nk),q(0:nq - 1),qq(10000) + data dum /1.d0, 1.d0, 1.d0/ + data t_recs/'total', 'gpairs', 'randn', 'rcomm', ' totc + &omp', ' totcomm'/ + double precision :: r23_0,r23_1,r46_0,r46_1,t23_0,t23_1,t46_0,t46 + &_1 + parameter (r23_0 = 0.5d0** 23,t23_0 = 2.d0** 23,t23_1 = 2.d0** 23, + &r23_1 = 0.5d0** 23,r46_0 = r23_0** 2,t46_0 = t23_0** 2,t46_1 = t23 + &_1** 2,r46_1 = r23_1** 2) + double precision :: a1_0,a1_2,a2_0,a2_2,randlc_0,t1_0,t1_2,t2_0,t + &2_2,t3_0,t3_2,t4_0,t4_2,x1_0,x1_2,x2_0,x2_2,z_0,z_2,arg0 + integer :: arg_0,i_0 + intrinsic int + call mpi_init(ierr) + call mpi_comm_rank(mpi_comm_world,node,ierr) + call mpi_comm_size(mpi_comm_world,no_nodes,ierr) + root = 0 + if (.not.(convertdouble)) then + dp_type = mpi_double_precision + else + dp_type = mpi_real + endif + if (node .eq. root) then + +! Because the size of the problem is too large to store in a 32-bit +! integer for some classes, we put it into a string (for printing). +! Have to strip off the decimal point put in there by the floating +! point print statement (internal file) + write (unit = *,fmt = 1000) + write (unit = size,fmt = '(f15.0)') 2.d0** (m + 1) + j = 15 + if (size(j:j) .eq. '.') j = j - 1 + write (unit = *,fmt = 1001) size(1:j) + write (unit = *,fmt = 1003) no_nodes +1000 format(/,' NAS Parallel Benchmarks 3.3 -- EP Benchmark + &',/) +1001 format(' Number of random numbers generated: ', a1 + &5) +1003 format(' Number of active processes: ', 2x + &, i13, /) + open (unit = 2,file = 'timer.flag',status = 'old',iostat = fsta + &tus) + timers_enabled = .FALSE. + if (fstatus .eq. 0) then + timers_enabled = .TRUE. + close (unit = 2) + endif + endif + call mpi_bcast(timers_enabled,1,mpi_logical,root,mpi_comm_world,ie + &rr) + verified = .FALSE. + +! Compute the number of "batches" of random number pairs generated +! per processor. Adjust if the number of processors does not evenly +! divide the total number + np = nn / no_nodes + no_large_nodes = mod (nn,no_nodes) + if (node .lt. no_large_nodes) then + np_add = 1 + else + np_add = 0 + endif + np = np + np_add + if (np .eq. 0) then + write (unit = 6,fmt = 1) no_nodes,nn +1 format ('Too many nodes:',2i6) + ierrcode = 1 + call mpi_abort(mpi_comm_world,ierrcode,ierr) + stop + endif + +! Call the random number generator functions and initialize +! the x-array to reduce the effects of paging on the timings. +! Also, call all mathematical functions that are used. Make +! sure these initializations cannot be eliminated as dead code. +!DVM$ GET_ACTUAL (dum) + call vranlc(0,dum(1),dum(2),dum(3)) +!DVM$ ACTUAL (dum) + dum(1) = randlc (dum(2),dum(3)) +!DVM$ ACTUAL (dum) +!DVM$ REGION +!DVM$ PARALLEL (i), PRIVATE (i),TIE (x(i)) + do i = 1,2 * nk + x(i) = (-(1.d99)) + enddo +!DVM$ END REGION + mops = log (sqrt (abs (max (1.d0,1.d0)))) + +!--------------------------------------------------------------------- +! Synchronize before placing time stamp +!--------------------------------------------------------------------- + do i = 1,t_last + call timer_clear(i) + enddo + call mpi_barrier(mpi_comm_world,ierr) + call timer_start(1) + t1 = a + call vranlc(0,t1,a,x) + +! Compute AN = A ^ (2 * NK) (mod 2^46). + t1 = a + do i = 1,mk + 1 + t2 = randlc (t1,t1) + enddo + an = t1 + tt = s + gc = 0.d0 + sx = 0.d0 + sy = 0.d0 + do i = 0,nq - 1 + q(i) = 0.d0 + enddo + +! Each instance of this loop may be performed independently. We compute +! the k offsets separately to take into account the fact that some nodes +! have more numbers to generate than others + if (np_add .eq. 1) then + k_offset = node * np - 1 + else + k_offset = no_large_nodes * (np + 1) + (node - no_large_nodes) + &* np - 1 + endif +!DVM$ REGION +!DVM$ PARALLEL(k),private( kk, t1, t2, i, ik, t1_0,a1_0,a2_0,x1_0,x2_0, +!DVM$& t2_0, z_0, t3_0, t4_0, randlc_0, t3, arg_0, t1_2, a1_2, a2_2, +!DVM$& i_0, x1_2, x2_2, t2_2, z_2, t3_2, t4_2,x1,x2,arg0,t4,l), +!DVM$& reduction (sum(q),sum(sy),sum(sx)) + do k = 1,np + kk = k_offset + k + t1 = s + t2 = an + +! Find starting seed t1 for this kk. + do i = 1,100 + ik = kk / 2 + if (2 * ik .ne. kk) then + t1_0 = r23_0 * t2 + a1_0 = int (t1_0) + a2_0 = t2 - t23_0 * a1_0 + t1_0 = r23_0 * t1 + x1_0 = int (t1_0) + x2_0 = t1 - t23_0 * x1_0 + t1_0 = a1_0 * x2_0 + a2_0 * x1_0 + t2_0 = int (r23_0 * t1_0) + z_0 = t1_0 - t23_0 * t2_0 + t3_0 = t23_0 * z_0 + a2_0 * x2_0 + t4_0 = int (r46_0 * t3_0) + t1 = t3_0 - t46_0 * t4_0 + randlc_0 = r46_0 * t1 + t3 = randlc_0 + endif + if (ik .eq. 0) goto 130 + t1_0 = r23_0 * t2 + a1_0 = int (t1_0) + a2_0 = t2 - t23_0 * a1_0 + t1_0 = r23_0 * t2 + x1_0 = int (t1_0) + x2_0 = t2 - t23_0 * x1_0 + t1_0 = a1_0 * x2_0 + a2_0 * x1_0 + t2_0 = int (r23_0 * t1_0) + z_0 = t1_0 - t23_0 * t2_0 + t3_0 = t23_0 * z_0 + a2_0 * x2_0 + t4_0 = int (r46_0 * t3_0) + t2 = t3_0 - t46_0 * t4_0 + randlc_0 = r46_0 * t2 + t3 = randlc_0 + kk = ik + enddo + +! Compute uniform pseudorandom numbers. +130 continue + arg_0 = 2 * nk + t1_2 = r23_1 * a + a1_2 = int (t1_2) + a2_2 = a - t23_1 * a1_2 + do i_0 = 1,nk + t1_2 = r23_1 * t1 + x1_2 = int (t1_2) + x2_2 = t1 - t23_1 * x1_2 + t1_2 = a1_2 * x2_2 + a2_2 * x1_2 + t2_2 = int (r23_1 * t1_2) + z_2 = t1_2 - t23_1 * t2_2 + t3_2 = t23_1 * z_2 + a2_2 * x2_2 + t4_2 = int (r46_1 * t3_2) + t1 = t3_2 - t46_1 * t4_2 + x1 = r46_1 * t1 + t1_2 = r23_1 * t1 + x1_2 = int (t1_2) + x2_2 = t1 - t23_1 * x1_2 + t1_2 = a1_2 * x2_2 + a2_2 * x1_2 + t2_2 = int (r23_1 * t1_2) + z_2 = t1_2 - t23_1 * t2_2 + t3_2 = t23_1 * z_2 + a2_2 * x2_2 + t4_2 = int (r46_1 * t3_2) + t1 = t3_2 - t46_1 * t4_2 + x2 = r46_1 * t1 + +! x1 = 2.d0 * x(2 * i_0 - 1) - 1.d0 +! x2 = 2.d0 * x(2 * i_0) - 1.d0 + x1 = 2.d0 * x1 - 1.d0 + x2 = 2.d0 * x2 - 1.d0 + arg0 = x1** 2 + x2** 2 + if (arg0 .le. 1.d0) then + t2 = sqrt ((-(2.d0)) * log (arg0) / arg0) + t3 = x1 * t2 + t4 = x2 * t2 + l = max (abs (t3),abs (t4)) + q(l) = q(l) + 1.d0 + sx = sx + t3 + sy = sy + t4 + endif + enddo + +! if (timers_enabled) call timer_stop(t_gpairs) + enddo +!DVM$ END REGION + if (timers_enabled) call timer_start(t_rcomm) +!DVM$ GET_ACTUAL (x) + call mpi_allreduce(sx,x,1,dp_type,mpi_sum,mpi_comm_world,ierr) +!DVM$ ACTUAL (x) + sx = x(1) +!DVM$ GET_ACTUAL (x) + call mpi_allreduce(sy,x,1,dp_type,mpi_sum,mpi_comm_world,ierr) +!DVM$ ACTUAL (x) + sy = x(1) +!DVM$ GET_ACTUAL (x) + call mpi_allreduce(q,x,nq,dp_type,mpi_sum,mpi_comm_world,ierr) +!DVM$ ACTUAL (x) + if (timers_enabled) call timer_stop(t_rcomm) +!DVM$ REGION +!DVM$ PARALLEL (i), PRIVATE (i),TIE (x(i)) + do i = 1,nq + q(i - 1) = x(i) + enddo +!DVM$ END REGION + do i = 0,nq - 1 + gc = gc + q(i) + enddo + call timer_stop(1) + tm = timer_read (1) +!DVM$ GET_ACTUAL (x) + call mpi_allreduce(tm,x,1,dp_type,mpi_max,mpi_comm_world,ierr) +!DVM$ ACTUAL (x) + tm = x(1) + if (node .eq. root) then + nit = 0 + verified = .TRUE. + if (m .eq. 24) then + sx_verify_value = (-(3.247834652034740d+3)) + sy_verify_value = (-(6.958407078382297d+3)) + else if (m .eq. 25) then + sx_verify_value = (-(2.863319731645753d+3)) + sy_verify_value = (-(6.320053679109499d+3)) + else if (m .eq. 28) then + sx_verify_value = (-(4.295875165629892d+3)) + sy_verify_value = (-(1.580732573678431d+4)) + else if (m .eq. 30) then + sx_verify_value = 4.033815542441498d+4 + sy_verify_value = (-(2.660669192809235d+4)) + else if (m .eq. 32) then + sx_verify_value = 4.764367927995374d+4 + sy_verify_value = (-(8.084072988043731d+4)) + else if (m .eq. 36) then + sx_verify_value = 1.982481200946593d+5 + sy_verify_value = (-(1.020596636361769d+5)) + else if (m .eq. 40) then + sx_verify_value = (-(5.319717441530d+05)) + sy_verify_value = (-(3.688834557731d+05)) + else + verified = .FALSE. + endif + if (verified) then + sx_err = abs ((sx - sx_verify_value) / sx_verify_value) + sy_err = abs ((sy - sy_verify_value) / sy_verify_value) + verified = sx_err .le. epsilon .and. sy_err .le. epsilon + endif + mops = 2.d0** (m + 1) / tm / 1000000.d0 + write (unit = 6,fmt = 11) tm,m,gc,sx,sy,(i,q(i), i = 0,nq - 1) +11 format ('EP Benchmark Results:'//'CPU Time =',f10.4 + &/'N = 2^', i5/'No. Gaussian Pairs =',f15.0/'Sums = ',1p, + &2d25.15/ 'Counts:'/(i3,0p,f15.0)) + call print_results('EP',class,32 + 1,0,0,nit,npm,no_nodes,tm,mo + &ps,'Random numbers generated',verified,npbversion,compiletime,cs1, + &cs2,cs3,cs4,cs5,cs6,cs7) + endif + if (.not.(timers_enabled)) goto 999 +!DVM$ GET_ACTUAL (t1m) + do i = 1,t_last + t1m(i) = timer_read (i) + enddo +!DVM$ ACTUAL (t1m) + t1m(t_last + 2) = t1m(t_rcomm) +!DVM$ ACTUAL (t1m(t_last + 2)) + t1m(t_last + 1) = t1m(t_total) - t1m(t_last + 2) +!DVM$ ACTUAL (t1m(t_last + 1)) + call mpi_reduce(t1m,tsum,4 + 2,dp_type,mpi_sum,0,mpi_comm_world,ie + &rr) +!DVM$ GET_ACTUAL (t1m) + call mpi_reduce(t1m,tming,4 + 2,dp_type,mpi_min,0,mpi_comm_world,i + &err) +!DVM$ GET_ACTUAL (t1m) + call mpi_reduce(t1m,tmaxg,4 + 2,dp_type,mpi_max,0,mpi_comm_world,i + &err) + if (node .eq. 0) then + write (unit = *,fmt = 800) no_nodes +!DVM$ GET_ACTUAL (t_recs,tmaxg,tming,tsum) + do i = 1,t_last + 2 + tsum(i) = tsum(i) / no_nodes + write (unit = *,fmt = 810) i,t_recs(i),tming(i),tmaxg(i),tsu + &m(i) + enddo +!DVM$ ACTUAL (tsum) + endif +800 format(' nprocs =', i6, 11x, 'minimum', 5x, 'maximum', 5x, + &'average') +810 format(' timer ', i2, '(', A8, ') :', 3(2x,f10.4)) +999 continue + call mpi_finalize(ierr) + end + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/mpinpb.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/mpinpb.h new file mode 100644 index 0000000..1f13637 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/mpinpb.h @@ -0,0 +1,9 @@ + +c--------------------------------------------------------------------- +c--------------------------------------------------------------------- + + include 'mpif.h' + + integer me, nprocs, root, dp_type + common /mpistuff/ me, nprocs, root, dp_type + diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/npbparams.h b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/npbparams.h new file mode 100644 index 0000000..9770fe3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/EP_dvmh/npbparams.h @@ -0,0 +1,31 @@ +c NPROCS = 4 CLASS = D +c +c +c This file is generated automatically by the setparams utility. +c It sets the number of processors and the class of the NPB +c in this directory. Do not modify it by hand. +c + character class + parameter (class ='D') + integer m, npm + parameter (m=36, npm=4) + logical convertdouble + parameter (convertdouble = .false.) + character*11 compiletime + parameter (compiletime='23 Nov 2022') + character*5 npbversion + parameter (npbversion='3.3.1') + character*36 cs1 + parameter (cs1='mpiifort -qopenmp -O3 -mcmodel=large') + character*37 cs2 + parameter (cs2='mpiifort -qopenmp -O3 -mcmodel=large') + character*6 cs3 + parameter (cs3='(none)') + character*6 cs4 + parameter (cs4='(none)') + character*6 cs5 + parameter (cs5='(none)') + character*6 cs6 + parameter (cs6='(none)') + character*6 cs7 + parameter (cs7='randdp') diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/clear.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/clear.bat new file mode 100644 index 0000000..13594b8 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/clear.bat @@ -0,0 +1,21 @@ +@echo off + +@set TESTS=bt sp lu mg ep cg ft +@set CLASSES=A B C + +if exist err.txt del err.txt +if exist bin rmdir /S /Q bin + +@for %%T in (%TESTS%) do ( + cd %%T + if exist comp.err del comp.err + if exist dvm.err del dvm.err + if exist *.f del *.f + if exist *.cu del *.cu + if exist *info.c del *info.c + @for %%C in (%CLASSES%) do ( + if exist err_%%C.txt del err_%%C.txt + if exist out_%%C.txt del out_%%C.txt + ) + cd ../ +) diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compile.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compile.bat new file mode 100644 index 0000000..65c6572 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compile.bat @@ -0,0 +1,13 @@ +@echo off + +@set TESTS=BT SP LU MG EP CG FT + +@CALL config\make.def.bat + +if not exist bin mkdir bin +cd sys +if not exist setparams.exe CALL %DVM% cc setparams +cd ../ +@for %%T in (%TESTS%) do ( + START compileTest.bat %%T +) \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compile.sh b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compile.sh new file mode 100644 index 0000000..4434f82 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compile.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +TESTS="BT SP LU MG EP CG FT" +CLASSES="A B C" + +compile_one() { + cd $1 + make CLASS=$2 + cd .. +} + +mkdir -p bin + +export FOPT="$*" +for tn in $TESTS; do + for cn in $CLASSES; do + compile_one $tn $cn + done +done + +exit 0 diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compileTest.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compileTest.bat new file mode 100644 index 0000000..5db07de --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/compileTest.bat @@ -0,0 +1,10 @@ +@echo off +@set CLASSES=A B C +@set Test=%1 + @for %%C in (%CLASSES%) do ( + cd %Test% + echo ### compiling test %Test%, class %%C. + CALL make.bat %%C + cd ../ + ) +exit \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/config/make_dvmh.def b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/config/make_dvmh.def new file mode 100644 index 0000000..905457b --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/config/make_dvmh.def @@ -0,0 +1,8 @@ +F77 = dvm f -shared-dvm +FLINK = dvm flink -shared-dvm + +FFLAGS = ${FOPT} + +UCC = cc + +BINDIR = ../bin diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/config/make_dvmh.def.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/config/make_dvmh.def.bat new file mode 100644 index 0000000..15c8592 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/config/make_dvmh.def.bat @@ -0,0 +1,8 @@ +rem @echo off +rem ### SET DVM PATH### +set DVMDIR= + +set DVM=%DVMDIR%\dvm +set F77=%DVMDIR%\dvm f +set RUN=%DVMDIR%\dvm run +set BIN=..\bin \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/run.bat b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/run.bat new file mode 100644 index 0000000..137802c --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/run.bat @@ -0,0 +1,15 @@ +@echo off + +@set TESTS=bt sp lu mg ep cg ft +@set CLASSES=A B C + +@CALL config\make.def.bat + +if exist res.txt del res.txt +cd bin +@for %%T in (%TESTS%) do ( + @for %%C in (%CLASSES%) do ( + CALL %RUN% %%T.%%C.x.exe 1>>..\res.txt 2>>..\err.txt + ) +) +cd ../ \ No newline at end of file diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/run.sh b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/run.sh new file mode 100644 index 0000000..e820404 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/run.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +TESTS="bt sp lu mg ep cg ft" +CLASSES="A B C" + +ALL_OK=1 + +run_one() { + if [ -f "$1" ]; then + dvm run $PROC_GRID $1 + ALL_OK=$(( ALL_OK && $? == 0 )) + else + ALL_OK=0 + fi +} + +cd bin + +for tn in $TESTS; do + for cn in $CLASSES; do + run_one $tn.$cn.x + done +done + +if [ $ALL_OK -ne 0 ]; then + echo " END OF NPB Benchmarks" +fi + +exit 0 diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/Makefile b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/Makefile new file mode 100644 index 0000000..9fd8e5f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/Makefile @@ -0,0 +1,14 @@ +include ../config/make.def + +all: setparams + +# setparams creates an npbparam.h file for each benchmark +# configuration. npbparams.h also contains info about how a benchmark +# was compiled and linked + +setparams: setparams.c ../config/make.def + $(UCC) -o setparams setparams.c + +clean: + -rm -f setparams setparams.h npbparams.h + -rm -f *~ *.o diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/make.common b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/make.common new file mode 100644 index 0000000..959951d --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/make.common @@ -0,0 +1,31 @@ +PROGRAM = $(BINDIR)/$(BENCHMARK).$(CLASS).x + +# Class "U" is used internally by the setparams program to mean +# "unknown". This means that if you don't specify CLASS= +# on the command line, you'll get an error. It would be nice +# to be able to avoid this, but we'd have to get information +# from the setparams back to the make program, which isn't easy. +CLASS=U + +default:: ${PROGRAM} + +# This makes sure the configuration utility setparams +# is up to date. +# Note that this must be run every time, which is why the +# target does not exist and is not created. +# If you create a file called "config" you will break things. +config: + @cd ../sys; ${MAKE} all + ../sys/setparams ${BENCHMARK} ${CLASS} + +# Normally setparams updates npbparams.h only if the settings (CLASS) +# have changed. However, we also want to update if the compile options +# may have changed (set in ../config/make.def). +npbparams.h: ../config/make.def + @ echo make.def modified. Rebuilding npbparams.h just in case + rm -f npbparams.h + ../sys/setparams ${BENCHMARK} ${CLASS} + +# So that "make benchmark-name" works +${BENCHMARK}: default +${BENCHMARKU}: default diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/setparams.c b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/setparams.c new file mode 100644 index 0000000..63d2442 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/MPI+FDVMH.fdv/sys/setparams.c @@ -0,0 +1,1224 @@ +/* + * This utility configures a NPB to be built for a specific number + * of nodes and a specific class. It creates a file "npbparams.h" + * in the source directory. This file keeps state information about + * which size of benchmark is currently being built (so that nothing + * if unnecessarily rebuilt) and defines (through PARAMETER statements) + * the number of nodes and class for which a benchmark is being built. + + * The utility takes 3 arguments: + * setparams benchmark-name nprocs class + * benchmark-name is "sp", "bt", etc + * nprocs is the number of processors to run on + * class is the size of the benchmark + * These parameters are checked for the current benchmark. If they + * are invalid, this program prints a message and aborts. + * If the parameters are ok, the current npbsize.h (actually just + * the first line) is read in. If the new parameters are the same as + * the old, nothing is done, but an exit code is returned to force the + * user to specify (otherwise the make procedure succeeds but builds a + * binary of the wrong name). Otherwise the file is rewritten. + * Errors write a message (to stdout) and abort. + * + * This program makes use of two extra benchmark "classes" + * class "X" means an invalid specification. It is returned if + * there is an error parsing the config file. + * class "U" is an external specification meaning "unknown class" + * + * Unfortunately everything has to be case sensitive. This is + * because we can always convert lower to upper or v.v. but + * can't feed this information back to the makefile, so typing + * make CLASS=a and make CLASS=A will produce different binaries. + * + * + */ + +#include +#include +#include +#include +#include +#include + +/* + * This is the master version number for this set of + * NPB benchmarks. It is in an obscure place so people + * won't accidentally change it. + */ + +#define VERSION "3.3.1" + +/* controls verbose output from setparams */ +/* #define VERBOSE */ + +#define FILENAME "npbparams.h" +#define DESC_LINE "c NPROCS = %d CLASS = %c\n" +#define BT_DESC_LINE "c NPROCS = %d CLASS = %c SUBTYPE = %s\n" +#define DEF_CLASS_LINE "#define CLASS '%c'\n" +#define DEF_NUM_PROCS_LINE "#define NUM_PROCS %d\n" +#define FINDENT " " +#define CONTINUE " > " + +#ifdef FORTRAN_REC_SIZE +int fortran_rec_size = FORTRAN_REC_SIZE; +#else +int fortran_rec_size = 4; +#endif + +void get_info(int argc, char *argv[], int *typep, int *nprocsp, char *classp, + int* subtypep); +void check_info(int type, int nprocs, char class); +void read_info(int type, int *nprocsp, char *classp, int *subtypep); +void write_info(int type, int nprocs, char class, int subtype); +void write_sp_info(FILE *fp, int nprocs, char class); +void write_bt_info(FILE *fp, int nprocs, char class, int io); +void write_lu_info(FILE *fp, int nprocs, char class); +void write_mg_info(FILE *fp, int nprocs, char class); +void write_cg_info(FILE *fp, int nprocs, char class); +void write_ft_info(FILE *fp, int nprocs, char class); +void write_ep_info(FILE *fp, int nprocs, char class); +void write_is_info(FILE *fp, int nprocs, char class); +void write_dt_info(FILE *fp, int nprocs, char class); +void write_compiler_info(int type, FILE *fp); +void write_convertdouble_info(int type, FILE *fp); +void check_line(char *line, char *label, char *val); +int check_include_line(char *line, char *filename); +void put_string(FILE *fp, char *name, char *val); +void put_def_string(FILE *fp, char *name, char *val); +void put_def_variable(FILE *fp, char *name, char *val); +int isqrt(int i); +int ilog2(int i); +int ipow2(int i); +int isqrt2(int i); + +enum benchmark_types {SP, BT, LU, MG, FT, IS, DT, EP, CG}; +enum iotypes { NONE = 0, FULL, SIMPLE, EPIO, FORTRAN}; + +int main(int argc, char *argv[]) +{ + int nprocs, nprocs_old, type; + char class, class_old; + int subtype = -1, old_subtype = -1; + + /* Get command line arguments. Make sure they're ok. */ + get_info(argc, argv, &type, &nprocs, &class, &subtype); + if (class != 'U') { +#ifdef VERBOSE + printf("setparams: For benchmark %s: number of processors = %d class = %c\n", + argv[1], nprocs, class); +#endif + check_info(type, nprocs, class); + } + + /* Get old information. */ + read_info(type, &nprocs_old, &class_old, &old_subtype); + if (class != 'U') { + if (class_old != 'X') { +#ifdef VERBOSE + printf("setparams: old settings: number of processors = %d class = %c\n", + nprocs_old, class_old); +#endif + } + } else { + printf("setparams:\n\ + *********************************************************************\n\ + * You must specify NPROCS and CLASS to build this benchmark *\n\ + * For example, to build a class A benchmark for 4 processors, type *\n\ + * make {benchmark-name} NPROCS=4 CLASS=A *\n\ + *********************************************************************\n\n"); + + if (class_old != 'X') { +#ifdef VERBOSE + printf("setparams: Previous settings were CLASS=%c NPROCS=%d\n", + class_old, nprocs_old); +#endif + } + exit(1); /* exit on class==U */ + } + + /* Write out new information if it's different. */ + if (nprocs != nprocs_old || class != class_old || subtype != old_subtype) { +#ifdef VERBOSE + printf("setparams: Writing %s\n", FILENAME); +#endif + write_info(type, nprocs, class, subtype); + } else { +#ifdef VERBOSE + printf("setparams: Settings unchanged. %s unmodified\n", FILENAME); +#endif + } + + return 0; +} + + +/* + * get_info(): Get parameters from command line + */ + +void get_info(int argc, char *argv[], int *typep, int *nprocsp, char *classp, + int *subtypep) +{ + + if (argc < 4) { + printf("Usage: %s (%d) benchmark-name nprocs class\n", argv[0], argc); + exit(1); + } + + *nprocsp = atoi(argv[2]); + + *classp = *argv[3]; + + if (!strcmp(argv[1], "sp") || !strcmp(argv[1], "SP")) *typep = SP; + else if (!strcmp(argv[1], "ft") || !strcmp(argv[1], "FT")) *typep = FT; + else if (!strcmp(argv[1], "lu") || !strcmp(argv[1], "LU")) *typep = LU; + else if (!strcmp(argv[1], "mg") || !strcmp(argv[1], "MG")) *typep = MG; + else if (!strcmp(argv[1], "is") || !strcmp(argv[1], "IS")) *typep = IS; + else if (!strcmp(argv[1], "dt") || !strcmp(argv[1], "DT")) *typep = DT; + else if (!strcmp(argv[1], "ep") || !strcmp(argv[1], "EP")) *typep = EP; + else if (!strcmp(argv[1], "cg") || !strcmp(argv[1], "CG")) *typep = CG; + else if (!strcmp(argv[1], "bt") || !strcmp(argv[1], "BT")) { + *typep = BT; + if (argc != 5) { + /* printf("Usage: %s (%d) benchmark-name nprocs class\n", argv[0], argc); */ + /* exit(1); */ + *subtypep = NONE; + } else { + if (!strcmp(argv[4], "full") || !strcmp(argv[4], "FULL")) { + *subtypep = FULL; + } else if (!strcmp(argv[4], "simple") || !strcmp(argv[4], "SIMPLE")) { + *subtypep = SIMPLE; + } else if (!strcmp(argv[4], "epio") || !strcmp(argv[4], "EPIO")) { + *subtypep = EPIO; + } else if (!strcmp(argv[4], "fortran") || !strcmp(argv[4], "FORTRAN")) { + *subtypep = FORTRAN; + } else if (!strcmp(argv[4], "none") || !strcmp(argv[4], "NONE")) { + *subtypep = NONE; + } else { + printf("setparams: Error: unknown btio type %s\n", argv[4]); + exit(1); + } + } + } else { + printf("setparams: Error: unknown benchmark type %s\n", argv[1]); + exit(1); + } +} + +/* + * check_info(): Make sure command line data is ok for this benchmark + */ + +void check_info(int type, int nprocs, char class) +{ + int rootprocs, logprocs; + + /* check number of processors */ + if (nprocs <= 0) { + printf("setparams: Number of processors must be greater than zero\n"); + exit(1); + } + switch(type) { + + case SP: + case BT: + rootprocs = isqrt(nprocs); + if (rootprocs < 0) { + printf("setparams: Number of processors %d must be a square (1,4,9,...) for this benchmark", + nprocs); + exit(1); + } + if (class == 'S' && nprocs > 16) { + printf("setparams: BT and SP sample sizes cannot be run on more\n"); + printf(" than 16 processors because the cell size would be too small.\n"); + exit(1); + } + break; + + case LU: + rootprocs = isqrt2(nprocs); + if (rootprocs < 0) { + printf("setparams: Failed to determine proc_grid for nprocs=%d\n", + nprocs); + exit(1); + } + break; + + case CG: + case FT: + case MG: + case IS: + logprocs = ilog2(nprocs); + if (logprocs < 0) { + printf("setparams: Number of processors must be a power of two (1,2,4,...) for this benchmark\n"); + exit(1); + } + + break; + + case EP: + case DT: + break; + + default: + /* never should have gotten this far with a bad name */ + printf("setparams: (Internal Error) Benchmark type %d unknown to this program\n", type); + exit(1); + } + + /* check class */ + if (class != 'S' && + class != 'W' && + class != 'A' && + class != 'B' && + class != 'C' && + class != 'D' && + class != 'E') { + printf("setparams: Unknown benchmark class %c\n", class); + printf("setparams: Allowed classes are \"S\", \"W\", and \"A\" through \"E\"\n"); + exit(1); + } + + if (class == 'E' && (type == IS || type == DT)) { + printf("setparams: Benchmark class %c not defined for IS or DT\n", class); + exit(1); + } + + if (class == 'D' && type == IS && nprocs < 4) { + printf("setparams: IS class D size cannot be run on less than 4 processors\n"); + exit(1); + } +} + + +/* + * read_info(): Read previous information from file. + * Not an error if file doesn't exist, because this + * may be the first time we're running. + * Assumes the first line of the file is in a special + * format that we understand (since we wrote it). + */ + +void read_info(int type, int *nprocsp, char *classp, int *subtypep) +{ + int nread = 0; + FILE *fp; + fp = fopen(FILENAME, "r"); + if (fp == NULL) { +#ifdef VERBOSE + printf("setparams: INFO: configuration file %s does not exist (yet)\n", FILENAME); +#endif + goto abort; + } + + /* first line of file contains info (fortran), first two lines (C) */ + + switch(type) { + case BT: { + char subtype_str[100]; + nread = fscanf(fp, BT_DESC_LINE, nprocsp, classp, subtype_str); + if (nread != 3) { + if (nread != 2) { + printf("setparams: Error parsing config file %s. Ignoring previous settings\n", FILENAME); + goto abort; + } + *subtypep = 0; + break; + } + if (!strcmp(subtype_str, "full") || !strcmp(subtype_str, "FULL")) { + *subtypep = FULL; + } else if (!strcmp(subtype_str, "simple") || + !strcmp(subtype_str, "SIMPLE")) { + *subtypep = SIMPLE; + } else if (!strcmp(subtype_str, "epio") || !strcmp(subtype_str, "EPIO")) { + *subtypep = EPIO; + } else if (!strcmp(subtype_str, "fortran") || + !strcmp(subtype_str, "FORTRAN")) { + *subtypep = FORTRAN; + } else { + *subtypep = -1; + } + break; + } + + case SP: + case FT: + case MG: + case LU: + case EP: + case CG: + nread = fscanf(fp, DESC_LINE, nprocsp, classp); + if (nread != 2) { + printf("setparams: Error parsing config file %s. Ignoring previous settings\n", FILENAME); + goto abort; + } + break; + case IS: + case DT: + nread = fscanf(fp, DEF_CLASS_LINE, classp); + nread += fscanf(fp, DEF_NUM_PROCS_LINE, nprocsp); + if (nread != 2) { + printf("setparams: Error parsing config file %s. Ignoring previous settings\n", FILENAME); + goto abort; + } + break; + default: + /* never should have gotten this far with a bad name */ + printf("setparams: (Internal Error) Benchmark type %d unknown to this program\n", type); + exit(1); + } + + fclose(fp); + + + return; + + abort: + *nprocsp = -1; + *classp = 'X'; + *subtypep = -1; + return; +} + + +/* + * write_info(): Write new information to config file. + * First line is in a special format so we can read + * it in again. Then comes a warning. The rest is all + * specific to a particular benchmark. + */ + +void write_info(int type, int nprocs, char class, int subtype) +{ + FILE *fp; + char *BT_TYPES[] = {"NONE", "FULL", "SIMPLE", "EPIO", "FORTRAN"}; + + fp = fopen(FILENAME, "w"); + if (fp == NULL) { + printf("setparams: Can't open file %s for writing\n", FILENAME); + exit(1); + } + + switch(type) { + case BT: + /* Write out the header */ + if (subtype == -1 || subtype == 0) { + fprintf(fp, DESC_LINE, nprocs, class); + } else { + fprintf(fp, BT_DESC_LINE, nprocs, class, BT_TYPES[subtype]); + } + /* Print out a warning so bozos don't mess with the file */ + fprintf(fp, "\ +c \n\ +c \n\ +c This file is generated automatically by the setparams utility.\n\ +c It sets the number of processors and the class of the NPB\n\ +c in this directory. Do not modify it by hand.\n\ +c \n"); + + break; + + case SP: + case FT: + case MG: + case LU: + case EP: + case CG: + /* Write out the header */ + fprintf(fp, DESC_LINE, nprocs, class); + /* Print out a warning so bozos don't mess with the file */ + fprintf(fp, "\ +c \n\ +c \n\ +c This file is generated automatically by the setparams utility.\n\ +c It sets the number of processors and the class of the NPB\n\ +c in this directory. Do not modify it by hand.\n\ +c \n"); + + break; + case IS: + case DT: + fprintf(fp, DEF_CLASS_LINE, class); + fprintf(fp, DEF_NUM_PROCS_LINE, nprocs); + fprintf(fp, "\ +/*\n\ + This file is generated automatically by the setparams utility.\n\ + It sets the number of processors and the class of the NPB\n\ + in this directory. Do not modify it by hand. */\n\ + \n"); + break; + default: + printf("setparams: (Internal error): Unknown benchmark type %d\n", + type); + exit(1); + } + + /* Now do benchmark-specific stuff */ + switch(type) { + case SP: + write_sp_info(fp, nprocs, class); + break; + case LU: + write_lu_info(fp, nprocs, class); + break; + case MG: + write_mg_info(fp, nprocs, class); + break; + case IS: + write_is_info(fp, nprocs, class); + break; + case DT: + write_dt_info(fp, nprocs, class); + break; + case FT: + write_ft_info(fp, nprocs, class); + break; + case EP: + write_ep_info(fp, nprocs, class); + break; + case CG: + write_cg_info(fp, nprocs, class); + break; + case BT: + write_bt_info(fp, nprocs, class, subtype); + break; + default: + printf("setparams: (Internal error): Unknown benchmark type %d\n", type); + exit(1); + } + write_convertdouble_info(type, fp); + write_compiler_info(type, fp); + fclose(fp); + return; +} + + +/* + * write_sp_info(): Write SP specific info to config file + */ + +void write_sp_info(FILE *fp, int nprocs, char class) +{ + int maxcells, problem_size, niter; + char *dt; + maxcells = isqrt(nprocs); + if (class == 'S') { problem_size = 12; dt = "0.015d0"; niter = 100; } + else if (class == 'W') { problem_size = 36; dt = "0.0015d0"; niter = 400; } + else if (class == 'A') { problem_size = 64; dt = "0.0015d0"; niter = 400; } + else if (class == 'B') { problem_size = 102; dt = "0.001d0"; niter = 400; } + else if (class == 'C') { problem_size = 162; dt = "0.00067d0"; niter = 400; } + else if (class == 'D') { problem_size = 408; dt = "0.00030d0"; niter = 500; } + else if (class == 'E') { problem_size = 1020; dt = "0.0001d0"; niter = 500; } + else { + printf("setparams: Internal error: invalid class %c\n", class); + exit(1); + } + fprintf(fp, "%sinteger maxcells, problem_size, niter_default\n", FINDENT); + fprintf(fp, "%sparameter (maxcells=%d, problem_size=%d, niter_default=%d)\n", + FINDENT, maxcells, problem_size, niter); + fprintf(fp, "%sdouble precision dt_default\n", FINDENT); + fprintf(fp, "%sparameter (dt_default = %s)\n", FINDENT, dt); +} + +/* + * write_bt_info(): Write BT specific info to config file + */ + +void write_bt_info(FILE *fp, int nprocs, char class, int io) +{ + int maxcells, problem_size, niter, wr_interval; + char *dt; + maxcells = isqrt(nprocs); + if (class == 'S') { problem_size = 12; dt = "0.010d0"; niter = 60; } + else if (class == 'W') { problem_size = 24; dt = "0.0008d0"; niter = 200; } + else if (class == 'A') { problem_size = 64; dt = "0.0008d0"; niter = 200; } + else if (class == 'B') { problem_size = 102; dt = "0.0003d0"; niter = 200; } + else if (class == 'C') { problem_size = 162; dt = "0.0001d0"; niter = 200; } + else if (class == 'D') { problem_size = 408; dt = "0.00002d0"; niter = 250; } + else if (class == 'E') { problem_size = 1020; dt = "0.4d-5"; niter = 250; } + else { + printf("setparams: Internal error: invalid class %c\n", class); + exit(1); + } + wr_interval = 5; + fprintf(fp, "%sinteger maxcells, problem_size, niter_default\n", FINDENT); + fprintf(fp, "%sparameter (maxcells=%d, problem_size=%d, niter_default=%d)\n", + FINDENT, maxcells, problem_size, niter); + fprintf(fp, "%sdouble precision dt_default\n", FINDENT); + fprintf(fp, "%sparameter (dt_default = %s)\n", FINDENT, dt); + fprintf(fp, "%sinteger wr_default\n", FINDENT); + fprintf(fp, "%sparameter (wr_default = %d)\n", FINDENT, wr_interval); + fprintf(fp, "%sinteger iotype\n", FINDENT); + fprintf(fp, "%sparameter (iotype = %d)\n", FINDENT, io); + if (io) { + fprintf(fp, "%scharacter*(*) filenm\n", FINDENT); + switch (io) { + case FULL: + fprintf(fp, "%sparameter (filenm = 'btio.full.out')\n", FINDENT); + break; + case SIMPLE: + fprintf(fp, "%sparameter (filenm = 'btio.simple.out')\n", FINDENT); + break; + case EPIO: + fprintf(fp, "%sparameter (filenm = 'btio.epio.out')\n", FINDENT); + break; + case FORTRAN: + fprintf(fp, "%sparameter (filenm = 'btio.fortran.out')\n", FINDENT); + fprintf(fp, "%sinteger fortran_rec_sz\n", FINDENT); + fprintf(fp, "%sparameter (fortran_rec_sz = %d)\n", + FINDENT, fortran_rec_size); + break; + default: + break; + } + } +} + + + +/* + * write_lu_info(): Write SP specific info to config file + */ + +void write_lu_info(FILE *fp, int nprocs, char class) +{ + int isiz1, isiz2, itmax, inorm, problem_size; + int xdiv, ydiv; /* number of cells in x and y direction */ + char *dt_default; + + if (class == 'S') { problem_size = 12; dt_default = "0.5d0"; itmax = 50; } + else if (class == 'W') { problem_size = 33; dt_default = "1.5d-3"; itmax = 300; } + else if (class == 'A') { problem_size = 64; dt_default = "2.0d0"; itmax = 250; } + else if (class == 'B') { problem_size = 102; dt_default = "2.0d0"; itmax = 250; } + else if (class == 'C') { problem_size = 162; dt_default = "2.0d0"; itmax = 250; } + else if (class == 'D') { problem_size = 408; dt_default = "1.0d0"; itmax = 300; } + else if (class == 'E') { problem_size = 1020; dt_default = "0.5d0"; itmax = 300; } + else { + printf("setparams: Internal error: invalid class %c\n", class); + exit(1); + } + inorm = itmax; + xdiv = isqrt2(nprocs); + ydiv = nprocs/xdiv; + isiz1 = problem_size/xdiv; if (isiz1*xdiv < problem_size) isiz1++; + isiz2 = problem_size/ydiv; if (isiz2*ydiv < problem_size) isiz2++; + + + fprintf(fp, "\nc number of nodes for which this version is compiled\n"); + fprintf(fp, "%sinteger nnodes_compiled, nnodes_xdim\n", FINDENT); + fprintf(fp, "%sparameter (nnodes_compiled=%d, nnodes_xdim=%d)\n", + FINDENT, nprocs, xdiv); + + fprintf(fp, "\nc full problem size\n"); + fprintf(fp, "%sinteger isiz01, isiz02, isiz03\n", FINDENT); + fprintf(fp, "%sparameter (isiz01=%d, isiz02=%d, isiz03=%d)\n", + FINDENT, problem_size, problem_size, problem_size); + + fprintf(fp, "\nc sub-domain array size\n"); + fprintf(fp, "%sinteger isiz1, isiz2, isiz3\n", FINDENT); + fprintf(fp, "%sparameter (isiz1=%d, isiz2=%d, isiz3=isiz03)\n", + FINDENT, isiz1, isiz2); + + fprintf(fp, "\nc number of iterations and how often to print the norm\n"); + fprintf(fp, "%sinteger itmax_default, inorm_default\n", FINDENT); + fprintf(fp, "%sparameter (itmax_default=%d, inorm_default=%d)\n", + FINDENT, itmax, inorm); + + fprintf(fp, "%sdouble precision dt_default\n", FINDENT); + fprintf(fp, "%sparameter (dt_default = %s)\n", FINDENT, dt_default); + +} + +/* + * write_mg_info(): Write MG specific info to config file + */ + +void write_mg_info(FILE *fp, int nprocs, char class) +{ + int problem_size, nit, log2_size, log2_nprocs, lt_default, lm; + int ndim1, ndim2, ndim3; + if (class == 'S') { problem_size = 32; nit = 4; } + else if (class == 'W') { problem_size = 128; nit = 4; } + else if (class == 'A') { problem_size = 256; nit = 4; } + else if (class == 'B') { problem_size = 256; nit = 20; } + else if (class == 'C') { problem_size = 512; nit = 20; } + else if (class == 'D') { problem_size = 1024; nit = 50; } + else if (class == 'E') { problem_size = 2048; nit = 50; } + else { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + log2_size = ilog2(problem_size); + log2_nprocs = ilog2(nprocs); + /* lt is log of largest total dimension */ + lt_default = log2_size; + /* log of log of maximum dimension on a node */ + lm = log2_size - log2_nprocs/3; + ndim1 = lm; + ndim3 = log2_size - (log2_nprocs+2)/3; + ndim2 = log2_size - (log2_nprocs+1)/3; + + fprintf(fp, "%sinteger nprocs_compiled\n", FINDENT); + fprintf(fp, "%sparameter (nprocs_compiled = %d)\n", FINDENT, nprocs); + fprintf(fp, "%sinteger nx_default, ny_default, nz_default\n", FINDENT); + fprintf(fp, "%sparameter (nx_default=%d, ny_default=%d, nz_default=%d)\n", + FINDENT, problem_size, problem_size, problem_size); + fprintf(fp, "%sinteger nit_default, lm, lt_default\n", FINDENT); + fprintf(fp, "%sparameter (nit_default=%d, lm = %d, lt_default=%d)\n", + FINDENT, nit, lm, lt_default); + fprintf(fp, "%sinteger debug_default\n", FINDENT); + fprintf(fp, "%sparameter (debug_default=%d)\n", FINDENT, 0); + fprintf(fp, "%sinteger ndim1, ndim2, ndim3\n", FINDENT); + fprintf(fp, "%sparameter (ndim1 = %d, ndim2 = %d, ndim3 = %d)\n", + FINDENT, ndim1, ndim2, ndim3); +} + + +/* + * write_dt_info(): Write DT specific info to config file + */ + +void write_dt_info(FILE *fp, int nprocs, char class) +{ + int num_samples,deviation,num_sources; + if (class == 'S') { num_samples=1728; deviation=128; num_sources=4; } + else if (class == 'W') { num_samples=1728*8; deviation=128*2; num_sources=4*2; } + else if (class == 'A') { num_samples=1728*64; deviation=128*4; num_sources=4*4; } + else if (class == 'B') { num_samples=1728*512; deviation=128*8; num_sources=4*8; } + else if (class == 'C') { num_samples=1728*4096; deviation=128*16; num_sources=4*16; } + else if (class == 'D') { num_samples=1728*4096*8; deviation=128*32; num_sources=4*32; } + else { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + fprintf(fp, "#define NUM_SAMPLES %d\n", num_samples); + fprintf(fp, "#define STD_DEVIATION %d\n", deviation); + fprintf(fp, "#define NUM_SOURCES %d\n", num_sources); +} + +/* + * write_is_info(): Write IS specific info to config file + */ + +void write_is_info(FILE *fp, int nprocs, char class) +{ + if( class != 'S' && + class != 'W' && + class != 'A' && + class != 'B' && + class != 'C' && + class != 'D' ) + { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } +} + +/* + * write_cg_info(): Write CG specific info to config file + */ + +void write_cg_info(FILE *fp, int nprocs, char class) +{ + int na,nonzer,niter; + char *shift,*rcond="1.0d-1"; + char *shiftS="10.", + *shiftW="12.", + *shiftA="20.", + *shiftB="60.", + *shiftC="110.", + *shiftD="500.", + *shiftE="1.5d3"; + + int num_proc_cols, num_proc_rows; + + + if( class == 'S' ) + { na=1400; nonzer=7; niter=15; shift=shiftS; } + else if( class == 'W' ) + { na=7000; nonzer=8; niter=15; shift=shiftW; } + else if( class == 'A' ) + { na=14000; nonzer=11; niter=15; shift=shiftA; } + else if( class == 'B' ) + { na=75000; nonzer=13; niter=75; shift=shiftB; } + else if( class == 'C' ) + { na=150000; nonzer=15; niter=75; shift=shiftC; } + else if( class == 'D' ) + { na=1500000; nonzer=21; niter=100; shift=shiftD; } + else if( class == 'E' ) + { na=9000000; nonzer=26; niter=100; shift=shiftE; } + else + { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + fprintf( fp, "%sinteger na, nonzer, niter\n", FINDENT ); + fprintf( fp, "%sdouble precision shift, rcond\n", FINDENT ); + fprintf( fp, "%sparameter( na=%d,\n", FINDENT, na ); + fprintf( fp, "%s nonzer=%d,\n", CONTINUE, nonzer ); + fprintf( fp, "%s niter=%d,\n", CONTINUE, niter ); + fprintf( fp, "%s shift=%s,\n", CONTINUE, shift ); + fprintf( fp, "%s rcond=%s )\n", CONTINUE, rcond ); + + + num_proc_cols = num_proc_rows = ilog2(nprocs)/2; + if (num_proc_cols+num_proc_rows != ilog2(nprocs)) num_proc_cols += 1; + num_proc_cols = ipow2(num_proc_cols); num_proc_rows = ipow2(num_proc_rows); + + fprintf( fp, "\nc number of nodes for which this version is compiled\n" ); + fprintf( fp, "%sinteger nnodes_compiled\n", FINDENT ); + fprintf( fp, "%sparameter( nnodes_compiled = %d)\n", FINDENT, nprocs ); + fprintf( fp, "%sinteger num_proc_cols, num_proc_rows\n", FINDENT ); + fprintf( fp, "%sparameter( num_proc_cols=%d, num_proc_rows=%d )\n", + FINDENT, + num_proc_cols, + num_proc_rows ); +} + + +/* + * write_ft_info(): Write FT specific info to config file + */ + +void write_ft_info(FILE *fp, int nprocs, char class) +{ + /* easiest way (given the way the benchmark is written) + * is to specify log of number of grid points in each + * direction m1, m2, m3. nt is the number of iterations + */ + int nx, ny, nz, maxdim, niter; + if (class == 'S') { nx = 64; ny = 64; nz = 64; niter = 6;} + else if (class == 'W') { nx = 128; ny = 128; nz = 32; niter = 6;} + else if (class == 'A') { nx = 256; ny = 256; nz = 128; niter = 6;} + else if (class == 'B') { nx = 512; ny = 256; nz = 256; niter =20;} + else if (class == 'C') { nx = 512; ny = 512; nz = 512; niter =20;} + else if (class == 'D') { nx = 2048; ny = 1024; nz = 1024; niter =25;} + else if (class == 'E') { nx = 4096; ny = 2048; nz = 2048; niter =25;} + else { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + maxdim = nx; + if (ny > maxdim) maxdim = ny; + if (nz > maxdim) maxdim = nz; + fprintf(fp, "%sinteger nx, ny, nz, maxdim, niter_default, ntdivnp, np_min\n", FINDENT); + fprintf(fp, "%sparameter (nx=%d, ny=%d, nz=%d, maxdim=%d)\n", + FINDENT, nx, ny, nz, maxdim); + fprintf(fp, "%sparameter (niter_default=%d)\n", FINDENT, niter); + fprintf(fp, "%sparameter (np_min = %d)\n", FINDENT, nprocs); + fprintf(fp, "%sparameter (ntdivnp=((nx*ny)/np_min)*nz)\n", FINDENT); + fprintf(fp, "%sdouble precision ntotal_f\n", FINDENT); + fprintf(fp, "%sparameter (ntotal_f=1.d0*nx*ny*nz)\n", FINDENT); +} + +/* + * write_ep_info(): Write EP specific info to config file + */ + +void write_ep_info(FILE *fp, int nprocs, char class) +{ + /* easiest way (given the way the benchmark is written) + * is to specify log of number of grid points in each + * direction m1, m2, m3. nt is the number of iterations + */ + int m; + if (class == 'S') { m = 24; } + else if (class == 'W') { m = 25; } + else if (class == 'A') { m = 28; } + else if (class == 'B') { m = 30; } + else if (class == 'C') { m = 32; } + else if (class == 'D') { m = 36; } + else if (class == 'E') { m = 40; } + else { + printf("setparams: Internal error: invalid class type %c\n", class); + exit(1); + } + /* number of processors given by "npm" */ + + + fprintf(fp, "%scharacter class\n",FINDENT); + fprintf(fp, "%sparameter (class =\'%c\')\n", + FINDENT, class); + fprintf(fp, "%sinteger m, npm\n", FINDENT); + fprintf(fp, "%sparameter (m=%d, npm=%d)\n", + FINDENT, m, nprocs); +} + + +/* + * This is a gross hack to allow the benchmarks to + * print out how they were compiled. Various other ways + * of doing this have been tried and they all fail on + * some machine - due to a broken "make" program, or + * F77 limitations, of whatever. Hopefully this will + * always work because it uses very portable C. Unfortunately + * it relies on parsing the make.def file - YUK. + * If your machine doesn't have or , happy hacking! + * + */ + +#define VERBOSE +#define LL 400 +#include +#define DEFFILE "../config/make.def" +#define DEFAULT_MESSAGE "(none)" +FILE *deffile; +void write_compiler_info(int type, FILE *fp) +{ + char line[LL]; + char mpif77[LL], flink[LL], fmpi_lib[LL], fmpi_inc[LL], fflags[LL], flinkflags[LL]; + char compiletime[LL], randfile[LL]; + char mpicc[LL], cflags[LL], clink[LL], clinkflags[LL], + cmpi_lib[LL], cmpi_inc[LL]; + struct tm *tmp; + time_t t; + deffile = fopen(DEFFILE, "r"); + if (deffile == NULL) { + printf("\n\ +setparams: File %s doesn't exist. To build the NAS benchmarks\n\ + you need to create is according to the instructions\n\ + in the README in the main directory and comments in \n\ + the file config/make.def.template\n", DEFFILE); + exit(1); + } + strcpy(mpif77, DEFAULT_MESSAGE); + strcpy(flink, DEFAULT_MESSAGE); + strcpy(fmpi_lib, DEFAULT_MESSAGE); + strcpy(fmpi_inc, DEFAULT_MESSAGE); + strcpy(fflags, DEFAULT_MESSAGE); + strcpy(flinkflags, DEFAULT_MESSAGE); + strcpy(randfile, DEFAULT_MESSAGE); + strcpy(mpicc, DEFAULT_MESSAGE); + strcpy(cflags, DEFAULT_MESSAGE); + strcpy(clink, DEFAULT_MESSAGE); + strcpy(clinkflags, DEFAULT_MESSAGE); + strcpy(cmpi_lib, DEFAULT_MESSAGE); + strcpy(cmpi_inc, DEFAULT_MESSAGE); + + while (fgets(line, LL, deffile) != NULL) { + if (*line == '#') continue; + /* yes, this is inefficient. but it's simple! */ + check_line(line, "MPIF77", mpif77); + check_line(line, "FLINK", flink); + check_line(line, "FMPI_LIB", fmpi_lib); + check_line(line, "FMPI_INC", fmpi_inc); + check_line(line, "FFLAGS", fflags); + check_line(line, "FLINKFLAGS", flinkflags); + check_line(line, "RAND", randfile); + check_line(line, "MPICC", mpicc); + check_line(line, "CFLAGS", cflags); + check_line(line, "CLINK", clink); + check_line(line, "CLINKFLAGS", clinkflags); + check_line(line, "CMPI_LIB", cmpi_lib); + check_line(line, "CMPI_INC", cmpi_inc); + /* if the dummy library is used by including make.dummy, we set the + Fortran and C paths to libraries and headers accordingly */ + if(check_include_line(line, "../config/make.dummy")) { + strcpy(fmpi_lib, "-L../MPI_dummy -lmpi"); + strcpy(fmpi_inc, "-I../MPI_dummy"); + strcpy(cmpi_lib, "-L../MPI_dummy -lmpi"); + strcpy(cmpi_inc, "-I../MPI_dummy"); + } + } + + + (void) time(&t); + tmp = localtime(&t); + (void) strftime(compiletime, (size_t)LL, "%d %b %Y", tmp); + + + switch(type) { + case FT: + case SP: + case BT: + case MG: + case LU: + case EP: + case CG: + put_string(fp, "compiletime", compiletime); + put_string(fp, "npbversion", VERSION); + put_string(fp, "cs1", mpif77); + put_string(fp, "cs2", flink); + put_string(fp, "cs3", fmpi_lib); + put_string(fp, "cs4", fmpi_inc); + put_string(fp, "cs5", fflags); + put_string(fp, "cs6", flinkflags); + put_string(fp, "cs7", randfile); + break; + case IS: + case DT: + put_def_string(fp, "COMPILETIME", compiletime); + put_def_string(fp, "NPBVERSION", VERSION); + put_def_string(fp, "MPICC", mpicc); + put_def_string(fp, "CFLAGS", cflags); + put_def_string(fp, "CLINK", clink); + put_def_string(fp, "CLINKFLAGS", clinkflags); + put_def_string(fp, "CMPI_LIB", cmpi_lib); + put_def_string(fp, "CMPI_INC", cmpi_inc); + break; + default: + printf("setparams: (Internal error): Unknown benchmark type %d\n", + type); + exit(1); + } + +} + +void check_line(char *line, char *label, char *val) +{ + char *original_line; + int n; + original_line = line; + /* compare beginning of line and label */ + while (*label != '\0' && *line == *label) { + line++; label++; + } + /* if *label is not EOS, we must have had a mismatch */ + if (*label != '\0') return; + /* if *line is not a space, actual label is longer than test label */ + if (!isspace(*line) && *line != '=') return ; + /* skip over white space */ + while (isspace(*line)) line++; + /* next char should be '=' */ + if (*line != '=') return; + /* skip over white space */ + while (isspace(*++line)); + /* if EOS, nothing was specified */ + if (*line == '\0') return; + /* finally we've come to the value */ + strcpy(val, line); + /* chop off the newline at the end */ + n = strlen(val)-1; + if (n >= 0 && val[n] == '\n') + val[n--] = '\0'; + if (n >= 0 && val[n] == '\r') + val[n--] = '\0'; + /* treat continuation */ + while (val[n] == '\\' && fgets(original_line, LL, deffile)) { + line = original_line; + while (isspace(*line)) line++; + if (isspace(*original_line)) val[n++] = ' '; + while (*line && *line != '\n' && *line != '\r' && n < LL-1) + val[n++] = *line++; + val[n] = '\0'; + n--; + } +/* if (val[strlen(val) - 1] == '\\') { + printf("\n\ +setparams: Error in file make.def. Because of the way in which\n\ + command line arguments are incorporated into the\n\ + executable benchmark, you can't have any continued\n\ + lines in the file make.def, that is, lines ending\n\ + with the character \"\\\". Although it may be ugly, \n\ + you should be able to reformat without continuation\n\ + lines. The offending line is\n\ + %s\n", original_line); + exit(1); + } */ +} + +int check_include_line(char *line, char *filename) +{ + char *include_string = "include"; + /* compare beginning of line and "include" */ + while (*include_string != '\0' && *line == *include_string) { + line++; include_string++; + } + /* if *include_string is not EOS, we must have had a mismatch */ + if (*include_string != '\0') return(0); + /* if *line is not a space, first word is not "include" */ + if (!isspace(*line)) return(0); + /* skip over white space */ + while (isspace(*++line)); + /* if EOS, nothing was specified */ + if (*line == '\0') return(0); + /* next keyword should be name of include file in *filename */ + while (*filename != '\0' && *line == *filename) { + line++; filename++; + } + if (*filename != '\0' || + (*line != ' ' && *line != '\0' && *line !='\n')) return(0); + else return(1); +} + + +#define MAXL 46 +void put_string(FILE *fp, char *name, char *val) +{ + int len; + len = strlen(val); + if (len > MAXL) { + val[MAXL] = '\0'; + val[MAXL-1] = '.'; + val[MAXL-2] = '.'; + val[MAXL-3] = '.'; + len = MAXL; + } + fprintf(fp, "%scharacter*%d %s\n", FINDENT, len, name); + fprintf(fp, "%sparameter (%s=\'%s\')\n", FINDENT, name, val); +} + +/* need to escape quote (") in val */ +int fix_string_quote(char *val, char *newval, int maxl) +{ + int len; + int i, j; + len = strlen(val); + i = j = 0; + while (i < len && j < maxl) { + if (val[i] == '"') + newval[j++] = '\\'; + if (j < maxl) + newval[j++] = val[i++]; + } + newval[j] = '\0'; + return j; +} + +/* NOTE: is the ... stuff necessary in C? */ +void put_def_string(FILE *fp, char *name, char *val0) +{ + int len; + char val[MAXL+3]; + len = fix_string_quote(val0, val, MAXL+2); + if (len > MAXL) { + val[MAXL] = '\0'; + val[MAXL-1] = '.'; + val[MAXL-2] = '.'; + val[MAXL-3] = '.'; + len = MAXL; + } + fprintf(fp, "#define %s \"%s\"\n", name, val); +} + +void put_def_variable(FILE *fp, char *name, char *val) +{ + int len; + len = strlen(val); + if (len > MAXL) { + val[MAXL] = '\0'; + val[MAXL-1] = '.'; + val[MAXL-2] = '.'; + val[MAXL-3] = '.'; + len = MAXL; + } + fprintf(fp, "#define %s %s\n", name, val); +} + + + +#if 0 + +/* this version allows arbitrarily long lines but + * some compilers don't like that and they're rarely + * useful + */ + +#define LINELEN 65 +void put_string(FILE *fp, char *name, char *val) +{ + int len, nlines, pos, i; + char line[100]; + len = strlen(val); + nlines = len/LINELEN; + if (nlines*LINELEN < len) nlines++; + fprintf(fp, "%scharacter*%d %s\n", FINDENT, nlines*LINELEN, name); + fprintf(fp, "%sparameter (%s = \n", FINDENT, name); + for (i = 0; i < nlines; i++) { + pos = i*LINELEN; + if (i == 0) fprintf(fp, "%s\'", CONTINUE); + else fprintf(fp, "%s", CONTINUE); + /* number should be same as LINELEN */ + fprintf(fp, "%.65s", val+pos); + if (i == nlines-1) fprintf(fp, "\')\n"); + else fprintf(fp, "\n"); + } +} + +#endif + + +/* integer square root. Return error if argument isn't + * a perfect square or is less than or equal to zero + */ + +int isqrt(int i) +{ + int root, square; + if (i <= 0) return(-1); + square = 0; + for (root = 1; square <= i; root++) { + square = root*root; + if (square == i) return(root); + } + return(-1); +} + +int isqrt2(int i) +{ + int xdim, ydim, square; + if (i <= 0) return(-1); + square = 0; + for (xdim = 1; square <= i; xdim++) { + square = xdim*xdim; + if (square == i) return(xdim); + } + ydim = i / (--xdim); + while (xdim*ydim != i && 2*ydim >= xdim) { + xdim++; + ydim = i / xdim; + } + if (xdim*ydim == i && 2*ydim >= xdim) + return(xdim); + return(-1); +} + + +/* integer log base two. Return error is argument isn't + * a power of two or is less than or equal to zero + */ + +int ilog2(int i) +{ + int log2; + int exp2 = 1; + if (i <= 0) return(-1); + + for (log2 = 0; log2 < 30; log2++) { + if (exp2 == i) return(log2); + if (exp2 > i) break; + exp2 *= 2; + } + return(-1); +} + +int ipow2(int i) +{ + int pow2 = 1; + if (i < 0) return(-1); + if (i == 0) return(1); + while(i--) pow2 *= 2; + return(pow2); +} + + + +void write_convertdouble_info(int type, FILE *fp) +{ + switch(type) { + case SP: + case BT: + case LU: + case FT: + case MG: + case EP: + case CG: + fprintf(fp, "%slogical convertdouble\n", FINDENT); +#ifdef CONVERTDOUBLE + fprintf(fp, "%sparameter (convertdouble = .true.)\n", FINDENT); +#else + fprintf(fp, "%sparameter (convertdouble = .false.)\n", FINDENT); +#endif + break; + } +} diff --git a/dvm/tools/tester/trunk/test-suite/Performance/NPB/settings b/dvm/tools/tester/trunk/test-suite/Performance/NPB/settings new file mode 100644 index 0000000..67727d3 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/NPB/settings @@ -0,0 +1,4 @@ +DIMENSION_COUNT=3 +MAX_PROC_COUNT=1 +GPU_ONLY=1 +MAX_TIME=600 # In seconds diff --git a/dvm/tools/tester/trunk/test-suite/Performance/adi3d.cdv b/dvm/tools/tester/trunk/test-suite/Performance/adi3d.cdv new file mode 100644 index 0000000..50748f2 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/adi3d.cdv @@ -0,0 +1,100 @@ +/* ADI program */ + +#include +#include +#include + +#define Max(a, b) ((a) > (b) ? (a) : (b)) + +#define nx 384 +#define ny 384 +#define nz 384 + +#pragma dvm inherit(a) +void init(double (*a)[ny][nz]); + +int main(int argc, char *argv[]) +{ + double maxeps, eps; + #pragma dvm array distribute[block][block][block] + double (*a)[ny][nz]; + int it, itmax, i, j, k; + double startt, endt; + maxeps = 0.01; + itmax = 100; + a = (double (*)[ny][nz])malloc(nx * ny * nz * sizeof(double)); + init(a); + +#ifdef _DVMH + dvmh_barrier(); + startt = dvmh_wtime(); +#else + startt = 0; +#endif + for (it = 1; it <= itmax; it++) + { + eps = 0; + #pragma dvm actual(eps) + #pragma dvm region + { + #pragma dvm parallel([i][j][k] on a[i][j][k]) across(a[1:1][0:0][0:0]) + for (i = 1; i < nx - 1; i++) + for (j = 1; j < ny - 1; j++) + for (k = 1; k < nz - 1; k++) + a[i][j][k] = (a[i-1][j][k] + a[i+1][j][k]) / 2; + #pragma dvm parallel([i][j][k] on a[i][j][k]) across(a[0:0][1:1][0:0]) + for (i = 1; i < nx - 1; i++) + for (j = 1; j < ny - 1; j++) + for (k = 1; k < nz - 1; k++) + a[i][j][k] = (a[i][j-1][k] + a[i][j+1][k]) / 2; + #pragma dvm parallel([i][j][k] on a[i][j][k]) across(a[0:0][0:0][1:1]), reduction(max(eps)) + for (i = 1; i < nx - 1; i++) + for (j = 1; j < ny - 1; j++) + for (k = 1; k < nz - 1; k++) + { + double tmp1 = (a[i][j][k-1] + a[i][j][k+1]) / 2; + double tmp2 = fabs(a[i][j][k] - tmp1); + eps = Max(eps, tmp2); + a[i][j][k] = tmp1; + } + } + #pragma dvm get_actual(eps) + printf(" IT = %4i EPS = %14.7E\n", it, eps); + if (eps < maxeps) + break; + } +#ifdef _DVMH + dvmh_barrier(); + endt = dvmh_wtime(); +#else + endt = 0; +#endif + free(a); + + printf(" ADI Benchmark Completed.\n"); + printf(" Size = %4d x %4d x %4d\n", nx, ny, nz); + printf(" Iterations = %12d\n", itmax); + printf(" Time in seconds = %12.2lf\n", endt - startt); + printf(" Operation type = double precision\n"); + printf(" Verification = %12s\n", (fabs(eps - 0.07249074) < 1e-6 ? "SUCCESSFUL" : "UNSUCCESSFUL")); + + printf(" END OF ADI Benchmark\n"); + return 0; +} + +#pragma dvm inherit(a) +void init(double (*a)[ny][nz]) +{ + int i, j, k; + #pragma dvm region out(a) + { + #pragma dvm parallel([i][j][k] on a[i][j][k]) + for (i = 0; i < nx; i++) + for (j = 0; j < ny; j++) + for (k = 0; k < nz; k++) + if (k == 0 || k == nz - 1 || j == 0 || j == ny - 1 || i == 0 || i == nx - 1) + a[i][j][k] = 10.0 * i / (nx - 1) + 10.0 * j / (ny - 1) + 10.0 * k / (nz - 1); + else + a[i][j][k] = 0; + } +} diff --git a/dvm/tools/tester/trunk/test-suite/Performance/adi3d.fdv b/dvm/tools/tester/trunk/test-suite/Performance/adi3d.fdv new file mode 100644 index 0000000..2d0d87f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/adi3d.fdv @@ -0,0 +1,88 @@ + program adi + integer nx, ny, nz, itmax + double precision eps, relax, maxeps + double precision startt, endt, dvtime + parameter(nx=384, ny=384, nz=384, maxeps=0.01, itmax=100) + double precision a(nx, ny, nz) +!DVM$ DISTRIBUTE(BLOCK, BLOCK, BLOCK) :: a + call init(a, nx, ny, nz) +!DVM$ BARRIER + startt = dvtime() + do it = 1, itmax + eps=0.D0 +!DVM$ ACTUAL(eps) +!DVM$ REGION +!DVM$ PARALLEL(k, j, i) ON a(i, j, k), ACROSS(a(1:1, 0:0, 0:0)) + do k = 2, nz - 1 + do j = 2, ny - 1 + do i = 2, nx - 1 + a(i, j, k) = (a(i-1, j, k) + a(i+1, j, k)) / 2 + enddo + enddo + enddo +!DVM$ PARALLEL(k, j, i) ON a(i, j, k), ACROSS(a(0:0, 1:1, 0:0)) + do k = 2, nz - 1 + do j = 2, ny - 1 + do i = 2, nx - 1 + a(i, j, k) = (a(i, j-1, k) + a(i, j+1, k)) / 2 + enddo + enddo + enddo +!DVM$ PARALLEL(k, j, i) ON a(i, j, k), ACROSS(a(0:0, 0:0, 1:1)) +!DVM$>, REDUCTION(MAX(eps)) + do k = 2, nz - 1 + do j = 2, ny - 1 + do i = 2, nx - 1 + eps = max(eps, abs(a(i, j, k) - + > (a(i,j,k-1) + a(i,j,k+1)) / 2)) + a(i, j, k) = (a(i, j, k-1) + a(i, j, k+1)) / 2 + enddo + enddo + enddo +!DVM$ END REGION +!DVM$ GET_ACTUAL(eps) + print 200, it, eps +200 format (' IT = ', i4, ' EPS = ', e14.7) + if (eps .lt. maxeps) exit + enddo +!DVM$ BARRIER + endt = dvtime() + + print *, 'ADI Benchmark Completed.' + print 201, nx, ny, nz +201 format (' Size = ', i4, ' x ', i4, ' x ', i4) + print 202, itmax +202 format (' Iterations = ', i12) + print 203, endt - startt +203 format (' Time in seconds = ', f12.2) + print *, 'Operation type = double precision' + if (abs(eps - 0.07249074) .lt. 1.0e-6) then + print *, 'Verification = SUCCESSFUL' + else + print *, 'Verification = UNSUCCESSFUL' + endif + + print *, 'END OF ADI Benchmark' + end + + subroutine init(a, nx, ny, nz) + double precision a(nx, ny, nz) +!DVM$ INHERIT a + integer nx, ny, nz +!DVM$ REGION OUT(a) +!DVM$ PARALLEL(k, j, i) ON a(i, j, k) + do k = 1, nz + do j = 1, ny + do i = 1, nx + if(k.eq.1 .or. k.eq.nz .or. j.eq.1 .or. j.eq.ny .or. + > i.eq.1 .or. i.eq.nx) then + a(i, j, k) = 10.*(i-1)/(nx-1) + 10.*(j-1)/(ny-1) + > + 10.*(k-1)/(nz-1) + else + a(i, j, k) = 0.D0 + endif + enddo + enddo + enddo +!DVM$ END REGION + end diff --git a/dvm/tools/tester/trunk/test-suite/Performance/d_sor2d.fdv b/dvm/tools/tester/trunk/test-suite/Performance/d_sor2d.fdv new file mode 100644 index 0000000..fdeda52 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/d_sor2d.fdv @@ -0,0 +1,65 @@ + PROGRAM SOR2D_double + PARAMETER (L=8000, ITMAX=100) + DOUBLE PRECISION EPS, MAXEPS, A(L, L), W, S + DOUBLE PRECISION STARTT, ENDT, dvtime +!DVM$ DISTRIBUTE(BLOCK, BLOCK) :: A + + MAXEPS = 0.5 + W = 0.5 +!DVM$ REGION +!DVM$ PARALLEL(J, I) ON A(I, J), CUDA_BLOCK(32, 8) +! nest of two parallel loops, iteration (i, j) will be executed on +! processor, which is owner of element A(i, j) + DO J = 1, L + DO I = 1, L + IF (I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L ) THEN + A(I, J) = 0. + ELSE + A(I, J) = (1. + I + J) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ BARRIER + STARTT = dvtime() + DO IT = 1, ITMAX + EPS = 0. +!DVM$ ACTUAL(EPS) +!DVM$ REGION + +!DVM$ PARALLEL (J, I) ON A(I, J), ACROSS(A(1:1,1:1)), +!DVM$& REDUCTION(MAX(EPS)), PRIVATE(S) + DO J = 2, L - 1 + DO I = 2, L - 1 + S = A(I, J) + A(I, J) = (W / 6. ) * + > (A(I, J-1) + A(I-1, J) + A(I+1, J) + A(I, J+1)) + > + (1 - W) * A(I, J) + EPS = MAX(EPS, ABS(S - A(I, J))) + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ GET_ACTUAL(EPS) + PRINT 200, IT, EPS +200 FORMAT (' IT = ', I4, ' EPS = ', E23.16) + IF (EPS .LT. MAXEPS) EXIT + ENDDO +!DVM$ BARRIER + ENDT = dvtime() + + PRINT *, 'SOR2D_double Benchmark Completed.' + PRINT 201, L, L +201 FORMAT (' Size = ', I6, ' x ', I6) + PRINT 202, ITMAX +202 FORMAT (' Iterations = ', I12) + PRINT 203, ENDT - STARTT +203 FORMAT (' Time in seconds = ', F12.2) + PRINT *, 'Operation type = floating point' + IF (ABS(EPS - 0.424766850334810d0) .LT. 1.0E-7) THEN + PRINT *, 'Verification = SUCCESSFUL' + ELSE + PRINT *, 'Verification = UNSUCCESSFUL' + ENDIF + + PRINT *, 'END OF SOR2D_double Benchmark' + END diff --git a/dvm/tools/tester/trunk/test-suite/Performance/d_sor3d.fdv b/dvm/tools/tester/trunk/test-suite/Performance/d_sor3d.fdv new file mode 100644 index 0000000..8ae7646 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/d_sor3d.fdv @@ -0,0 +1,71 @@ + PROGRAM SOR3D_double + PARAMETER (L=384, ITMAX=100) + DOUBLE PRECISION EPS, MAXEPS, A(L, L, L), W, S + DOUBLE PRECISION STARTT, ENDT, dvtime +!DVM$ DISTRIBUTE(BLOCK, BLOCK, BLOCK) :: A + + MAXEPS = 0.5 + W = 0.5 +!DVM$ REGION +!DVM$ PARALLEL(K, J, I) ON A(I, J, K), CUDA_BLOCK(32, 8) +! nest of two parallel loops, iteration (i, j) will be executed on +! processor, which is owner of element A(i, j) + DO K = 1, L + DO J = 1, L + DO I = 1, L + IF (I.EQ.1 .OR. J.EQ.1 .OR. K.EQ.1 + >.OR. I.EQ.L .OR. J.EQ.L .OR. K.EQ.L) THEN + A(I, J, K) = 0. + ELSE + A(I, J, K) = (1. + I + J + K) + ENDIF + ENDDO + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ BARRIER + STARTT = dvtime() + DO IT = 1, ITMAX + EPS = 0. +!DVM$ ACTUAL(EPS) +!DVM$ REGION + +!DVM$ PARALLEL (K, J, I) ON A(I, J, K), ACROSS(A(1:1,1:1,1:1)), +!DVM$& REDUCTION(MAX(EPS)), PRIVATE(S) + DO K = 2, L - 1 + DO J = 2, L - 1 + DO I = 2, L - 1 + S = A(I, J, K) + A(I, J, K) = (W / 6. ) * (A(I, J, K-1) + A(I, J-1, K) + + > A(I-1, J, K) + A(I+1, J, K) + + > A(I, J+1, K) + A(I, J, K+1))+ + > + (1 - W) * A(I, J, K) + EPS = MAX(EPS, ABS(S - A(I, J, K))) + ENDDO + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ GET_ACTUAL(EPS) + PRINT 200, IT, EPS +200 FORMAT (' IT = ', I4, ' EPS = ', E23.16) + IF (EPS .LT. MAXEPS) EXIT + ENDDO +!DVM$ BARRIER + ENDT = dvtime() + + PRINT *, 'SOR3D_double Benchmark Completed.' + PRINT 201, L, L, L +201 FORMAT (' Size = ', I4, ' x ', I4, ' x ', I4) + PRINT 202, ITMAX +202 FORMAT (' Iterations = ', I12) + PRINT 203, ENDT - STARTT +203 FORMAT (' Time in seconds = ', F12.2) + PRINT *, 'Operation type = floating point' + IF (ABS(EPS - 5.134125088529458d0) .LT. 1.0d-7) THEN + PRINT *, 'Verification = SUCCESSFUL' + ELSE + PRINT *, 'Verification = UNSUCCESSFUL' + ENDIF + + PRINT *, 'END OF SOR3D_double Benchmark' + END diff --git a/dvm/tools/tester/trunk/test-suite/Performance/f_sor2d.fdv b/dvm/tools/tester/trunk/test-suite/Performance/f_sor2d.fdv new file mode 100644 index 0000000..179dace --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/f_sor2d.fdv @@ -0,0 +1,65 @@ + PROGRAM SOR2D_float + PARAMETER (L=8000, ITMAX=100) + REAL EPS, MAXEPS, A(L, L), W, S + DOUBLE PRECISION STARTT, ENDT, dvtime +!DVM$ DISTRIBUTE(BLOCK, BLOCK) :: A + + MAXEPS = 0.5 + W = 0.5 +!DVM$ REGION +!DVM$ PARALLEL(J, I) ON A(I, J), CUDA_BLOCK(32, 8) +! nest of two parallel loops, iteration (i, j) will be executed on +! processor, which is owner of element A(i, j) + DO J = 1, L + DO I = 1, L + IF (I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L ) THEN + A(I, J) = 0. + ELSE + A(I, J) = (1. + I + J) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ BARRIER + STARTT = dvtime() + DO IT = 1, ITMAX + EPS = 0. +!DVM$ ACTUAL(EPS) +!DVM$ REGION + +!DVM$ PARALLEL (J, I) ON A(I, J), ACROSS(A(1:1,1:1)), +!DVM$& REDUCTION(MAX(EPS)), PRIVATE(S) + DO J = 2, L - 1 + DO I = 2, L - 1 + S = A(I, J) + A(I, J) = (W / 6. ) * + > (A(I, J-1) + A(I-1, J) + A(I+1, J) + A(I, J+1)) + > + (1 - W) * A(I, J) + EPS = MAX(EPS, ABS(S - A(I, J))) + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ GET_ACTUAL(EPS) + PRINT 200, IT, EPS +200 FORMAT (' IT = ', I4, ' EPS = ', E14.7) + IF (EPS .LT. MAXEPS) EXIT + ENDDO +!DVM$ BARRIER + ENDT = dvtime() + + PRINT *, 'SOR2D_float Benchmark Completed.' + PRINT 201, L, L +201 FORMAT (' Size = ', I6, ' x ', I6) + PRINT 202, ITMAX +202 FORMAT (' Iterations = ', I12) + PRINT 203, ENDT - STARTT +203 FORMAT (' Time in seconds = ', F12.2) + PRINT *, 'Operation type = floating point' + IF (ABS(EPS - 0.4247670) .LT. 1.0E-4) THEN + PRINT *, 'Verification = SUCCESSFUL' + ELSE + PRINT *, 'Verification = UNSUCCESSFUL' + ENDIF + + PRINT *, 'END OF SOR2D_float Benchmark' + END diff --git a/dvm/tools/tester/trunk/test-suite/Performance/f_sor3d.fdv b/dvm/tools/tester/trunk/test-suite/Performance/f_sor3d.fdv new file mode 100644 index 0000000..56efb63 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/f_sor3d.fdv @@ -0,0 +1,71 @@ + PROGRAM SOR3D_float + PARAMETER (L=384, ITMAX=100) + REAL EPS, MAXEPS, A(L, L, L), W, S + DOUBLE PRECISION STARTT, ENDT, dvtime +!DVM$ DISTRIBUTE(BLOCK, BLOCK, BLOCK) :: A + + MAXEPS = 0.5 + W = 0.5 +!DVM$ REGION +!DVM$ PARALLEL(K, J, I) ON A(I, J, K), CUDA_BLOCK(32, 8) +! nest of two parallel loops, iteration (i, j) will be executed on +! processor, which is owner of element A(i, j) + DO K = 1, L + DO J = 1, L + DO I = 1, L + IF (I.EQ.1 .OR. J.EQ.1 .OR. K.EQ.1 + >.OR. I.EQ.L .OR. J.EQ.L .OR. K.EQ.L) THEN + A(I, J, K) = 0. + ELSE + A(I, J, K) = (1. + I + J + K) + ENDIF + ENDDO + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ BARRIER + STARTT = dvtime() + DO IT = 1, ITMAX + EPS = 0. +!DVM$ ACTUAL(EPS) +!DVM$ REGION + +!DVM$ PARALLEL (K, J, I) ON A(I, J, K), ACROSS(A(1:1,1:1,1:1)), +!DVM$& REDUCTION(MAX(EPS)), PRIVATE(S) + DO K = 2, L - 1 + DO J = 2, L - 1 + DO I = 2, L - 1 + S = A(I, J, K) + A(I, J, K) = (W / 6. ) * (A(I, J, K-1) + A(I, J-1, K) + + > A(I-1, J, K) + A(I+1, J, K) + + > A(I, J+1, K) + A(I, J, K+1))+ + > + (1 - W) * A(I, J, K) + EPS = MAX(EPS, ABS(S - A(I, J, K))) + ENDDO + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ GET_ACTUAL(EPS) + PRINT 200, IT, EPS +200 FORMAT (' IT = ', I4, ' EPS = ', E14.7) + IF (EPS .LT. MAXEPS) EXIT + ENDDO +!DVM$ BARRIER + ENDT = dvtime() + + PRINT *, 'SOR3D_float Benchmark Completed.' + PRINT 201, L, L, L +201 FORMAT (' Size = ', I4, ' x ', I4, ' x ', I4) + PRINT 202, ITMAX +202 FORMAT (' Iterations = ', I12) + PRINT 203, ENDT - STARTT +203 FORMAT (' Time in seconds = ', F12.2) + PRINT *, 'Operation type = floating point' + IF (ABS(EPS - 5.134155) .LT. 1.0E-4) THEN + PRINT *, 'Verification = SUCCESSFUL' + ELSE + PRINT *, 'Verification = UNSUCCESSFUL' + ENDIF + + PRINT *, 'END OF SOR3D_float Benchmark' + END diff --git a/dvm/tools/tester/trunk/test-suite/Performance/jac2d.cdv b/dvm/tools/tester/trunk/test-suite/Performance/jac2d.cdv new file mode 100644 index 0000000..f95e48f --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/jac2d.cdv @@ -0,0 +1,93 @@ +/* Jacobi-2 program */ + +#include +#include + +#define Max(a, b) ((a) > (b) ? (a) : (b)) + +#define L 8000 +#define ITMAX 100 + +int i, j, it; +float eps; +float MAXEPS = 0.5f; + +/* 2D arrays block distributed along 2 dimensions */ +#pragma dvm array distribute[block][block] +float A[L][L]; +#pragma dvm array align([i][j] with A[i][j]) +float B[L][L]; + +int main(int an, char **as) +{ + double startt, endt; + #pragma dvm region + { + /* 2D parallel loop with base array A */ + #pragma dvm parallel([i][j] on A[i][j]) cuda_block(256) + for (i = 0; i < L; i++) + for (j = 0; j < L; j++) + { + A[i][j] = 0; + if (i == 0 || j == 0 || i == L - 1 || j == L - 1) + B[i][j] = 0; + else + B[i][j] = 3 + i + j; + } + } + +#ifdef _DVMH + dvmh_barrier(); + startt = dvmh_wtime(); +#else + startt = 0; +#endif + /* iteration loop */ + for (it = 1; it <= ITMAX; it++) + { + eps = 0; + #pragma dvm actual(eps) + + #pragma dvm region + { + /* Parallel loop with base array A */ + /* calculating maximum in variable eps */ + #pragma dvm parallel([i][j] on A[i][j]) reduction(max(eps)), cuda_block(256) + for (i = 1; i < L - 1; i++) + for (j = 1; j < L - 1; j++) + { + float tmp = fabs(B[i][j] - A[i][j]); + eps = Max(tmp, eps); + A[i][j] = B[i][j]; + } + + /* Parallel loop with base array B and */ + /* with prior updating shadow elements of array A */ + #pragma dvm parallel([i][j] on B[i][j]) shadow_renew(A), cuda_block(256) + for (i = 1; i < L - 1; i++) + for (j = 1; j < L - 1; j++) + B[i][j] = (A[i - 1][j] + A[i][j - 1] + A[i][j + 1] + A[i + 1][j]) / 4.0f; + } + + #pragma dvm get_actual(eps) + printf(" IT = %4i EPS = %14.7E\n", it, eps); + if (eps < MAXEPS) + break; + } +#ifdef _DVMH + dvmh_barrier(); + endt = dvmh_wtime(); +#else + endt = 0; +#endif + + printf(" Jacobi2D Benchmark Completed.\n"); + printf(" Size = %6d x %6d\n", L, L); + printf(" Iterations = %12d\n", ITMAX); + printf(" Time in seconds = %12.2lf\n", endt - startt); + printf(" Operation type = floating point\n"); + printf(" Verification = %12s\n", (fabs(eps - 58.37598) < 1e-3 ? "SUCCESSFUL" : "UNSUCCESSFUL")); + + printf(" END OF Jacobi2D Benchmark\n"); + return 0; +} diff --git a/dvm/tools/tester/trunk/test-suite/Performance/jac2d.fdv b/dvm/tools/tester/trunk/test-suite/Performance/jac2d.fdv new file mode 100644 index 0000000..dae88b4 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/jac2d.fdv @@ -0,0 +1,71 @@ + PROGRAM JAC2D + PARAMETER (L=8000, ITMAX=100) + REAL A(L, L), EPS, MAXEPS, B(L, L) + DOUBLE PRECISION STARTT, ENDT, dvtime +!DVM$ DISTRIBUTE(BLOCK, BLOCK) :: A +!DVM$ ALIGN B(I, J) WITH A(I, J) +! arrays A and B with block distribution + + MAXEPS = 0.5 +!DVM$ REGION +!DVM$ PARALLEL(J, I) ON A(I, J), CUDA_BLOCK(256) +! nest of two parallel loops, iteration (i, j) will be executed on +! processor, which is owner of element A(i, j) + DO J = 1, L + DO I = 1, L + A(I, J) = 0. + IF (I.EQ.1 .OR. J.EQ.1 .OR. I.EQ.L .OR. J.EQ.L) THEN + B(I, J) = 0. + ELSE + B(I, J) = (1. + I + J) + ENDIF + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ BARRIER + STARTT = dvtime() + DO IT = 1, ITMAX + EPS = 0. +!DVM$ ACTUAL(EPS) +!DVM$ REGION +!DVM$ PARALLEL(J, I) ON A(I, J), REDUCTION(MAX(EPS)), CUDA_BLOCK(256) +! variable EPS is used for calculation of maximum value + DO J = 2, L - 1 + DO I = 2, L - 1 + EPS = MAX(EPS, ABS(B(I, J) - A(I, J))) + A(I, J) = B(I, J) + ENDDO + ENDDO +!DVM$ PARALLEL(J, I) ON B(I, J), SHADOW_RENEW(A), CUDA_BLOCK(256) +! Copying shadow elements of array A from +! neighbouring processors before loop execution + DO J = 2, L - 1 + DO I = 2, L - 1 + B(I, J) = (A(I, J-1) + A(I-1, J) + A(I+1, J) + A(I, J+1)) / 4. + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ GET_ACTUAL(EPS) + PRINT 200, IT, EPS +200 FORMAT (' IT = ', I4, ' EPS = ', E14.7) + IF (EPS .LT. MAXEPS) EXIT + ENDDO +!DVM$ BARRIER + ENDT = dvtime() + + PRINT *, 'Jacobi2D Benchmark Completed.' + PRINT 201, L, L +201 FORMAT (' Size = ', I6, ' x ', I6) + PRINT 202, ITMAX +202 FORMAT (' Iterations = ', I12) + PRINT 203, ENDT - STARTT +203 FORMAT (' Time in seconds = ', F12.2) + PRINT *, 'Operation type = floating point' + IF (ABS(EPS - 58.37598) .LT. 1.0E-3) THEN + PRINT *, 'Verification = SUCCESSFUL' + ELSE + PRINT *, 'Verification = UNSUCCESSFUL' + ENDIF + + PRINT *, 'END OF Jacobi2D Benchmark' + END diff --git a/dvm/tools/tester/trunk/test-suite/Performance/jac3d.cdv b/dvm/tools/tester/trunk/test-suite/Performance/jac3d.cdv new file mode 100644 index 0000000..c4ac766 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/jac3d.cdv @@ -0,0 +1,96 @@ +/* Jacobi-3 program */ + +#include +#include + +#define Max(a, b) ((a) > (b) ? (a) : (b)) + +#define L 384 +#define ITMAX 100 + +int i, j, k, it; +float eps; +float MAXEPS = 0.5f; + +/* 3D arrays block distributed along 3 dimensions */ +#pragma dvm array distribute[block][block][block] +float A[L][L][L]; +#pragma dvm array align([i][j][k] with A[i][j][k]) +float B[L][L][L]; + +int main(int an, char **as) +{ + double startt, endt; + #pragma dvm region + { + /* 3D parallel loop with base array A */ + #pragma dvm parallel([i][j][k] on A[i][j][k]) cuda_block(32, 8) + for (i = 0; i < L; i++) + for (j = 0; j < L; j++) + for (k = 0; k < L; k++) + { + A[i][j][k] = 0; + if (i == 0 || j == 0 || k == 0 || i == L - 1 || j == L - 1 || k == L - 1) + B[i][j][k] = 0; + else + B[i][j][k] = 4 + i + j + k; + } + } + +#ifdef _DVMH + dvmh_barrier(); + startt = dvmh_wtime(); +#else + startt = 0; +#endif + /* iteration loop */ + for (it = 1; it <= ITMAX; it++) + { + eps = 0; + #pragma dvm actual(eps) + + #pragma dvm region + { + /* Parallel loop with base array A */ + /* calculating maximum in variable eps */ + #pragma dvm parallel([i][j][k] on A[i][j][k]) reduction(max(eps)), cuda_block(32, 8) + for (i = 1; i < L - 1; i++) + for (j = 1; j < L - 1; j++) + for (k = 1; k < L - 1; k++) + { + float tmp = fabs(B[i][j][k] - A[i][j][k]); + eps = Max(tmp, eps); + A[i][j][k] = B[i][j][k]; + } + + /* Parallel loop with base array B and */ + /* with prior updating shadow elements of array A */ + #pragma dvm parallel([i][j][k] on B[i][j][k]) shadow_renew(A), cuda_block(32, 8) + for (i = 1; i < L - 1; i++) + for (j = 1; j < L - 1; j++) + for (k = 1; k < L - 1; k++) + B[i][j][k] = (A[i - 1][j][k] + A[i][j - 1][k] + A[i][j][k - 1] + A[i][j][k + 1] + A[i][j + 1][k] + A[i + 1][j][k]) / 6.0f; + } + + #pragma dvm get_actual(eps) + printf(" IT = %4i EPS = %14.7E\n", it, eps); + if (eps < MAXEPS) + break; + } +#ifdef _DVMH + dvmh_barrier(); + endt = dvmh_wtime(); +#else + endt = 0; +#endif + + printf(" Jacobi3D Benchmark Completed.\n"); + printf(" Size = %4d x %4d x %4d\n", L, L, L); + printf(" Iterations = %12d\n", ITMAX); + printf(" Time in seconds = %12.2lf\n", endt - startt); + printf(" Operation type = floating point\n"); + printf(" Verification = %12s\n", (fabs(eps - 5.058044) < 1e-4 ? "SUCCESSFUL" : "UNSUCCESSFUL")); + + printf(" END OF Jacobi3D Benchmark\n"); + return 0; +} diff --git a/dvm/tools/tester/trunk/test-suite/Performance/jac3d.fdv b/dvm/tools/tester/trunk/test-suite/Performance/jac3d.fdv new file mode 100644 index 0000000..ddd7add --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/jac3d.fdv @@ -0,0 +1,81 @@ + PROGRAM JAC3D + PARAMETER (L=384, ITMAX=100) + REAL A(L, L, L), EPS, MAXEPS, B(L, L, L) + DOUBLE PRECISION STARTT, ENDT, dvtime +!DVM$ DISTRIBUTE(BLOCK, BLOCK, BLOCK) :: A +!DVM$ ALIGN B(I, J, K) WITH A(I, J, K) +! arrays A and B with block distribution + + MAXEPS = 0.5 +!DVM$ REGION +!DVM$ PARALLEL(K, J, I) ON A(I, J, K), CUDA_BLOCK(32, 8) +! nest of two parallel loops, iteration (i, j) will be executed on +! processor, which is owner of element A(i, j) + DO K = 1, L + DO J = 1, L + DO I = 1, L + A(I, J, K) = 0. + IF (I.EQ.1 .OR. J.EQ.1 .OR. K.EQ.1 + >.OR. I.EQ.L .OR. J.EQ.L .OR. K.EQ.L) THEN + B(I, J, K) = 0. + ELSE + B(I, J, K) = (1. + I + J + K) + ENDIF + ENDDO + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ BARRIER + STARTT = dvtime() + DO IT = 1, ITMAX + EPS = 0. +!DVM$ ACTUAL(EPS) +!DVM$ REGION +!DVM$ PARALLEL(K, J, I) ON A(I, J, K), REDUCTION(MAX(EPS)) +!DVM$>, CUDA_BLOCK(32, 8) +! variable EPS is used for calculation of maximum value + DO K = 2, L - 1 + DO J = 2, L - 1 + DO I = 2, L - 1 + EPS = MAX(EPS, ABS(B(I, J, K) - A(I, J, K))) + A(I, J, K) = B(I, J, K) + ENDDO + ENDDO + ENDDO +!DVM$ PARALLEL(K, J, I) ON B(I, J, K), SHADOW_RENEW(A) +!DVM$>, CUDA_BLOCK(32, 8) +! Copying shadow elements of array A from +! neighbouring processors before loop execution + DO K = 2, L - 1 + DO J = 2, L - 1 + DO I = 2, L - 1 + B(I, J, K) = (A(I, J, K-1) + A(I, J-1, K) + A(I-1, J, K) + >+ A(I+1, J, K) + A(I, J+1, K) + A(I, J, K+1)) / 6. + ENDDO + ENDDO + ENDDO +!DVM$ END REGION +!DVM$ GET_ACTUAL(EPS) + PRINT 200, IT, EPS +200 FORMAT (' IT = ', I4, ' EPS = ', E14.7) + IF (EPS .LT. MAXEPS) EXIT + ENDDO +!DVM$ BARRIER + ENDT = dvtime() + + PRINT *, 'Jacobi3D Benchmark Completed.' + PRINT 201, L, L, L +201 FORMAT (' Size = ', I4, ' x ', I4, ' x ', I4) + PRINT 202, ITMAX +202 FORMAT (' Iterations = ', I12) + PRINT 203, ENDT - STARTT +203 FORMAT (' Time in seconds = ', F12.2) + PRINT *, 'Operation type = floating point' + IF (ABS(EPS - 5.058044) .LT. 1.0E-4) THEN + PRINT *, 'Verification = SUCCESSFUL' + ELSE + PRINT *, 'Verification = UNSUCCESSFUL' + ENDIF + + PRINT *, 'END OF Jacobi3D Benchmark' + END diff --git a/dvm/tools/tester/trunk/test-suite/Performance/settings b/dvm/tools/tester/trunk/test-suite/Performance/settings new file mode 100644 index 0000000..5c9ddf9 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/settings @@ -0,0 +1,3 @@ +MAX_PROC_COUNT=4 +MAX_DIM_PROC_COUNT=4 +MAX_TIME=60 # In seconds diff --git a/dvm/tools/tester/trunk/test-suite/Performance/test-analyzer.sh b/dvm/tools/tester/trunk/test-suite/Performance/test-analyzer.sh new file mode 100644 index 0000000..d72fd3e --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/Performance/test-analyzer.sh @@ -0,0 +1,74 @@ +#!/bin/sh + +# This is analyzer of output of NPB-style formed tests +# Requires variables: LAUNCH_EXIT_CODE, STDOUT_FN, STDERR_FN +# Produces variables: SUBTEST_COUNT, TEST_PASSED, RESULT_COMMENT, ERROR_LEVEL, TASK_CALC_TIME +# Produces functions: analyze_subtest + +SUBTEST_COUNT=`grep 'Completed.' <"$STDOUT_FN" | wc -l` + +if [ `grep -E 'Assertion' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Assertion failed" + ERROR_LEVEL=5 +elif [ `grep -E 'RTS fatal' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="RTS fatal" + ERROR_LEVEL=4 +elif [ `grep -E 'RTS err' <"$STDERR_FN" | wc -l` -gt 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="RTS err" + ERROR_LEVEL=3 +elif [ `grep "END OF" <"$STDOUT_FN" | wc -l` -eq 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Crash" + ERROR_LEVEL=2 +elif [ $LAUNCH_EXIT_CODE -ne 0 ]; then + TEST_PASSED=0 + RESULT_COMMENT="Launch failure" + ERROR_LEVEL=6 +elif [ `grep ' SUCCESSFUL' <"$STDOUT_FN" | wc -l` -lt $SUBTEST_COUNT ]; then + TEST_PASSED=0 + RESULT_COMMENT="Has failed subtests" + ERROR_LEVEL=1 +else + TEST_PASSED=1 + RESULT_COMMENT="OK" + ERROR_LEVEL=0 +fi + +if [ $SUBTEST_COUNT -eq 1 ]; then + TASK_CALC_TIME=`grep 'Time in seconds' <"$STDOUT_FN" | awk '{ print $5 }'` +fi + +analyze_subtest() { + # Produces variables: SUBTEST_NAME, TEST_PASSED, RESULT_COMMENT, ERROR_LEVEL, TASK_CALC_TIME + local SUBTEST_RES_START=`grep -n 'Completed.' <"$STDOUT_FN" | head -n $1 | tail -n 1 | sed 's/:.*//g'` + local SUBTEST_RES_END= + if [ $1 -lt $SUBTEST_COUNT ]; then + SUBTEST_RES_END=`grep -n 'Completed.' <"$STDOUT_FN" | head -n $(( $1 + 1 )) | tail -n 1 | sed 's/:.*//g'` + SUBTEST_RES_END=$(( SUBTEST_RES_END - 1)) + else + SUBTEST_RES_END=`cat "$STDOUT_FN" | wc -l` + fi + local linecount=$(( SUBTEST_RES_END - SUBTEST_RES_START + 1 )) + local tmp=`mktemp` + cat "$STDOUT_FN" | head -n $SUBTEST_RES_END | tail -n $linecount >$tmp + SUBTEST_NAME=`grep "Completed." <$tmp | head -n 1 | awk '{ print $1 }'` + local CLASS_NAME=`grep "Class" <$tmp | head -n 1 | awk '{ print $3 }'` + if [ -n "$CLASS_NAME" ]; then + SUBTEST_NAME="$SUBTEST_NAME ($CLASS_NAME)" + fi + TEST_PASSED=`grep "Verification" <$tmp | head -n 1 | awk '{ print $3 }'` + if [ "$TEST_PASSED" = "SUCCESSFUL" ]; then + TEST_PASSED=1 + RESULT_COMMENT="OK" + ERROR_LEVEL=0 + else + TEST_PASSED=0 + RESULT_COMMENT="Subtest failed" + ERROR_LEVEL=1 + fi + TASK_CALC_TIME=`grep 'Time in seconds' <$tmp | awk '{ print $5 }'` + rm $tmp +} diff --git a/dvm/tools/tester/trunk/test-suite/settings b/dvm/tools/tester/trunk/test-suite/settings new file mode 100644 index 0000000..2d65b60 --- /dev/null +++ b/dvm/tools/tester/trunk/test-suite/settings @@ -0,0 +1,7 @@ +MAX_PROC_COUNT=1 +MAX_DIM_PROC_COUNT=0 +SHARE_RESOURCES=0 +ALLOW_MULTIDEV=1 +DVM_ONLY=0 +GPU_ONLY=0 +MAX_TIME=300 # In seconds