DSP-only BILS test suite works on C6678 EVM.
authorJianzhong Xu <xuj@ti.com>
Wed, 24 Feb 2016 20:46:51 +0000 (15:46 -0500)
committerJianzhong Xu <xuj@ti.com>
Wed, 24 Feb 2016 20:46:51 +0000 (15:46 -0500)
30 files changed:
Makefile
blis/config/c66x/bli_config.h
blis/frame/3/gemm/bli_gemm.c
blis/frame/3/hemm/bli_hemm.c
blis/frame/3/her2k/bli_her2k.c
blis/frame/3/herk/bli_herk.c
blis/frame/3/symm/bli_symm.c
blis/frame/3/syr2k/bli_syr2k.c
blis/frame/3/syrk/bli_syrk.c
blis/frame/3/trmm/bli_trmm.c
blis/frame/3/trsm/bli_trsm.c
blis/frame/base/bli_malloc.c
blis/testsuite/dsponly/Makefile [new file with mode: 0644]
blis/testsuite/src/test_gemm.c
blis/testsuite/src/test_libblis.c
blis/testsuite/src/test_libblis.h
blis/testsuite/src/test_scalv.c
blis/testsuite/src/test_trsv.c
build_opencl_k2h_large.sh [new file with mode: 0755]
build_opencl_k2h_medium.sh [new file with mode: 0755]
build_opencl_k2h_small.sh [new file with mode: 0755]
build_rtos_c6678_small.sh [new file with mode: 0755]
examples/dsponly/common/Makefile.common
examples/dsponly/common/linker_fc.cmd
examples/dsponly/common/omp_config.cfg
examples/dsponly/common/ticblas_config.c
examples/dsponly/dgemm_test/Makefile
examples/dsponly/dgemm_test/dgemm_test.c
setup_env_C6678_rtos.sh
setup_env_k2h_rtos.sh

index 0dd21855ba2068b305c737d2547a6d04310b167b..ca06b9e084f594a56ba67a83787f30b0579a427f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -49,7 +49,7 @@ ARMplusDSP: DSPlibs ARMlibs
 
 cleanDSPlibs:
        cd $(LINALG_CBLAS_DIR); make arch=C66 clean; \
