|  | ============================================================================ | 
|  | |                   OpenMP Validation Suite  V 3.0                           | | 
|  | |              High Performance Computing Center, Stuttgart                  | | 
|  | |       High Performance Computing and Tools, University of Houston          | | 
|  | |                              Jan. 2012                                     | | 
|  | ============================================================================ | 
|  |  | 
|  |  | 
|  | TABLE OF CONTENTS | 
|  |  | 
|  | I    	INTRODUCTION | 
|  | I.1.	  Aims and general function | 
|  | I.2. 	  Files and directories | 
|  |  | 
|  | II		USAGE | 
|  | II.1.	  First run with make | 
|  | II.2	  Where to search for results | 
|  | II.3.	  Using the runtest script | 
|  |  | 
|  | III		Adding and modifying tests | 
|  | III.1.	  The template structure | 
|  |  | 
|  | IV		Known Issues and Workaround | 
|  |  | 
|  | V       Contact and Support | 
|  |  | 
|  | ------------------------------------------------------------------------------ | 
|  |  | 
|  | I.  INTRODUCTION | 
|  | ============================================================================== | 
|  |  | 
|  | I.1.  Aims and general function | 
|  | -------------------------------- | 
|  |  | 
|  | The OpenMP validation suite is designed to verify the correct implementation | 
|  | of OpenMP in compilers. It is capable of checking Fortran as well as c | 
|  | compiler. | 
|  |  | 
|  | Testing the implementation is based on statistics. Each directive is tested | 
|  | by computing and verifying the result with the already known value. In most | 
|  | cases a wrong implementation can result in the right values. So the tests are | 
|  | run several times. | 
|  |  | 
|  | Additionally, the validation suite creates so called crosstests for each | 
|  | directive. These are tests in which either the directive is missing or used | 
|  | with different arguments. If this so called crosstest fails, this indicates | 
|  | strongly that the previous test is capable of testing the directive. | 
|  |  | 
|  | Lastly, an orphaned test is also run to determine if the directive being | 
|  | tested is able to correctly run when 'orphaned' from the main function. | 
|  | Essentially, the directive's code is placed into its own function which is | 
|  | called during execution of the main function and often inside a parallel | 
|  | region. | 
|  |  | 
|  |  | 
|  | I.2.  Files and directories | 
|  | ---------------------------- | 
|  |  | 
|  |  | 
|  | d c                         directory containing the templates for the c tests | 
|  | d fortran                   directory containing the templates for the Fortran | 
|  | tests | 
|  | Makefile                  Makefile containing options for compilation | 
|  | common_utility.f | 
|  | omp_my_sleep.h            thread save sleep function | 
|  | omp_testsuite.f           Fortran header file | 
|  | omp_testsuite.h           autogenerated c-header file | 
|  | ompts-c.conf              configuration file for the c tests about how often | 
|  | the tests shall be executed or how large the loop size | 
|  | is | 
|  | ompts_makeHeader.pl	    perl module for automatically generation of an up | 
|  | to date header file | 
|  | ompts_parserFunctions.pm	perl module containing general functions for | 
|  | the parser.pl script | 
|  | ompts_parser.pl	        script for generating the source code out of the templates | 
|  | ompts_standaloneProc.c	framework for the c tests | 
|  | ompts_standaloneProc.f	framework for the Fortran tests | 
|  | README		            the README file you've already found ;-) | 
|  | LICENSE                   contains license information | 
|  | runtest.pl		        the frame program of the test suite | 
|  | testlist-f.txt	        test list containing the available tests for Fortran | 
|  | testlist-c.txt	        test list containing the available tests for c | 
|  |  | 
|  |  | 
|  | ------------------------------------------------------------------------------ | 
|  |  | 
|  | II.  USAGE | 
|  | ============================================================================== | 
|  |  | 
|  |  | 
|  | II.1. First run with make | 
|  | -------------------------- | 
|  |  | 
|  |  | 
|  | You can do a first simple run of the testsuite only after one step of | 
|  | configuration: | 
|  |  | 
|  | 1) Modify the ompts.conf and ompts-c.conf file, change the number of threads | 
|  | and number of repetitions of each test. | 
|  |  | 
|  | 2) Modify the Makefile, uncommenting the CC/FC and CFLAGS/FFLAGS variables for | 
|  | the compiler of your choice. | 
|  |  | 
|  | And now you can run the testsuite either for a C compiler with: | 
|  |  | 
|  | >	make ctest | 
|  |  | 
|  | or for a Fortran compiler with: | 
|  |  | 
|  | >	make ftest | 
|  |  | 
|  |  | 
|  | II.2. Running custom tests | 
|  | -------------------------- | 
|  |  | 
|  |  | 
|  | In order to run single tests or custom groups of tests, two make commmands | 
|  | are defined: make stest and make fstest. These two command reference the file | 
|  | customtest.txt when looking for a testlist to use. Simply edit customtest.txt | 
|  | to include the desired test or tests. If customtest.txt contains c tests, | 
|  |  | 
|  | >      make stest | 
|  |  | 
|  | or for fortran tests | 
|  |  | 
|  | >      make fstest | 
|  |  | 
|  | In order to change the number of threads used in the tests, simply edit the | 
|  | Makefile variables MINTHREADS and MAXTHREADS. By default, they are configured | 
|  | to use 2 threads. To change the number of times each test is run, for c tests | 
|  | edit the REPETITIONS variable in the file ompts-c.conf. The LOOPCOUNT and | 
|  | SLEEPTIME variables can also be changed here. For fortran tests, edit the file | 
|  | omp_testsuite.f to change both the LOOPCOUNT and the number of times each test | 
|  | is run. | 
|  |  | 
|  |  | 
|  |  | 
|  | II.3. Understanding the results | 
|  | --------------------------------- | 
|  |  | 
|  |  | 
|  | When running the testsuite the results will be shown on the screen. | 
|  |  | 
|  | If you need the results for further purpose you can use the results.txt, which | 
|  | is a simple list containing the results for each directive | 
|  | in a single line. Each line starts with the name of the directive. Then follows | 
|  | the result of the test given in the percentage of the passed tests. If 100% of | 
|  | the tests passed successfully, the second number gives the result of the | 
|  | corresponding crosstest. Crosstests will only be run if the normal test passes | 
|  | with 100% accuracy. If a crosstest was not run or a test does not exist, it is | 
|  | denotated by a "-". | 
|  | After the results of the normal tests, there follow a series of tests in the | 
|  | orphaned mode. If there were no orphaned tests available this is shown by a "-". | 
|  |  | 
|  | If you run the testsuite with different numbers of threads (e.g. using the | 
|  | runtest.pl script) the results are shown in blocks of 4 columns for each number | 
|  | of threads. | 
|  |  | 
|  | If a test fails you can find more detailed information in the ompts.log, | 
|  | bin/c/*.out and *.log files. While the ompts.log file contains all compiler | 
|  | error messages for all tests, the *.out and *.log files contain detailed inforamtion | 
|  | on the execution process of the single tests. | 
|  | In the *.out files there are listed all the results of the single executions of | 
|  | the tests. In the *.log files there are error messages of the tests itself. | 
|  |  | 
|  |  | 
|  | II.4. Cleaning Up | 
|  | ----------------- | 
|  |  | 
|  |  | 
|  | Because many files are generated for each tested directive, it is often necessary | 
|  | to clean the main directory after a battery of tests. To clean all generated files | 
|  | in the main directory including the results and log files, | 
|  |  | 
|  | >     make clean | 
|  |  | 
|  |  | 
|  | To clean only the logs and out files, | 
|  |  | 
|  | >     make cleanlogs | 
|  |  | 
|  | To clean only the results, | 
|  |  | 
|  | >     make cleanresults | 
|  |  | 
|  |  | 
|  |  | 
|  | II.4. Using the runtest script | 
|  | ------------------------------- | 
|  |  | 
|  |  | 
|  | So for special purpose you can use the runtest.pl script, which allows a lot | 
|  | more options for the execution process than the execution with make. | 
|  |  | 
|  | Using the runtest.pl script is rather easy. You can use the the test suite only | 
|  | after two steps of modifications: | 
|  |  | 
|  | 1.) Modify the Makefile to your wishes choosing your compiler and the necessary | 
|  | compiler flags. | 
|  | 2.) If necessary edit one of the test lists (testlist-c.txt) and comment out the | 
|  | tests you do not want to run using # at the beginning of a line. Testlists for Fortran end | 
|  | with -f.txt while test lists for c with -c.txt. | 
|  |  | 
|  | And now you can run the test suite either for Fortran using | 
|  | #	>  ./runtest.pl -lang=fortran -d=fortran testlist-f.txt | 
|  | or for c | 
|  | #	>  ./runtest.pl -lang=c -d=c testlist-c.txt | 
|  |  | 
|  | With the --help option you can show the complete list of options and their | 
|  | explanations. | 
|  |  | 
|  | The test results are summarized in cresults or fresults.txt while *.log keep | 
|  | details for individual tests. There is also a file (ompts.log) keeping | 
|  | compilation information. (see section II.2 ) | 
|  |  | 
|  | If you don't want to test the directives in orphaned mode you can use the | 
|  | -norphan option. You also can use the runtest.pl script either to compile all | 
|  | tests or run compiled tests e.g. for cross compilation on other platforms. For | 
|  | this there are the options -norun and -nocompile. | 
|  |  | 
|  | Happy testing! | 
|  |  | 
|  |  | 
|  | ------------------------------------------------------------------------------ | 
|  |  | 
|  | III.	How to add new tests / The structure of test templates | 
|  | ============================================================================== | 
|  |  | 
|  | III.1  The template structure | 
|  | ------------------------------ | 
|  |  | 
|  | The test suite is based on templates so that you only have one file for test, | 
|  | crosstest and the orphaned versions of them. | 
|  |  | 
|  | A) Description of the template structure | 
|  |  | 
|  | The syntax of the templates is much like xml. So each test begins with | 
|  | '<ompts:test>' and ends with '</ompts:test>'. | 
|  |  | 
|  | In between there are several other blocks holding information: | 
|  |  | 
|  | - <ompts:testdescription> </ompts:testdescription> In between this tag you can | 
|  | give a description on what the test checks and how it works. | 
|  |  | 
|  | - <ompts:ompversion> </ompts:version> This tag is used to specify the | 
|  | OpenMP-version which includes the tested directive. | 
|  |  | 
|  | - <ompts:directive> </ompts:directive> Used to specify the directive how it is | 
|  | called in the programming language. | 
|  |  | 
|  | - <ompts:dependences> </ompts:dependences> With this tag you can specify other | 
|  | omp directives which are necessary for the correct execution of your test. | 
|  | The directives have to be listed by their directive names as it is called in | 
|  | the programming language. Multiple directives are separated by ','. | 
|  |  | 
|  | - <ompts:testcode> </ompts:testcode> In this tag stands the whole source code | 
|  | for the test / crosstest.  Each test has to be written as a function. The | 
|  | syntax of the functions differs between C and Fortran: In C it has to take a | 
|  | file pointer 'FILE * logFile' and return an int. If the test has been passed | 
|  | successful it has to return a value unequal to 0. The file pointer can be used | 
|  | to write information into a log file.  In Fortran the function takes no | 
|  | argument and the function name must not exceed XX characters.  The return value | 
|  | has to be specified using the '<testfunctionname>' tags. It has to be 1 if the | 
|  | test succeeded and 0 if the test failed. For details see the example. | 
|  |  | 
|  | To tell the test suite the name of your test function you have to enclose it | 
|  | into the '<ompts:testcode:functionname> </ompts:testcode:functionname>' tag. | 
|  |  | 
|  | If there are differences between test and crosstest you can use the | 
|  | <ompts:check> </ompts:check> and <ompts:crosscheck> </ompts:crosscheck> tag. | 
|  | When generating the test the parser will use the code enclosed in | 
|  | <ompts:check> tags and cut out the code written in <ompts:crosscheck> tags. So | 
|  | you have two possibilities to write your template for test and crosstest: The | 
|  | first way you can write the complete code is to write the test in one | 
|  | <ompts:check> tag and later the crosstest in one <ompts:crosscheck> tag.  The | 
|  | second way is to write both tests only by enclosing differing parts in | 
|  | corresponding tags. | 
|  |  | 
|  | The first method should be preferred if test and crosstest differ much from | 
|  | each other. The second e.g. if you only want to change a few options like | 
|  | replacing an omp singleprivate clause by an omp private clause or to cut out | 
|  | a directive like omp flush.  When you use the first way you have to take care | 
|  | of the function name! You have to declare it twice with | 
|  | <ompts:testcode:functionname>! | 
|  |  | 
|  | - <ompts:orphan> </ompts:orphan> This tag can be used if you want to enable | 
|  | your test to check the directive in orphan regions, too.  The code enclosed | 
|  | in this part will be written to a separate function which will be called | 
|  | instead.  If you have variables which are used outside this region you have to | 
|  | declare them as global variables enclosed in an <ompts:orphan:vars> tag. For | 
|  | further information see the description of the <ompts:orphan:vars> tag. | 
|  |  | 
|  | - <ompts:orphan:vars> </ompts:orphan:vars> This tag is used to specify global | 
|  | variables for an orphan region which allow the exchange of values between | 
|  | the main program and the orphaned functions. The usage differs between C and | 
|  | Fortran.  In C you have to use a single declaration for each variable. You can | 
|  | either declare all variables in one single or in several different regions. You | 
|  | must not initialize the variables inside!  In Fortran you have to put all | 
|  | declarations in one single tag. Because there exist no global variables as in | 
|  | C you have to use common blocks. For further information see the examples. | 
|  |  | 
|  | III.2.  Adding tests to the test lists | 
|  | -------------------------------------- | 
|  |  | 
|  | After you have created a new test you have to add them to a testlist. Simply | 
|  | add the function name in a new Line into a file. | 
|  |  | 
|  |  | 
|  |  | 
|  | ------------------------------------------------------------------------------ | 
|  |  | 
|  |  | 
|  | IV.   Known Issues and Workaround | 
|  | ============================================================================== | 
|  |  | 
|  | The Sun OS has a problem with the -maxdepth option on the 'make cleanall' | 
|  | command. This prevents the tests from being removed from the working directory | 
|  | and can cause problems with future tests. To remedy, edit the makefile line | 
|  | under the clean command: | 
|  |  | 
|  | -rm [cf]test*.[cf] [cf]crosstest*.[cf] [cf]ctest*.[cf] [cf]orphan*.[cf] | 
|  |  | 
|  | Change to: | 
|  |  | 
|  | -rm [cf]test* [cf]crosstest* [cf]ctest* [cf]orphan* | 
|  |  | 
|  |  | 
|  |  | 
|  | ------------------------------------------------------------------------------ | 
|  |  | 
|  | V.   Contact and Support | 
|  | ============================================================================== | 
|  |  | 
|  | Contact: http://www.cs.uh.edu/~hpctools |