-       cd ../$(LINALG_BLIS_DIR); ./configure -p install/$(BLIS_CFG) c66x; make -j8 clean; rm install/$(BLIS_CFG)/lib/*; \
+       cd ../$(LINALG_BLIS_DIR); ./configure -p install/$(BLIS_CFG) c66x; make -j8 clean; rm install/$(BLIS_CFG)/lib/*; rm install/$(BLIS_CFG)/include/blis/*; \
        cd ../$(LINALG_TICBLAS_DIR)/src; make clean; \
        cd ../..; rm lib/*
 
@@ -60,12 +60,14 @@ cleanARMlibs:
        cd ../$(LINALG_BLIS_DIR)/testsuite; make clean; \
        cd ../../$(LINALG_CLAPACK_DIR); make clean
 
-#DSPonly:
-       
 BLIStest:
        cd $(LINALG_BLIS_DIR); ./configure -p install/arm cortex-a15; \
        cd testsuite; make lib=OpenCLCBLAS -j8 
 
+BLIStestDSP:
+       cd $(LINALG_BLIS_DIR); ./configure -p install/$(BLIS_CFG) c66x; \
+       cd testsuite/dsponly; make MEM_MODEL=Small TARGET=SOC_C6678 LIBOS=LIB_RTOS 
+
 BLAStest:
        cd $(LINALG_CLAPACK_DIR)/BLAS/TESTING; make -f Makeblat1; make -f Makeblat2; make -f Makeblat3
 
index 33de0dfea1ce13b46692277f9b7f95189ad05c64..e37943d880890816c9951cd823242474000e2a8a 100755 (executable)
 #define BLIS_C66X_IC_NT                                BLIS_MAX_NUM_THREADS
 #elif defined (MEM_MODEL_SMALL)
 #define BLIS_MAX_NUM_THREADS            8
-#define BLIS_C66X_IC_NT                                2
+#define BLIS_C66X_IC_NT                                8
 #endif
 
 #define BLIS_C66X_JC_NT                                1
 
 
 
+extern void * blasGetMemHandle();
 
 #endif
 
index 3939f9ea2f78e57c19b075f6f893fb7e73bac2e2..7d0d1cdae2d8af65b821e6bcf4afdb9da682bd54 100644 (file)
@@ -45,6 +45,10 @@ void bli_gemm( obj_t*  alpha,
 {
        num_t dt = bli_obj_datatype( *c );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3mh_is_enabled_dt( dt ) ) bli_gemm3mh_entry( alpha, a, b, beta, c );
        else if ( bli_3m_is_enabled_dt( dt ) )  bli_gemm3m_entry( alpha, a, b, beta, c );
        else if ( bli_4mh_is_enabled_dt( dt ) ) bli_gemm4mh_entry( alpha, a, b, beta, c );
index c1c62a0b8a6358ee6a5218ad4f80382d134df3d8..94afbbdbde083cab4e435824fddc4d8bac4f056c 100644 (file)
@@ -46,6 +46,10 @@ void bli_hemm( side_t  side,
 {
        num_t dt = bli_obj_datatype( *c );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3mh_is_enabled_dt( dt ) ) bli_hemm3mh_entry( side, alpha, a, b, beta, c );
        else if ( bli_3m_is_enabled_dt( dt ) )  bli_hemm3m_entry( side, alpha, a, b, beta, c );
        else if ( bli_4mh_is_enabled_dt( dt ) ) bli_hemm4mh_entry( side, alpha, a, b, beta, c );
index 5d78c83a13d161a57c794e97e9a8e355fefaa5ef..64863831e57cadc16a1db0136fbdac24944592cc 100644 (file)
@@ -45,6 +45,10 @@ void bli_her2k( obj_t*  alpha,
 {
        num_t dt = bli_obj_datatype( *c );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3mh_is_enabled_dt( dt ) ) bli_her2k3mh_entry( alpha, a, b, beta, c );
        else if ( bli_3m_is_enabled_dt( dt ) )  bli_her2k3m_entry( alpha, a, b, beta, c );
        else if ( bli_4mh_is_enabled_dt( dt ) ) bli_her2k4mh_entry( alpha, a, b, beta, c );
index a56ff3971b988ff1e8f9fab297a2eac935f0cfdc..9fe511b6f016fddb2bc644808c8c318ed18ac022 100644 (file)
@@ -44,6 +44,10 @@ void bli_herk( obj_t*  alpha,
 {
        num_t dt = bli_obj_datatype( *c );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3mh_is_enabled_dt( dt ) ) bli_herk3mh_entry( alpha, a, beta, c );
        else if ( bli_3m_is_enabled_dt( dt ) )  bli_herk3m_entry( alpha, a, beta, c );
        else if ( bli_4mh_is_enabled_dt( dt ) ) bli_herk4mh_entry( alpha, a, beta, c );
index d01232f65bd0013ff044285822ae44ece6932411..32d4f633304f6388493c1331221adf07bb3ef7c6 100644 (file)
@@ -46,6 +46,10 @@ void bli_symm( side_t  side,
 {
        num_t dt = bli_obj_datatype( *c );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3mh_is_enabled_dt( dt ) ) bli_symm3mh_entry( side, alpha, a, b, beta, c );
        else if ( bli_3m_is_enabled_dt( dt ) )  bli_symm3m_entry( side, alpha, a, b, beta, c );
        else if ( bli_4mh_is_enabled_dt( dt ) ) bli_symm4mh_entry( side, alpha, a, b, beta, c );
index 9fbc9d7a78a338ed5c84a049abaa972317a96057..8dae961b62b1510efb0e7db433f533390d16bf9b 100644 (file)
@@ -45,6 +45,10 @@ void bli_syr2k( obj_t*  alpha,
 {
        num_t dt = bli_obj_datatype( *c );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3mh_is_enabled_dt( dt ) ) bli_syr2k3mh_entry( alpha, a, b, beta, c );
        else if ( bli_3m_is_enabled_dt( dt ) )  bli_syr2k3m_entry( alpha, a, b, beta, c );
        else if ( bli_4mh_is_enabled_dt( dt ) ) bli_syr2k4mh_entry( alpha, a, b, beta, c );
index 69dde1fcbba4480f30bf3c5be6b416df08c3a834..f44c08d44261409d8be1ef4d622e53e2b858ce72 100644 (file)
@@ -44,6 +44,10 @@ void bli_syrk( obj_t*  alpha,
 {
        num_t dt = bli_obj_datatype( *c );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3mh_is_enabled_dt( dt ) ) bli_syrk3mh_entry( alpha, a, beta, c );
        else if ( bli_3m_is_enabled_dt( dt ) )  bli_syrk3m_entry( alpha, a, beta, c );
        else if ( bli_4mh_is_enabled_dt( dt ) ) bli_syrk4mh_entry( alpha, a, beta, c );
index 7037876bb62b390818e6167574b8db26b160f5cc..2257fbbc079db3f7681a571282de539df08c7576 100644 (file)
@@ -44,6 +44,10 @@ void bli_trmm( side_t  side,
 {
        num_t dt = bli_obj_datatype( *b );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3m_is_enabled_dt( dt ) ) bli_trmm3m_entry( side, alpha, a, b );
        else if ( bli_4m_is_enabled_dt( dt ) ) bli_trmm4m_entry( side, alpha, a, b );
        else                                   bli_trmm_entry( side, alpha, a, b );
index 4b74acf6104b666500d8992a14ccee1281dccea0..de849281f3523011d447085a7adb4af844ee7d0a 100644 (file)
@@ -44,6 +44,10 @@ void bli_trsm( side_t  side,
 {
        num_t dt = bli_obj_datatype( *b );
 
+#if defined (BLIS_ENABLE_C66X_BUILD)
+       lib_smem_sreset(blasGetMemHandle()); /* reset BLAS scratch heap */
+#endif 
+       
        if      ( bli_3m_is_enabled_dt( dt ) ) bli_trsm3m_entry( side, alpha, a, b );
        else if ( bli_4m_is_enabled_dt( dt ) ) bli_trsm4m_entry( side, alpha, a, b );
        else                                   bli_trsm_entry( side, alpha, a, b );
index c500c82c7a1ab8771a3fc7dc99854c3c7316f10a..c9cb628cebb6d48bbf56369fda31da09f5f9f41f 100644 (file)
@@ -37,8 +37,6 @@
 #include <CL/cl_ext.h>
 #endif
 
-extern void * blasGetMemHandle();
-
 /* This function is used to allocate memory during BLIS initialization. 
    Allocated memory will be freed when bli_finalize() is called */
 void* bli_malloc( siz_t size )
diff --git a/blis/testsuite/dsponly/Makefile b/blis/testsuite/dsponly/Makefile
new file mode 100644 (file)
index 0000000..56f7d29
--- /dev/null
@@ -0,0 +1,216 @@
+
+#
+# Check if required environment variables are defined
+#
+ifneq ($(MAKECMDGOALS),clean)
+
+# Path to C6000 compiler tools
+ifeq ($(CGTROOT),)
+$(call error,ERROR - CGTROOT NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(XDC_DIR),)
+$(call error,ERROR - XDC_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(XDAIS_DIR),)
+$(call error,ERROR - XDAIS_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(BIOS_DIR),)
+$(call error,ERROR - BIOS_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(IPC_DIR),)
+$(call error,ERROR - IPC_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(OMP_DIR),)
+$(call error,ERROR - OMP_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(PDK_DIR),)
+$(call error,ERROR - PDK_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(FC_DIR),)
+$(call error,ERROR - FC_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(EDMA3_DIR),)
+$(call error,ERROR - EDMA3_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(LIBARCH_DIR),)
+$(call error,ERROR - LIBARCH_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+ifeq ($(LINALG_DIR),)
+$(call error,ERROR - LINALG_DIR NOT DEFINED, PLEASE REFER TO README.txt)
+endif
+
+endif
+
+DESTDIR = ../../
+
+#
+# --- Makefile initialization --------------------------------------------------
+#
+
+# Define the name of the configuration file.
+CONFIG_MK_FILE     := config.mk
+
+# Define the name of the file containing build and architecture-specific
+# makefile definitions.
+MAKE_DEFS_FILE     := make_defs.mk
+
+# All makefile fragments in the tree will have this name.
+FRAGMENT_MK        := .fragment.mk
+
+# Locations of important files.
+CONFIG_DIR         := config
+FRAME_DIR          := frame
+LIB_DIR            := lib
+
+
+
+#
+# --- Include makefile configuration file --------------------------------------
+#
+
+# Construct the path to the makefile configuration file that was generated by
+# the configure script.
+CONFIG_MK_PATH    := ../../$(CONFIG_MK_FILE)
+
+# Include the configuration file.
+-include $(CONFIG_MK_PATH)
+
+# Detect whether we actually got the configuration file. If we didn't, then
+# it is likely that the user has not yet generated it (via configure).
+ifeq ($(strip $(CONFIG_MK_INCLUDED)),yes)
+CONFIG_MK_PRESENT := yes
+else
+CONFIG_MK_PRESENT := no
+endif
+
+# Override the DIST_PATH value obtained from config.mk, since it is relative
+# to the build directory.
+DIST_PATH         := ..
+
+# Now we have access to CONFIG_NAME, which tells us which sub-directory of the
+# config directory to use as our configuration.
+CONFIG_PATH       := $(DIST_PATH)/$(CONFIG_DIR)/$(CONFIG_NAME)
+FRAME_PATH        := $(DIST_PATH)/$(FRAME_DIR)
+
+
+
+#
+# --- Include makefile definitions file ----------------------------------------
+#
+
+# Construct the path to the makefile definitions file residing inside of
+# the configuration sub-directory.
+MAKE_DEFS_MK_PATH := $(CONFIG_PATH)/$(MAKE_DEFS_FILE)
+
+# Include the makefile definitions file.
+-include $(MAKE_DEFS_MK_PATH)
+
+# Detect whether we actually got the make definitios file. If we didn't, then
+# it is likely that the configuration is invalid (or incomplete).
+ifeq ($(strip $(MAKE_DEFS_MK_INCLUDED)),yes)
+MAKE_DEFS_MK_PRESENT := yes
+else
+MAKE_DEFS_MK_PRESENT := no
+endif
+
+
+
+#
+# --- Include makefile fragments -----------------------------------------------
+#
+
+# Initialize our list of directory paths to makefile fragments with the empty
+# list. This variable will accumulate all of the directory paths in which
+# makefile fragments reside.
+FRAGMENT_DIR_PATHS :=
+
+# This variable is used by the include statements as they recursively include
+# one another. For the framework source tree ('frame' directory), we initialize
+# it to the top-level directory since that is its parent.
+PARENT_PATH        := $(DIST_PATH)
+
+# Recursively include all the makefile fragments in the framework itself.
+-include $(addsuffix /$(FRAGMENT_MK), $(FRAME_PATH))
+
+# Now set PARENT_PATH to $(DIST_PATH)/config in preparation to include the
+# fragments in the configuration sub-directory.
+PARENT_PATH        := $(DIST_PATH)/$(CONFIG_DIR)
+
+# Recursively include all the makefile fragments in the configuration
+# sub-directory.
+-include $(addsuffix /$(FRAGMENT_MK), $(CONFIG_PATH))
+
+# Create a list of the makefile fragments.
+MAKEFILE_FRAGMENTS := $(addsuffix /$(FRAGMENT_MK), $(FRAGMENT_DIR_PATHS))
+
+# Detect whether we actually got any makefile fragments. If we didn't, then it
+# is likely that the user has not yet generated them (via configure).
+ifeq ($(strip $(MAKEFILE_FRAGMENTS)),)
+MAKEFILE_FRAGMENTS_PRESENT := no
+else
+MAKEFILE_FRAGMENTS_PRESENT := yes
+endif
+
+
+
+#
+# --- Compiler include path definitions ----------------------------------------
+#
+
+# Expand the fragment paths that contain .h files to attain the set of header
+# files present in all fragment paths.
+MK_HEADER_FILES := $(foreach frag_path, $(FRAGMENT_DIR_PATHS), \
+                                        $(wildcard $(frag_path)/*.h))
+
+# Strip the leading, internal, and trailing whitespace from our list of header
+# files. This makes the "make install-headers" much more readable.
+MK_HEADER_FILES := $(strip $(MK_HEADER_FILES))
+
+# Expand the fragment paths that contain .h files, and take the first
+# expansion. Then, strip the header filename to leave the path to each header
+# location. Notice this process even weeds out duplicates! Add the config
+# directory manually since it contains FLA_config.h.
+MK_HEADER_DIR_PATHS := $(dir $(foreach frag_path, $(FRAGMENT_DIR_PATHS), \
+                                       $(firstword $(wildcard $(frag_path)/*.h))))
+
+# Add -I to each header path so we can specify our include search paths to the
+# C compiler.
+INCLUDE_PATHS   := $(strip $(patsubst %, -I%, $(MK_HEADER_DIR_PATHS)))
+CFLAGS          := $(CFLAGS) $(INCLUDE_PATHS)
+
+# BLIS library and header path. This is simply wherever it was installed.
+BLIS_INC_PATH  := $(INSTALL_PREFIX)/include/blis
+
+CL_OPTS  = -I$(BLIS_INC_PATH) -DCBLAS -DBLIS_TEST_DSP
+
+COMMON_FOLDER = ../../../examples/dsponly/common
+
+testfiles_obj = ticblas_config.obj fc_config_c6678.obj \
+                test_addm.obj      test_dotxaxpyf.obj     test_her2.obj     test_scal2v.obj  test_syr2k.obj \
+                test_addv.obj      test_dotxf.obj         test_her2k.obj    test_scalm.obj   test_syr.obj \
+                test_axpy2v.obj    test_dotxv.obj         test_her.obj      test_scalv.obj   test_syrk.obj \
+                test_axpyf.obj     test_gemm.obj          test_herk.obj     test_setm.obj    test_trmm3.obj \
+                test_axpym.obj     test_gemmtrsm_ukr.obj  test_libblis.obj  test_setv.obj    test_trmm.obj \
+                test_axpyv.obj     test_gemm_ukr.obj      test_normfm.obj   test_subm.obj    test_trmv.obj \
+                test_copym.obj     test_gemv.obj          test_normfv.obj   test_subv.obj    test_trsm.obj \
+                test_copyv.obj     test_ger.obj           test_randm.obj    test_symm.obj    test_trsm_ukr.obj \
+                test_dotaxpyv.obj  test_hemm.obj          test_randv.obj    test_symv.obj    test_trsv.obj \
+                test_dotv.obj      test_hemv.obj          test_scal2m.obj   test_syr2.obj
+
+outfile = ../blistestDSP.out
+
+include $(COMMON_FOLDER)/Makefile.common
+
+%.obj: ../src/%.c
+       $(CL) $(CL_OPTS) $<
+       echo Compiling $<
index 33ef0c8192fb6dc47aff4544df5003077883c6d7..8748928932171f4b26731d0f56a0d80eb7aadf97 100644 (file)
@@ -439,7 +439,9 @@ void libblis_test_gemm_impl( iface_t   iface,
           cblas_c     = (float *) bli_obj_buffer( *c );
 
           //printf("test_gemm %d %d %d %d %d, 0x%x, 0x%x, 0x%x\n", order, transA, transB, lda, ldb, (unsigned int)cblas_a,(unsigned int)cblas_b,(unsigned int)cblas_c);
+           //printf("Start sgemm for (m,k,n) = (%d,%d,%d) \n", m, k, n);
           cblas_sgemm(order, transA, transB, m, n, k, *cblas_alpha, cblas_a, lda, cblas_b, ldb, *cblas_beta, cblas_c, ldc);
+           //printf("sgemm for (m,k,n) = (%d,%d,%d) finished.\n", m, k, n);
 
        }
        else if (bli_obj_is_double( *a ))
@@ -481,7 +483,9 @@ void libblis_test_gemm_impl( iface_t   iface,
                   cblas_b     = bli_obj_buffer( *b );
                   cblas_c     = bli_obj_buffer( *c );
 
+           //printf("Start zgemm for (m,k,n) = (%d,%d,%d) \n", m, k, n);
            cblas_zgemm(order, transA, transB, m, n, k, cblas_alpha, cblas_a, lda, cblas_b, ldb, cblas_beta, cblas_c, ldc);
+           //printf("zgemm for (m,k,n) = (%d,%d,%d) finished.\n", m, k, n);
        }
 #else
                bli_gemm( alpha, a, b, beta, c );
index 3281c4bd4989258b8237da4ceddfca032d6983d5..1a0a9d9d827e56ec501134d8df725ab0692d8a92 100644 (file)
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 */
 
 #include "blis.h"
 #include "test_libblis.h"
 
+/* ticblas init and finalize functions,
+   defined in ../../../examples/dsponly/common/ticblas_config.c */
+extern void cleanup_after_ticblas();
+extern void prepare_for_ticblas();
 
 // Global variables.
 char libblis_test_binary_name[ MAX_BINARY_NAME_LENGTH + 1 ];
@@ -58,7 +61,9 @@ int main( int argc, char** argv )
        test_ops_t    ops;
 
        // Initialize libblis.
-       bli_init();
+       //bli_init();
+    /* Configure memory and initialize TI CBLAS */
+    prepare_for_ticblas();
 
        // Initialize some strings.
        libblis_test_init_strings();
@@ -94,7 +99,9 @@ int main( int argc, char** argv )
        libblis_test_level3_ops( &params, &ops );
 
        // Finalize libblis.
-       bli_finalize();
+       //bli_finalize();
+    /* Finalize TI CBLAS and reconfigure memory */
+    cleanup_after_ticblas();
 
        // Return peacefully.
        return 0;
@@ -2128,7 +2135,8 @@ void libblis_test_parse_command_line( int argc, char** argv )
        char   opt_ch;
 
        // Copy the binary name to a global string so we can use it later.
-       strncpy( libblis_test_binary_name, argv[0], MAX_BINARY_NAME_LENGTH );
+       //strncpy( libblis_test_binary_name, argv[0], MAX_BINARY_NAME_LENGTH );
+       strncpy( libblis_test_binary_name, "BlisTestSuite", MAX_BINARY_NAME_LENGTH );
 
        // Process all option arguments until we get a -1, which means we're done.
 #ifndef BLIS_ENABLE_C66X_BUILD
index 054bae4c16e4897f828ba9cf6e58ff3540ae2c0d..4ebf9ce9e8b3383d367a158f021bbf0c20763b17 100644 (file)
 #include <unistd.h>
 #endif
 
-// To enable Multiple threads making BLAS calls
+#ifndef BLIS_TEST_DSP
+// To enable Multiple threads making BLAS calls (for ARM only)
 #define BLIS_ENABLE_MULTITHREAD_TEST
-
+#endif
 
 
 //
index eceae1975505ac4ed9bd030e9910654a39a6c4d2..e99c2b91a7bfe2029611ad26f815905349b97156 100644 (file)
@@ -183,8 +183,8 @@ void libblis_test_scalv_experiment( test_params_t* params,
                bli_copyv( &y[i], &y_save[i] );
        }
 #else
-       bli_randv( &y[i] );
-       bli_copyv( &y[i], &y_save[i] );
+       bli_randv( &y );
+       bli_copyv( &y, &y_save );
 #endif
 
 
index f2e4371d53d96ca8c0c89b58b310433cecd947a8..8f0cb335d3cd798c8f589bdbffed7ea3d23dcf95 100644 (file)
@@ -298,7 +298,7 @@ void libblis_test_trsv_experiment( test_params_t* params,
        libblis_test_trsv_check( &alpha, &a, &x, &x_save, resid );
 
        // Zero out performance and residual if output vector is empty.
-       libblis_test_check_empty_problem( &y, perf, resid );
+       libblis_test_check_empty_problem( &x, perf, resid );
 #endif
 
        // Free the test objects.
diff --git a/build_opencl_k2h_large.sh b/build_opencl_k2h_large.sh
new file mode 100755 (executable)
index 0000000..c99bf62
--- /dev/null
@@ -0,0 +1,12 @@
+source setup_env_devkit.sh
+cd ../../libarch_intgit/libarch
+make clean
+make TARGET=SOC_K2H LIBOS=LIB_OPENCL
+cd -
+make cleanARMplusDSP MEM_MODEL=Large TARGET=SOC_K2H LIBOS=LIB_OPENCL
+make ARMplusDSP MEM_MODEL=Large TARGET=SOC_K2H LIBOS=LIB_OPENCL
+make installARMplusDSPlib DESTDIR=~/proclibs/linalg_opencl_k2h_Large_install
+export LINALG_DIR=~/proclibs/linalg_opencl_k2h_Large_install
+cd examples/arm+dsp/matmpy
+make clean
+make
diff --git a/build_opencl_k2h_medium.sh b/build_opencl_k2h_medium.sh
new file mode 100755 (executable)
index 0000000..f0965a7
--- /dev/null
@@ -0,0 +1,12 @@
+source setup_env_devkit.sh
+cd ../../libarch_intgit/libarch
+make clean
+make TARGET=SOC_K2H LIBOS=LIB_OPENCL
+cd -
+make cleanARMplusDSP MEM_MODEL=Medium TARGET=SOC_K2H LIBOS=LIB_OPENCL
+make ARMplusDSP MEM_MODEL=Medium TARGET=SOC_K2H LIBOS=LIB_OPENCL
+make installARMplusDSPlib DESTDIR=~/proclibs/linalg_opencl_k2h_medium_install
+export LINALG_DIR=~/proclibs/linalg_opencl_k2h_medium_install
+cd examples/arm+dsp/matmpy
+make clean
+make
diff --git a/build_opencl_k2h_small.sh b/build_opencl_k2h_small.sh
new file mode 100755 (executable)
index 0000000..790ab9d
--- /dev/null
@@ -0,0 +1,12 @@
+source setup_env_devkit.sh
+cd ../../libarch_intgit/libarch
+make clean
+make TARGET=SOC_K2H LIBOS=LIB_OPENCL
+cd -
+make cleanARMplusDSP MEM_MODEL=Small TARGET=SOC_K2H LIBOS=LIB_OPENCL
+make ARMplusDSP MEM_MODEL=Small TARGET=SOC_K2H LIBOS=LIB_OPENCL
+make installARMplusDSPlib DESTDIR=~/proclibs/linalg_opencl_k2h_small_install
+export LINALG_DIR=~/proclibs/linalg_opencl_k2h_small_install
+cd examples/arm+dsp/matmpy
+make clean
+make
diff --git a/build_rtos_c6678_small.sh b/build_rtos_c6678_small.sh
new file mode 100755 (executable)
index 0000000..6302fb2
--- /dev/null
@@ -0,0 +1,11 @@
+cd ../../libarch_intgit/libarch
+make clean
+make TARGET=SOC_C6678 LIBOS=LIB_RTOS
+cd -
+make cleanDSPlibs MEM_MODEL=Small TARGET=SOC_C6678 LIBOS=LIB_RTOS
+make DSPlibs MEM_MODEL=Small TARGET=SOC_C6678 LIBOS=LIB_RTOS
+make installDSPlib DESTDIR=~/proclibs/linalg_rtos_c6678_small_install
+export LINALG_DIR=~/proclibs/linalg_rtos_c6678_small_install
+cd examples/dsponly/dgemm_test
+make clean
+make MEM_MODEL=Small TARGET=SOC_C6678
index 0e76de80b2a731f07ff7145a2586d8a626300f92..49afda1448b23d233f333b388f24f5dc366736ee 100644 (file)
@@ -3,23 +3,45 @@
 default: all
 
 # Configuration file used (without the .cfg extension)
-CFGDIR     = omp_config
+CFGDIR     = $(COMMON_FOLDER)/omp_config
 
 # Set BUILD_TYPE to debug/release to pick appropriate libraries
 BUILD_TYPE  = release
 
 # Platform file
+ifneq ($(MAKECMDGOALS),clean)
+
 ifeq ($(TARGET),SOC_AM572x)
-export PDK_DIR=$(AM572_PDK_DIR)
 XDCPLATFORM = ti.runtime.openmp.platforms.am57x
 else ifeq ($(TARGET),SOC_C6678)
-export PDK_DIR=$(C6678_PDK_DIR)
 XDCPLATFORM = ti.runtime.openmp.platforms.evm6678
 else ifeq ($(TARGET),SOC_K2H)
-export PDK_DIR=$(C6636_PDK_DIR)
 XDCPLATFORM = ti.runtime.openmp.platforms.evmTCI6636K2H
+else
+$(call error, ERROR - TARGET NOT DEFINED. Must specify one of: TARGET=SOC_K2H,TARGET=SOC_C6678,TARGET=SOC_AM572X)
+endif
+
+ifeq ($(MEM_MODEL),Large)
+    CL_OPTS += -DMEM_MODEL_Large
+else ifeq ($(MEM_MODEL),Small)
+    CL_OPTS += -DMEM_MODEL_Small
+else ifeq ($(MEM_MODEL),Medium)
+    CL_OPTS += -DMEM_MODEL_Medium
+else
+$(call error, ERROR - MEM_MODEL NOT DEFINED. Must specify one of: MEM_MODEL=Large, MEM_MODEL=Medium, MEM_MODEL=Small)
+endif
+
+ifeq ($(BUILD_TYPE),debug)
+    CL_OPTS += -g --optimize_with_debug=on
+else
+    CL_OPTS += -o3
 endif
 
+endif
+
+CL_OPTS  += -@ $(OPT_CMD) -mv6600 --omp -I $(OMP_DIR)/packages/ti/runtime/openmp
+CL_OPTS  += -I$(FC_DIR)/packages -I$(XDAIS_DIR)/packages -I$(EDMA3_DIR)/packages -I$(LIBARCH_DIR)/include -I$(LINALG_DIR)/include
+CL_OPTS  += -D$(TARGET) -DLIB_RTOS
 
 # Include . to find config.bld
 XDCPATH = $(PDK_DIR)/packages;$(OMP_DIR)/packages;$(BIOS_DIR)/packages;$(IPC_DIR)/packages;$(FC_DIR)/packages;$(XDAIS_DIR)/packages;$(EDMA3_DIR)/packages;.
@@ -39,32 +61,32 @@ CL        = $(CGTROOT)/bin/cl6x
 RTS_LIB   = $(CGTROOT)/lib/libc.a
 LIBARCH_LIB = $(LIBARCH_DIR)/lib/libArch.ae66
 LINALG_LIB  = $(LINALG_DIR)/lib/libcblas.ae66
-
-ifeq ($(BUILD_TYPE),debug)
-    CL_OPTS += -g --optimize_with_debug=on
-else
-    CL_OPTS += -o3
-endif
-
  
 all: $(outfile)
 
 # Generate and build libomp config packages
-libomp_config:
+libomp_config: $(CFGDIR).cfg
        @echo making $(CFGDIR) files
-       cp $(COMMON_FOLDER)/$(CFGDIR).cfg .
        $(XS) --xdcpath "$(XDCPATH)" xdc.tools.configuro -c $(CGTROOT) --cb -t $(XDCTARGET) -p $(XDCPLATFORM) -r $(BUILD_TYPE) $(CFGDIR).cfg
 
 libomp_clean:
        @echo Removing $(CFGDIR)
        @rm -rf $(CFGDIR)/
 
-%.out: $(testfiles) libomp_config
-       echo compiling $<
-       $(CL) $(CL_OPTS) $(testfiles) -z $(LNK_OPTS) -o $@ -m $*.map $(LNK_CMD) $(LNK_CMD_FC) $(RTS_LIB) $(LIBARCH_LIB) $(LINALG_LIB)
+$(outfile): libomp_config $(testfiles_obj)
+       echo generating $(outfile)
+       $(CL) $(CL_OPTS) -z $(LNK_OPTS) -m $*.map $(LNK_CMD) $(LNK_CMD_FC) $(testfiles_obj) $(RTS_LIB) $(LIBARCH_LIB) $(LINALG_LIB) --output_file=$(outfile)
+
+ticblas_config.obj: $(COMMON_FOLDER)/ticblas_config.c
+       $(CL) $(CL_OPTS) $<
+       echo Compiling $<
+
+fc_config_c6678.obj: $(COMMON_FOLDER)/fc_config_c6678.c
+       $(CL) $(CL_OPTS) $<
+       echo Compiling $<
 
 clean: libomp_clean
-       @rm -rf *.map *.out *.obj *.mak $(CFGDIR).cfg
+       @rm -rf *.map *.out *.obj *.mak
 
 #
 # Cleans libomp artifacts
index a07396e345954896f93f42a454e08fed508d9f26..9e8838ede1d707bc2c84c770e5f5d1df2197de99 100644 (file)
@@ -13,7 +13,6 @@ SECTIONS
         "edma3_lld_rm.ae66" (.fardata)
 
         "edmamgr.ae66"      (.far)
-        "ecpy.ae66"         (.far)
         "edma3Chan.ae66"    (.far)
         "edma3.ae66"       (.far)
         "rman.ae66"            (.far)
index 63af9a86efa7a8b6ec44caa24fc230df05abae90..e82f0aad77fd923d2782a2d7050719ea6d6d7cf6 100644 (file)
@@ -78,8 +78,6 @@ program.sectMap[".blas_l2"].loadSegment     = "L2SRAM";
 program.sectMap[".blas_msmc"].loadSegment   = "MSMCSRAM";
 
 // Code sections shared by cores - place in shared memory to avoid duplication
-//program.sectMap[".switch"].loadSegment      = program.platform.codeMemory;
-//program.sectMap[".text"].loadSegment        = program.platform.codeMemory;
 program.sectMap[".switch"].loadSegment      = "DDR3";
 program.sectMap[".text"].loadSegment        = "DDR3";
 
@@ -87,12 +85,11 @@ program.sectMap[".text"].loadSegment        = "DDR3";
 var deviceName = String(Program.cpu.deviceName);
 if  (deviceName.search("DRA7XX") == -1) { program.stack = 0x10000; } 
 else                                    { program.stack = 0x8000;  }
-program.sectMap[".stack"].loadSegment       = "L2SRAM";
+program.sectMap[".stack"].loadSegment      = "L2SRAM";
 
 // Since there are no arguments passed to main, set .args size to 0
 program.argSize = 0;
 
-
 /********************************/
 /* OPENMP RUNTIME CONFIGURATION */
 /********************************/
index aaba5a24583b79409a522f133634fc96738e5b0c..65972053151ea337a669163538d42b9e1e2c29a1 100644 (file)
 #include <cblas.h>
 
 /* use small memory model of BLAS */
-#define BLAS_L2_BUF_SIZE   (183*1024UL)        /* 183KB */
-#define BLAS_MSMC_BUF_SIZE (2*1024*1024UL)     /* 2MB   */
-#define BLAS_L3_DDR_SIZE   (5120)              /* 5KB   */
+#ifdef MEM_MODEL_Small
+#define BLAS_L2_BUF_SIZE   (183*1024UL)        
+#define BLAS_MSMC_BUF_SIZE (2*1024*1024UL)     
+#define BLAS_L3_DDR_SIZE   (5120)              
+#else
+#  if MEM_MODEL_Large
+#    define BLAS_L2_BUF_SIZE   (768*1024UL)    
+#    define BLAS_MSMC_BUF_SIZE (4608*1024UL)       /* 4.5MB */
+#    define BLAS_L3_DDR_SIZE   (5120)              
+#  else
+#    error "MEM_MODEL undefined! Must be one of MEM_MODEL_Small or MEM_MODEL_Large"
+#  endif
+#endif
 
 //#define BLAS_L2_BUF_SIZE   (384*1024UL)        /* 384KB */
 //#define BLAS_MSMC_BUF_SIZE (4718592UL)         /* 4.5MB   */
@@ -137,6 +147,9 @@ int reconfig_mem_after_ticblas()
 } /* reconfig_mem_after_ticblas */
 
 
+/*==============================================================================
+ * This function prepares for calling TI's CBLAS
+ *============================================================================*/
 void prepare_for_ticblas()
 {
   int err;
index ecaf8b7a6a661368985835677485996512cbab25..23ea2c0588aca4a7732dc9a50a5d766c13713eca 100644 (file)
@@ -1,11 +1,14 @@
 # Default to RTSC mode
 
 COMMON_FOLDER = ../common
-testfiles = dgemm_test.c $(COMMON_FOLDER)/ticblas_config.c $(COMMON_FOLDER)/fc_config_c6678.c 
+#testfiles = dgemm_test.c $(COMMON_FOLDER)/ticblas_config.c $(COMMON_FOLDER)/fc_config_c6678.c 
+testfiles_obj = dgemm_test.obj ticblas_config.obj fc_config_c6678.obj 
 outfile = dgemm_test.out
-
-CL_OPTS   = -@ $(OPT_CMD) -mv6600 --omp -I $(OMP_DIR)/packages/ti/runtime/openmp
-CL_OPTS  += -I$(FC_DIR)/packages -I$(XDAIS_DIR)/packages -I$(EDMA3_DIR)/packages -I$(LIBARCH_DIR)/include -I$(LINALG_DIR)/include
-CL_OPTS  += -D$(TARGET) -DLIB_RTOS
+CL_OPTS = 
 
 include $(COMMON_FOLDER)/Makefile.common
+
+%.obj: %.c
+       $(CL) $(CL_OPTS) $<
+       echo Compiling $<
+
index dddd57f3dafa548e3bbeefc8314cc407c28a4323..5620e256ab8d6babf8173ba6698cd7a26f3192b5 100644 (file)
@@ -26,7 +26,7 @@
  *   THE POSSIBILITY OF SUCH DAMAGE.
  *****************************************************************************/
 /******************************************************************************
-* FILE: dgemm_test.c
+* FILE: dgemm_test.c 
 ******************************************************************************/
 #include <omp.h>
 #include <string.h>
index 798c4b2bc8298091c93683d0b845ffbda15fa8aa..a60f5003ae996a2e34452bc7f7a5603ac2e82d79 100644 (file)
@@ -12,3 +12,4 @@ export XDC_DIR="/home/a0869574local/ti-rtos-sdk-12-08/xdctools_3_31_02_38_core"
 export IPC_DIR="/home/a0869574local/ti/processor-sdk-rtos-c667x-evm-02.00.01.07/ipc_3_41_00_08"
 export EDMA3_DIR="/home/a0869574local/ti/processor-sdk-rtos-c667x-evm-02.00.01.07/edma3_lld_02_12_01_22"
 export PATH="/home/a0869574local/yocoto/tisdk-rtos/sources/oe-core/scripts:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/usr/bin/arm-linux-gnueabi:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/c667x-evm/usr/bin/crossscripts:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/usr/sbin:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/usr/bin:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/sbin:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/bin:/home/a0869574local/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/bin:/home/a0869574local/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/bin:/home/a0869574local/yocoto/tisdk-rtos/sources/oe-core/scripts:/home/a0869574local/yocoto/tisdk-rtos/sources/bitbake/bin:/home/a0869574local/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/bin:/home/a0869574local/yocoto/tisdk-rtos/sources/oe-core/scripts:/home/a0869574local/yocoto/tisdk-rtos/sources/bitbake/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
+export LINALG_DIR=~/proclibs/linalg_rtos_c6678_small_install
index c9a830f10903ba71df943fb863ca8bfede2395b7..9d6c07a83d7cca837abce3ce8d0c8ac025380fc3 100644 (file)
@@ -1,15 +1,14 @@
 #!/bin/bash
 
-export CGTROOT="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/x86_64-arago-linux/usr/share/ti/cgt-c6x"
-export XDC_DIR="/home/a0869574local/ti-rtos-sdk-12-08/xdctools_3_31_02_38_core"
-export BIOS_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-sysbios-tree"
-export XDAIS_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-xdais-tree"
-export IPC_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-ipc-tree"
-export EDMA3_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-edma3lld-tree"
-export FC_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-framework-components-tree"
-export PDK_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-pdk-tree"
-export C6636_PDK_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-pdk-tree"
-export OMP_DIR="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.02.02/linux-devkit/sysroots/cortexa15hf-vfp-neon-linux-gnueabi/usr/share/ti/ti-omp-tree"
+export CGTROOT="/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/usr/share/ti/cgt-c6x"
+export XDC_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/xdctools_3_32_00_06_core"
+export BIOS_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/bios_6_45_00_20"
+export XDAIS_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/xdais_7_24_00_04"
+export IPC_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/ipc_3_42_00_01_eng"
+export EDMA3_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/edma3_lld_02_12_01_22"
+export FC_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/framework_components_3_40_01_04"
+export PDK_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/pdk_k2hk_4_0_1"
+export C6636_PDK_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/pdk_k2hk_4_0_1"
+export OMP_DIR="/home/a0869574local/ti/processor-sdk-rtos-k2hk-evm-02.00.02.02/openmp_dsp_k2x_2_02_00_02"
 export LIBARCH_DIR="/home/a0869574local/proclibs/libarch_intgit/libarch"
-
-export PATH="/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.01.07/linux-devkit/sysroots/x86_64-arago-linux/usr/share/ti/cgt-c6x/bin:/home/a0869574local/ti/processor-sdk-linux-k2hk-evm-02.00.01.07/linux-devkit/sysroots/x86_64-arago-linux/usr/bin:$PATH"
+export PATH="/home/a0869574local/yocoto/tisdk-rtos/sources/oe-core/scripts:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/usr/bin/arm-linux-gnueabi:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/c667x-evm/usr/bin/crossscripts:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/usr/sbin:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/usr/bin:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/sbin:/home/a0869574local/yocoto/tisdk-rtos/build/arago-tmp-external-linaro-toolchain/sysroots/x86_64-linux/bin:/home/a0869574local/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/bin:/home/a0869574local/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/bin:/home/a0869574local/yocoto/tisdk-rtos/sources/oe-core/scripts:/home/a0869574local/yocoto/tisdk-rtos/sources/bitbake/bin:/home/a0869574local/gcc-linaro-4.9-2015.05-x86_64_arm-linux-gnueabihf/bin:/home/a0869574local/yocoto/tisdk-rtos/sources/oe-core/scripts:/home/a0869574local/yocoto/tisdk-rtos/sources/bitbake/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"