Compare commits
214
Commits
v0.1alpha2.5
...
v0.2.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e01b3d4b54 | ||
|
|
cea1a885b5 | ||
|
|
f78eb335d6 | ||
|
|
2345bdec68 | ||
|
|
5f0117385e | ||
|
|
6caf1bab73 | ||
|
|
01e3c984ce | ||
|
|
6751f7b9a7 | ||
|
|
d5717a97ea | ||
|
|
b45d43d295 | ||
|
|
dcfb69c2b5 | ||
|
|
e85549ee11 | ||
|
|
789f205177 | ||
|
|
378acfe826 | ||
|
|
538c764d2b | ||
|
|
0f26a21624 | ||
|
|
5c1efa1149 | ||
|
|
ca4136cf41 | ||
|
|
3a26470fb7 | ||
|
|
6c5899dff5 | ||
|
|
2df2878dfc | ||
|
|
0b719945c5 | ||
|
|
b1a54a0107 | ||
|
|
08c177ca36 | ||
|
|
2573311308 | ||
|
|
1d72b8bf1b | ||
|
|
758e34efbb | ||
|
|
735ca38b8f | ||
|
|
f76a384841 | ||
|
|
9419a43a7f | ||
|
|
b695680a33 | ||
|
|
d0e731e8b8 | ||
|
|
48f075cfd5 | ||
|
|
3e87648de3 | ||
|
|
fe4ab95cd5 | ||
|
|
801383effe | ||
|
|
54cd65e47f | ||
|
|
a55821a2ec | ||
|
|
068861a927 | ||
|
|
d007cca61d | ||
|
|
a92895939e | ||
|
|
7bd1834d59 | ||
|
|
1b056c5328 | ||
|
|
e8306f623a | ||
|
|
3108a1853d | ||
|
|
25f1a573fd | ||
|
|
71d29fa3d0 | ||
|
|
50848e34ec | ||
|
|
4a5d08d0cf | ||
|
|
6fcdaa4387 | ||
|
|
699fc7641f | ||
|
|
3692b4d631 | ||
|
|
4b7677a916 | ||
|
|
5719b7a58d | ||
|
|
f22bfe6a55 | ||
|
|
551f478477 | ||
|
|
a430880729 | ||
|
|
a507b56ab1 | ||
|
|
f430e54daf | ||
|
|
47860cf002 | ||
|
|
13f5f18140 | ||
|
|
857a0fa0df | ||
|
|
0a958b6a02 | ||
|
|
b39c51195b | ||
|
|
853d16ed7e | ||
|
|
422359d09a | ||
|
|
544af1efec | ||
|
|
a6214c057e | ||
|
|
fe809c39f9 | ||
|
|
157cc54449 | ||
|
|
cbfacf9a10 | ||
|
|
fda5e0da8a | ||
|
|
98d004c50b | ||
|
|
037d995c4d | ||
|
|
e4a27d194e | ||
|
|
d34fce56e4 | ||
|
|
b8b922d334 | ||
|
|
88c272f6a7 | ||
|
|
6cfcb54a28 | ||
|
|
3ef96aa567 | ||
|
|
996dc6d1c8 | ||
|
|
61b1c2db5b | ||
|
|
34fd3b85a8 | ||
|
|
f76f952547 | ||
|
|
11b4a0e4b6 | ||
|
|
eefd30881c | ||
|
|
d3b67d0bd8 | ||
|
|
d6cab3f37e | ||
|
|
37edae1c90 | ||
|
|
90d6ad569d | ||
|
|
a4daa34db7 | ||
|
|
cfc2940412 | ||
|
|
a6adbb299d | ||
|
|
8cc7f86cf7 | ||
|
|
a53c6e2440 | ||
|
|
5199809bba | ||
|
|
a431042475 | ||
|
|
33941033e2 | ||
|
|
4e29b6ffc0 | ||
|
|
839b18aa26 | ||
|
|
a27339b244 | ||
|
|
10e25690b4 | ||
|
|
660d9e09f8 | ||
|
|
e9be1fdd2b | ||
|
|
44124d3055 | ||
|
|
14c3511e92 | ||
|
|
d647f751ee | ||
|
|
be1692d64f | ||
|
|
f404a17787 | ||
|
|
fc4927fa0f | ||
|
|
06e208c5c3 | ||
|
|
52485e5fd0 | ||
|
|
dee74174ff | ||
|
|
e7846547be | ||
|
|
7f89edee3e | ||
|
|
11cc9dc151 | ||
|
|
4236d0d938 | ||
|
|
8218cbea2a | ||
|
|
5b7f443cf4 | ||
|
|
0e39699c8c | ||
|
|
60a58e03ea | ||
|
|
e154920bc6 | ||
|
|
fcb89ad94d | ||
|
|
d48a1d1928 | ||
|
|
d02171b494 | ||
|
|
c8a5d4b86f | ||
|
|
006200c9a4 | ||
|
|
5d657c6e67 | ||
|
|
14428af879 | ||
|
|
5656cca4f3 | ||
|
|
08570c4248 | ||
|
|
b2bdb6f7c4 | ||
|
|
9037782a9c | ||
|
|
f93318a6c8 | ||
|
|
001c2c322b | ||
|
|
f4eee224d8 | ||
|
|
74306b54d7 | ||
|
|
fd2ee0c9e2 | ||
|
|
78914475ae | ||
|
|
435420d6d5 | ||
|
|
03b0eb19f7 | ||
|
|
910338f071 | ||
|
|
fad089ffff | ||
|
|
19a48b82cf | ||
|
|
09b2417848 | ||
|
|
5cbbc496b0 | ||
|
|
09f74f6d23 | ||
|
|
2b3eae6cc7 | ||
|
|
0b89a7a92d | ||
|
|
91ce66a0a8 | ||
|
|
ccdba3c771 | ||
|
|
3871b6a86d | ||
|
|
83ecfbb9b3 | ||
|
|
31c836ac25 | ||
|
|
3afedbf6f0 | ||
|
|
b4ec36debc | ||
|
|
1f15bee02a | ||
|
|
dff146e306 | ||
|
|
722dd08703 | ||
|
|
d047afe615 | ||
|
|
a7a7751be7 | ||
|
|
0bbf955d4c | ||
|
|
70abe10fc0 | ||
|
|
0a696bd4ce | ||
|
|
8da6fdc2ce | ||
|
|
7af0139a09 | ||
|
|
8e53b57bb2 | ||
|
|
b281f3dee4 | ||
|
|
a4292976e9 | ||
|
|
c2dad58ad1 | ||
|
|
66904fc4e8 | ||
|
|
8163ab7e55 | ||
|
|
ef6f7f32ae | ||
|
|
285e69e2d1 | ||
|
|
d1baf14a64 | ||
|
|
0884f6b78d | ||
|
|
2d78fb05c8 | ||
|
|
b95ad4cfaf | ||
|
|
3bbe3ddb31 | ||
|
|
a32e56500a | ||
|
|
c1e618ea2d | ||
|
|
9fe3049de6 | ||
|
|
831858b883 | ||
|
|
e08cfaf9ca | ||
|
|
ee4bb8bd25 | ||
|
|
7fa3d23dd9 | ||
|
|
9679dd077e | ||
|
|
048742f38f | ||
|
|
d238a768ab | ||
|
|
16fc083322 | ||
|
|
3c856c0c1a | ||
|
|
dc9c69db93 | ||
|
|
0389b631fa | ||
|
|
64fa709d1f | ||
|
|
4727fe8abf | ||
|
|
74d4cdb81a | ||
|
|
7906146836 | ||
|
|
3274ff47b8 | ||
|
|
a059c553a1 | ||
|
|
23e182ca7c | ||
|
|
a15bc95824 | ||
|
|
74a3f63489 | ||
|
|
09f49fa891 | ||
|
|
cb0214787b | ||
|
|
2e8cdd1542 | ||
|
|
b29d327d14 | ||
|
|
c8360e3ae5 | ||
|
|
33313b0221 | ||
|
|
68532fa9ec | ||
|
|
708d2b6255 | ||
|
|
e72113f06a | ||
|
|
14f81da375 | ||
|
|
fc21f7ad28 | ||
|
|
1c96d345e2 |
@@ -1,16 +1,25 @@
|
||||
*.obj
|
||||
*.lib
|
||||
*.dll
|
||||
*.dylib
|
||||
*.def
|
||||
*.o
|
||||
lapack-3.1.1
|
||||
lapack-3.1.1.tgz
|
||||
lapack-3.4.1
|
||||
lapack-3.4.1.tgz
|
||||
lapack-3.4.2
|
||||
lapack-3.4.2.tgz
|
||||
*.so
|
||||
*.a
|
||||
.svn
|
||||
*~
|
||||
lib.grd
|
||||
nohup.out
|
||||
config.h
|
||||
Makefile.conf
|
||||
Makefile.conf_last
|
||||
config_last.h
|
||||
getarch
|
||||
getarch_2nd
|
||||
utest/openblas_utest
|
||||
|
||||
+111
@@ -1,4 +1,115 @@
|
||||
OpenBLAS ChangeLog
|
||||
====================================================================
|
||||
Version 0.2.5
|
||||
26-Nov-2012
|
||||
common:
|
||||
* Added NO_SHARED flag to disable generating the shared library.
|
||||
* Compile LAPACKE with ILP64 modle when INTERFACE64=1 (#158)
|
||||
* Export LAPACK 3.4.2 symbols in shared library. (#147)
|
||||
* Only detect the number of physical CPU cores on Mac OSX. (#157)
|
||||
* Fixed NetBSD build. (#155)
|
||||
* Fixed compilation with TARGET=GENERIC. (#160)
|
||||
x86/x86-64:
|
||||
* Restore the original CPU affinity when calling
|
||||
openblas_set_num_threads(1) (#153)
|
||||
* Fixed a SEGFAULT bug in dgemv_t when m is very large.(#154)
|
||||
MIPS64:
|
||||
|
||||
====================================================================
|
||||
Version 0.2.4
|
||||
8-Oct-2012
|
||||
common:
|
||||
* Upgraded LAPACK to 3.4.2 version. (#145)
|
||||
* Provided support for passing CFLAGS, FFLAGS, PFLAGS,
|
||||
FPFLAGS to make. (#137)
|
||||
* f77blas.h:compatibility for compilers without C99 complex
|
||||
number support. (#141)
|
||||
x86/x86-64:
|
||||
* Added NO_AVX flag. Check OS supporting AVX on runtime. (#139)
|
||||
* Fixed zdot incompatibility ABI issue with GCC 4.7 on
|
||||
Windows 32-bit. (#140)
|
||||
MIPS64:
|
||||
* Fixed the generation of shared library bug.
|
||||
* Fixed the detection bug on the Loongson 3A server.
|
||||
====================================================================
|
||||
Version 0.2.3
|
||||
20-Aug-2012
|
||||
common:
|
||||
* Fixed LAPACK unstable bug about ?laswp. (#130)
|
||||
* Fixed the shared library bug about unloading the library on
|
||||
Linux (#132).
|
||||
* Fixed the compilation failure on BlueGene/P (TARGET=PPC440FP2)
|
||||
Please use gcc and IBM xlf. (#134)
|
||||
x86/x86-64:
|
||||
* Supported goto_set_num_threads and openblas_set_num_threads
|
||||
APIs in Windows. They can set the number of threads on runtime.
|
||||
|
||||
====================================================================
|
||||
Version 0.2.2
|
||||
6-July-2012
|
||||
common:
|
||||
* Fixed exporting DLL functions bug on Windows/MingW
|
||||
* Support GNU Hurd (Thank Sylvestre Ledru)
|
||||
* Support kfreebsd kernel (Thank Sylvestre Ledru)
|
||||
x86/x86-64:
|
||||
* Support Intel Sandy Bridge 22nm desktop/mobile CPU
|
||||
SPARC:
|
||||
* Improve the detection of SPARC (Thank Sylvestre Ledru)
|
||||
|
||||
====================================================================
|
||||
Version 0.2.1
|
||||
30-Jun-2012
|
||||
common:
|
||||
x86/x86-64:
|
||||
* Fixed the SEGFAULT bug about hyper-theading
|
||||
* Support AMD Bulldozer by using GotoBLAS2 AMD Barcelona codes
|
||||
|
||||
====================================================================
|
||||
Version 0.2.0
|
||||
26-Jun-2012
|
||||
common:
|
||||
* Removed the limitation (64) of numbers of CPU cores.
|
||||
Now, it supports 256 cores at max.
|
||||
* Supported clang compiler.
|
||||
* Fixed some build bugs on FreeBSD
|
||||
x86/x86-64:
|
||||
* Optimized Level-3 BLAS on Intel Sandy Bridge x86-64 by AVX instructions.
|
||||
Please use gcc >= 4.6 or clang >=3.1.
|
||||
* Support AMD Bobcat by using GotoBLAS2 AMD Barcelona codes.
|
||||
|
||||
====================================================================
|
||||
Version 0.1.1
|
||||
29-Apr-2012
|
||||
common:
|
||||
* Upgraded LAPACK to 3.4.1 version. (Thank Zaheer Chothia)
|
||||
* Supported LAPACKE, a C interface to LAPACKE. (Thank Zaheer Chothia)
|
||||
* Fixed the build bug (MD5 and download) on Mac OSX.
|
||||
* Auto download CUnit 2.1.2-2 from SF.net with UTEST_CHECK=1.
|
||||
* Fxied the compatibility issue for compilers without C99 complex number
|
||||
(e.g. Visual Studio)
|
||||
x86/x86_64:
|
||||
* Auto-detect Intel Sandy Bridge Core i7-3xxx & Xeon E7 Westmere-EX.
|
||||
* Test alpha=Nan in dscale.
|
||||
* Fixed a SEGFAULT bug in samax on x86 windows.
|
||||
|
||||
====================================================================
|
||||
Version 0.1.0
|
||||
23-Mar-2012
|
||||
common:
|
||||
* Set soname of shared library on Linux.
|
||||
* Added LIBNAMESUFFIX flag in Makefile.rule. The user can use
|
||||
this flag to control the library name, e.g. libopenblas.a,
|
||||
libopenblas_ifort.a or libopenblas_omp.a.
|
||||
* Added GEMM_MULTITHREAD_THRESHOLD flag in Makefile.rule.
|
||||
The lib use single thread in GEMM function with small matrices.
|
||||
x86/x86_64:
|
||||
* Used GEMV SSE/SSE2 kernels on x86 32-bit.
|
||||
* Exported CBLAS functions in Windows DLL.
|
||||
MIPS64:
|
||||
* Completed Level-3 BLAS optimization on Loongson 3A CPU.
|
||||
* Improved GEMV performance on Loongson 3A CPU.
|
||||
* Improved Level-3 BLAS performance on Loongson 3B CPU. (EXPERIMENT)
|
||||
|
||||
====================================================================
|
||||
Version 0.1 alpha2.5
|
||||
19-Feb-2012
|
||||
|
||||
@@ -90,6 +90,15 @@
|
||||
number of threads will consume extra resource. I recommend you to
|
||||
specify minimum number of threads.
|
||||
|
||||
1.9 Q I have segfaults when I compile with USE_OPENMP=1. What's wrong?
|
||||
|
||||
A This may be related to a bug in the Linux kernel 2.6.32. Try applying
|
||||
the patch segaults.patch using
|
||||
|
||||
patch < segfaults.patch
|
||||
|
||||
and see if the crashes persist. Note that this patch will lead to many
|
||||
compiler warnings.
|
||||
|
||||
2. Architecture Specific issue or Implementation
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@@ -3,7 +3,7 @@ include ./Makefile.system
|
||||
|
||||
BLASDIRS = interface driver/level2 driver/level3 driver/others
|
||||
|
||||
ifndef DYNAMIC_ARCH
|
||||
ifneq ($(DYNAMIC_ARCH), 1)
|
||||
BLASDIRS += kernel
|
||||
endif
|
||||
|
||||
@@ -26,7 +26,7 @@ endif
|
||||
|
||||
SUBDIRS_ALL = $(SUBDIRS) test ctest utest exports benchmark ../laswp ../bench
|
||||
|
||||
.PHONY : all libs netlib test ctest shared install
|
||||
.PHONY : all libs netlib test ctest shared install
|
||||
.NOTPARALLEL : all libs prof lapack-test install
|
||||
|
||||
all :: libs netlib tests shared
|
||||
@@ -80,29 +80,30 @@ endif
|
||||
@echo
|
||||
|
||||
shared :
|
||||
ifndef NO_SHARED
|
||||
ifeq ($(OSNAME), Linux)
|
||||
$(MAKE) -C exports so
|
||||
-ln -fs $(LIBSONAME) libopenblas.so
|
||||
-ln -fs $(LIBSONAME) $(LIBPREFIX).so
|
||||
-ln -fs $(LIBSONAME) $(LIBPREFIX).so.$(MAJOR_VERSION)
|
||||
endif
|
||||
ifeq ($(OSNAME), FreeBSD)
|
||||
$(MAKE) -C exports so
|
||||
-ln -fs $(LIBSONAME) libopenblas.so
|
||||
-ln -fs $(LIBSONAME) $(LIBPREFIX).so
|
||||
endif
|
||||
ifeq ($(OSNAME), NetBSD)
|
||||
$(MAKE) -C exports so
|
||||
-ln -fs $(LIBSONAME) libopenblas.so
|
||||
-ln -fs $(LIBSONAME) $(LIBPREFIX).so
|
||||
endif
|
||||
ifeq ($(OSNAME), Darwin)
|
||||
$(MAKE) -C exports dyn
|
||||
-ln -fs $(LIBDYNNAME) libopenblas.dylib
|
||||
-ln -fs $(LIBDYNNAME) $(LIBPREFIX).dylib
|
||||
endif
|
||||
ifeq ($(OSNAME), WINNT)
|
||||
$(MAKE) -C exports dll
|
||||
-ln -fs $(LIBDLLNAME) libopenblas.dll
|
||||
endif
|
||||
ifeq ($(OSNAME), CYGWIN_NT)
|
||||
$(MAKE) -C exports dll
|
||||
-ln -fs $(LIBDLLNAME) libopenblas.dll
|
||||
endif
|
||||
endif
|
||||
|
||||
tests :
|
||||
@@ -130,7 +131,7 @@ endif
|
||||
ifeq ($(NOFORTRAN), 1)
|
||||
$(error OpenBLAS: Detecting fortran compiler failed. Please install fortran compiler, e.g. gfortran, ifort, openf90.)
|
||||
endif
|
||||
-ln -fs $(LIBNAME) libopenblas.$(LIBSUFFIX)
|
||||
-ln -fs $(LIBNAME) $(LIBPREFIX).$(LIBSUFFIX)
|
||||
for d in $(SUBDIRS) ; \
|
||||
do if test -d $$d; then \
|
||||
$(MAKE) -C $$d $(@F) || exit 1 ; \
|
||||
@@ -146,7 +147,7 @@ ifeq ($(EXPRECISION), 1)
|
||||
echo "#define EXPRECISION">> config_last.h
|
||||
endif
|
||||
##
|
||||
ifdef DYNAMIC_ARCH
|
||||
ifeq ($(DYNAMIC_ARCH), 1)
|
||||
$(MAKE) -C kernel commonlibs || exit 1
|
||||
for d in $(DYNAMIC_CORE) ; \
|
||||
do $(MAKE) GOTOBLAS_MAKEFILE= -C kernel TARGET_CORE=$$d kernel || exit 1 ;\
|
||||
@@ -158,18 +159,18 @@ endif
|
||||
prof : prof_blas prof_lapack
|
||||
|
||||
prof_blas :
|
||||
ln -fs $(LIBNAME_P) libopenblas_p.$(LIBSUFFIX)
|
||||
ln -fs $(LIBNAME_P) $(LIBPREFIX)_p.$(LIBSUFFIX)
|
||||
for d in $(SUBDIRS) ; \
|
||||
do if test -d $$d; then \
|
||||
$(MAKE) -C $$d prof || exit 1 ; \
|
||||
fi; \
|
||||
done
|
||||
ifdef DYNAMIC_ARCH
|
||||
ifeq ($(DYNAMIC_ARCH), 1)
|
||||
$(MAKE) -C kernel commonprof || exit 1
|
||||
endif
|
||||
|
||||
blas :
|
||||
ln -fs $(LIBNAME) libopenblas.$(LIBSUFFIX)
|
||||
ln -fs $(LIBNAME) $(LIBPREFIX).$(LIBSUFFIX)
|
||||
for d in $(BLASDIRS) ; \
|
||||
do if test -d $$d; then \
|
||||
$(MAKE) -C $$d libs || exit 1 ; \
|
||||
@@ -177,13 +178,13 @@ blas :
|
||||
done
|
||||
|
||||
hpl :
|
||||
ln -fs $(LIBNAME) libopenblas.$(LIBSUFFIX)
|
||||
ln -fs $(LIBNAME) $(LIBPREFIX).$(LIBSUFFIX)
|
||||
for d in $(BLASDIRS) ../laswp exports ; \
|
||||
do if test -d $$d; then \
|
||||
$(MAKE) -C $$d $(@F) || exit 1 ; \
|
||||
fi; \
|
||||
done
|
||||
ifdef DYNAMIC_ARCH
|
||||
ifeq ($(DYNAMIC_ARCH), 1)
|
||||
$(MAKE) -C kernel commonlibs || exit 1
|
||||
for d in $(DYNAMIC_CORE) ; \
|
||||
do $(MAKE) GOTOBLAS_MAKEFILE= -C kernel TARGET_CORE=$$d kernel || exit 1 ;\
|
||||
@@ -191,7 +192,7 @@ ifdef DYNAMIC_ARCH
|
||||
endif
|
||||
|
||||
hpl_p :
|
||||
ln -fs $(LIBNAME_P) libopenblas_p.$(LIBSUFFIX)
|
||||
ln -fs $(LIBNAME_P) $(LIBPREFIX)_p.$(LIBSUFFIX)
|
||||
for d in $(SUBDIRS) ../laswp exports ; \
|
||||
do if test -d $$d; then \
|
||||
$(MAKE) -C $$d $(@F) || exit 1 ; \
|
||||
@@ -202,47 +203,73 @@ ifeq ($(NO_LAPACK), 1)
|
||||
netlib :
|
||||
|
||||
else
|
||||
netlib : lapack-3.4.0 patch.for_lapack-3.4.0 lapack-3.4.0/make.inc
|
||||
netlib : lapack-3.4.2 patch.for_lapack-3.4.2 $(NETLIB_LAPACK_DIR)/make.inc
|
||||
ifndef NOFORTRAN
|
||||
-@$(MAKE) -C lapack-3.4.0 lapacklib
|
||||
-@$(MAKE) -C $(NETLIB_LAPACK_DIR) lapacklib
|
||||
endif
|
||||
ifndef NO_LAPACKE
|
||||
-@$(MAKE) -C $(NETLIB_LAPACK_DIR) lapackelib
|
||||
endif
|
||||
endif
|
||||
|
||||
prof_lapack : lapack-3.4.0 lapack-3.4.0/make.inc
|
||||
-@$(MAKE) -C lapack-3.4.0 lapack_prof
|
||||
prof_lapack : lapack-3.4.2 $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@$(MAKE) -C $(NETLIB_LAPACK_DIR) lapack_prof
|
||||
|
||||
lapack-3.4.0/make.inc :
|
||||
$(NETLIB_LAPACK_DIR)/make.inc :
|
||||
ifndef NOFORTRAN
|
||||
-@echo "FORTRAN = $(FC)" > lapack-3.4.0/make.inc
|
||||
-@echo "OPTS = $(FFLAGS)" >> lapack-3.4.0/make.inc
|
||||
-@echo "POPTS = $(FPFLAGS)" >> lapack-3.4.0/make.inc
|
||||
-@echo "NOOPT = $(FFLAGS) -O0" >> lapack-3.4.0/make.inc
|
||||
-@echo "PNOOPT = $(FPFLAGS) -O0" >> lapack-3.4.0/make.inc
|
||||
-@echo "LOADOPTS = $(FFLAGS) $(EXTRALIB)" >> lapack-3.4.0/make.inc
|
||||
-@echo "ARCH = $(AR)" >> lapack-3.4.0/make.inc
|
||||
-@echo "RANLIB = $(RANLIB)" >> lapack-3.4.0/make.inc
|
||||
-@echo "LAPACKLIB = ../$(LIBNAME)" >> lapack-3.4.0/make.inc
|
||||
-@echo "LAPACKLIB_P = ../$(LIBNAME_P)" >> lapack-3.4.0/make.inc
|
||||
-@echo "SUFFIX = $(SUFFIX)" >> lapack-3.4.0/make.inc
|
||||
-@echo "PSUFFIX = $(PSUFFIX)" >> lapack-3.4.0/make.inc
|
||||
# -@echo "CEXTRALIB = $(CEXTRALIB)" >> lapack-3.4.0/make.inc
|
||||
-@cat make.inc >> lapack-3.4.0/make.inc
|
||||
-@echo "FORTRAN = $(FC)" > $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "OPTS = $(FFLAGS)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "POPTS = $(FPFLAGS)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "NOOPT = $(FFLAGS) -O0" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "PNOOPT = $(FPFLAGS) -O0" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "LOADOPTS = $(FFLAGS) $(EXTRALIB)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "CC = $(CC)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
ifdef INTERFACE64
|
||||
-@echo "CFLAGS = $(CFLAGS) -DHAVE_LAPACK_CONFIG_H -DLAPACK_ILP64" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
else
|
||||
-@echo "CFLAGS = $(CFLAGS)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
endif
|
||||
-@echo "ARCH = $(AR)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "ARCHFLAGS = -ru" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "RANLIB = $(RANLIB)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "LAPACKLIB = ../$(LIBNAME)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "LAPACKELIB = ../$(LIBNAME)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "LAPACKLIB_P = ../$(LIBNAME_P)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "SUFFIX = $(SUFFIX)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "PSUFFIX = $(PSUFFIX)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@echo "CEXTRALIB = $(EXTRALIB)" >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
-@cat make.inc >> $(NETLIB_LAPACK_DIR)/make.inc
|
||||
endif
|
||||
|
||||
lapack-3.4.0 : lapack-3.4.0.tgz
|
||||
lapack-3.4.2 : lapack-3.4.2.tgz
|
||||
ifndef NOFORTRAN
|
||||
@if test `$(MD5SUM) lapack-3.4.0.tgz | $(AWK) '{print $$1}'` = 02d5706ec03ba885fc246e5fa10d8c70; then \
|
||||
ifndef NO_LAPACK
|
||||
@if test `$(MD5SUM) lapack-3.4.2.tgz | $(AWK) '{print $$1}'` = 61bf1a8a4469d4bdb7604f5897179478; then \
|
||||
echo $(TAR) zxf $< ;\
|
||||
$(TAR) zxf $< && (cd lapack-3.4.0; $(PATCH) -p1 < ../patch.for_lapack-3.4.0) ;\
|
||||
$(TAR) zxf $< && (cd $(NETLIB_LAPACK_DIR); $(PATCH) -p1 < ../patch.for_lapack-3.4.2) ;\
|
||||
rm -f $(NETLIB_LAPACK_DIR)/lapacke/make.inc ;\
|
||||
else \
|
||||
echo " lapack-3.4.0.tgz check sum is wrong (Please use orignal)." ;\
|
||||
rm -rf lapack-3.4.0 ;\
|
||||
rm -rf $(NETLIB_LAPACK_DIR) ;\
|
||||
echo " Cannot download lapack-3.4.2.tgz or the MD5 check sum is wrong (Please use orignal)."; \
|
||||
exit 1; \
|
||||
fi
|
||||
endif
|
||||
endif
|
||||
|
||||
lapack-3.4.0.tgz :
|
||||
LAPACK_URL=http://www.netlib.org/lapack/lapack-3.4.2.tgz
|
||||
|
||||
lapack-3.4.2.tgz :
|
||||
ifndef NOFORTRAN
|
||||
-wget http://www.netlib.org/lapack/lapack-3.4.0.tgz
|
||||
#http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
|
||||
ifeq ($(OSNAME), $(filter $(OSNAME),Darwin NetBSD))
|
||||
curl -O $(LAPACK_URL)
|
||||
else
|
||||
ifeq ($(OSNAME), FreeBSD)
|
||||
fetch $(LAPACK_URL)
|
||||
else
|
||||
wget $(LAPACK_URL)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
large.tgz :
|
||||
@@ -255,21 +282,21 @@ ifndef NOFORTRAN
|
||||
-wget http://www.netlib.org/lapack/timing/timing.tgz
|
||||
endif
|
||||
|
||||
lapack-timing : lapack-3.4.0 large.tgz timing.tgz
|
||||
lapack-timing : lapack-3.4.2 large.tgz timing.tgz
|
||||
ifndef NOFORTRAN
|
||||
(cd lapack-3.4.0; $(TAR) zxf ../timing.tgz TIMING)
|
||||
(cd lapack-3.4.0/TIMING; $(TAR) zxf ../../large.tgz )
|
||||
make -C lapack-3.4.0 tmglib
|
||||
make -C lapack-3.4.0/TIMING
|
||||
(cd $(NETLIB_LAPACK_DIR); $(TAR) zxf ../timing.tgz TIMING)
|
||||
(cd $(NETLIB_LAPACK_DIR)/TIMING; $(TAR) zxf ../../large.tgz )
|
||||
make -C $(NETLIB_LAPACK_DIR) tmglib
|
||||
make -C $(NETLIB_LAPACK_DIR)/TIMING
|
||||
endif
|
||||
|
||||
|
||||
lapack-test :
|
||||
$(MAKE) -C lapack-3.4.0 tmglib
|
||||
$(MAKE) -C lapack-3.4.0/TESTING xeigtstc xeigtstd xeigtsts xeigtstz xlintstc xlintstd xlintstds xlintsts xlintstz xlintstzc
|
||||
@rm -f lapack-3.4.0/TESTING/*.out
|
||||
$(MAKE) -j 1 -C lapack-3.4.0/TESTING
|
||||
$(GREP) failed lapack-3.4.0/TESTING/*.out
|
||||
$(MAKE) -C $(NETLIB_LAPACK_DIR) tmglib
|
||||
$(MAKE) -C $(NETLIB_LAPACK_DIR)/TESTING xeigtstc xeigtstd xeigtsts xeigtstz xlintstc xlintstd xlintstds xlintsts xlintstz xlintstzc
|
||||
@rm -f $(NETLIB_LAPACK_DIR)/TESTING/*.out
|
||||
$(MAKE) -j 1 -C $(NETLIB_LAPACK_DIR)/TESTING
|
||||
$(GREP) failed $(NETLIB_LAPACK_DIR)/TESTING/*.out
|
||||
|
||||
dummy :
|
||||
|
||||
@@ -285,11 +312,12 @@ clean ::
|
||||
#ifdef DYNAMIC_ARCH
|
||||
@$(MAKE) -C kernel clean
|
||||
#endif
|
||||
@rm -f *.$(LIBSUFFIX) *.so *~ *.exe getarch getarch_2nd *.dll *.lib *.$(SUFFIX) *.dwf libopenblas.$(LIBSUFFIX) libopenblas_p.$(LIBSUFFIX) *.lnk myconfig.h
|
||||
@$(MAKE) -C reference clean
|
||||
@rm -f *.$(LIBSUFFIX) *.so *~ *.exe getarch getarch_2nd *.dll *.lib *.$(SUFFIX) *.dwf $(LIBPREFIX).$(LIBSUFFIX) $(LIBPREFIX)_p.$(LIBSUFFIX) $(LIBPREFIX).so.$(MAJOR_VERSION) *.lnk myconfig.h
|
||||
@rm -f Makefile.conf config.h Makefile_kernel.conf config_kernel.h st* *.dylib
|
||||
@if test -d lapack-3.4.0; then \
|
||||
echo deleting lapack-3.4.0; \
|
||||
rm -rf lapack-3.4.0 ;\
|
||||
@if test -d $(NETLIB_LAPACK_DIR); then \
|
||||
echo deleting $(NETLIB_LAPACK_DIR); \
|
||||
rm -rf $(NETLIB_LAPACK_DIR) ;\
|
||||
fi
|
||||
@rm -f *.grd Makefile.conf_last config_last.h
|
||||
@echo Done.
|
||||
+17
-8
@@ -23,7 +23,7 @@ install : lib.grd
|
||||
@cat config_last.h >> $(OPENBLAS_INCLUDE_DIR)/openblas_config.h
|
||||
@echo \#define VERSION \" OpenBLAS $(VERSION) \" >> $(OPENBLAS_INCLUDE_DIR)/openblas_config.h
|
||||
@cat openblas_config_template.h >> $(OPENBLAS_INCLUDE_DIR)/openblas_config.h
|
||||
@echo \#endif >> $(OPENBLAS_INCLUDE_DIR)/openblas_config.h
|
||||
@echo \#endif \/\* OPENBLAS_CONFIG_H \*\/ >> $(OPENBLAS_INCLUDE_DIR)/openblas_config.h
|
||||
|
||||
@echo Generating f77blas.h in $(OPENBLAS_INCLUDE_DIR)
|
||||
@echo \#ifndef OPENBLAS_F77BLAS_H > $(OPENBLAS_INCLUDE_DIR)/f77blas.h
|
||||
@@ -32,39 +32,48 @@ install : lib.grd
|
||||
@cat common_interface.h >> $(OPENBLAS_INCLUDE_DIR)/f77blas.h
|
||||
@echo \#endif >> $(OPENBLAS_INCLUDE_DIR)/f77blas.h
|
||||
|
||||
ifndef NO_CBLAS
|
||||
@echo Generating cblas.h in $(OPENBLAS_INCLUDE_DIR)
|
||||
@sed 's/common/openblas_config/g' cblas.h > $(OPENBLAS_INCLUDE_DIR)/cblas.h
|
||||
endif
|
||||
|
||||
ifndef NO_LAPACKE
|
||||
@echo Copying LAPACKE header files to $(OPENBLAS_LIBRARY_DIR)
|
||||
@-cp $(NETLIB_LAPACK_DIR)/lapacke/include/lapacke.h $(OPENBLAS_INCLUDE_DIR)/lapacke.h
|
||||
@-cp $(NETLIB_LAPACK_DIR)/lapacke/include/lapacke_config.h $(OPENBLAS_INCLUDE_DIR)/lapacke_config.h
|
||||
@-cp $(NETLIB_LAPACK_DIR)/lapacke/include/lapacke_mangling_with_flags.h $(OPENBLAS_INCLUDE_DIR)/lapacke_mangling.h
|
||||
@-cp $(NETLIB_LAPACK_DIR)/lapacke/include/lapacke_utils.h $(OPENBLAS_INCLUDE_DIR)/lapacke_utils.h
|
||||
endif
|
||||
|
||||
#for install static library
|
||||
@echo Copy the static library to $(OPENBLAS_LIBRARY_DIR)
|
||||
@cp $(LIBNAME) $(OPENBLAS_LIBRARY_DIR)
|
||||
@-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBNAME) $(OPENBLAS_LIBRARY_DIR)/libopenblas.$(LIBSUFFIX)
|
||||
@-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBNAME) $(OPENBLAS_LIBRARY_DIR)/$(LIBPREFIX).$(LIBSUFFIX)
|
||||
#for install shared library
|
||||
@echo Copy the shared library to $(OPENBLAS_LIBRARY_DIR)
|
||||
ifeq ($(OSNAME), Linux)
|
||||
-cp $(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)/libopenblas.so
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)/$(LIBPREFIX).so
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)/$(LIBPREFIX).so.$(MAJOR_VERSION)
|
||||
endif
|
||||
ifeq ($(OSNAME), FreeBSD)
|
||||
-cp $(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)/libopenblas.so
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)/$(LIBPREFIX).so
|
||||
endif
|
||||
ifeq ($(OSNAME), NetBSD)
|
||||
-cp $(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)/libopenblas.so
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBSONAME) $(OPENBLAS_LIBRARY_DIR)/$(LIBPREFIX).so
|
||||
endif
|
||||
ifeq ($(OSNAME), Darwin)
|
||||
-cp $(LIBDYNNAME) $(OPENBLAS_LIBRARY_DIR)
|
||||
-install_name_tool -id $(OPENBLAS_LIBRARY_DIR)/$(LIBDYNNAME) $(OPENBLAS_LIBRARY_DIR)/$(LIBDYNNAME)
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBDYNNAME) $(OPENBLAS_LIBRARY_DIR)/libopenblas.dylib
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBDYNNAME) $(OPENBLAS_LIBRARY_DIR)/$(LIBPREFIX).dylib
|
||||
endif
|
||||
ifeq ($(OSNAME), WINNT)
|
||||
-cp $(LIBDLLNAME) $(OPENBLAS_LIBRARY_DIR)
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBDLLNAME) $(OPENBLAS_LIBRARY_DIR)/libopenblas.dll
|
||||
endif
|
||||
ifeq ($(OSNAME), CYGWIN_NT)
|
||||
-cp $(LIBDLLNAME) $(OPENBLAS_LIBRARY_DIR)
|
||||
-ln -fs $(OPENBLAS_LIBRARY_DIR)/$(LIBDLLNAME) $(OPENBLAS_LIBRARY_DIR)/libopenblas.dll
|
||||
endif
|
||||
|
||||
@echo Install OK!
|
||||
|
||||
+33
-12
@@ -3,7 +3,12 @@
|
||||
#
|
||||
|
||||
# This library's version
|
||||
VERSION = 0.1alpha2.5
|
||||
VERSION = 0.2.5
|
||||
|
||||
# If you set the suffix, the library name will be libopenblas_$(LIBNAMESUFFIX).a
|
||||
# and libopenblas_$(LIBNAMESUFFIX).so. Meanwhile, the soname in shared library
|
||||
# is libopenblas_$(LIBNAMESUFFIX).so.0.
|
||||
# LIBNAMESUFFIX = omp
|
||||
|
||||
# You can specify the target architecture, otherwise it's
|
||||
# automatically detected.
|
||||
@@ -19,10 +24,13 @@ VERSION = 0.1alpha2.5
|
||||
# Fortran compiler. Default is g77.
|
||||
# FC = gfortran
|
||||
|
||||
# Even you can specify cross compiler
|
||||
# Even you can specify cross compiler. Meanwhile, please set HOSTCC.
|
||||
# CC = x86_64-w64-mingw32-gcc
|
||||
# FC = x86_64-w64-mingw32-gfortran
|
||||
|
||||
# If you use the cross compiler, please set this host compiler.
|
||||
# HOSTCC = gcc
|
||||
|
||||
# If you need 32bit binary, define BINARY=32, otherwise define BINARY=64
|
||||
# BINARY=64
|
||||
|
||||
@@ -40,12 +48,19 @@ VERSION = 0.1alpha2.5
|
||||
# automatically detected by the the script.
|
||||
# NUM_THREADS = 24
|
||||
|
||||
# if you don't need generate the shared library, please comment it in.
|
||||
# NO_SHARED = 1
|
||||
|
||||
# If you don't need CBLAS interface, please comment it in.
|
||||
# NO_CBLAS = 1
|
||||
|
||||
# If you don't need LAPACK, please comment it in.
|
||||
# If you don't need LAPACK, please comment it in.
|
||||
# If you set NO_LAPACK=1, the library automatically sets NO_LAPACKE=1.
|
||||
# NO_LAPACK = 1
|
||||
|
||||
# If you don't need LAPACKE (C Interface to LAPACK), please comment it in.
|
||||
# NO_LAPACKE = 1
|
||||
|
||||
# If you want to use legacy threaded Level 3 implementation.
|
||||
# USE_SIMPLE_THREADED_LEVEL3 = 1
|
||||
|
||||
@@ -62,6 +77,10 @@ VERSION = 0.1alpha2.5
|
||||
# If you want to disable CPU/Memory affinity on Linux.
|
||||
# NO_AFFINITY = 1
|
||||
|
||||
# Don't use AVX kernel on Sandy Bridge. It is compatible with old compilers
|
||||
# and OS. However, the performance is low.
|
||||
# NO_AVX = 1
|
||||
|
||||
# If you would like to know minute performance report of GotoBLAS.
|
||||
# FUNCTION_PROFILE = 1
|
||||
|
||||
@@ -83,6 +102,11 @@ VERSION = 0.1alpha2.5
|
||||
# If you need to synchronize FP CSR between threads (for x86/x86_64 only).
|
||||
# CONSISTENT_FPCSR = 1
|
||||
|
||||
# If any gemm arguement m, n or k is less or equal this threshold, gemm will be execute
|
||||
# with single thread. You can use this flag to avoid the overhead of multi-threading
|
||||
# in small matrix sizes. The default value is 50.
|
||||
# GEMM_MULTITHREAD_THRESHOLD = 50
|
||||
|
||||
# If you need santy check by comparing reference BLAS. It'll be very
|
||||
# slow (Not implemented yet).
|
||||
# SANITY_CHECK = 1
|
||||
@@ -94,19 +118,16 @@ VERSION = 0.1alpha2.5
|
||||
# The installation directory.
|
||||
# PREFIX = /opt/OpenBLAS
|
||||
|
||||
# Common Optimization Flag; -O2 is enough.
|
||||
# DEBUG = 1
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
COMMON_OPT += -g
|
||||
# -DDEBUG
|
||||
else
|
||||
COMMON_OPT += -O2
|
||||
endif
|
||||
# Common Optimization Flag;
|
||||
# The default -O2 is enough.
|
||||
# COMMON_OPT = -O2
|
||||
|
||||
# Profiling flags
|
||||
COMMON_PROF = -pg
|
||||
|
||||
# Build Debug version
|
||||
# DEBUG = 1
|
||||
|
||||
#
|
||||
# End of user configuration
|
||||
#
|
||||
|
||||
+110
-11
@@ -9,8 +9,20 @@ ifndef TOPDIR
|
||||
TOPDIR = .
|
||||
endif
|
||||
|
||||
ifndef NETLIB_LAPACK_DIR
|
||||
NETLIB_LAPACK_DIR = $(TOPDIR)/lapack-3.4.2
|
||||
endif
|
||||
|
||||
# Default C compiler
|
||||
# - Only set if not specified on the command line or inherited from the environment.
|
||||
# - CC is an implicit variable so neither '?=' or 'ifndef' can be used.
|
||||
# http://stackoverflow.com/questions/4029274/mingw-and-make-variables
|
||||
# - Default value is 'cc' which is not always a valid command (e.g. MinGW).
|
||||
ifeq ($(origin CC),default)
|
||||
CC = gcc
|
||||
endif
|
||||
|
||||
# Default Fortran compiler (FC) is selected by f_check.
|
||||
|
||||
ifndef MAKEFILE_RULE
|
||||
include $(TOPDIR)/Makefile.rule
|
||||
@@ -40,6 +52,19 @@ ifdef INTERFACE64
|
||||
GETARCH_FLAGS += -DUSE64BITINT
|
||||
endif
|
||||
|
||||
ifndef GEMM_MULTITHREAD_THRESHOLD
|
||||
GEMM_MULTITHREAD_THRESHOLD=50
|
||||
endif
|
||||
GETARCH_FLAGS += -DGEMM_MULTITHREAD_THRESHOLD=$(GEMM_MULTITHREAD_THRESHOLD)
|
||||
|
||||
ifeq ($(NO_AVX), 1)
|
||||
GETARCH_FLAGS += -DNO_AVX
|
||||
endif
|
||||
|
||||
ifeq ($(DEBUG), 1)
|
||||
GETARCH_FLAGS += -g
|
||||
endif
|
||||
|
||||
# This operation is expensive, so execution should be once.
|
||||
ifndef GOTOBLAS_MAKEFILE
|
||||
export GOTOBLAS_MAKEFILE = 1
|
||||
@@ -96,6 +121,15 @@ DLLWRAP = $(CROSS_SUFFIX)dllwrap
|
||||
|
||||
ifeq ($(OSNAME), Darwin)
|
||||
export MACOSX_DEPLOYMENT_TARGET=10.2
|
||||
MD5SUM = md5 -r
|
||||
endif
|
||||
|
||||
ifeq ($(OSNAME), FreeBSD)
|
||||
MD5SUM = md5 -r
|
||||
endif
|
||||
|
||||
ifeq ($(OSNAME), NetBSD)
|
||||
MD5SUM = md5 -n
|
||||
endif
|
||||
|
||||
ifeq ($(OSNAME), Linux)
|
||||
@@ -115,6 +149,26 @@ EXTRALIB += -defaultlib:advapi32
|
||||
SUFFIX = obj
|
||||
PSUFFIX = pobj
|
||||
LIBSUFFIX = lib
|
||||
ifeq ($(C_COMPILER), GCC)
|
||||
#Test for supporting MS_ABI
|
||||
GCCVERSIONGTEQ4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \>= 4)
|
||||
GCCVERSIONGT4 := $(shell expr `$(CC) -dumpversion | cut -f1 -d.` \> 4)
|
||||
GCCMINORVERSIONGTEQ7 := $(shell expr `$(CC) -dumpversion | cut -f2 -d.` \>= 7)
|
||||
ifeq ($(GCCVERSIONGT4), 1)
|
||||
# GCC Majar version > 4
|
||||
# It is compatible with MSVC ABI.
|
||||
CCOMMON_OPT += -DMS_ABI
|
||||
endif
|
||||
|
||||
ifeq ($(GCCVERSIONGTEQ4), 1)
|
||||
ifeq ($(GCCMINORVERSIONGTEQ7), 1)
|
||||
# GCC Version >=4.7
|
||||
# It is compatible with MSVC ABI.
|
||||
CCOMMON_OPT += -DMS_ABI
|
||||
endif
|
||||
endif
|
||||
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(OSNAME), Interix)
|
||||
@@ -218,14 +272,20 @@ endif
|
||||
endif
|
||||
|
||||
|
||||
ifdef DYNAMIC_ARCH
|
||||
ifeq ($(DYNAMIC_ARCH), 1)
|
||||
ifeq ($(ARCH), x86)
|
||||
DYNAMIC_CORE = KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS \
|
||||
CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA ATOM NANO
|
||||
CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
|
||||
ifneq ($(NO_AVX), 1)
|
||||
DYNAMIC_CORE += SANDYBRIDGE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(ARCH), x86_64)
|
||||
DYNAMIC_CORE = PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA ATOM NANO
|
||||
DYNAMIC_CORE = PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO
|
||||
ifneq ($(NO_AVX), 1)
|
||||
DYNAMIC_CORE += SANDYBRIDGE
|
||||
endif
|
||||
endif
|
||||
|
||||
ifndef DYNAMIC_CORE
|
||||
@@ -274,7 +334,12 @@ endif
|
||||
BINARY_DEFINED = 1
|
||||
endif
|
||||
|
||||
ifeq ($(CORE), LOONGSON3A)
|
||||
ifeq ($(CORE), LOONGSON3A)
|
||||
CCOMMON_OPT += -march=mips64
|
||||
FCOMMON_OPT += -march=mips64
|
||||
endif
|
||||
|
||||
ifeq ($(CORE), LOONGSON3B)
|
||||
CCOMMON_OPT += -march=mips64
|
||||
FCOMMON_OPT += -march=mips64
|
||||
endif
|
||||
@@ -341,7 +406,8 @@ endif
|
||||
|
||||
ifeq ($(F_COMPILER), GFORTRAN)
|
||||
CCOMMON_OPT += -DF_INTERFACE_GFORT
|
||||
FCOMMON_OPT += -Wall
|
||||
FCOMMON_OPT += -Wall
|
||||
EXTRALIB += -lgfortran
|
||||
ifdef NO_BINARY_MODE
|
||||
ifeq ($(ARCH), mips64)
|
||||
ifdef BINARY64
|
||||
@@ -522,14 +588,26 @@ endif
|
||||
|
||||
ifeq ($(NO_LAPACK), 1)
|
||||
CCOMMON_OPT += -DNO_LAPACK
|
||||
#Disable LAPACK C interface
|
||||
NO_LAPACKE = 1
|
||||
endif
|
||||
|
||||
ifeq ($(NO_LAPACKE), 1)
|
||||
CCOMMON_OPT += -DNO_LAPACKE
|
||||
endif
|
||||
|
||||
ifeq ($(NO_AVX), 1)
|
||||
CCOMMON_OPT += -DNO_AVX
|
||||
endif
|
||||
|
||||
ifdef SMP
|
||||
CCOMMON_OPT += -DSMP_SERVER
|
||||
|
||||
ifeq ($(ARCH), mips64)
|
||||
ifneq ($(CORE), LOONGSON3B)
|
||||
USE_SIMPLE_THREADED_LEVEL3 = 1
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(USE_OPENMP), 1)
|
||||
# USE_SIMPLE_THREADED_LEVEL3 = 1
|
||||
@@ -568,7 +646,11 @@ ifdef USE_SIMPLE_THREADED_LEVEL3
|
||||
CCOMMON_OPT += -DUSE_SIMPLE_THREADED_LEVEL3
|
||||
endif
|
||||
|
||||
ifndef LIBNAMESUFFIX
|
||||
LIBPREFIX = libopenblas
|
||||
else
|
||||
LIBPREFIX = libopenblas_$(LIBNAMESUFFIX)
|
||||
endif
|
||||
|
||||
KERNELDIR = $(TOPDIR)/kernel/$(ARCH)
|
||||
|
||||
@@ -590,9 +672,11 @@ endif
|
||||
|
||||
ifneq ($(ARCH), x86_64)
|
||||
ifneq ($(ARCH), x86)
|
||||
ifneq ($(CORE), LOONGSON3B)
|
||||
NO_AFFINITY = 1
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifdef NO_AFFINITY
|
||||
CCOMMON_OPT += -DNO_AFFINITY
|
||||
@@ -632,16 +716,30 @@ PATCH = patch
|
||||
GREP = grep
|
||||
endif
|
||||
|
||||
ifndef MD5SUM
|
||||
MD5SUM = md5sum
|
||||
endif
|
||||
|
||||
AWK = awk
|
||||
|
||||
REVISION = -r$(VERSION)
|
||||
MAJOR_VERSION = $(word 1,$(subst ., ,$(VERSION)))
|
||||
|
||||
CFLAGS = $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
|
||||
PFLAGS = $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
|
||||
ifeq ($(DEBUG), 1)
|
||||
COMMON_OPT += -g
|
||||
endif
|
||||
|
||||
FFLAGS = $(COMMON_OPT) $(FCOMMON_OPT)
|
||||
FPFLAGS = $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
|
||||
ifndef COMMON_OPT
|
||||
COMMON_OPT = -O2
|
||||
endif
|
||||
|
||||
|
||||
override CFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR)
|
||||
override PFLAGS += $(COMMON_OPT) $(CCOMMON_OPT) -I$(TOPDIR) -DPROFILE $(COMMON_PROF)
|
||||
|
||||
override FFLAGS += $(COMMON_OPT) $(FCOMMON_OPT)
|
||||
override FPFLAGS += $(COMMON_OPT) $(FCOMMON_OPT) $(COMMON_PROF)
|
||||
#MAKEOVERRIDES =
|
||||
|
||||
ifndef SUFFIX
|
||||
SUFFIX = o
|
||||
@@ -655,7 +753,7 @@ ifndef LIBSUFFIX
|
||||
LIBSUFFIX = a
|
||||
endif
|
||||
|
||||
ifndef DYNAMIC_ARCH
|
||||
ifneq ($(DYNAMIC_ARCH), 1)
|
||||
ifndef SMP
|
||||
LIBNAME = $(LIBPREFIX)_$(LIBCORE)$(REVISION).$(LIBSUFFIX)
|
||||
LIBNAME_P = $(LIBPREFIX)_$(LIBCORE)$(REVISION)_p.$(LIBSUFFIX)
|
||||
@@ -674,8 +772,8 @@ endif
|
||||
endif
|
||||
|
||||
|
||||
LIBDLLNAME = $(LIBPREFIX).dll
|
||||
LIBSONAME = $(LIBNAME:.$(LIBSUFFIX)=.so)
|
||||
LIBDLLNAME = $(LIBNAME:.$(LIBSUFFIX)=.dll)
|
||||
LIBDYNNAME = $(LIBNAME:.$(LIBSUFFIX)=.dylib)
|
||||
LIBDEFNAME = $(LIBNAME:.$(LIBSUFFIX)=.def)
|
||||
LIBEXPNAME = $(LIBNAME:.$(LIBSUFFIX)=.exp)
|
||||
@@ -720,6 +818,7 @@ export HAVE_SSE4_1
|
||||
export HAVE_SSE4_2
|
||||
export HAVE_SSE4A
|
||||
export HAVE_SSE5
|
||||
export HAVE_AVX
|
||||
export KERNELDIR
|
||||
export FUNCTION_PROFILE
|
||||
export TARGET_CORE
|
||||
|
||||
+12
-12
@@ -22,19 +22,19 @@ BLASOBJS += $(QBLASOBJS) $(XBLASOBJS)
|
||||
BLASOBJS_P += $(QBLASOBJS_P) $(XBLASOBJS_P)
|
||||
endif
|
||||
|
||||
$(SBLASOBJS) $(SBLASOBJS_P) : CFLAGS += -UDOUBLE -UCOMPLEX
|
||||
$(DBLASOBJS) $(DBLASOBJS_P) : CFLAGS += -DDOUBLE -UCOMPLEX
|
||||
$(QBLASOBJS) $(QBLASOBJS_P) : CFLAGS += -DXDOUBLE -UCOMPLEX
|
||||
$(CBLASOBJS) $(CBLASOBJS_P) : CFLAGS += -UDOUBLE -DCOMPLEX
|
||||
$(ZBLASOBJS) $(ZBLASOBJS_P) : CFLAGS += -DDOUBLE -DCOMPLEX
|
||||
$(XBLASOBJS) $(XBLASOBJS_P) : CFLAGS += -DXDOUBLE -DCOMPLEX
|
||||
$(SBLASOBJS) $(SBLASOBJS_P) : override CFLAGS += -UDOUBLE -UCOMPLEX
|
||||
$(DBLASOBJS) $(DBLASOBJS_P) : override CFLAGS += -DDOUBLE -UCOMPLEX
|
||||
$(QBLASOBJS) $(QBLASOBJS_P) : override CFLAGS += -DXDOUBLE -UCOMPLEX
|
||||
$(CBLASOBJS) $(CBLASOBJS_P) : override CFLAGS += -UDOUBLE -DCOMPLEX
|
||||
$(ZBLASOBJS) $(ZBLASOBJS_P) : override CFLAGS += -DDOUBLE -DCOMPLEX
|
||||
$(XBLASOBJS) $(XBLASOBJS_P) : override CFLAGS += -DXDOUBLE -DCOMPLEX
|
||||
|
||||
$(SBLASOBJS_P) : CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(DBLASOBJS_P) : CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(QBLASOBJS_P) : CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(CBLASOBJS_P) : CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(ZBLASOBJS_P) : CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(XBLASOBJS_P) : CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(SBLASOBJS_P) : override CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(DBLASOBJS_P) : override CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(QBLASOBJS_P) : override CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(CBLASOBJS_P) : override CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(ZBLASOBJS_P) : override CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
$(XBLASOBJS_P) : override CFLAGS += -DPROFILE $(COMMON_PROF)
|
||||
|
||||
libs :: $(BLASOBJS) $(COMMONOBJS)
|
||||
$(AR) $(ARFLAGS) -ru $(TOPDIR)/$(LIBNAME) $^
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
OpenBLAS Readme
|
||||
|
||||
1.Introduction
|
||||
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version. OpenBLAS is an open source project supported by Lab of Parallel Software and Computational Science, ISCAS.(http://www.rdcps.ac.cn)
|
||||
|
||||
2.Intallation
|
||||
Download from project homepage. http://xianyi.github.com/OpenBLAS/
|
||||
Or,
|
||||
check out codes from git://github.com/xianyi/OpenBLAS.git
|
||||
1)Normal compile
|
||||
(a) type "make" to detect the CPU automatically.
|
||||
or
|
||||
(b) type "make TARGET=xxx" to set target CPU, e.g. "make TARGET=NEHALEM". The full target list is in file TargetList.txt.
|
||||
|
||||
2)Cross compile
|
||||
Please set CC and FC with the cross toolchains. Then, set HOSTCC with your host C compiler. At last, set TARGET explicitly.
|
||||
|
||||
examples:
|
||||
On X86 box, compile this library for loongson3a CPU.
|
||||
make BINARY=64 CC=mips64el-unknown-linux-gnu-gcc FC=mips64el-unknown-linux-gnu-gfortran HOSTCC=gcc TARGET=LOONGSON3A
|
||||
|
||||
3)Debug version
|
||||
make DEBUG=1
|
||||
|
||||
4)Intall to the directory (Optional)
|
||||
e.g.
|
||||
make install PREFIX=your_installation_directory
|
||||
The default directory is /opt/OpenBLAS
|
||||
|
||||
3.Support CPU & OS
|
||||
Please read GotoBLAS_01Readme.txt
|
||||
|
||||
Additional support CPU:
|
||||
x86_64:
|
||||
Intel Xeon 56xx (Westmere) //Used GotoBLAS2 Nehalem codes.
|
||||
MIPS64:
|
||||
ICT Loongson 3A //The initial version used GotoBLAS2 MIPS64 kernels. Thus, the performance is not good.
|
||||
|
||||
4.Usages
|
||||
Link with libopenblas.a or -lopenblas for shared library.
|
||||
|
||||
4.1 Set the number of threads with environment variables. for example,
|
||||
export OPENBLAS_NUM_THREADS=4
|
||||
or
|
||||
export GOTO_NUM_THREADS=4
|
||||
or
|
||||
export OMP_NUM_THREADS=4
|
||||
|
||||
The priorities are OPENBLAS_NUM_THREADS > GOTO_NUM_THREADS > OMP_NUM_THREADS.
|
||||
|
||||
If you compile this lib with USE_OPENMP=1, you should set OMP_NUM_THREADS environment variable. OpenBLAS ignores OPENBLAS_NUM_THREADS and GOTO_NUM_THREADS with USE_OPENMP=1.
|
||||
|
||||
4.2 Set the number of threads with calling functions. for example,
|
||||
void goto_set_num_threads(int num_threads);
|
||||
or
|
||||
void openblas_set_num_threads(int num_threads);
|
||||
|
||||
If you compile this lib with USE_OPENMP=1, you should use the above functions, too.
|
||||
|
||||
5.Report Bugs
|
||||
Please add a issue in https://github.com/xianyi/OpenBLAS/issues
|
||||
|
||||
6.To-Do List:
|
||||
Optimization on ICT Loongson 3A CPU
|
||||
|
||||
7.Contact
|
||||
OpenBLAS users mailing list: http://list.rdcps.ac.cn/mailman/listinfo/openblas
|
||||
|
||||
8.ChangeLog
|
||||
Please see Changelog.txt to obtain the differences between GotoBLAS2 1.13 BSD version.
|
||||
|
||||
9.Known Issues
|
||||
* The number of CPUs/Cores should less than or equal to 8*sizeof(unsigned long). On 64 bits, the limit
|
||||
is 64. On 32 bits, it is 32.
|
||||
|
||||
10. Specification of Git Branches
|
||||
We used the git branching model in this article (http://nvie.com/posts/a-successful-git-branching-model/).
|
||||
Now, there are 4 branches in github.com.
|
||||
* The master branch. This a main branch to reflect a production-ready state.
|
||||
* The develop branch. This a main branch to reflect a state with the latest delivered development changes for the next release.
|
||||
* The loongson3a branch. This is a feature branch. We develop Loongson3A codes on this branch. We will merge this feature to develop branch in future.
|
||||
* The gh-pages branch. This is for web pages
|
||||
@@ -0,0 +1,113 @@
|
||||
# OpenBLAS
|
||||
|
||||
## Introduction
|
||||
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version. OpenBLAS is an open source project supported by Lab of Parallel Software and Computational Science, ISCAS <http://www.rdcps.ac.cn>.
|
||||
|
||||
Please read the documents on OpenBLAS wiki pages <http://github.com/xianyi/OpenBLAS/wiki>.
|
||||
|
||||
## Installation
|
||||
Download from project homepage. http://xianyi.github.com/OpenBLAS/
|
||||
|
||||
Or, check out codes from git://github.com/xianyi/OpenBLAS.git
|
||||
### Normal compile
|
||||
* type "make" to detect the CPU automatically.
|
||||
or
|
||||
* type "make TARGET=xxx" to set target CPU, e.g. "make TARGET=NEHALEM". The full target list is in file TargetList.txt.
|
||||
|
||||
### Cross compile
|
||||
Please set CC and FC with the cross toolchains. Then, set HOSTCC with your host C compiler. At last, set TARGET explicitly.
|
||||
|
||||
Examples:
|
||||
|
||||
On X86 box, compile this library for loongson3a CPU.
|
||||
|
||||
make BINARY=64 CC=mips64el-unknown-linux-gnu-gcc FC=mips64el-unknown-linux-gnu-gfortran HOSTCC=gcc TARGET=LOONGSON3A
|
||||
|
||||
### Debug version
|
||||
|
||||
make DEBUG=1
|
||||
|
||||
### Intall to the directory (Optional)
|
||||
|
||||
Example:
|
||||
|
||||
make install PREFIX=your_installation_directory
|
||||
|
||||
The default directory is /opt/OpenBLAS
|
||||
|
||||
## Support CPU & OS
|
||||
Please read GotoBLAS_01Readme.txt
|
||||
|
||||
### Additional support CPU:
|
||||
|
||||
#### x86/x86-64:
|
||||
- **Intel Xeon 56xx (Westmere)**: Used GotoBLAS2 Nehalem codes.
|
||||
- **Intel Sandy Bridge**: Optimized Level-3 BLAS with AVX on x86-64.
|
||||
- **AMD Bobcat**: Used GotoBLAS2 Barcelona codes.
|
||||
- **AMD Bulldozer**: Used GotoBLAS2 Barcelona codes.
|
||||
|
||||
#### MIPS64:
|
||||
- **ICT Loongson 3A**: Optimized Level-3 BLAS and the part of Level-1,2.
|
||||
- **ICT Loongson 3B**: Experimental
|
||||
|
||||
### Support OS:
|
||||
- **GNU/Linux**
|
||||
- **MingWin/Windows**: Please read <https://github.com/xianyi/OpenBLAS/wiki/How-to-use-OpenBLAS-in-Microsoft-Visual-Studio>.
|
||||
- **Darwin/Mac OS X**: Experimental. Although GotoBLAS2 supports Darwin, we are the beginner on Mac OS X.
|
||||
- **FreeBSD**: Supportted by community. We didn't test the library on this OS.
|
||||
|
||||
## Usages
|
||||
Link with libopenblas.a or -lopenblas for shared library.
|
||||
|
||||
### Set the number of threads with environment variables.
|
||||
|
||||
Examples:
|
||||
|
||||
export OPENBLAS_NUM_THREADS=4
|
||||
|
||||
or
|
||||
|
||||
export GOTO_NUM_THREADS=4
|
||||
|
||||
or
|
||||
|
||||
export OMP_NUM_THREADS=4
|
||||
|
||||
The priorities are OPENBLAS_NUM_THREADS > GOTO_NUM_THREADS > OMP_NUM_THREADS.
|
||||
|
||||
If you compile this lib with USE_OPENMP=1, you should set OMP_NUM_THREADS environment variable. OpenBLAS ignores OPENBLAS_NUM_THREADS and GOTO_NUM_THREADS with USE_OPENMP=1.
|
||||
|
||||
### Set the number of threads on runtime.
|
||||
|
||||
We provided the below functions to controll the number of threads on runtime.
|
||||
|
||||
void goto_set_num_threads(int num_threads);
|
||||
|
||||
void openblas_set_num_threads(int num_threads);
|
||||
|
||||
If you compile this lib with USE_OPENMP=1, you should use the above functions, too.
|
||||
|
||||
## Report Bugs
|
||||
Please add a issue in https://github.com/xianyi/OpenBLAS/issues
|
||||
|
||||
## Contact
|
||||
OpenBLAS users mailing list: http://list.rdcps.ac.cn/mailman/listinfo/openblas
|
||||
|
||||
## ChangeLog
|
||||
Please see Changelog.txt to obtain the differences between GotoBLAS2 1.13 BSD version.
|
||||
|
||||
## Troubleshooting
|
||||
* Please read [Faq](https://github.com/xianyi/OpenBLAS/wiki/Faq) at first.
|
||||
* Please use gcc version 4.6 and above to compile Sandy Bridge AVX kernels on Linux/MingW/BSD.
|
||||
* Please use Clang version 3.1 and above to compile the library on Sandy Bridge microarchitecture. The Clang 3.0 will generate the wrong AVX binary code.
|
||||
* The number of CPUs/Cores should less than or equal to 256.
|
||||
* On Linux, OpenBLAS sets the processor affinity by default. This may cause [the conflict with R parallel](https://stat.ethz.ch/pipermail/r-sig-hpc/2012-April/001348.html). You can build the library with NO_AFFINITY=1.
|
||||
* On Loongson 3A. make test would be failed because of pthread_create error. The error code is EAGAIN. However, it will be OK when you run the same testcase on shell.
|
||||
|
||||
## Specification of Git Branches
|
||||
We used the git branching model in this article (http://nvie.com/posts/a-successful-git-branching-model/).
|
||||
Now, there are 4 branches in github.com.
|
||||
* The master branch. This a main branch to reflect a production-ready state.
|
||||
* The develop branch. This a main branch to reflect a state with the latest delivered development changes for the next release.
|
||||
* The loongson3a branch. This is a feature branch. We develop Loongson3A codes on this branch. We will merge this feature to develop branch in future.
|
||||
* The gh-pages branch. This is for web pages
|
||||
@@ -18,6 +18,7 @@ CORE2
|
||||
PENRYN
|
||||
DUNNINGTON
|
||||
NEHALEM
|
||||
SANDYBRIDGE
|
||||
ATOM
|
||||
|
||||
b)AMD CPU:
|
||||
@@ -27,6 +28,7 @@ OPTERON_SSE3
|
||||
BARCELONA
|
||||
SHANGHAI
|
||||
ISTANBUL
|
||||
BOBCAT
|
||||
|
||||
c)VIA CPU:
|
||||
SSE_GENERIC
|
||||
@@ -47,6 +49,7 @@ CELL
|
||||
3.MIPS64 CPU:
|
||||
SICORTEX
|
||||
LOONGSON3A
|
||||
LOONGSON3B
|
||||
|
||||
4.IA64 CPU:
|
||||
ITANIUM2
|
||||
|
||||
@@ -43,14 +43,14 @@ $compiler = DEC if ($data =~ /COMPILER_DEC/);
|
||||
$compiler = GCC if ($compiler eq "");
|
||||
|
||||
$os = Linux if ($data =~ /OS_LINUX/);
|
||||
$os = FreeBSD if ($data =~ /OS_FreeBSD/);
|
||||
$os = NetBSD if ($data =~ /OS_NetBSD/);
|
||||
$os = Darwin if ($data =~ /OS_Darwin/);
|
||||
$os = SunOS if ($data =~ /OS_SunOS/);
|
||||
$os = FreeBSD if ($data =~ /OS_FREEBSD/);
|
||||
$os = NetBSD if ($data =~ /OS_NETBSD/);
|
||||
$os = Darwin if ($data =~ /OS_DARWIN/);
|
||||
$os = SunOS if ($data =~ /OS_SUNOS/);
|
||||
$os = AIX if ($data =~ /OS_AIX/);
|
||||
$os = osf if ($data =~ /OS_OSF/);
|
||||
$os = WINNT if ($data =~ /OS_WINNT/);
|
||||
$os = CYGWIN_NT if ($data =~ /OS_CYGWIN/);
|
||||
$os = CYGWIN_NT if ($data =~ /OS_CYGWIN_NT/);
|
||||
$os = Interix if ($data =~ /OS_INTERIX/);
|
||||
|
||||
$architecture = x86 if ($data =~ /ARCH_X86/);
|
||||
@@ -174,6 +174,8 @@ $linker_a = "";
|
||||
$link =~ s/\-Y\sP\,/\-Y/g;
|
||||
|
||||
@flags = split(/[\s\,\n]/, $link);
|
||||
# remove leading and trailing quotes from each flag.
|
||||
@flags = map {s/^['"]|['"]$//g; $_} @flags;
|
||||
|
||||
foreach $flags (@flags) {
|
||||
if (
|
||||
|
||||
@@ -9,6 +9,10 @@ extern "C" {
|
||||
#include <stddef.h>
|
||||
#include "common.h"
|
||||
|
||||
/*Set the number of threads on runtime.*/
|
||||
void openblas_set_num_threads(int num_threads);
|
||||
void goto_set_num_threads(int num_threads);
|
||||
|
||||
#define CBLAS_INDEX size_t
|
||||
|
||||
enum CBLAS_ORDER {CblasRowMajor=101, CblasColMajor=102};
|
||||
@@ -22,15 +26,15 @@ double cblas_dsdot (blasint n, float *x, blasint incx, float *y, blasint incy);
|
||||
float cblas_sdot(blasint n, float *x, blasint incx, float *y, blasint incy);
|
||||
double cblas_ddot(blasint n, double *x, blasint incx, double *y, blasint incy);
|
||||
|
||||
float _Complex cblas_cdotu(blasint n, float *x, blasint incx, float *y, blasint incy);
|
||||
float _Complex cblas_cdotc(blasint n, float *x, blasint incx, float *y, blasint incy);
|
||||
double _Complex cblas_zdotu(blasint n, double *x, blasint incx, double *y, blasint incy);
|
||||
double _Complex cblas_zdotc(blasint n, double *x, blasint incx, double *y, blasint incy);
|
||||
openblas_complex_float cblas_cdotu(blasint n, float *x, blasint incx, float *y, blasint incy);
|
||||
openblas_complex_float cblas_cdotc(blasint n, float *x, blasint incx, float *y, blasint incy);
|
||||
openblas_complex_double cblas_zdotu(blasint n, double *x, blasint incx, double *y, blasint incy);
|
||||
openblas_complex_double cblas_zdotc(blasint n, double *x, blasint incx, double *y, blasint incy);
|
||||
|
||||
void cblas_cdotu_sub(blasint n, float *x, blasint incx, float *y, blasint incy, float _Complex *ret);
|
||||
void cblas_cdotc_sub(blasint n, float *x, blasint incx, float *y, blasint incy, float _Complex *ret);
|
||||
void cblas_zdotu_sub(blasint n, double *x, blasint incx, double *y, blasint incy, double _Complex *ret);
|
||||
void cblas_zdotc_sub(blasint n, double *x, blasint incx, double *y, blasint incy, double _Complex *ret);
|
||||
void cblas_cdotu_sub(blasint n, float *x, blasint incx, float *y, blasint incy, openblas_complex_float *ret);
|
||||
void cblas_cdotc_sub(blasint n, float *x, blasint incx, float *y, blasint incy, openblas_complex_float *ret);
|
||||
void cblas_zdotu_sub(blasint n, double *x, blasint incx, double *y, blasint incy, openblas_complex_double *ret);
|
||||
void cblas_zdotc_sub(blasint n, double *x, blasint incx, double *y, blasint incy, openblas_complex_double *ret);
|
||||
|
||||
float cblas_sasum (blasint n, float *x, blasint incx);
|
||||
double cblas_dasum (blasint n, double *x, blasint incx);
|
||||
|
||||
@@ -68,7 +68,7 @@ extern "C" {
|
||||
#define SMP
|
||||
#endif
|
||||
|
||||
#if defined(OS_WINNT) || defined(OS_CYGWIN_NT) || defined(OS_Interix)
|
||||
#if defined(OS_WINNT) || defined(OS_CYGWIN_NT) || defined(OS_INTERIX)
|
||||
#define WINDOWS_ABI
|
||||
#define OS_WINDOWS
|
||||
|
||||
@@ -89,7 +89,7 @@ extern "C" {
|
||||
#include <sched.h>
|
||||
#endif
|
||||
|
||||
#ifdef OS_DARWIN
|
||||
#if defined(OS_DARWIN) || defined(OS_FREEBSD) || defined(OS_NETBSD)
|
||||
#include <sched.h>
|
||||
#endif
|
||||
|
||||
@@ -351,7 +351,12 @@ typedef int blasint;
|
||||
#endif
|
||||
|
||||
#define MMAP_ACCESS (PROT_READ | PROT_WRITE)
|
||||
|
||||
#ifdef __NetBSD__
|
||||
#define MMAP_POLICY (MAP_PRIVATE | MAP_ANON)
|
||||
#else
|
||||
#define MMAP_POLICY (MAP_PRIVATE | MAP_ANONYMOUS)
|
||||
#endif
|
||||
|
||||
#include "param.h"
|
||||
#include "common_param.h"
|
||||
@@ -374,6 +379,30 @@ typedef int blasint;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ASSEMBLER
|
||||
#ifndef NOINCLUDE
|
||||
/* Inclusion of a standard header file is needed for definition of __STDC_*
|
||||
predefined macros with some compilers (e.g. GCC 4.7 on Linux). This occurs
|
||||
as a side effect of including either <features.h> or <stdc-predef.h>. */
|
||||
#include <stdio.h>
|
||||
#endif // NOINCLUDE
|
||||
|
||||
/* C99 supports complex floating numbers natively, which GCC also offers as an
|
||||
extension since version 3.0. If neither are available, use a compatible
|
||||
structure as fallback (see Clause 6.2.5.13 of the C99 standard). */
|
||||
#if defined(__STDC_IEC_559_COMPLEX__) || __STDC_VERSION__ >= 199901L || __GNUC__ >= 3
|
||||
#define OPENBLAS_COMPLEX_C99
|
||||
typedef float _Complex openblas_complex_float;
|
||||
typedef double _Complex openblas_complex_double;
|
||||
typedef xdouble _Complex openblas_complex_xdouble;
|
||||
#else
|
||||
#define OPENBLAS_COMPLEX_STRUCT
|
||||
typedef struct { float real, imag; } openblas_complex_float;
|
||||
typedef struct { double real, imag; } openblas_complex_double;
|
||||
typedef struct { xdouble real, imag; } openblas_complex_xdouble;
|
||||
#endif
|
||||
#endif // ASSEMBLER
|
||||
|
||||
#ifndef IFLUSH
|
||||
#define IFLUSH
|
||||
#endif
|
||||
|
||||
+30
-12
@@ -45,6 +45,8 @@ extern "C" {
|
||||
|
||||
int BLASFUNC(xerbla)(char *, blasint *info, blasint);
|
||||
|
||||
void openblas_set_num_threads_(int *);
|
||||
|
||||
FLOATRET BLASFUNC(sdot) (blasint *, float *, blasint *, float *, blasint *);
|
||||
FLOATRET BLASFUNC(sdsdot)(blasint *, float *, float *, blasint *, float *, blasint *);
|
||||
|
||||
@@ -74,19 +76,19 @@ myxcomplex_t BLASFUNC(xdotu) (blasint *, xdouble *, blasint *, xdouble *,
|
||||
myxcomplex_t BLASFUNC(xdotc) (blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
|
||||
#elif defined RETURN_BY_STACK
|
||||
void BLASFUNC(cdotu) (float _Complex *, blasint *, float * , blasint *, float *, blasint *);
|
||||
void BLASFUNC(cdotc) (float _Complex *, blasint *, float *, blasint *, float *, blasint *);
|
||||
void BLASFUNC(zdotu) (double _Complex *, blasint *, double *, blasint *, double *, blasint *);
|
||||
void BLASFUNC(zdotc) (double _Complex *, blasint *, double *, blasint *, double *, blasint *);
|
||||
void BLASFUNC(xdotu) (xdouble _Complex *, blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
void BLASFUNC(xdotc) (xdouble _Complex *, blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
void BLASFUNC(cdotu) (openblas_complex_float *, blasint *, float * , blasint *, float *, blasint *);
|
||||
void BLASFUNC(cdotc) (openblas_complex_float *, blasint *, float *, blasint *, float *, blasint *);
|
||||
void BLASFUNC(zdotu) (openblas_complex_double *, blasint *, double *, blasint *, double *, blasint *);
|
||||
void BLASFUNC(zdotc) (openblas_complex_double *, blasint *, double *, blasint *, double *, blasint *);
|
||||
void BLASFUNC(xdotu) (openblas_complex_xdouble *, blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
void BLASFUNC(xdotc) (openblas_complex_xdouble *, blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
#else
|
||||
float _Complex BLASFUNC(cdotu) (blasint *, float *, blasint *, float *, blasint *);
|
||||
float _Complex BLASFUNC(cdotc) (blasint *, float *, blasint *, float *, blasint *);
|
||||
double _Complex BLASFUNC(zdotu) (blasint *, double *, blasint *, double *, blasint *);
|
||||
double _Complex BLASFUNC(zdotc) (blasint *, double *, blasint *, double *, blasint *);
|
||||
xdouble _Complex BLASFUNC(xdotu) (blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
xdouble _Complex BLASFUNC(xdotc) (blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
openblas_complex_float BLASFUNC(cdotu) (blasint *, float *, blasint *, float *, blasint *);
|
||||
openblas_complex_float BLASFUNC(cdotc) (blasint *, float *, blasint *, float *, blasint *);
|
||||
openblas_complex_double BLASFUNC(zdotu) (blasint *, double *, blasint *, double *, blasint *);
|
||||
openblas_complex_double BLASFUNC(zdotc) (blasint *, double *, blasint *, double *, blasint *);
|
||||
openblas_complex_xdouble BLASFUNC(xdotu) (blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
openblas_complex_xdouble BLASFUNC(xdotc) (blasint *, xdouble *, blasint *, xdouble *, blasint *);
|
||||
#endif
|
||||
|
||||
void BLASFUNC(saxpy) (blasint *, float *, float *, blasint *, float *, blasint *);
|
||||
@@ -640,6 +642,8 @@ int BLASFUNC(zgemc)(char *, char *, blasint *, blasint *, blasint *, double *,
|
||||
int BLASFUNC(xgemc)(char *, char *, blasint *, blasint *, blasint *, xdouble *,
|
||||
xdouble *, blasint *, xdouble *, blasint *, xdouble *, blasint *, xdouble *, xdouble *, blasint *);
|
||||
|
||||
/* Lapack routines */
|
||||
|
||||
int BLASFUNC(sgetf2)(blasint *, blasint *, float *, blasint *, blasint *, blasint *);
|
||||
int BLASFUNC(dgetf2)(blasint *, blasint *, double *, blasint *, blasint *, blasint *);
|
||||
int BLASFUNC(qgetf2)(blasint *, blasint *, xdouble *, blasint *, blasint *, blasint *);
|
||||
@@ -675,6 +679,13 @@ int BLASFUNC(cgesv)(blasint *, blasint *, float *, blasint *, blasint *, float
|
||||
int BLASFUNC(zgesv)(blasint *, blasint *, double *, blasint *, blasint *, double*, blasint *, blasint *);
|
||||
int BLASFUNC(xgesv)(blasint *, blasint *, xdouble *, blasint *, blasint *, xdouble*, blasint *, blasint *);
|
||||
|
||||
int BLASFUNC(sgesvd)(char *, char *, blasint *, blasint *, float *, blasint *, float *, float *, blasint *, float *, blasint *, float *, blasint *, blasint *);
|
||||
int BLASFUNC(dgesvd)(char *, char *, blasint *, blasint *, double *, blasint *, double *, double *, blasint *, double *, blasint *, double *, blasint *, blasint *);
|
||||
int BLASFUNC(qgesvd)(char *, char *, blasint *, blasint *, xdouble *, blasint *, xdouble *, xdouble *, blasint *, xdouble *, blasint *, xdouble *, blasint *, blasint *);
|
||||
int BLASFUNC(cgesvd)(char *, char *, blasint *, blasint *, float *, blasint *, float *, float *, blasint *, float *, blasint *, float *, blasint *, blasint *);
|
||||
int BLASFUNC(zgesvd)(char *, char *, blasint *, blasint *, double *, blasint *, double *, double *, blasint *, double *, blasint *, double *, blasint *, blasint *);
|
||||
int BLASFUNC(xgesvd)(char *, char *, blasint *, blasint *, xdouble *, blasint *, xdouble *, xdouble *, blasint *, xdouble *, blasint *, xdouble *, blasint *, blasint *);
|
||||
|
||||
int BLASFUNC(spotf2)(char *, blasint *, float *, blasint *, blasint *);
|
||||
int BLASFUNC(dpotf2)(char *, blasint *, double *, blasint *, blasint *);
|
||||
int BLASFUNC(qpotf2)(char *, blasint *, xdouble *, blasint *, blasint *);
|
||||
@@ -689,6 +700,13 @@ int BLASFUNC(cpotrf)(char *, blasint *, float *, blasint *, blasint *);
|
||||
int BLASFUNC(zpotrf)(char *, blasint *, double *, blasint *, blasint *);
|
||||
int BLASFUNC(xpotrf)(char *, blasint *, xdouble *, blasint *, blasint *);
|
||||
|
||||
int BLASFUNC(spotrs)(char *, blasint *, blasint *, float *, blasint *, float *, blasint *, blasint *);
|
||||
int BLASFUNC(dpotrs)(char *, blasint *, blasint *, double *, blasint *, double *, blasint *, blasint *);
|
||||
int BLASFUNC(qpotrs)(char *, blasint *, blasint *, xdouble *, blasint *, xdouble *, blasint *, blasint *);
|
||||
int BLASFUNC(cpotrs)(char *, blasint *, blasint *, float *, blasint *, float *, blasint *, blasint *);
|
||||
int BLASFUNC(zpotrs)(char *, blasint *, blasint *, double *, blasint *, double *, blasint *, blasint *);
|
||||
int BLASFUNC(xpotrs)(char *, blasint *, blasint *, xdouble *, blasint *, xdouble *, blasint *, blasint *);
|
||||
|
||||
int BLASFUNC(slauu2)(char *, blasint *, float *, blasint *, blasint *);
|
||||
int BLASFUNC(dlauu2)(char *, blasint *, double *, blasint *, blasint *);
|
||||
int BLASFUNC(qlauu2)(char *, blasint *, xdouble *, blasint *, blasint *);
|
||||
|
||||
+17
-3
@@ -68,9 +68,17 @@ extern long int syscall (long int __sysno, ...);
|
||||
static inline int my_mbind(void *addr, unsigned long len, int mode,
|
||||
unsigned long *nodemask, unsigned long maxnode,
|
||||
unsigned flags) {
|
||||
#if defined (LOONGSON3B)
|
||||
#if defined (__64BIT__)
|
||||
return syscall(SYS_mbind, addr, len, mode, nodemask, maxnode, flags);
|
||||
#else
|
||||
return 0; //NULL Implementation on Loongson 3B 32bit.
|
||||
#endif
|
||||
#else
|
||||
//Fixed randomly SEGFAULT when nodemask==NULL with above Linux 2.6.34
|
||||
unsigned long null_nodemask=0;
|
||||
return syscall(SYS_mbind, addr, len, mode, &null_nodemask, maxnode, flags);
|
||||
// unsigned long null_nodemask=0;
|
||||
return syscall(SYS_mbind, addr, len, mode, nodemask, maxnode, flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline int my_set_mempolicy(int mode, const unsigned long *addr, unsigned long flag) {
|
||||
@@ -78,7 +86,13 @@ static inline int my_set_mempolicy(int mode, const unsigned long *addr, unsigned
|
||||
return syscall(SYS_set_mempolicy, mode, addr, flag);
|
||||
}
|
||||
|
||||
static inline int my_gettid(void) { return syscall(SYS_gettid); }
|
||||
static inline int my_gettid(void) {
|
||||
#ifdef SYS_gettid
|
||||
return syscall(SYS_gettid);
|
||||
#else
|
||||
return getpid();
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+3
-1
@@ -2127,7 +2127,9 @@
|
||||
#endif
|
||||
|
||||
#ifndef ASSEMBLER
|
||||
#if defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_IA64)
|
||||
#if defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_IA64) || defined(ARCH_MIPS64)
|
||||
extern BLASLONG gemm_offset_a;
|
||||
extern BLASLONG gemm_offset_b;
|
||||
extern BLASLONG sgemm_p;
|
||||
extern BLASLONG sgemm_q;
|
||||
extern BLASLONG sgemm_r;
|
||||
|
||||
+40
-6
@@ -101,10 +101,15 @@ static void INLINE blas_lock(volatile unsigned long *address){
|
||||
|
||||
static inline unsigned int rpcc(void){
|
||||
unsigned long ret;
|
||||
#if defined(LOONGSON3A)
|
||||
unsigned long long tmp;
|
||||
__asm__ __volatile__("dmfc0 %0, $25, 1": "=r"(tmp):: "memory");
|
||||
ret=tmp;
|
||||
#if defined(LOONGSON3A) || defined(LOONGSON3B)
|
||||
// unsigned long long tmp;
|
||||
//__asm__ __volatile__("dmfc0 %0, $25, 1": "=r"(tmp):: "memory");
|
||||
//ret=tmp;
|
||||
__asm__ __volatile__(".set push \n"
|
||||
".set mips32r2\n"
|
||||
"rdhwr %0, $2\n"
|
||||
".set pop": "=r"(ret):: "memory");
|
||||
|
||||
#else
|
||||
__asm__ __volatile__(".set push \n"
|
||||
".set mips32r2\n"
|
||||
@@ -114,6 +119,21 @@ static inline unsigned int rpcc(void){
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if defined(LOONGSON3A) || defined(LOONGSON3B)
|
||||
#ifndef NO_AFFINITY
|
||||
#define WHEREAMI
|
||||
static inline int WhereAmI(void){
|
||||
int ret=0;
|
||||
__asm__ __volatile__(".set push \n"
|
||||
".set mips32r2\n"
|
||||
"rdhwr %0, $0\n"
|
||||
".set pop": "=r"(ret):: "memory");
|
||||
return ret;
|
||||
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static inline int blas_quickdivide(blasint x, blasint y){
|
||||
return x / y;
|
||||
}
|
||||
@@ -152,6 +172,7 @@ static inline int blas_quickdivide(blasint x, blasint y){
|
||||
#define CMPEQ c.eq.d
|
||||
#define CMPLE c.le.d
|
||||
#define CMPLT c.lt.d
|
||||
#define NEG neg.d
|
||||
#else
|
||||
#define LD lwc1
|
||||
#define ST swc1
|
||||
@@ -170,6 +191,14 @@ static inline int blas_quickdivide(blasint x, blasint y){
|
||||
#define CMPEQ c.eq.s
|
||||
#define CMPLE c.le.s
|
||||
#define CMPLT c.lt.s
|
||||
#define PLU plu.ps
|
||||
#define PLL pll.ps
|
||||
#define PUU puu.ps
|
||||
#define PUL pul.ps
|
||||
#define MADPS madd.ps
|
||||
#define CVTU cvt.s.pu
|
||||
#define CVTL cvt.s.pl
|
||||
#define NEG neg.s
|
||||
#endif
|
||||
|
||||
#if defined(__64BIT__) && defined(USE64BITINT)
|
||||
@@ -218,13 +247,18 @@ REALNAME: ;\
|
||||
|
||||
#define SEEK_ADDRESS
|
||||
|
||||
#define BUFFER_SIZE ( 8 << 20)
|
||||
#define BUFFER_SIZE ( 32 << 20)
|
||||
|
||||
#if defined(LOONGSON3A)
|
||||
#define PAGESIZE (16UL << 10)
|
||||
#define FIXED_PAGESIZE (16UL << 10)
|
||||
#endif
|
||||
|
||||
#if defined(LOONGSON3B)
|
||||
#define PAGESIZE (32UL << 10)
|
||||
#define FIXED_PAGESIZE (32UL << 10)
|
||||
#endif
|
||||
|
||||
#ifndef PAGESIZE
|
||||
#define PAGESIZE (64UL << 10)
|
||||
#endif
|
||||
@@ -236,7 +270,7 @@ REALNAME: ;\
|
||||
#define MAP_ANONYMOUS MAP_ANON
|
||||
#endif
|
||||
|
||||
#if defined(LOONGSON3A)
|
||||
#if defined(LOONGSON3A) || defined(LOONGSON3B)
|
||||
#define PREFETCHD_(x) ld $0, x
|
||||
#define PREFETCHD(x) PREFETCHD_(x)
|
||||
#else
|
||||
|
||||
@@ -63,5 +63,7 @@ double _Complex BLASFUNC_REF(zdotc) (blasint *, double *, blasint *, double
|
||||
void BLASFUNC_REF(drotmg)(double *, double *, double *, double *, double *);
|
||||
|
||||
double BLASFUNC_REF(dsdot)(blasint *, float *, blasint *, float *, blasint*);
|
||||
|
||||
FLOATRET BLASFUNC_REF(samax) (blasint *, float *, blasint *);
|
||||
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -135,7 +135,7 @@ static __inline int num_cpu_avail(int level) {
|
||||
int openmp_nthreads=0;
|
||||
#endif
|
||||
|
||||
if ((blas_cpu_number == 1)
|
||||
if (blas_cpu_number == 1
|
||||
|
||||
#ifdef USE_OPENMP
|
||||
|| omp_in_parallel()
|
||||
|
||||
+10
-3
@@ -254,7 +254,7 @@ static __inline int blas_quickdivide(unsigned int x, unsigned int y){
|
||||
#define PROFCODE
|
||||
#endif
|
||||
|
||||
#if defined(OS_WINNT) || defined(OS_CYGWIN_NT) || defined(OS_INERIX)
|
||||
#if defined(OS_WINNT) || defined(OS_CYGWIN_NT) || defined(OS_INTERIX)
|
||||
#define SAVEREGISTERS \
|
||||
subl $32, %esp;\
|
||||
movups %xmm6, 0(%esp);\
|
||||
@@ -269,7 +269,7 @@ static __inline int blas_quickdivide(unsigned int x, unsigned int y){
|
||||
#define RESTOREREGISTERS
|
||||
#endif
|
||||
|
||||
#if defined(OS_WINNT) || defined(OS_CYGWIN_NT) || defined(OS_INERIX)
|
||||
#if defined(OS_WINNT) || defined(OS_CYGWIN_NT) || defined(OS_INTERIX)
|
||||
#define PROLOGUE \
|
||||
.text; \
|
||||
.align 16; \
|
||||
@@ -282,7 +282,7 @@ REALNAME:
|
||||
#define EPILOGUE .end REALNAME
|
||||
#endif
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_FreeBSD) || defined(OS_NetBSD) || defined(__ELF__)
|
||||
#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(__ELF__)
|
||||
#define PROLOGUE \
|
||||
.text; \
|
||||
.align 16; \
|
||||
@@ -356,4 +356,11 @@ REALNAME:
|
||||
|
||||
#ifndef ALIGN_6
|
||||
#define ALIGN_6 .align 64
|
||||
|
||||
// ffreep %st(0).
|
||||
// Because Clang didn't support ffreep, we directly use the opcode.
|
||||
// Please check out http://www.sandpile.org/x86/opc_fpu.htm
|
||||
#ifndef ffreep
|
||||
#define ffreep .byte 0xdf, 0xc0 #
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+8
-1
@@ -353,7 +353,7 @@ REALNAME:
|
||||
#define EPILOGUE .end REALNAME
|
||||
#endif
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_FreeBSD) || defined(OS_NetBSD) || defined(__ELF__) || defined(C_PGI)
|
||||
#if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_NETBSD) || defined(__ELF__) || defined(C_PGI)
|
||||
#define PROLOGUE \
|
||||
.text; \
|
||||
.align 512; \
|
||||
@@ -425,6 +425,7 @@ REALNAME:
|
||||
#define ALIGN_2 .align 2
|
||||
#define ALIGN_3 .align 3
|
||||
#define ALIGN_4 .align 4
|
||||
#define ALIGN_5 .align 5
|
||||
#define ffreep fstp
|
||||
#endif
|
||||
|
||||
@@ -448,4 +449,10 @@ REALNAME:
|
||||
#define ALIGN_6 .align 64
|
||||
#endif
|
||||
|
||||
// ffreep %st(0).
|
||||
// Because Clang didn't support ffreep, we directly use the opcode.
|
||||
// Please check out http://www.sandpile.org/x86/opc_fpu.htm
|
||||
#ifndef ffreep
|
||||
#define ffreep .byte 0xdf, 0xc0 #
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -103,6 +103,9 @@
|
||||
#define CORE_NEHALEM 17
|
||||
#define CORE_ATOM 18
|
||||
#define CORE_NANO 19
|
||||
#define CORE_SANDYBRIDGE 20
|
||||
#define CORE_BOBCAT 21
|
||||
#define CORE_BULLDOZER 22
|
||||
|
||||
#define HAVE_SSE (1 << 0)
|
||||
#define HAVE_SSE2 (1 << 1)
|
||||
@@ -122,6 +125,7 @@
|
||||
#define HAVE_MISALIGNSSE (1 << 15)
|
||||
#define HAVE_128BITFPU (1 << 16)
|
||||
#define HAVE_FASTMOVU (1 << 17)
|
||||
#define HAVE_AVX (1 << 18)
|
||||
|
||||
#define CACHE_INFO_L1_I 1
|
||||
#define CACHE_INFO_L1_D 2
|
||||
@@ -188,4 +192,7 @@ typedef struct {
|
||||
#define CPUTYPE_NSGEODE 41
|
||||
#define CPUTYPE_VIAC3 42
|
||||
#define CPUTYPE_NANO 43
|
||||
#define CPUTYPE_SANDYBRIDGE 44
|
||||
#define CPUTYPE_BOBCAT 45
|
||||
#define CPUTYPE_BULLDOZER 46
|
||||
#endif
|
||||
|
||||
+39
-2
@@ -1,5 +1,5 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -72,11 +72,13 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define CPU_UNKNOWN 0
|
||||
#define CPU_SICORTEX 1
|
||||
#define CPU_LOONGSON3A 2
|
||||
#define CPU_LOONGSON3B 3
|
||||
|
||||
static char *cpuname[] = {
|
||||
"UNKOWN",
|
||||
"SICORTEX",
|
||||
"LOONGSON3A"
|
||||
"LOONGSON3A",
|
||||
"LOONGSON3B"
|
||||
};
|
||||
|
||||
int detect(void){
|
||||
@@ -99,10 +101,14 @@ int detect(void){
|
||||
|
||||
fclose(infile);
|
||||
|
||||
if(p != NULL){
|
||||
if (strstr(p, "Loongson-3A")){
|
||||
return CPU_LOONGSON3A;
|
||||
}else if(strstr(p, "Loongson-3B")){
|
||||
return CPU_LOONGSON3B;
|
||||
}else if (strstr(p, "Loongson-3")){
|
||||
infile = fopen("/proc/cpuinfo", "r");
|
||||
p = (char *)NULL;
|
||||
while (fgets(buffer, sizeof(buffer), infile)){
|
||||
if (!strncmp("system type", buffer, 11)){
|
||||
p = strchr(buffer, ':') + 2;
|
||||
@@ -115,6 +121,24 @@ int detect(void){
|
||||
}else{
|
||||
return CPU_SICORTEX;
|
||||
}
|
||||
}
|
||||
//Check model name for Loongson3
|
||||
infile = fopen("/proc/cpuinfo", "r");
|
||||
p = (char *)NULL;
|
||||
while (fgets(buffer, sizeof(buffer), infile)){
|
||||
if (!strncmp("model name", buffer, 10)){
|
||||
p = strchr(buffer, ':') + 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
fclose(infile);
|
||||
if(p != NULL){
|
||||
if (strstr(p, "Loongson-3A")){
|
||||
return CPU_LOONGSON3A;
|
||||
}else if(strstr(p, "Loongson-3B")){
|
||||
return CPU_LOONGSON3B;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return CPU_UNKNOWN;
|
||||
}
|
||||
@@ -130,6 +154,8 @@ void get_architecture(void){
|
||||
void get_subarchitecture(void){
|
||||
if(detect()==CPU_LOONGSON3A) {
|
||||
printf("LOONGSON3A");
|
||||
}else if(detect()==CPU_LOONGSON3B){
|
||||
printf("LOONGSON3B");
|
||||
}else{
|
||||
printf("SICORTEX");
|
||||
}
|
||||
@@ -149,6 +175,15 @@ void get_cpuconfig(void){
|
||||
printf("#define DTB_DEFAULT_ENTRIES 64\n");
|
||||
printf("#define DTB_SIZE 4096\n");
|
||||
printf("#define L2_ASSOCIATIVE 4\n");
|
||||
}else if(detect()==CPU_LOONGSON3B){
|
||||
printf("#define LOONGSON3B\n");
|
||||
printf("#define L1_DATA_SIZE 65536\n");
|
||||
printf("#define L1_DATA_LINESIZE 32\n");
|
||||
printf("#define L2_SIZE 512488\n");
|
||||
printf("#define L2_LINESIZE 32\n");
|
||||
printf("#define DTB_DEFAULT_ENTRIES 64\n");
|
||||
printf("#define DTB_SIZE 4096\n");
|
||||
printf("#define L2_ASSOCIATIVE 4\n");
|
||||
}else{
|
||||
printf("#define SICORTEX\n");
|
||||
printf("#define L1_DATA_SIZE 32768\n");
|
||||
@@ -164,6 +199,8 @@ void get_cpuconfig(void){
|
||||
void get_libname(void){
|
||||
if(detect()==CPU_LOONGSON3A) {
|
||||
printf("loongson3a\n");
|
||||
}else if(detect()==CPU_LOONGSON3B) {
|
||||
printf("loongson3b\n");
|
||||
}else{
|
||||
#ifdef __mips64
|
||||
printf("mips64\n");
|
||||
|
||||
+113
-17
@@ -40,6 +40,11 @@
|
||||
#include <string.h>
|
||||
#include "cpuid.h"
|
||||
|
||||
#ifdef NO_AVX
|
||||
#define CPUTYPE_SANDYBRIDGE CPUTYPE_NEHALEM
|
||||
#define CORE_SANDYBRIDGE CORE_NEHALEM
|
||||
#endif
|
||||
|
||||
#ifndef CPUIDEMU
|
||||
|
||||
#if defined(__APPLE__) && defined(__i386__)
|
||||
@@ -109,6 +114,32 @@ static inline int have_excpuid(void){
|
||||
return eax & 0xffff;
|
||||
}
|
||||
|
||||
#ifndef NO_AVX
|
||||
static inline void xgetbv(int op, int * eax, int * edx){
|
||||
__asm__ __volatile__
|
||||
("xgetbv": "=a" (*eax), "=d" (*edx) : "c" (op) : "cc");
|
||||
}
|
||||
#endif
|
||||
|
||||
int support_avx(){
|
||||
#ifndef NO_AVX
|
||||
int eax, ebx, ecx, edx;
|
||||
int ret=0;
|
||||
|
||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||
if ((ecx & (1 << 28)) != 0 && (ecx & (1 << 27)) != 0){
|
||||
xgetbv(0, &eax, &edx);
|
||||
if((eax & 6) == 6){
|
||||
ret=1; //OS support AVX
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int get_vendor(void){
|
||||
int eax, ebx, ecx, edx;
|
||||
char vendor[13];
|
||||
@@ -189,6 +220,9 @@ int get_cputype(int gettype){
|
||||
if ((ecx & (1 << 9)) != 0) feature |= HAVE_SSSE3;
|
||||
if ((ecx & (1 << 19)) != 0) feature |= HAVE_SSE4_1;
|
||||
if ((ecx & (1 << 20)) != 0) feature |= HAVE_SSE4_2;
|
||||
#ifndef NO_AVX
|
||||
if (support_avx()) feature |= HAVE_AVX;
|
||||
#endif
|
||||
|
||||
if (have_excpuid() >= 0x01) {
|
||||
cpuid(0x80000001, &eax, &ebx, &ecx, &edx);
|
||||
@@ -974,21 +1008,42 @@ int get_cpuname(void){
|
||||
return CPUTYPE_DUNNINGTON;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
switch (model) {
|
||||
case 5:
|
||||
//Intel Core (Clarkdale) / Core (Arrandale)
|
||||
// Pentium (Clarkdale) / Pentium Mobile (Arrandale)
|
||||
// Xeon (Clarkdale), 32nm
|
||||
return CPUTYPE_NEHALEM;
|
||||
case 10:
|
||||
//Intel Core i5-2000 /i7-2000 (Sandy Bridge)
|
||||
return CPUTYPE_NEHALEM;
|
||||
case 12:
|
||||
//Xeon Processor 5600 (Westmere-EP)
|
||||
return CPUTYPE_NEHALEM;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
switch (model) {
|
||||
case 5:
|
||||
//Intel Core (Clarkdale) / Core (Arrandale)
|
||||
// Pentium (Clarkdale) / Pentium Mobile (Arrandale)
|
||||
// Xeon (Clarkdale), 32nm
|
||||
return CPUTYPE_NEHALEM;
|
||||
case 10:
|
||||
//Intel Core i5-2000 /i7-2000 (Sandy Bridge)
|
||||
if(support_avx())
|
||||
return CPUTYPE_SANDYBRIDGE;
|
||||
else
|
||||
return CPUTYPE_NEHALEM; //OS doesn't support AVX
|
||||
case 12:
|
||||
//Xeon Processor 5600 (Westmere-EP)
|
||||
return CPUTYPE_NEHALEM;
|
||||
case 13:
|
||||
//Intel Core i7-3000 / Xeon E5 (Sandy Bridge)
|
||||
if(support_avx())
|
||||
return CPUTYPE_SANDYBRIDGE;
|
||||
else
|
||||
return CPUTYPE_NEHALEM;
|
||||
case 15:
|
||||
//Xeon Processor E7 (Westmere-EX)
|
||||
return CPUTYPE_NEHALEM;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
switch (model) {
|
||||
case 10:
|
||||
if(support_avx())
|
||||
return CPUTYPE_SANDYBRIDGE;
|
||||
else
|
||||
return CPUTYPE_NEHALEM;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x7:
|
||||
@@ -1020,7 +1075,10 @@ int get_cpuname(void){
|
||||
return CPUTYPE_OPTERON;
|
||||
case 1:
|
||||
case 10:
|
||||
case 6: //AMD Bulldozer Opteron 6200 / Opteron 4200 / AMD FX-Series
|
||||
return CPUTYPE_BARCELONA;
|
||||
case 5:
|
||||
return CPUTYPE_BOBCAT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1140,6 +1198,9 @@ static char *cpuname[] = {
|
||||
"NSGEODE",
|
||||
"VIAC3",
|
||||
"NANO",
|
||||
"SANDYBRIDGE",
|
||||
"BOBCAT",
|
||||
"BULLDOZER",
|
||||
};
|
||||
|
||||
static char *lowercpuname[] = {
|
||||
@@ -1186,6 +1247,9 @@ static char *lowercpuname[] = {
|
||||
"tms3x00",
|
||||
"nsgeode",
|
||||
"nano",
|
||||
"sandybridge",
|
||||
"bobcat",
|
||||
"bulldozer",
|
||||
};
|
||||
|
||||
static char *corename[] = {
|
||||
@@ -1209,6 +1273,9 @@ static char *corename[] = {
|
||||
"NEHALEM",
|
||||
"ATOM",
|
||||
"NANO",
|
||||
"SANDYBRIDGE",
|
||||
"BOBCAT",
|
||||
"BULLDOZER",
|
||||
};
|
||||
|
||||
static char *corename_lower[] = {
|
||||
@@ -1232,6 +1299,9 @@ static char *corename_lower[] = {
|
||||
"nehalem",
|
||||
"atom",
|
||||
"nano",
|
||||
"sandybridge",
|
||||
"bobcat",
|
||||
"bulldozer",
|
||||
};
|
||||
|
||||
|
||||
@@ -1315,10 +1385,31 @@ int get_coretype(void){
|
||||
return CORE_NEHALEM;
|
||||
case 10:
|
||||
//Intel Core i5-2000 /i7-2000 (Sandy Bridge)
|
||||
return CORE_NEHALEM;
|
||||
if(support_avx())
|
||||
return CORE_SANDYBRIDGE;
|
||||
else
|
||||
return CORE_NEHALEM; //OS doesn't support AVX
|
||||
case 12:
|
||||
//Xeon Processor 5600 (Westmere-EP)
|
||||
return CORE_NEHALEM;
|
||||
case 13:
|
||||
//Intel Core i7-3000 / Xeon E5 (Sandy Bridge)
|
||||
if(support_avx())
|
||||
return CORE_SANDYBRIDGE;
|
||||
else
|
||||
return CORE_NEHALEM; //OS doesn't support AVX
|
||||
case 15:
|
||||
//Xeon Processor E7 (Westmere-EX)
|
||||
return CORE_NEHALEM;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
switch (model) {
|
||||
case 10:
|
||||
if(support_avx())
|
||||
return CORE_SANDYBRIDGE;
|
||||
else
|
||||
return CORE_NEHALEM; //OS doesn't support AVX
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1334,7 +1425,10 @@ int get_coretype(void){
|
||||
if (family <= 0x5) return CORE_80486;
|
||||
if (family <= 0xe) return CORE_ATHLON;
|
||||
if (family == 0xf){
|
||||
if ((exfamily == 0) || (exfamily == 2)) return CORE_OPTERON; else return CORE_BARCELONA;
|
||||
if ((exfamily == 0) || (exfamily == 2)) return CORE_OPTERON;
|
||||
else if (exfamily == 5) return CORE_BOBCAT;
|
||||
else if (exfamily == 6) return CORE_BARCELONA; //AMD Bulldozer Opteron 6200 / Opteron 4200 / AMD FX-Series
|
||||
else return CORE_BARCELONA;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1414,6 +1508,7 @@ void get_cpuconfig(void){
|
||||
if (features & HAVE_SSE4_2) printf("#define HAVE_SSE4_2\n");
|
||||
if (features & HAVE_SSE4A) printf("#define HAVE_SSE4A\n");
|
||||
if (features & HAVE_SSE5 ) printf("#define HAVE_SSSE5\n");
|
||||
if (features & HAVE_AVX ) printf("#define HAVE_AVX\n");
|
||||
if (features & HAVE_3DNOWEX) printf("#define HAVE_3DNOWEX\n");
|
||||
if (features & HAVE_3DNOW) printf("#define HAVE_3DNOW\n");
|
||||
if (features & HAVE_CFLUSH) printf("#define HAVE_CFLUSH\n");
|
||||
@@ -1479,6 +1574,7 @@ void get_sse(void){
|
||||
if (features & HAVE_SSE4_2) printf("HAVE_SSE4_2=1\n");
|
||||
if (features & HAVE_SSE4A) printf("HAVE_SSE4A=1\n");
|
||||
if (features & HAVE_SSE5 ) printf("HAVE_SSSE5=1\n");
|
||||
if (features & HAVE_AVX ) printf("HAVE_AVX=1\n");
|
||||
if (features & HAVE_3DNOWEX) printf("HAVE_3DNOWEX=1\n");
|
||||
if (features & HAVE_3DNOW) printf("HAVE_3DNOW=1\n");
|
||||
|
||||
|
||||
@@ -34,20 +34,20 @@ COMPILER_GNU
|
||||
OS_LINUX
|
||||
#endif
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
OS_FreeBSD
|
||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
||||
OS_FREEBSD
|
||||
#endif
|
||||
|
||||
#if defined(__NetBSD__)
|
||||
OS_NetBSD
|
||||
OS_NETBSD
|
||||
#endif
|
||||
|
||||
#if defined(__sun)
|
||||
OS_SunOS
|
||||
OS_SUNOS
|
||||
#endif
|
||||
|
||||
#if defined(__APPLE__)
|
||||
OS_Darwin
|
||||
OS_DARWIN
|
||||
#endif
|
||||
|
||||
#if defined(_AIX)
|
||||
@@ -63,13 +63,18 @@ OS_WINNT
|
||||
#endif
|
||||
|
||||
#if defined(__CYGWIN__)
|
||||
OS_CYGWIN
|
||||
OS_CYGWIN_NT
|
||||
#endif
|
||||
|
||||
#if defined(__INTERIX)
|
||||
OS_INTERIX
|
||||
#endif
|
||||
|
||||
#if defined(__gnu_hurd__)
|
||||
/* Hurd is very similar to GNU/Linux, it should work out of the box */
|
||||
OS_LINUX
|
||||
#endif
|
||||
|
||||
#if defined(__i386) || defined(_X86)
|
||||
ARCH_X86
|
||||
#endif
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
TOPDIR = ..
|
||||
include $(TOPDIR)/Makefile.system
|
||||
|
||||
CFLAGS += -DADD$(BU) -DCBLAS
|
||||
override CFLAGS += -DADD$(BU) -DCBLAS
|
||||
|
||||
LIB = $(TOPDIR)/$(LIBNAME)
|
||||
|
||||
|
||||
@@ -77,8 +77,8 @@ int CNAME(int mode, blas_arg_t *arg, BLASLONG *range_m, BLASLONG *range_n, int (
|
||||
range_M[0] = 0;
|
||||
i = arg -> m;
|
||||
} else {
|
||||
range_M[0] = range_M[0];
|
||||
i = range_M[1] - range_M[0];
|
||||
range_M[0] = range_m[0];
|
||||
i = range_m[1] - range_m[0];
|
||||
}
|
||||
|
||||
num_cpu_m = 0;
|
||||
|
||||
@@ -71,16 +71,25 @@ int CNAME(int mode, blas_arg_t *arg, BLASLONG *range_m, BLASLONG *range_n, int (
|
||||
queue[num_cpu].args = arg;
|
||||
queue[num_cpu].range_m = range_m;
|
||||
queue[num_cpu].range_n = &range[num_cpu];
|
||||
queue[num_cpu].sa = NULL;
|
||||
#if defined(LOONGSON3A)
|
||||
queue[num_cpu].sa = sa + GEMM_OFFSET_A1 * num_cpu;
|
||||
queue[num_cpu].sb = queue[num_cpu].sa + GEMM_OFFSET_A1 * 5;
|
||||
#else
|
||||
queue[num_cpu].sa = NULL;
|
||||
queue[num_cpu].sb = NULL;
|
||||
#endif
|
||||
queue[num_cpu].next = &queue[num_cpu + 1];
|
||||
num_cpu ++;
|
||||
}
|
||||
|
||||
if (num_cpu) {
|
||||
#if defined(LOONGSON3A)
|
||||
queue[0].sa = sa;
|
||||
queue[0].sb = sb;
|
||||
|
||||
queue[0].sb = sa + GEMM_OFFSET_A1 * 5;
|
||||
#else
|
||||
queue[0].sa = sa;
|
||||
queue[0].sb = sb;
|
||||
#endif
|
||||
queue[num_cpu - 1].next = NULL;
|
||||
|
||||
exec_blas(num_cpu,
|
||||
|
||||
@@ -55,8 +55,8 @@ int CNAME(int mode,
|
||||
range_M[0] = 0;
|
||||
i = arg -> m;
|
||||
} else {
|
||||
range_M[0] = range_M[0];
|
||||
i = range_M[1] - range_M[0];
|
||||
range_M[0] = range_m[0];
|
||||
i = range_m[1] - range_m[0];
|
||||
}
|
||||
|
||||
num_cpu_m = 0;
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
TOPDIR = ../..
|
||||
include ../../Makefile.system
|
||||
|
||||
COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX)
|
||||
COMMONOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) c_abs.$(SUFFIX) z_abs.$(SUFFIX) openblas_set_num_threads.$(SUFFIX)
|
||||
|
||||
COMMONOBJS += slamch.$(SUFFIX) slamc3.$(SUFFIX) dlamch.$(SUFFIX) dlamc3.$(SUFFIX)
|
||||
|
||||
ifdef SMP
|
||||
COMMONOBJS += blas_server.$(SUFFIX) divtable.$(SUFFIX) blasL1thread.$(SUFFIX) openblas_set_num_threads.$(SUFFIX)
|
||||
COMMONOBJS += blas_server.$(SUFFIX) divtable.$(SUFFIX) blasL1thread.$(SUFFIX)
|
||||
ifndef NO_AFFINITY
|
||||
COMMONOBJS += init.$(SUFFIX)
|
||||
endif
|
||||
@@ -14,7 +14,7 @@ endif
|
||||
|
||||
# COMMONOBJS += info.$(SUFFIX)
|
||||
|
||||
ifdef DYNAMIC_ARCH
|
||||
ifeq ($(DYNAMIC_ARCH), 1)
|
||||
COMMONOBJS += dynamic.$(SUFFIX)
|
||||
else
|
||||
COMMONOBJS += parameter.$(SUFFIX)
|
||||
@@ -70,7 +70,7 @@ ifndef BLAS_SERVER
|
||||
BLAS_SERVER = blas_server.c
|
||||
endif
|
||||
|
||||
ifdef DYNAMIC_ARCH
|
||||
ifeq ($(DYNAMIC_ARCH), 1)
|
||||
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic.$(SUFFIX)
|
||||
else
|
||||
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) parameter.$(SUFFIX)
|
||||
@@ -215,7 +215,7 @@ info.$(SUFFIX) : info.c info.h ../../common.h ../../param.h
|
||||
$(CC) $(CFLAGS) -c $< -o $(@F)
|
||||
|
||||
|
||||
hpl : CFLAGS += -DHPL
|
||||
hpl_p : CFLAGS += -DHPL
|
||||
hpl : override CFLAGS += -DHPL
|
||||
hpl_p : override CFLAGS += -DHPL
|
||||
|
||||
include $(TOPDIR)/Makefile.tail
|
||||
|
||||
@@ -435,7 +435,7 @@ static int blas_thread_server(void *arg){
|
||||
|
||||
blas_memory_free(buffer);
|
||||
|
||||
pthread_exit(NULL);
|
||||
//pthread_exit(NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -500,6 +500,7 @@ static int blas_monitor(void *arg){
|
||||
/* Initializing routine */
|
||||
int blas_thread_init(void){
|
||||
BLASLONG i;
|
||||
int ret;
|
||||
#ifdef NEED_STACKATTR
|
||||
pthread_attr_t attr;
|
||||
#endif
|
||||
@@ -545,12 +546,16 @@ int blas_thread_init(void){
|
||||
pthread_cond_init (&thread_status[i].wakeup, NULL);
|
||||
|
||||
#ifdef NEED_STACKATTR
|
||||
pthread_create(&blas_threads[i], &attr,
|
||||
ret=pthread_create(&blas_threads[i], &attr,
|
||||
(void *)&blas_thread_server, (void *)i);
|
||||
#else
|
||||
pthread_create(&blas_threads[i], NULL,
|
||||
ret=pthread_create(&blas_threads[i], NULL,
|
||||
(void *)&blas_thread_server, (void *)i);
|
||||
#endif
|
||||
if(ret!=0){
|
||||
fprintf(STDERR,"OpenBLAS: pthread_creat error in blas_thread_init function. Error code:%d\n",ret);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef MONITOR
|
||||
@@ -765,6 +770,19 @@ void goto_set_num_threads(int num_threads) {
|
||||
|
||||
if (num_threads < 1) num_threads = blas_num_threads;
|
||||
|
||||
#ifndef NO_AFFINITY
|
||||
if (num_threads == 1) {
|
||||
if (blas_cpu_number == 1){
|
||||
//OpenBLAS is already single thread.
|
||||
return;
|
||||
}else{
|
||||
//From multi-threads to single thread
|
||||
//Restore the original affinity mask
|
||||
gotoblas_set_affinity(-1);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (num_threads > MAX_CPU_NUMBER) num_threads = MAX_CPU_NUMBER;
|
||||
|
||||
if (num_threads > blas_num_threads) {
|
||||
@@ -795,8 +813,20 @@ void goto_set_num_threads(int num_threads) {
|
||||
UNLOCK_COMMAND(&server_lock);
|
||||
}
|
||||
|
||||
#ifndef NO_AFFINITY
|
||||
if(blas_cpu_number == 1 && num_threads > 1){
|
||||
//Restore the thread 0 affinity.
|
||||
gotoblas_set_affinity(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
blas_cpu_number = num_threads;
|
||||
|
||||
#if defined(ARCH_MIPS64)
|
||||
//set parameters for different number of threads.
|
||||
blas_set_parameter();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void openblas_set_num_threads(int num_threads) {
|
||||
|
||||
@@ -63,6 +63,11 @@ void goto_set_num_threads(int num_threads) {
|
||||
|
||||
omp_set_num_threads(blas_cpu_number);
|
||||
|
||||
#if defined(ARCH_MIPS64)
|
||||
//set parameters for different number of threads.
|
||||
blas_set_parameter();
|
||||
#endif
|
||||
|
||||
}
|
||||
void openblas_set_num_threads(int num_threads) {
|
||||
|
||||
|
||||
@@ -63,6 +63,8 @@ static blas_pool_t pool;
|
||||
static HANDLE blas_threads [MAX_CPU_NUMBER];
|
||||
static DWORD blas_threads_id[MAX_CPU_NUMBER];
|
||||
|
||||
|
||||
|
||||
static void legacy_exec(void *func, int mode, blas_arg_t *args, void *sb){
|
||||
|
||||
if (!(mode & BLAS_COMPLEX)){
|
||||
@@ -179,7 +181,7 @@ static DWORD WINAPI blas_thread_server(void *arg){
|
||||
|
||||
do {
|
||||
action = WaitForMultipleObjects(2, handles, FALSE, INFINITE);
|
||||
} while ((action != WAIT_OBJECT_0) && (action == WAIT_OBJECT_0 + 1));
|
||||
} while ((action != WAIT_OBJECT_0) && (action != WAIT_OBJECT_0 + 1));
|
||||
|
||||
if (action == WAIT_OBJECT_0 + 1) break;
|
||||
|
||||
@@ -263,7 +265,9 @@ static DWORD WINAPI blas_thread_server(void *arg){
|
||||
} else {
|
||||
legacy_exec(routine, queue -> mode, queue -> args, sb);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
continue; //if queue == NULL
|
||||
}
|
||||
|
||||
#ifdef SMP_DEBUG
|
||||
fprintf(STDERR, "Server[%2ld] Finished!\n", cpu);
|
||||
@@ -425,7 +429,7 @@ int exec_blas(BLASLONG num, blas_queue_t *queue){
|
||||
/* Shutdown procedure, but user don't have to call this routine. The */
|
||||
/* kernel automatically kill threads. */
|
||||
|
||||
int blas_thread_shutdown_(void){
|
||||
int BLASFUNC(blas_thread_shutdown)(void){
|
||||
|
||||
int i;
|
||||
|
||||
@@ -437,7 +441,7 @@ int blas_thread_shutdown_(void){
|
||||
|
||||
SetEvent(pool.killed);
|
||||
|
||||
for(i = 0; i < blas_cpu_number - 1; i++){
|
||||
for(i = 0; i < blas_num_threads - 1; i++){
|
||||
WaitForSingleObject(blas_threads[i], INFINITE);
|
||||
}
|
||||
|
||||
@@ -448,3 +452,47 @@ int blas_thread_shutdown_(void){
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void goto_set_num_threads(int num_threads)
|
||||
{
|
||||
long i;
|
||||
|
||||
if (num_threads < 1) num_threads = blas_cpu_number;
|
||||
|
||||
if (num_threads > MAX_CPU_NUMBER) num_threads = MAX_CPU_NUMBER;
|
||||
|
||||
if (num_threads > blas_num_threads) {
|
||||
|
||||
LOCK_COMMAND(&server_lock);
|
||||
|
||||
//increased_threads = 1;
|
||||
if (!blas_server_avail){
|
||||
|
||||
InitializeCriticalSection(&pool.lock);
|
||||
pool.filled = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
pool.killed = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
|
||||
pool.shutdown = 0;
|
||||
pool.queue = NULL;
|
||||
blas_server_avail = 1;
|
||||
}
|
||||
|
||||
for(i = blas_num_threads - 1; i < num_threads - 1; i++){
|
||||
|
||||
blas_threads[i] = CreateThread(NULL, 0,
|
||||
blas_thread_server, (void *)i,
|
||||
0, &blas_threads_id[i]);
|
||||
}
|
||||
|
||||
blas_num_threads = num_threads;
|
||||
|
||||
UNLOCK_COMMAND(&server_lock);
|
||||
}
|
||||
|
||||
blas_cpu_number = num_threads;
|
||||
}
|
||||
|
||||
void openblas_set_num_threads(int num)
|
||||
{
|
||||
goto_set_num_threads(num);
|
||||
}
|
||||
+73
-11
@@ -60,6 +60,14 @@ extern gotoblas_t gotoblas_NEHALEM;
|
||||
extern gotoblas_t gotoblas_OPTERON;
|
||||
extern gotoblas_t gotoblas_OPTERON_SSE3;
|
||||
extern gotoblas_t gotoblas_BARCELONA;
|
||||
extern gotoblas_t gotoblas_BOBCAT;
|
||||
#ifndef NO_AVX
|
||||
extern gotoblas_t gotoblas_SANDYBRIDGE;
|
||||
#else
|
||||
//Use NEHALEM kernels for sandy bridge
|
||||
#define gotoblas_SANDYBRIDGE gotoblas_NEHALEM
|
||||
#endif
|
||||
|
||||
|
||||
#define VENDOR_INTEL 1
|
||||
#define VENDOR_AMD 2
|
||||
@@ -68,6 +76,31 @@ extern gotoblas_t gotoblas_BARCELONA;
|
||||
|
||||
#define BITMASK(a, b, c) ((((a) >> (b)) & (c)))
|
||||
|
||||
#ifndef NO_AVX
|
||||
static inline void xgetbv(int op, int * eax, int * edx){
|
||||
__asm__ __volatile__
|
||||
("xgetbv": "=a" (*eax), "=d" (*edx) : "c" (op) : "cc");
|
||||
}
|
||||
#endif
|
||||
|
||||
int support_avx(){
|
||||
#ifndef NO_AVX
|
||||
int eax, ebx, ecx, edx;
|
||||
int ret=0;
|
||||
|
||||
cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||
if ((ecx & (1 << 28)) != 0 && (ecx & (1 << 27)) != 0){
|
||||
xgetbv(0, &eax, &edx);
|
||||
if((eax & 6) == 6){
|
||||
ret=1; //OS support AVX
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int get_vendor(void){
|
||||
int eax, ebx, ecx, edx;
|
||||
char vendor[13];
|
||||
@@ -122,15 +155,38 @@ static gotoblas_t *get_coretype(void){
|
||||
if (model == 12) return &gotoblas_ATOM;
|
||||
return NULL;
|
||||
|
||||
case 2:
|
||||
//Intel Core (Clarkdale) / Core (Arrandale)
|
||||
// Pentium (Clarkdale) / Pentium Mobile (Arrandale)
|
||||
// Xeon (Clarkdale), 32nm
|
||||
if (model == 5) return &gotoblas_NEHALEM;
|
||||
case 2:
|
||||
//Intel Core (Clarkdale) / Core (Arrandale)
|
||||
// Pentium (Clarkdale) / Pentium Mobile (Arrandale)
|
||||
// Xeon (Clarkdale), 32nm
|
||||
if (model == 5) return &gotoblas_NEHALEM;
|
||||
|
||||
//Intel Xeon Processor 5600 (Westmere-EP)
|
||||
if (model == 12) return &gotoblas_NEHALEM;
|
||||
return NULL;
|
||||
//Intel Xeon Processor 5600 (Westmere-EP)
|
||||
//Xeon Processor E7 (Westmere-EX)
|
||||
if (model == 12 || model == 15) return &gotoblas_NEHALEM;
|
||||
|
||||
//Intel Core i5-2000 /i7-2000 (Sandy Bridge)
|
||||
//Intel Core i7-3000 / Xeon E5
|
||||
if (model == 10 || model == 13) {
|
||||
if(support_avx())
|
||||
return &gotoblas_SANDYBRIDGE;
|
||||
else{
|
||||
fprintf(stderr, "OpenBLAS : Your OS doesn't support AVX. Use Nehalem kernels.\n");
|
||||
return &gotoblas_NEHALEM; //OS doesn't support AVX. Use old kernels.
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
case 3:
|
||||
//Intel Sandy Bridge 22nm (Ivy Bridge?)
|
||||
if (model == 10) {
|
||||
if(support_avx())
|
||||
return &gotoblas_SANDYBRIDGE;
|
||||
else{
|
||||
fprintf(stderr, "OpenBLAS : Your OS doesn't support AVX. Use Nehalem kernels.\n");
|
||||
return &gotoblas_NEHALEM; //OS doesn't support AVX. Use old kernels.
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
case 0xf:
|
||||
if (model <= 0x2) return &gotoblas_NORTHWOOD;
|
||||
@@ -144,7 +200,9 @@ static gotoblas_t *get_coretype(void){
|
||||
if ((exfamily == 0) || (exfamily == 2)) {
|
||||
if (ecx & (1 << 0)) return &gotoblas_OPTERON_SSE3;
|
||||
else return &gotoblas_OPTERON;
|
||||
} else {
|
||||
} else if (exfamily == 5) {
|
||||
return &gotoblas_BOBCAT;
|
||||
} else {
|
||||
return &gotoblas_BARCELONA;
|
||||
}
|
||||
}
|
||||
@@ -178,6 +236,8 @@ static char *corename[] = {
|
||||
"Opteron(SSE3)",
|
||||
"Barcelona",
|
||||
"Nano",
|
||||
"Sandybridge",
|
||||
"Bobcat",
|
||||
};
|
||||
|
||||
char *gotoblas_corename(void) {
|
||||
@@ -197,7 +257,9 @@ char *gotoblas_corename(void) {
|
||||
if (gotoblas == &gotoblas_OPTERON) return corename[13];
|
||||
if (gotoblas == &gotoblas_BARCELONA) return corename[14];
|
||||
if (gotoblas == &gotoblas_NANO) return corename[15];
|
||||
|
||||
if (gotoblas == &gotoblas_SANDYBRIDGE) return corename[16];
|
||||
if (gotoblas == &gotoblas_BOBCAT) return corename[17];
|
||||
|
||||
return corename[0];
|
||||
}
|
||||
|
||||
@@ -216,7 +278,7 @@ void gotoblas_dynamic_init(void) {
|
||||
if (gotoblas && gotoblas -> init) {
|
||||
gotoblas -> init();
|
||||
} else {
|
||||
fprintf(stderr, "GotoBLAS : Architecture Initialization failed. No initialization function found.\n");
|
||||
fprintf(stderr, "OpenBLAS : Architecture Initialization failed. No initialization function found.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
+170
-72
@@ -1,5 +1,5 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -85,6 +85,11 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#define MAX_NODES 16
|
||||
#define MAX_CPUS 256
|
||||
#define NCPUBITS (8*sizeof(unsigned long))
|
||||
#define MAX_BITMASK_LEN (MAX_CPUS/NCPUBITS)
|
||||
#define CPUELT(cpu) ((cpu) / NCPUBITS)
|
||||
#define CPUMASK(cpu) ((unsigned long) 1UL << ((cpu) % NCPUBITS))
|
||||
|
||||
|
||||
#define SH_MAGIC 0x510510
|
||||
|
||||
@@ -103,10 +108,10 @@ typedef struct {
|
||||
int num_nodes;
|
||||
int num_procs;
|
||||
int final_num_procs;
|
||||
unsigned long avail;
|
||||
|
||||
unsigned long avail [MAX_BITMASK_LEN];
|
||||
int avail_count;
|
||||
unsigned long cpu_info [MAX_CPUS];
|
||||
unsigned long node_info [MAX_NODES];
|
||||
unsigned long node_info [MAX_NODES][MAX_BITMASK_LEN];
|
||||
int cpu_use[MAX_CPUS];
|
||||
|
||||
} shm_t;
|
||||
@@ -126,7 +131,8 @@ static shm_t *common = (void *)-1;
|
||||
static int shmid, pshmid;
|
||||
static void *paddr;
|
||||
|
||||
static unsigned long lprocmask, lnodemask;
|
||||
static unsigned long lprocmask[MAX_BITMASK_LEN], lnodemask;
|
||||
static int lprocmask_count = 0;
|
||||
static int numprocs = 1;
|
||||
static int numnodes = 1;
|
||||
|
||||
@@ -177,70 +183,114 @@ static inline int rcount(unsigned long number) {
|
||||
than sizeof(unsigned long). On 64 bits, the limit
|
||||
is 64. On 32 bits, it is 32.
|
||||
***/
|
||||
static inline unsigned long get_cpumap(int node) {
|
||||
static inline void get_cpumap(int node, unsigned long * node_info) {
|
||||
|
||||
int infile;
|
||||
unsigned long affinity;
|
||||
unsigned long affinity[32];
|
||||
char name[160];
|
||||
char cpumap[160];
|
||||
char *p, *dummy;
|
||||
char *dummy;
|
||||
int i=0;
|
||||
int count=0;
|
||||
int k=0;
|
||||
|
||||
sprintf(name, CPUMAP_NAME, node);
|
||||
|
||||
infile = open(name, O_RDONLY);
|
||||
for(i=0; i<32; i++){
|
||||
affinity[i] = 0;
|
||||
}
|
||||
|
||||
affinity = 0;
|
||||
|
||||
if (infile != -1) {
|
||||
|
||||
read(infile, cpumap, sizeof(cpumap));
|
||||
p = cpumap;
|
||||
while (*p != '\n' && i<160){
|
||||
if(*p != ',') {
|
||||
name[i++]=*p;
|
||||
|
||||
for(i=0; i<160; i++){
|
||||
if(cpumap[i] == '\n')
|
||||
break;
|
||||
if(cpumap[i] != ','){
|
||||
name[k++]=cpumap[i];
|
||||
|
||||
//Enough data for Hex
|
||||
if(k >= NCPUBITS/4){
|
||||
affinity[count++] = strtoul(name, &dummy, 16);
|
||||
k=0;
|
||||
}
|
||||
}
|
||||
p++;
|
||||
|
||||
}
|
||||
if(k!=0){
|
||||
name[k]='\0';
|
||||
affinity[count++] = strtoul(name, &dummy, 16);
|
||||
k=0;
|
||||
}
|
||||
// 0-63bit -> node_info[0], 64-128bit -> node_info[1] ....
|
||||
// revert the sequence
|
||||
for(i=0; i<count && i<MAX_BITMASK_LEN; i++){
|
||||
node_info[i]=affinity[count-i-1];
|
||||
}
|
||||
p = name;
|
||||
|
||||
// while ((*p == '0') || (*p == ',')) p++;
|
||||
|
||||
affinity = strtoul(p, &dummy, 16);
|
||||
|
||||
close(infile);
|
||||
}
|
||||
|
||||
return affinity;
|
||||
return ;
|
||||
}
|
||||
|
||||
static inline unsigned long get_share(int cpu, int level) {
|
||||
static inline void get_share(int cpu, int level, unsigned long * share) {
|
||||
|
||||
int infile;
|
||||
unsigned long affinity;
|
||||
unsigned long affinity[32];
|
||||
char cpumap[160];
|
||||
char name[160];
|
||||
char *p;
|
||||
|
||||
char *dummy;
|
||||
int count=0;
|
||||
int i=0,k=0;
|
||||
int bitmask_idx = 0;
|
||||
|
||||
sprintf(name, SHARE_NAME, cpu, level);
|
||||
|
||||
infile = open(name, O_RDONLY);
|
||||
|
||||
affinity = (1UL << cpu);
|
||||
|
||||
// Init share
|
||||
for(i=0; i<MAX_BITMASK_LEN; i++){
|
||||
share[i]=0;
|
||||
}
|
||||
bitmask_idx = CPUELT(cpu);
|
||||
share[bitmask_idx] = CPUMASK(cpu);
|
||||
|
||||
if (infile != -1) {
|
||||
|
||||
read(infile, name, sizeof(name));
|
||||
read(infile, cpumap, sizeof(cpumap));
|
||||
|
||||
for(i=0; i<160; i++){
|
||||
if(cpumap[i] == '\n')
|
||||
break;
|
||||
if(cpumap[i] != ','){
|
||||
name[k++]=cpumap[i];
|
||||
|
||||
//Enough data
|
||||
if(k >= NCPUBITS/4){
|
||||
affinity[count++] = strtoul(name, &dummy, 16);
|
||||
k=0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if(k!=0){
|
||||
name[k]='\0';
|
||||
affinity[count++] = strtoul(name, &dummy, 16);
|
||||
k=0;
|
||||
}
|
||||
// 0-63bit -> node_info[0], 64-128bit -> node_info[1] ....
|
||||
// revert the sequence
|
||||
for(i=0; i<count && i<MAX_BITMASK_LEN; i++){
|
||||
share[i]=affinity[count-i-1];
|
||||
}
|
||||
|
||||
p = name;
|
||||
|
||||
while ((*p == '0') || (*p == ',')) p++;
|
||||
|
||||
affinity = strtol(p, &p, 16);
|
||||
|
||||
close(infile);
|
||||
}
|
||||
|
||||
return affinity;
|
||||
return ;
|
||||
}
|
||||
|
||||
static int numa_check(void) {
|
||||
@@ -248,6 +298,7 @@ static int numa_check(void) {
|
||||
DIR *dp;
|
||||
struct dirent *dir;
|
||||
int node;
|
||||
int j;
|
||||
|
||||
common -> num_nodes = 0;
|
||||
|
||||
@@ -258,7 +309,9 @@ static int numa_check(void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (node = 0; node < MAX_NODES; node ++) common -> node_info[node] = 0;
|
||||
for (node = 0; node < MAX_NODES; node ++) {
|
||||
for (j = 0; j<MAX_BITMASK_LEN; j++) common -> node_info[node][j] = 0;
|
||||
}
|
||||
|
||||
while ((dir = readdir(dp)) != NULL) {
|
||||
if (*(unsigned int *) dir -> d_name == 0x065646f6eU) {
|
||||
@@ -266,12 +319,12 @@ static int numa_check(void) {
|
||||
node = atoi(&dir -> d_name[4]);
|
||||
|
||||
if (node > MAX_NODES) {
|
||||
fprintf(stderr, "\nGotoBLAS Warining : MAX_NODES (NUMA) is too small. Terminated.\n");
|
||||
fprintf(stderr, "\nOpenBLAS Warning : MAX_NODES (NUMA) is too small. Terminated.\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
common -> num_nodes ++;
|
||||
common -> node_info[node] = get_cpumap(node);
|
||||
get_cpumap(node, common->node_info[node]);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -284,7 +337,7 @@ static int numa_check(void) {
|
||||
fprintf(stderr, "Numa found : number of Nodes = %2d\n", common -> num_nodes);
|
||||
|
||||
for (node = 0; node < common -> num_nodes; node ++)
|
||||
fprintf(stderr, "MASK (%2d) : %08lx\n", node, common -> node_info[node]);
|
||||
fprintf(stderr, "MASK (%2d) : %08lx\n", node, common -> node_info[node][0]);
|
||||
#endif
|
||||
|
||||
return common -> num_nodes;
|
||||
@@ -296,11 +349,13 @@ static void numa_mapping(void) {
|
||||
int i, j, h;
|
||||
unsigned long work, bit;
|
||||
int count = 0;
|
||||
int bitmask_idx = 0;
|
||||
|
||||
for (node = 0; node < common -> num_nodes; node ++) {
|
||||
core = 0;
|
||||
for (cpu = 0; cpu < common -> num_procs; cpu ++) {
|
||||
if (common -> node_info[node] & common -> avail & (1UL << cpu)) {
|
||||
bitmask_idx = CPUELT(cpu);
|
||||
if (common -> node_info[node][bitmask_idx] & common -> avail[bitmask_idx] & CPUMASK(cpu)) {
|
||||
common -> cpu_info[count] = WRITE_CORE(core) | WRITE_NODE(node) | WRITE_CPU(cpu);
|
||||
count ++;
|
||||
core ++;
|
||||
@@ -357,58 +412,92 @@ static void numa_mapping(void) {
|
||||
|
||||
static void disable_hyperthread(void) {
|
||||
|
||||
unsigned long share;
|
||||
unsigned long share[MAX_BITMASK_LEN];
|
||||
int cpu;
|
||||
int bitmask_idx = 0;
|
||||
int i=0, count=0;
|
||||
bitmask_idx = CPUELT(common -> num_procs);
|
||||
|
||||
if(common->num_procs > 64){
|
||||
fprintf(stderr, "\nOpenBLAS Warining : The number of CPU/Cores(%d) is beyond the limit(64). Terminated.\n", common->num_procs);
|
||||
exit(1);
|
||||
}else if(common->num_procs == 64){
|
||||
common -> avail = 0xFFFFFFFFFFFFFFFFUL;
|
||||
}else
|
||||
common -> avail = (1UL << common -> num_procs) - 1;
|
||||
for(i=0; i< bitmask_idx; i++){
|
||||
common -> avail[count++] = 0xFFFFFFFFFFFFFFFFUL;
|
||||
}
|
||||
if(CPUMASK(common -> num_procs) != 1){
|
||||
common -> avail[count++] = CPUMASK(common -> num_procs) - 1;
|
||||
}
|
||||
common -> avail_count = count;
|
||||
|
||||
/* if(common->num_procs > 64){ */
|
||||
/* fprintf(stderr, "\nOpenBLAS Warning : The number of CPU/Cores(%d) is beyond the limit(64). Terminated.\n", common->num_procs); */
|
||||
/* exit(1); */
|
||||
/* }else if(common->num_procs == 64){ */
|
||||
/* common -> avail = 0xFFFFFFFFFFFFFFFFUL; */
|
||||
/* }else */
|
||||
/* common -> avail = (1UL << common -> num_procs) - 1; */
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "\nAvail CPUs : %04lx.\n", common -> avail);
|
||||
fprintf(stderr, "\nAvail CPUs : ");
|
||||
for(i=0; i<count; i++)
|
||||
fprintf(stderr, "%04lx ", common -> avail[i]);
|
||||
fprintf(stderr, ".\n");
|
||||
#endif
|
||||
|
||||
for (cpu = 0; cpu < common -> num_procs; cpu ++) {
|
||||
|
||||
share = (get_share(cpu, 1) & common -> avail);
|
||||
|
||||
if (popcount(share) > 1) {
|
||||
|
||||
get_share(cpu, 1, share);
|
||||
|
||||
//When the shared cpu are in different element of share & avail array, this may be a bug.
|
||||
for (i = 0; i < count ; i++){
|
||||
|
||||
share[i] &= common->avail[i];
|
||||
|
||||
if (popcount(share[i]) > 1) {
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Detected Hyper Threading on CPU %4x; disabled CPU %04lx.\n",
|
||||
cpu, share & ~(1UL << cpu));
|
||||
fprintf(stderr, "Detected Hyper Threading on CPU %4x; disabled CPU %04lx.\n",
|
||||
cpu, share[i] & ~(CPUMASK(cpu)));
|
||||
#endif
|
||||
|
||||
common -> avail &= ~((share & ~(1UL << cpu)));
|
||||
common -> avail[i] &= ~((share[i] & ~ CPUMASK(cpu)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void disable_affinity(void) {
|
||||
|
||||
int i=0;
|
||||
int bitmask_idx=0;
|
||||
int count=0;
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Final all available CPUs : %04lx.\n\n", common -> avail);
|
||||
fprintf(stderr, "Final all available CPUs : %04lx.\n\n", common -> avail[0]);
|
||||
fprintf(stderr, "CPU mask : %04lx.\n\n", *(unsigned long *)&cpu_orig_mask[0]);
|
||||
#endif
|
||||
|
||||
if(common->final_num_procs > 64){
|
||||
fprintf(stderr, "\nOpenBLAS Warining : The number of CPU/Cores(%d) is beyond the limit(64). Terminated.\n", common->final_num_procs);
|
||||
exit(1);
|
||||
}else if(common->final_num_procs == 64){
|
||||
lprocmask = 0xFFFFFFFFFFFFFFFFUL;
|
||||
}else
|
||||
lprocmask = (1UL << common -> final_num_procs) - 1;
|
||||
/* if(common->final_num_procs > 64){ */
|
||||
/* fprintf(stderr, "\nOpenBLAS Warining : The number of CPU/Cores(%d) is beyond the limit(64). Terminated.\n", common->final_num_procs); */
|
||||
/* exit(1); */
|
||||
/* }else if(common->final_num_procs == 64){ */
|
||||
/* lprocmask = 0xFFFFFFFFFFFFFFFFUL; */
|
||||
/* }else */
|
||||
/* lprocmask = (1UL << common -> final_num_procs) - 1; */
|
||||
|
||||
bitmask_idx = CPUELT(common -> final_num_procs);
|
||||
|
||||
for(i=0; i< bitmask_idx; i++){
|
||||
lprocmask[count++] = 0xFFFFFFFFFFFFFFFFUL;
|
||||
}
|
||||
if(CPUMASK(common -> final_num_procs) != 1){
|
||||
lprocmask[count++] = CPUMASK(common -> final_num_procs) - 1;
|
||||
}
|
||||
lprocmask_count = count;
|
||||
|
||||
#ifndef USE_OPENMP
|
||||
lprocmask &= *(unsigned long *)&cpu_orig_mask[0];
|
||||
for(i=0; i< count; i++){
|
||||
lprocmask[i] &= ((unsigned long *)&cpu_orig_mask[0])[i];
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "I choose these CPUs : %04lx.\n\n", lprocmask);
|
||||
fprintf(stderr, "I choose these CPUs : %04lx.\n\n", lprocmask[0]);
|
||||
#endif
|
||||
|
||||
}
|
||||
@@ -498,7 +587,7 @@ static void create_pshmem(void) {
|
||||
static void local_cpu_map(void) {
|
||||
|
||||
int cpu, id, mapping;
|
||||
|
||||
int bitmask_idx = 0;
|
||||
cpu = 0;
|
||||
mapping = 0;
|
||||
|
||||
@@ -508,8 +597,9 @@ static void local_cpu_map(void) {
|
||||
if (id > 0) {
|
||||
if (is_dead(id)) common -> cpu_use[cpu] = 0;
|
||||
}
|
||||
|
||||
if ((common -> cpu_use[cpu] == 0) && (lprocmask & (1UL << cpu))) {
|
||||
|
||||
bitmask_idx = CPUELT(cpu);
|
||||
if ((common -> cpu_use[cpu] == 0) && (lprocmask[bitmask_idx] & CPUMASK(cpu))) {
|
||||
|
||||
common -> cpu_use[cpu] = pshmid;
|
||||
cpu_mapping[mapping] = READ_CPU(common -> cpu_info[cpu]);
|
||||
@@ -595,6 +685,7 @@ void gotoblas_affinity_init(void) {
|
||||
#ifndef USE_OPENMP
|
||||
cpu_set_t cpu_mask;
|
||||
#endif
|
||||
int i;
|
||||
|
||||
if (initialized) return;
|
||||
|
||||
@@ -646,6 +737,11 @@ void gotoblas_affinity_init(void) {
|
||||
|
||||
common -> num_procs = get_nprocs();
|
||||
|
||||
if(common -> num_procs > MAX_CPUS) {
|
||||
fprintf(stderr, "\nOpenBLAS Warining : The number of CPU/Cores(%d) is beyond the limit(%d). Terminated.\n", common->num_procs, MAX_CPUS);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
for (cpu = 0; cpu < common -> num_procs; cpu++) common -> cpu_info[cpu] = cpu;
|
||||
|
||||
numa_check();
|
||||
@@ -654,7 +750,8 @@ void gotoblas_affinity_init(void) {
|
||||
|
||||
if (common -> num_nodes > 1) numa_mapping();
|
||||
|
||||
common -> final_num_procs = popcount(common -> avail);
|
||||
common -> final_num_procs = 0;
|
||||
for(i = 0; i < common -> avail_count; i++) common -> final_num_procs += popcount(common -> avail[i]);
|
||||
|
||||
for (cpu = 0; cpu < common -> final_num_procs; cpu ++) common -> cpu_use[cpu] = 0;
|
||||
|
||||
@@ -664,7 +761,8 @@ void gotoblas_affinity_init(void) {
|
||||
|
||||
disable_affinity();
|
||||
|
||||
num_avail = popcount(lprocmask);
|
||||
num_avail = 0;
|
||||
for(i=0; i<lprocmask_count; i++) num_avail += popcount(lprocmask[i]);
|
||||
|
||||
if ((numprocs <= 0) || (numprocs > num_avail)) numprocs = num_avail;
|
||||
|
||||
|
||||
+31
-10
@@ -1,5 +1,5 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -103,7 +103,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/syscall.h>
|
||||
#endif
|
||||
|
||||
#if defined(OS_FreeBSD) || defined(OS_Darwin)
|
||||
#if defined(OS_FREEBSD) || defined(OS_DARWIN)
|
||||
#include <sys/sysctl.h>
|
||||
#endif
|
||||
|
||||
@@ -185,7 +185,7 @@ int get_num_procs(void) {
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(OS_FreeBSD) || defined(OS_Darwin)
|
||||
#if defined(OS_FREEBSD)
|
||||
|
||||
int get_num_procs(void) {
|
||||
|
||||
@@ -206,7 +206,27 @@ int get_num_procs(void) {
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(OS_DARWIN)
|
||||
int get_num_procs(void) {
|
||||
static int nums = 0;
|
||||
size_t len;
|
||||
if (nums == 0){
|
||||
len = sizeof(int);
|
||||
sysctlbyname("hw.physicalcpu", &nums, &len, NULL, 0);
|
||||
}
|
||||
return nums;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
OpenBLAS uses the numbers of CPU cores in multithreading.
|
||||
It can be set by openblas_set_num_threads(int num_threads);
|
||||
*/
|
||||
int blas_cpu_number = 0;
|
||||
/*
|
||||
The numbers of threads in the thread pool.
|
||||
This value is equal or large than blas_cpu_number. This means some threads are sleep.
|
||||
*/
|
||||
int blas_num_threads = 0;
|
||||
|
||||
int goto_get_num_procs (void) {
|
||||
@@ -215,7 +235,7 @@ int goto_get_num_procs (void) {
|
||||
|
||||
int blas_get_cpu_number(void){
|
||||
char *p;
|
||||
#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FreeBSD) || defined(OS_Darwin)
|
||||
#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN)
|
||||
int max_num;
|
||||
#endif
|
||||
int blas_goto_num = 0;
|
||||
@@ -223,7 +243,7 @@ int blas_get_cpu_number(void){
|
||||
|
||||
if (blas_num_threads) return blas_num_threads;
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FreeBSD) || defined(OS_Darwin)
|
||||
#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN)
|
||||
max_num = get_num_procs();
|
||||
#endif
|
||||
|
||||
@@ -250,7 +270,7 @@ int blas_get_cpu_number(void){
|
||||
else if (blas_omp_num > 0) blas_num_threads = blas_omp_num;
|
||||
else blas_num_threads = MAX_CPU_NUMBER;
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FreeBSD) || defined(OS_Darwin)
|
||||
#if defined(OS_LINUX) || defined(OS_WINDOWS) || defined(OS_FREEBSD) || defined(OS_DARWIN)
|
||||
if (blas_num_threads > max_num) blas_num_threads = max_num;
|
||||
#endif
|
||||
|
||||
@@ -390,11 +410,11 @@ static void *alloc_mmap(void *address){
|
||||
|
||||
#ifdef OS_LINUX
|
||||
#ifdef DEBUG
|
||||
int ret;
|
||||
int ret=0;
|
||||
ret=my_mbind(map_address, BUFFER_SIZE * SCALING, MPOL_PREFERRED, NULL, 0, 0);
|
||||
if(ret==-1){
|
||||
int errsv=errno;
|
||||
perror("alloc_mmap:");
|
||||
perror("OpenBLAS alloc_mmap:");
|
||||
printf("error code=%d,\tmap_address=%lx\n",errsv,map_address);
|
||||
}
|
||||
|
||||
@@ -884,7 +904,7 @@ void *blas_memory_alloc(int procpos){
|
||||
if (!blas_num_threads) blas_cpu_number = blas_get_cpu_number();
|
||||
#endif
|
||||
|
||||
#if defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_IA64)
|
||||
#if defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_IA64) || defined(ARCH_MIPS64)
|
||||
#ifndef DYNAMIC_ARCH
|
||||
blas_set_parameter();
|
||||
#endif
|
||||
@@ -1128,7 +1148,7 @@ static BLASULONG init_lock = 0UL;
|
||||
static void _touch_memory(blas_arg_t *arg, BLASLONG *range_m, BLASLONG *range_n,
|
||||
void *sa, void *sb, BLASLONG pos) {
|
||||
|
||||
#ifndef ARCH_POWER
|
||||
#if !defined(ARCH_POWER) && !defined(ARCH_SPARC)
|
||||
|
||||
long size;
|
||||
BLASULONG buffer;
|
||||
@@ -1289,6 +1309,7 @@ void DESTRUCTOR gotoblas_quit(void) {
|
||||
moncontrol (1);
|
||||
#endif
|
||||
|
||||
blas_shutdown();
|
||||
}
|
||||
|
||||
#if (defined(C_PGI) || (!defined(C_SUN) && defined(F_INTERFACE_SUN))) && (defined(ARCH_X86) || defined(ARCH_X86_64))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -33,13 +33,20 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include "common.h"
|
||||
|
||||
#ifdef SMP_SERVER
|
||||
#ifdef OS_LINUX
|
||||
|
||||
extern void openblas_set_num_threads(int num_threads) ;
|
||||
|
||||
void NAME(int* num_threads){
|
||||
void openblas_set_num_threads_(int* num_threads){
|
||||
openblas_set_num_threads(*num_threads);
|
||||
}
|
||||
|
||||
#endif
|
||||
#else
|
||||
//Single thread
|
||||
|
||||
void openblas_set_num_threads(int num_threads) {
|
||||
}
|
||||
|
||||
void openblas_set_num_threads_(int* num_threads){
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -45,8 +45,22 @@ int get_L2_size(void);
|
||||
#define DEFAULT_GEMM_P 128
|
||||
#define DEFAULT_GEMM_Q 128
|
||||
#define DEFAULT_GEMM_R 128
|
||||
#define DEFAULT_GEMM_OFFSET_A 0
|
||||
#define DEFAULT_GEMM_OFFSET_B 0
|
||||
|
||||
/* Global Parameter */
|
||||
#if GEMM_OFFSET_A == gemm_offset_a
|
||||
BLASLONG gemm_offset_a = DEFAULT_GEMM_OFFSET_A;
|
||||
#else
|
||||
BLASLONG gemm_offset_a = GEMM_OFFSET_A;
|
||||
#endif
|
||||
|
||||
#if GEMM_OFFSET_B == gemm_offset_b
|
||||
BLASLONG gemm_offset_b = DEFAULT_GEMM_OFFSET_B;
|
||||
#else
|
||||
BLASLONG gemm_offset_b = GEMM_OFFSET_B;
|
||||
#endif
|
||||
|
||||
#if SGEMM_P == sgemm_p
|
||||
BLASLONG sgemm_p = DEFAULT_GEMM_P;
|
||||
#else
|
||||
@@ -149,9 +163,9 @@ int get_L2_size(void){
|
||||
|
||||
int eax, ebx, ecx, edx;
|
||||
|
||||
#if defined(ATHLON) || defined(OPTERON) || defined(BARCELONA) || \
|
||||
#if defined(ATHLON) || defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || \
|
||||
defined(CORE_PRESCOTT) || defined(CORE_CORE2) || defined(PENRYN) || defined(DUNNINGTON) || \
|
||||
defined(CORE_NEHALEM) || defined(ATOM) || defined(GENERIC)
|
||||
defined(CORE_NEHALEM) || defined(CORE_SANDYBRIDGE) || defined(ATOM) || defined(GENERIC)
|
||||
|
||||
cpuid(0x80000006, &eax, &ebx, &ecx, &edx);
|
||||
|
||||
@@ -370,6 +384,17 @@ void blas_set_parameter(void){
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(SANDYBRIDGE)
|
||||
sgemm_p = 1024;
|
||||
dgemm_p = 512;
|
||||
cgemm_p = 512;
|
||||
zgemm_p = 256;
|
||||
#ifdef EXPRECISION
|
||||
qgemm_p = 256;
|
||||
xgemm_p = 128;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CORE_PRESCOTT) || defined(GENERIC)
|
||||
size >>= 6;
|
||||
|
||||
@@ -421,7 +446,7 @@ void blas_set_parameter(void){
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(CORE_BARCELONA)
|
||||
#if defined(CORE_BARCELONA) || defined(CORE_BOBCAT)
|
||||
size >>= 8;
|
||||
|
||||
sgemm_p = 232 * size;
|
||||
@@ -666,3 +691,36 @@ void blas_set_parameter(void){
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(ARCH_MIPS64)
|
||||
void blas_set_parameter(void){
|
||||
#if defined(LOONGSON3A)
|
||||
#ifdef SMP
|
||||
if(blas_num_threads == 1){
|
||||
#endif
|
||||
//single thread
|
||||
dgemm_r = 1024;
|
||||
#ifdef SMP
|
||||
}else{
|
||||
//multi thread
|
||||
dgemm_r = 200;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(LOONGSON3B)
|
||||
#ifdef SMP
|
||||
if(blas_num_threads == 1 || blas_num_threads == 2){
|
||||
#endif
|
||||
//single thread
|
||||
dgemm_r = 640;
|
||||
#ifdef SMP
|
||||
}else{
|
||||
//multi thread
|
||||
dgemm_r = 160;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
+33
-19
@@ -10,6 +10,14 @@ ifndef NO_CBLAS
|
||||
NO_CBLAS = 0
|
||||
endif
|
||||
|
||||
ifndef NO_LAPACK
|
||||
NO_LAPACK = 0
|
||||
endif
|
||||
|
||||
ifndef NO_LAPACKE
|
||||
NO_LAPACKE = 0
|
||||
endif
|
||||
|
||||
ifeq ($(OSNAME), WINNT)
|
||||
ifeq ($(F_COMPILER), GFORTRAN)
|
||||
EXTRALIB += -lgfortran
|
||||
@@ -58,16 +66,21 @@ dll : ../$(LIBDLLNAME)
|
||||
|
||||
dll2 : libgoto2_shared.dll
|
||||
|
||||
../$(LIBDLLNAME) : ../$(LIBNAME) libgoto2.def dllinit.$(SUFFIX)
|
||||
# On Windows, we only generate a DLL without a version suffix. This is because
|
||||
# applications which link against the dynamic library reference a fixed DLL name
|
||||
# in their import table. By instead using a stable name it is possible to
|
||||
# upgrade between library versions, without needing to re-link an application.
|
||||
# For more details see: https://github.com/xianyi/OpenBLAS/issues/127.
|
||||
../$(LIBDLLNAME) : ../$(LIBNAME) libopenblas.def dllinit.$(SUFFIX)
|
||||
$(RANLIB) ../$(LIBNAME)
|
||||
ifeq ($(BINARY32), 1)
|
||||
$(DLLWRAP) -o ../$(LIBDLLNAME) --def libgoto2.def \
|
||||
--entry _dllinit@12 -s dllinit.$(SUFFIX) --dllname $(@F) ../$(LIBNAME) $(FEXTRALIB)
|
||||
-lib /machine:i386 /def:libgoto2.def
|
||||
$(DLLWRAP) -o ../$(LIBDLLNAME) --def libopenblas.def \
|
||||
--entry _dllinit@12 -s dllinit.$(SUFFIX) --dllname $(@F) ../$(LIBNAME) $(EXTRALIB)
|
||||
-lib /machine:i386 /def:libopenblas.def
|
||||
else
|
||||
$(DLLWRAP) -o ../$(LIBDLLNAME) --def libgoto2.def \
|
||||
--entry $(FU)dllinit -s dllinit.$(SUFFIX) --dllname $(@F) ../$(LIBNAME) $(FEXTRALIB)
|
||||
-lib /machine:X64 /def:libgoto2.def
|
||||
$(DLLWRAP) -o ../$(LIBDLLNAME) --def libopenblas.def \
|
||||
--entry $(FU)dllinit -s dllinit.$(SUFFIX) --dllname $(@F) ../$(LIBNAME) $(EXTRALIB)
|
||||
-lib /machine:X64 /def:libopenblas.def
|
||||
endif
|
||||
|
||||
libgoto2_shared.dll : ../$(LIBNAME) libgoto2_shared.def
|
||||
@@ -75,14 +88,14 @@ libgoto2_shared.dll : ../$(LIBNAME) libgoto2_shared.def
|
||||
-Wl,--whole-archive ../$(LIBNAME) -Wl,--no-whole-archive \
|
||||
-Wl,--out-implib,libgoto2_shared.lib $(FEXTRALIB)
|
||||
|
||||
libgoto2.def : gensymbol
|
||||
perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > $(@F)
|
||||
libopenblas.def : gensymbol
|
||||
perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F)
|
||||
|
||||
libgoto2_shared.def : gensymbol
|
||||
perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > $(@F)
|
||||
perl ./gensymbol win2k $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F)
|
||||
|
||||
libgoto_hpl.def : gensymbol
|
||||
perl ./gensymbol win2khpl $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > $(@F)
|
||||
perl ./gensymbol win2khpl $(ARCH) dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F)
|
||||
|
||||
$(LIBDYNNAME) : ../$(LIBNAME) osx.def
|
||||
$(CC) $(CFLAGS) -all_load -headerpad_max_install_names -install_name $(CURDIR)/../$(LIBDYNNAME) -dynamiclib -o ../$(LIBDYNNAME) $< -Wl,-exported_symbols_list,osx.def $(FEXTRALIB)
|
||||
@@ -100,20 +113,21 @@ so : ../$(LIBSONAME)
|
||||
../$(LIBSONAME) : ../$(LIBNAME) linux.def linktest.c
|
||||
$(CC) $(CFLAGS) -shared -o ../$(LIBSONAME) \
|
||||
-Wl,--whole-archive ../$(LIBNAME) -Wl,--no-whole-archive \
|
||||
-Wl,--retain-symbols-file=linux.def $(EXTRALIB)
|
||||
-Wl,--retain-symbols-file=linux.def -Wl,-soname,$(LIBPREFIX).so.$(MAJOR_VERSION) $(EXTRALIB)
|
||||
$(CC) $(CFLAGS) -w -o linktest linktest.c ../$(LIBSONAME) $(FEXTRALIB) && echo OK.
|
||||
rm -f linktest
|
||||
|
||||
endif
|
||||
|
||||
ifeq ($(OSNAME), FreeBSD)
|
||||
#http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or
|
||||
ifeq ($(OSNAME), $(filter $(OSNAME),FreeBSD NetBSD))
|
||||
|
||||
so : ../$(LIBSONAME)
|
||||
|
||||
../$(LIBSONAME) : ../$(LIBNAME) linux.def linktest.c
|
||||
$(CC) $(CFLAGS) -shared -o ../$(LIBSONAME) \
|
||||
-Wl,--whole-archive ../$(LIBNAME) -Wl,--no-whole-archive \
|
||||
-Wl,--retain-symbols-file=linux.def $(EXTRALIB)
|
||||
-Wl,--retain-symbols-file=linux.def $(FEXTRALIB) $(EXTRALIB)
|
||||
$(CC) $(CFLAGS) -w -o linktest linktest.c ../$(LIBSONAME) $(FEXTRALIB) && echo OK.
|
||||
rm -f linktest
|
||||
|
||||
@@ -163,23 +177,23 @@ static : ../$(LIBNAME)
|
||||
rm -f goto.$(SUFFIX)
|
||||
|
||||
linux.def : gensymbol ../Makefile.system ../getarch.c
|
||||
perl ./gensymbol linux $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > $(@F)
|
||||
perl ./gensymbol linux $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F)
|
||||
|
||||
osx.def : gensymbol ../Makefile.system ../getarch.c
|
||||
perl ./gensymbol osx $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > $(@F)
|
||||
perl ./gensymbol osx $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F)
|
||||
|
||||
aix.def : gensymbol ../Makefile.system ../getarch.c
|
||||
perl ./gensymbol aix $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > $(@F)
|
||||
perl ./gensymbol aix $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > $(@F)
|
||||
|
||||
symbol.S : gensymbol
|
||||
perl ./gensymbol win2kasm noarch dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > symbol.S
|
||||
perl ./gensymbol win2kasm noarch dummy $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > symbol.S
|
||||
|
||||
test : linktest.c
|
||||
$(CC) $(CFLAGS) -w -o linktest linktest.c ../$(LIBSONAME) -lm && echo OK.
|
||||
rm -f linktest
|
||||
|
||||
linktest.c : gensymbol ../Makefile.system ../getarch.c
|
||||
perl ./gensymbol linktest $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) > linktest.c
|
||||
perl ./gensymbol linktest $(ARCH) $(BU) $(EXPRECISION) $(NO_CBLAS) $(NO_LAPACK) $(NO_LAPACKE) > linktest.c
|
||||
|
||||
clean ::
|
||||
@rm -f *.def *.dylib __.SYMDEF*
|
||||
|
||||
+2489
-95
File diff suppressed because it is too large
Load Diff
@@ -32,11 +32,12 @@ if ($compiler eq "") {
|
||||
"pgf95", "pgf90", "pgf77",
|
||||
"ifort");
|
||||
|
||||
OUTER:
|
||||
foreach $lists (@lists) {
|
||||
foreach $path (@path) {
|
||||
if (-f $path . "/" . $lists) {
|
||||
if (-x $path . "/" . $lists) {
|
||||
$compiler = $lists;
|
||||
break;
|
||||
last OUTER;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -210,6 +211,10 @@ if (!$?) {
|
||||
if ($?) {
|
||||
$link = `$compiler $openmp -q32 -v ftest2.f 2>&1 && rm -f a.out a.exe`;
|
||||
}
|
||||
#For gfortran MIPS
|
||||
if ($?) {
|
||||
$link = `$compiler $openmp -mabi=n32 -v ftest2.f 2>&1 && rm -f a.out a.exe`;
|
||||
}
|
||||
$binary = "" if ($?);
|
||||
}
|
||||
|
||||
@@ -218,6 +223,10 @@ if (!$?) {
|
||||
if ($?) {
|
||||
$link = `$compiler $openmp -q64 -v ftest2.f 2>&1 && rm -f a.out a.exe`;
|
||||
}
|
||||
#For gfortran MIPS
|
||||
if ($?) {
|
||||
$link = `$compiler $openmp -mabi=64 -v ftest2.f 2>&1 && rm -f a.out a.exe`;
|
||||
}
|
||||
$binary = "" if ($?);
|
||||
}
|
||||
|
||||
@@ -237,6 +246,8 @@ if ($link ne "") {
|
||||
$link =~ s/\-rpath\s+/\-rpath\@/g;
|
||||
|
||||
@flags = split(/[\s\,\n]/, $link);
|
||||
# remove leading and trailing quotes from each flag.
|
||||
@flags = map {s/^['"]|['"]$//g; $_} @flags;
|
||||
|
||||
foreach $flags (@flags) {
|
||||
if (
|
||||
@@ -284,6 +295,10 @@ if ($link ne "") {
|
||||
|
||||
}
|
||||
|
||||
if ($vendor eq "INTEL"){
|
||||
$linker_a .= "-lgfortran"
|
||||
}
|
||||
|
||||
open(MAKEFILE, ">> $makefile") || die "Can't append $makefile";
|
||||
open(CONFFILE, ">> $config" ) || die "Can't append $config";
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011, Lab of Parallel Software and Computational Science,ICSAS
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
@@ -102,6 +102,8 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/* #define FORCE_BARCELONA */
|
||||
/* #define FORCE_SHANGHAI */
|
||||
/* #define FORCE_ISTANBUL */
|
||||
/* #define FORCE_BULLDOZER */
|
||||
/* #define FORCE_BOBCAT */
|
||||
/* #define FORCE_SSE_GENERIC */
|
||||
/* #define FORCE_VIAC3 */
|
||||
/* #define FORCE_NANO */
|
||||
@@ -117,6 +119,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
/* #define FORCE_CELL */
|
||||
/* #define FORCE_SICORTEX */
|
||||
/* #define FORCE_LOONGSON3A */
|
||||
/* #define FORCE_LOONGSON3B */
|
||||
/* #define FORCE_ITANIUM2 */
|
||||
/* #define FORCE_GENERIC */
|
||||
/* #define FORCE_SPARC */
|
||||
@@ -277,6 +280,20 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define CORENAME "NEHALEM"
|
||||
#endif
|
||||
|
||||
#ifdef FORCE_SANDYBRIDGE
|
||||
#define FORCE
|
||||
#define FORCE_INTEL
|
||||
#define ARCHITECTURE "X86"
|
||||
#define SUBARCHITECTURE "SANDYBRIDGE"
|
||||
#define ARCHCONFIG "-DSANDYBRIDGE " \
|
||||
"-DL1_DATA_SIZE=32768 -DL1_DATA_LINESIZE=64 " \
|
||||
"-DL2_SIZE=262144 -DL2_LINESIZE=64 " \
|
||||
"-DDTB_DEFAULT_ENTRIES=64 -DDTB_SIZE=4096 " \
|
||||
"-DHAVE_CMOV -DHAVE_MMX -DHAVE_SSE -DHAVE_SSE2 -DHAVE_SSE3 -DHAVE_SSSE3 -DHAVE_SSE4_1 -DHAVE_SSE4_2 -DHAVE_AVX"
|
||||
#define LIBNAME "sandybridge"
|
||||
#define CORENAME "SANDYBRIDGE"
|
||||
#endif
|
||||
|
||||
#ifdef FORCE_ATOM
|
||||
#define FORCE
|
||||
#define FORCE_INTEL
|
||||
@@ -333,7 +350,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define CORENAME "OPTERON"
|
||||
#endif
|
||||
|
||||
#if defined(FORCE_BARCELONA) || defined(FORCE_SHANGHAI) || defined(FORCE_ISTANBUL)
|
||||
#if defined(FORCE_BARCELONA) || defined(FORCE_SHANGHAI) || defined(FORCE_ISTANBUL) || defined (FORCE_BULLDOZER)
|
||||
#define FORCE
|
||||
#define FORCE_INTEL
|
||||
#define ARCHITECTURE "X86"
|
||||
@@ -341,13 +358,28 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#define ARCHCONFIG "-DBARCELONA " \
|
||||
"-DL1_DATA_SIZE=65536 -DL1_DATA_LINESIZE=64 " \
|
||||
"-DL2_SIZE=524288 -DL2_LINESIZE=64 -DL3_SIZE=2097152 " \
|
||||
"-DDTB_DEFAULT_ENTRIES=48 -DDTB_SIZE=4096 -DHAVE_3DNOW " \
|
||||
"-DHAVE_3DNOWEX -DHAVE_MMX -DHAVE_SSE -DHAVE_SSE2 -DHAVE_SSE3 " \
|
||||
"-DDTB_DEFAULT_ENTRIES=48 -DDTB_SIZE=4096 " \
|
||||
"-DHAVE_MMX -DHAVE_SSE -DHAVE_SSE2 -DHAVE_SSE3 " \
|
||||
"-DHAVE_SSE4A -DHAVE_MISALIGNSSE -DHAVE_128BITFPU -DHAVE_FASTMOVU"
|
||||
#define LIBNAME "barcelona"
|
||||
#define CORENAME "BARCELONA"
|
||||
#endif
|
||||
|
||||
#if defined(FORCE_BOBCAT)
|
||||
#define FORCE
|
||||
#define FORCE_INTEL
|
||||
#define ARCHITECTURE "X86"
|
||||
#define SUBARCHITECTURE "BOBCAT"
|
||||
#define ARCHCONFIG "-DBOBCAT " \
|
||||
"-DL1_DATA_SIZE=32768 -DL1_DATA_LINESIZE=64 " \
|
||||
"-DL2_SIZE=524288 -DL2_LINESIZE=64 " \
|
||||
"-DDTB_DEFAULT_ENTRIES=40 -DDTB_SIZE=4096 " \
|
||||
"-DHAVE_MMX -DHAVE_SSE -DHAVE_SSE2 -DHAVE_SSE3 -DHAVE_SSSE3 " \
|
||||
"-DHAVE_SSE4A -DHAVE_MISALIGNSSE -DHAVE_CFLUSH -DHAVE_CMOV"
|
||||
#define LIBNAME "bobcat"
|
||||
#define CORENAME "BOBCAT"
|
||||
#endif
|
||||
|
||||
#ifdef FORCE_SSE_GENERIC
|
||||
#define FORCE
|
||||
#define FORCE_INTEL
|
||||
@@ -548,6 +580,20 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#else
|
||||
#endif
|
||||
|
||||
#ifdef FORCE_LOONGSON3B
|
||||
#define FORCE
|
||||
#define ARCHITECTURE "MIPS"
|
||||
#define SUBARCHITECTURE "LOONGSON3B"
|
||||
#define SUBDIRNAME "mips64"
|
||||
#define ARCHCONFIG "-DLOONGSON3B " \
|
||||
"-DL1_DATA_SIZE=65536 -DL1_DATA_LINESIZE=32 " \
|
||||
"-DL2_SIZE=512488 -DL2_LINESIZE=32 " \
|
||||
"-DDTB_DEFAULT_ENTRIES=64 -DDTB_SIZE=4096 -DL2_ASSOCIATIVE=4 "
|
||||
#define LIBNAME "loongson3b"
|
||||
#define CORENAME "LOONGSON3B"
|
||||
#else
|
||||
#endif
|
||||
|
||||
#ifdef FORCE_ITANIUM2
|
||||
#define FORCE
|
||||
#define ARCHITECTURE "IA64"
|
||||
|
||||
@@ -34,6 +34,7 @@ int main(int argc, char **argv) {
|
||||
#ifdef USE64BITINT
|
||||
printf("#define USE64BITINT\n");
|
||||
#endif
|
||||
printf("#define GEMM_MULTITHREAD_THRESHOLD\t%ld\n", GEMM_MULTITHREAD_THRESHOLD);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
+20
-4
@@ -318,7 +318,7 @@ CZBLAS3OBJS = \
|
||||
|
||||
ifndef NO_CBLAS
|
||||
|
||||
CFLAGS += -I.
|
||||
override CFLAGS += -I.
|
||||
|
||||
SBLAS1OBJS += $(CSBLAS1OBJS)
|
||||
SBLAS2OBJS += $(CSBLAS2OBJS)
|
||||
@@ -400,7 +400,7 @@ all :: libs
|
||||
|
||||
ifdef FUNCTION_PROFILE
|
||||
$(BLASOBJS) $(BLASOBJS_P) : functable.h
|
||||
$(BLASOBJS) $(BLASOBJS_P) : CFLAGS += -DPROFILE_FUNC_NAME=interface_$(*F)
|
||||
$(BLASOBJS) $(BLASOBJS_P) : override CFLAGS += -DPROFILE_FUNC_NAME=interface_$(*F)
|
||||
|
||||
functable.h : Makefile
|
||||
./create $(FUNCALLFILES) > functable.h
|
||||
@@ -420,7 +420,7 @@ level3 : $(SBLAS3OBJS) $(DBLAS3OBJS) $(QBLAS3OBJS) $(CBLAS3OBJS) $(ZBLAS3OBJS) $
|
||||
$(AR) $(ARFLAGS) -ru $(TOPDIR)/$(LIBNAME) $^
|
||||
|
||||
$(CSBLASOBJS) $(CSBLASOBJS_P) $(CDBLASOBJS) $(CDBLASOBJS_P) $(CQBLASOBJS) $(CQBLASOBJS_P) \
|
||||
$(CCBLASOBJS) $(CCBLASOBJS_P) $(CZBLASOBJS) $(CZBLASOBJS_P) $(CXBLASOBJS) $(CXBLASOBJS_P) : CFLAGS += -DCBLAS
|
||||
$(CCBLASOBJS) $(CCBLASOBJS_P) $(CZBLASOBJS) $(CZBLASOBJS_P) $(CXBLASOBJS) $(CXBLASOBJS_P) : override CFLAGS += -DCBLAS
|
||||
|
||||
srot.$(SUFFIX) srot.$(PSUFFIX) : rot.c
|
||||
$(CC) $(CFLAGS) -c $< -o $(@F)
|
||||
@@ -770,20 +770,36 @@ xgeru.$(SUFFIX) xgeru.$(PSUFFIX) : zger.c
|
||||
xgerc.$(SUFFIX) xgerc.$(PSUFFIX) : zger.c
|
||||
$(CC) -c $(CFLAGS) -DCONJ $< -o $(@F)
|
||||
|
||||
ifndef USE_NETLIB_GEMV
|
||||
sgemv.$(SUFFIX) sgemv.$(PSUFFIX): gemv.c
|
||||
$(CC) -c $(CFLAGS) -o $(@F) $<
|
||||
|
||||
dgemv.$(SUFFIX) dgemv.$(PSUFFIX): gemv.c
|
||||
$(CC) -c $(CFLAGS) -o $(@F) $<
|
||||
else
|
||||
sgemv.$(SUFFIX) sgemv.$(PSUFFIX): netlib/sgemv.f
|
||||
$(FC) -c $(FFLAGS) -o $(@F) $<
|
||||
|
||||
dgemv.$(SUFFIX) dgemv.$(PSUFFIX): netlib/dgemv.f
|
||||
$(FC) -c $(FFLAGS) -o $(@F) $<
|
||||
endif
|
||||
|
||||
qgemv.$(SUFFIX) qgemv.$(PSUFFIX): gemv.c
|
||||
$(CC) -c $(CFLAGS) -o $(@F) $<
|
||||
|
||||
|
||||
ifndef USE_NETLIB_GEMV
|
||||
cgemv.$(SUFFIX) cgemv.$(PSUFFIX): zgemv.c
|
||||
$(CC) -c $(CFLAGS) -o $(@F) $<
|
||||
|
||||
zgemv.$(SUFFIX) zgemv.$(PSUFFIX): zgemv.c
|
||||
$(CC) -c $(CFLAGS) -o $(@F) $<
|
||||
else
|
||||
cgemv.$(SUFFIX) cgemv.$(PSUFFIX): netlib/cgemv.f
|
||||
$(FC) -c $(FFLAGS) -o $(@F) $<
|
||||
|
||||
zgemv.$(SUFFIX) zgemv.$(PSUFFIX): netlib/zgemv.f
|
||||
$(FC) -c $(FFLAGS) -o $(@F) $<
|
||||
endif
|
||||
|
||||
xgemv.$(SUFFIX) xgemv.$(PSUFFIX): zgemv.c
|
||||
$(CC) -c $(CFLAGS) -o $(@F) $<
|
||||
|
||||
+6
-1
@@ -397,8 +397,13 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_TRANSPOSE TransA, enum CBLAS_TRANS
|
||||
mode |= (transb << BLAS_TRANSB_SHIFT);
|
||||
|
||||
args.common = NULL;
|
||||
args.nthreads = num_cpu_avail(3);
|
||||
|
||||
if(args.m <= GEMM_MULTITHREAD_THRESHOLD || args.n <= GEMM_MULTITHREAD_THRESHOLD
|
||||
|| args.k <=GEMM_MULTITHREAD_THRESHOLD){
|
||||
args.nthreads = 1;
|
||||
}else{
|
||||
args.nthreads = num_cpu_avail(3);
|
||||
}
|
||||
if (args.nthreads == 1) {
|
||||
#endif
|
||||
|
||||
|
||||
@@ -0,0 +1,285 @@
|
||||
SUBROUTINE CGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
|
||||
* .. Scalar Arguments ..
|
||||
COMPLEX ALPHA,BETA
|
||||
INTEGER INCX,INCY,LDA,M,N
|
||||
CHARACTER TRANS
|
||||
* ..
|
||||
* .. Array Arguments ..
|
||||
COMPLEX A(LDA,*),X(*),Y(*)
|
||||
* ..
|
||||
*
|
||||
* Purpose
|
||||
* =======
|
||||
*
|
||||
* CGEMV performs one of the matrix-vector operations
|
||||
*
|
||||
* y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or
|
||||
*
|
||||
* y := alpha*A**H*x + beta*y,
|
||||
*
|
||||
* where alpha and beta are scalars, x and y are vectors and A is an
|
||||
* m by n matrix.
|
||||
*
|
||||
* Arguments
|
||||
* ==========
|
||||
*
|
||||
* TRANS - CHARACTER*1.
|
||||
* On entry, TRANS specifies the operation to be performed as
|
||||
* follows:
|
||||
*
|
||||
* TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
|
||||
*
|
||||
* TRANS = 'T' or 't' y := alpha*A**T*x + beta*y.
|
||||
*
|
||||
* TRANS = 'C' or 'c' y := alpha*A**H*x + beta*y.
|
||||
*
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* M - INTEGER.
|
||||
* On entry, M specifies the number of rows of the matrix A.
|
||||
* M must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* N - INTEGER.
|
||||
* On entry, N specifies the number of columns of the matrix A.
|
||||
* N must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* ALPHA - COMPLEX .
|
||||
* On entry, ALPHA specifies the scalar alpha.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* A - COMPLEX array of DIMENSION ( LDA, n ).
|
||||
* Before entry, the leading m by n part of the array A must
|
||||
* contain the matrix of coefficients.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* LDA - INTEGER.
|
||||
* On entry, LDA specifies the first dimension of A as declared
|
||||
* in the calling (sub) program. LDA must be at least
|
||||
* max( 1, m ).
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* X - COMPLEX array of DIMENSION at least
|
||||
* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
|
||||
* Before entry, the incremented array X must contain the
|
||||
* vector x.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* INCX - INTEGER.
|
||||
* On entry, INCX specifies the increment for the elements of
|
||||
* X. INCX must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* BETA - COMPLEX .
|
||||
* On entry, BETA specifies the scalar beta. When BETA is
|
||||
* supplied as zero then Y need not be set on input.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Y - COMPLEX array of DIMENSION at least
|
||||
* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
|
||||
* Before entry with BETA non-zero, the incremented array Y
|
||||
* must contain the vector y. On exit, Y is overwritten by the
|
||||
* updated vector y.
|
||||
*
|
||||
* INCY - INTEGER.
|
||||
* On entry, INCY specifies the increment for the elements of
|
||||
* Y. INCY must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Further Details
|
||||
* ===============
|
||||
*
|
||||
* Level 2 Blas routine.
|
||||
* The vector and matrix arguments are not referenced when N = 0, or M = 0
|
||||
*
|
||||
* -- Written on 22-October-1986.
|
||||
* Jack Dongarra, Argonne National Lab.
|
||||
* Jeremy Du Croz, Nag Central Office.
|
||||
* Sven Hammarling, Nag Central Office.
|
||||
* Richard Hanson, Sandia National Labs.
|
||||
*
|
||||
* =====================================================================
|
||||
*
|
||||
* .. Parameters ..
|
||||
COMPLEX ONE
|
||||
PARAMETER (ONE= (1.0E+0,0.0E+0))
|
||||
COMPLEX ZERO
|
||||
PARAMETER (ZERO= (0.0E+0,0.0E+0))
|
||||
* ..
|
||||
* .. Local Scalars ..
|
||||
COMPLEX TEMP
|
||||
INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
|
||||
LOGICAL NOCONJ
|
||||
* ..
|
||||
* .. External Functions ..
|
||||
LOGICAL LSAME
|
||||
EXTERNAL LSAME
|
||||
* ..
|
||||
* .. External Subroutines ..
|
||||
EXTERNAL XERBLA
|
||||
* ..
|
||||
* .. Intrinsic Functions ..
|
||||
INTRINSIC CONJG,MAX
|
||||
* ..
|
||||
*
|
||||
* Test the input parameters.
|
||||
*
|
||||
INFO = 0
|
||||
IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
|
||||
+ .NOT.LSAME(TRANS,'C')) THEN
|
||||
INFO = 1
|
||||
ELSE IF (M.LT.0) THEN
|
||||
INFO = 2
|
||||
ELSE IF (N.LT.0) THEN
|
||||
INFO = 3
|
||||
ELSE IF (LDA.LT.MAX(1,M)) THEN
|
||||
INFO = 6
|
||||
ELSE IF (INCX.EQ.0) THEN
|
||||
INFO = 8
|
||||
ELSE IF (INCY.EQ.0) THEN
|
||||
INFO = 11
|
||||
END IF
|
||||
IF (INFO.NE.0) THEN
|
||||
CALL XERBLA('CGEMV ',INFO)
|
||||
RETURN
|
||||
END IF
|
||||
*
|
||||
* Quick return if possible.
|
||||
*
|
||||
IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
|
||||
+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
|
||||
*
|
||||
NOCONJ = LSAME(TRANS,'T')
|
||||
*
|
||||
* Set LENX and LENY, the lengths of the vectors x and y, and set
|
||||
* up the start points in X and Y.
|
||||
*
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
LENX = N
|
||||
LENY = M
|
||||
ELSE
|
||||
LENX = M
|
||||
LENY = N
|
||||
END IF
|
||||
IF (INCX.GT.0) THEN
|
||||
KX = 1
|
||||
ELSE
|
||||
KX = 1 - (LENX-1)*INCX
|
||||
END IF
|
||||
IF (INCY.GT.0) THEN
|
||||
KY = 1
|
||||
ELSE
|
||||
KY = 1 - (LENY-1)*INCY
|
||||
END IF
|
||||
*
|
||||
* Start the operations. In this version the elements of A are
|
||||
* accessed sequentially with one pass through A.
|
||||
*
|
||||
* First form y := beta*y.
|
||||
*
|
||||
IF (BETA.NE.ONE) THEN
|
||||
IF (INCY.EQ.1) THEN
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 10 I = 1,LENY
|
||||
Y(I) = ZERO
|
||||
10 CONTINUE
|
||||
ELSE
|
||||
DO 20 I = 1,LENY
|
||||
Y(I) = BETA*Y(I)
|
||||
20 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
IY = KY
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 30 I = 1,LENY
|
||||
Y(IY) = ZERO
|
||||
IY = IY + INCY
|
||||
30 CONTINUE
|
||||
ELSE
|
||||
DO 40 I = 1,LENY
|
||||
Y(IY) = BETA*Y(IY)
|
||||
IY = IY + INCY
|
||||
40 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
END IF
|
||||
IF (ALPHA.EQ.ZERO) RETURN
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
*
|
||||
* Form y := alpha*A*x + y.
|
||||
*
|
||||
JX = KX
|
||||
IF (INCY.EQ.1) THEN
|
||||
DO 60 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
DO 50 I = 1,M
|
||||
Y(I) = Y(I) + TEMP*A(I,J)
|
||||
50 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
60 CONTINUE
|
||||
ELSE
|
||||
DO 80 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
IY = KY
|
||||
DO 70 I = 1,M
|
||||
Y(IY) = Y(IY) + TEMP*A(I,J)
|
||||
IY = IY + INCY
|
||||
70 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
80 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
*
|
||||
* Form y := alpha*A**T*x + y or y := alpha*A**H*x + y.
|
||||
*
|
||||
JY = KY
|
||||
IF (INCX.EQ.1) THEN
|
||||
DO 110 J = 1,N
|
||||
TEMP = ZERO
|
||||
IF (NOCONJ) THEN
|
||||
DO 90 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(I)
|
||||
90 CONTINUE
|
||||
ELSE
|
||||
DO 100 I = 1,M
|
||||
TEMP = TEMP + CONJG(A(I,J))*X(I)
|
||||
100 CONTINUE
|
||||
END IF
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
110 CONTINUE
|
||||
ELSE
|
||||
DO 140 J = 1,N
|
||||
TEMP = ZERO
|
||||
IX = KX
|
||||
IF (NOCONJ) THEN
|
||||
DO 120 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(IX)
|
||||
IX = IX + INCX
|
||||
120 CONTINUE
|
||||
ELSE
|
||||
DO 130 I = 1,M
|
||||
TEMP = TEMP + CONJG(A(I,J))*X(IX)
|
||||
IX = IX + INCX
|
||||
130 CONTINUE
|
||||
END IF
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
140 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
*
|
||||
RETURN
|
||||
*
|
||||
* End of CGEMV .
|
||||
*
|
||||
END
|
||||
@@ -0,0 +1,265 @@
|
||||
SUBROUTINE DGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
|
||||
* .. Scalar Arguments ..
|
||||
DOUBLE PRECISION ALPHA,BETA
|
||||
INTEGER INCX,INCY,LDA,M,N
|
||||
CHARACTER TRANS
|
||||
* ..
|
||||
* .. Array Arguments ..
|
||||
DOUBLE PRECISION A(LDA,*),X(*),Y(*)
|
||||
* ..
|
||||
*
|
||||
* Purpose
|
||||
* =======
|
||||
*
|
||||
* DGEMV performs one of the matrix-vector operations
|
||||
*
|
||||
* y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y,
|
||||
*
|
||||
* where alpha and beta are scalars, x and y are vectors and A is an
|
||||
* m by n matrix.
|
||||
*
|
||||
* Arguments
|
||||
* ==========
|
||||
*
|
||||
* TRANS - CHARACTER*1.
|
||||
* On entry, TRANS specifies the operation to be performed as
|
||||
* follows:
|
||||
*
|
||||
* TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
|
||||
*
|
||||
* TRANS = 'T' or 't' y := alpha*A**T*x + beta*y.
|
||||
*
|
||||
* TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y.
|
||||
*
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* M - INTEGER.
|
||||
* On entry, M specifies the number of rows of the matrix A.
|
||||
* M must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* N - INTEGER.
|
||||
* On entry, N specifies the number of columns of the matrix A.
|
||||
* N must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* ALPHA - DOUBLE PRECISION.
|
||||
* On entry, ALPHA specifies the scalar alpha.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* A - DOUBLE PRECISION array of DIMENSION ( LDA, n ).
|
||||
* Before entry, the leading m by n part of the array A must
|
||||
* contain the matrix of coefficients.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* LDA - INTEGER.
|
||||
* On entry, LDA specifies the first dimension of A as declared
|
||||
* in the calling (sub) program. LDA must be at least
|
||||
* max( 1, m ).
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* X - DOUBLE PRECISION array of DIMENSION at least
|
||||
* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
|
||||
* Before entry, the incremented array X must contain the
|
||||
* vector x.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* INCX - INTEGER.
|
||||
* On entry, INCX specifies the increment for the elements of
|
||||
* X. INCX must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* BETA - DOUBLE PRECISION.
|
||||
* On entry, BETA specifies the scalar beta. When BETA is
|
||||
* supplied as zero then Y need not be set on input.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Y - DOUBLE PRECISION array of DIMENSION at least
|
||||
* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
|
||||
* Before entry with BETA non-zero, the incremented array Y
|
||||
* must contain the vector y. On exit, Y is overwritten by the
|
||||
* updated vector y.
|
||||
*
|
||||
* INCY - INTEGER.
|
||||
* On entry, INCY specifies the increment for the elements of
|
||||
* Y. INCY must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Further Details
|
||||
* ===============
|
||||
*
|
||||
* Level 2 Blas routine.
|
||||
* The vector and matrix arguments are not referenced when N = 0, or M = 0
|
||||
*
|
||||
* -- Written on 22-October-1986.
|
||||
* Jack Dongarra, Argonne National Lab.
|
||||
* Jeremy Du Croz, Nag Central Office.
|
||||
* Sven Hammarling, Nag Central Office.
|
||||
* Richard Hanson, Sandia National Labs.
|
||||
*
|
||||
* =====================================================================
|
||||
*
|
||||
* .. Parameters ..
|
||||
DOUBLE PRECISION ONE,ZERO
|
||||
PARAMETER (ONE=1.0D+0,ZERO=0.0D+0)
|
||||
* ..
|
||||
* .. Local Scalars ..
|
||||
DOUBLE PRECISION TEMP
|
||||
INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
|
||||
* ..
|
||||
* .. External Functions ..
|
||||
LOGICAL LSAME
|
||||
EXTERNAL LSAME
|
||||
* ..
|
||||
* .. External Subroutines ..
|
||||
EXTERNAL XERBLA
|
||||
* ..
|
||||
* .. Intrinsic Functions ..
|
||||
INTRINSIC MAX
|
||||
* ..
|
||||
*
|
||||
* Test the input parameters.
|
||||
*
|
||||
INFO = 0
|
||||
IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
|
||||
+ .NOT.LSAME(TRANS,'C')) THEN
|
||||
INFO = 1
|
||||
ELSE IF (M.LT.0) THEN
|
||||
INFO = 2
|
||||
ELSE IF (N.LT.0) THEN
|
||||
INFO = 3
|
||||
ELSE IF (LDA.LT.MAX(1,M)) THEN
|
||||
INFO = 6
|
||||
ELSE IF (INCX.EQ.0) THEN
|
||||
INFO = 8
|
||||
ELSE IF (INCY.EQ.0) THEN
|
||||
INFO = 11
|
||||
END IF
|
||||
IF (INFO.NE.0) THEN
|
||||
CALL XERBLA('DGEMV ',INFO)
|
||||
RETURN
|
||||
END IF
|
||||
*
|
||||
* Quick return if possible.
|
||||
*
|
||||
IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
|
||||
+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
|
||||
*
|
||||
* Set LENX and LENY, the lengths of the vectors x and y, and set
|
||||
* up the start points in X and Y.
|
||||
*
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
LENX = N
|
||||
LENY = M
|
||||
ELSE
|
||||
LENX = M
|
||||
LENY = N
|
||||
END IF
|
||||
IF (INCX.GT.0) THEN
|
||||
KX = 1
|
||||
ELSE
|
||||
KX = 1 - (LENX-1)*INCX
|
||||
END IF
|
||||
IF (INCY.GT.0) THEN
|
||||
KY = 1
|
||||
ELSE
|
||||
KY = 1 - (LENY-1)*INCY
|
||||
END IF
|
||||
*
|
||||
* Start the operations. In this version the elements of A are
|
||||
* accessed sequentially with one pass through A.
|
||||
*
|
||||
* First form y := beta*y.
|
||||
*
|
||||
IF (BETA.NE.ONE) THEN
|
||||
IF (INCY.EQ.1) THEN
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 10 I = 1,LENY
|
||||
Y(I) = ZERO
|
||||
10 CONTINUE
|
||||
ELSE
|
||||
DO 20 I = 1,LENY
|
||||
Y(I) = BETA*Y(I)
|
||||
20 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
IY = KY
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 30 I = 1,LENY
|
||||
Y(IY) = ZERO
|
||||
IY = IY + INCY
|
||||
30 CONTINUE
|
||||
ELSE
|
||||
DO 40 I = 1,LENY
|
||||
Y(IY) = BETA*Y(IY)
|
||||
IY = IY + INCY
|
||||
40 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
END IF
|
||||
IF (ALPHA.EQ.ZERO) RETURN
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
*
|
||||
* Form y := alpha*A*x + y.
|
||||
*
|
||||
JX = KX
|
||||
IF (INCY.EQ.1) THEN
|
||||
DO 60 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
DO 50 I = 1,M
|
||||
Y(I) = Y(I) + TEMP*A(I,J)
|
||||
50 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
60 CONTINUE
|
||||
ELSE
|
||||
DO 80 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
IY = KY
|
||||
DO 70 I = 1,M
|
||||
Y(IY) = Y(IY) + TEMP*A(I,J)
|
||||
IY = IY + INCY
|
||||
70 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
80 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
*
|
||||
* Form y := alpha*A**T*x + y.
|
||||
*
|
||||
JY = KY
|
||||
IF (INCX.EQ.1) THEN
|
||||
DO 100 J = 1,N
|
||||
TEMP = ZERO
|
||||
DO 90 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(I)
|
||||
90 CONTINUE
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
100 CONTINUE
|
||||
ELSE
|
||||
DO 120 J = 1,N
|
||||
TEMP = ZERO
|
||||
IX = KX
|
||||
DO 110 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(IX)
|
||||
IX = IX + INCX
|
||||
110 CONTINUE
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
120 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
*
|
||||
RETURN
|
||||
*
|
||||
* End of DGEMV .
|
||||
*
|
||||
END
|
||||
@@ -0,0 +1,265 @@
|
||||
SUBROUTINE SGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
|
||||
* .. Scalar Arguments ..
|
||||
REAL ALPHA,BETA
|
||||
INTEGER INCX,INCY,LDA,M,N
|
||||
CHARACTER TRANS
|
||||
* ..
|
||||
* .. Array Arguments ..
|
||||
REAL A(LDA,*),X(*),Y(*)
|
||||
* ..
|
||||
*
|
||||
* Purpose
|
||||
* =======
|
||||
*
|
||||
* SGEMV performs one of the matrix-vector operations
|
||||
*
|
||||
* y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y,
|
||||
*
|
||||
* where alpha and beta are scalars, x and y are vectors and A is an
|
||||
* m by n matrix.
|
||||
*
|
||||
* Arguments
|
||||
* ==========
|
||||
*
|
||||
* TRANS - CHARACTER*1.
|
||||
* On entry, TRANS specifies the operation to be performed as
|
||||
* follows:
|
||||
*
|
||||
* TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
|
||||
*
|
||||
* TRANS = 'T' or 't' y := alpha*A**T*x + beta*y.
|
||||
*
|
||||
* TRANS = 'C' or 'c' y := alpha*A**T*x + beta*y.
|
||||
*
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* M - INTEGER.
|
||||
* On entry, M specifies the number of rows of the matrix A.
|
||||
* M must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* N - INTEGER.
|
||||
* On entry, N specifies the number of columns of the matrix A.
|
||||
* N must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* ALPHA - REAL .
|
||||
* On entry, ALPHA specifies the scalar alpha.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* A - REAL array of DIMENSION ( LDA, n ).
|
||||
* Before entry, the leading m by n part of the array A must
|
||||
* contain the matrix of coefficients.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* LDA - INTEGER.
|
||||
* On entry, LDA specifies the first dimension of A as declared
|
||||
* in the calling (sub) program. LDA must be at least
|
||||
* max( 1, m ).
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* X - REAL array of DIMENSION at least
|
||||
* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
|
||||
* Before entry, the incremented array X must contain the
|
||||
* vector x.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* INCX - INTEGER.
|
||||
* On entry, INCX specifies the increment for the elements of
|
||||
* X. INCX must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* BETA - REAL .
|
||||
* On entry, BETA specifies the scalar beta. When BETA is
|
||||
* supplied as zero then Y need not be set on input.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Y - REAL array of DIMENSION at least
|
||||
* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
|
||||
* Before entry with BETA non-zero, the incremented array Y
|
||||
* must contain the vector y. On exit, Y is overwritten by the
|
||||
* updated vector y.
|
||||
*
|
||||
* INCY - INTEGER.
|
||||
* On entry, INCY specifies the increment for the elements of
|
||||
* Y. INCY must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Further Details
|
||||
* ===============
|
||||
*
|
||||
* Level 2 Blas routine.
|
||||
* The vector and matrix arguments are not referenced when N = 0, or M = 0
|
||||
*
|
||||
* -- Written on 22-October-1986.
|
||||
* Jack Dongarra, Argonne National Lab.
|
||||
* Jeremy Du Croz, Nag Central Office.
|
||||
* Sven Hammarling, Nag Central Office.
|
||||
* Richard Hanson, Sandia National Labs.
|
||||
*
|
||||
* =====================================================================
|
||||
*
|
||||
* .. Parameters ..
|
||||
REAL ONE,ZERO
|
||||
PARAMETER (ONE=1.0E+0,ZERO=0.0E+0)
|
||||
* ..
|
||||
* .. Local Scalars ..
|
||||
REAL TEMP
|
||||
INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
|
||||
* ..
|
||||
* .. External Functions ..
|
||||
LOGICAL LSAME
|
||||
EXTERNAL LSAME
|
||||
* ..
|
||||
* .. External Subroutines ..
|
||||
EXTERNAL XERBLA
|
||||
* ..
|
||||
* .. Intrinsic Functions ..
|
||||
INTRINSIC MAX
|
||||
* ..
|
||||
*
|
||||
* Test the input parameters.
|
||||
*
|
||||
INFO = 0
|
||||
IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
|
||||
+ .NOT.LSAME(TRANS,'C')) THEN
|
||||
INFO = 1
|
||||
ELSE IF (M.LT.0) THEN
|
||||
INFO = 2
|
||||
ELSE IF (N.LT.0) THEN
|
||||
INFO = 3
|
||||
ELSE IF (LDA.LT.MAX(1,M)) THEN
|
||||
INFO = 6
|
||||
ELSE IF (INCX.EQ.0) THEN
|
||||
INFO = 8
|
||||
ELSE IF (INCY.EQ.0) THEN
|
||||
INFO = 11
|
||||
END IF
|
||||
IF (INFO.NE.0) THEN
|
||||
CALL XERBLA('SGEMV ',INFO)
|
||||
RETURN
|
||||
END IF
|
||||
*
|
||||
* Quick return if possible.
|
||||
*
|
||||
IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
|
||||
+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
|
||||
*
|
||||
* Set LENX and LENY, the lengths of the vectors x and y, and set
|
||||
* up the start points in X and Y.
|
||||
*
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
LENX = N
|
||||
LENY = M
|
||||
ELSE
|
||||
LENX = M
|
||||
LENY = N
|
||||
END IF
|
||||
IF (INCX.GT.0) THEN
|
||||
KX = 1
|
||||
ELSE
|
||||
KX = 1 - (LENX-1)*INCX
|
||||
END IF
|
||||
IF (INCY.GT.0) THEN
|
||||
KY = 1
|
||||
ELSE
|
||||
KY = 1 - (LENY-1)*INCY
|
||||
END IF
|
||||
*
|
||||
* Start the operations. In this version the elements of A are
|
||||
* accessed sequentially with one pass through A.
|
||||
*
|
||||
* First form y := beta*y.
|
||||
*
|
||||
IF (BETA.NE.ONE) THEN
|
||||
IF (INCY.EQ.1) THEN
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 10 I = 1,LENY
|
||||
Y(I) = ZERO
|
||||
10 CONTINUE
|
||||
ELSE
|
||||
DO 20 I = 1,LENY
|
||||
Y(I) = BETA*Y(I)
|
||||
20 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
IY = KY
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 30 I = 1,LENY
|
||||
Y(IY) = ZERO
|
||||
IY = IY + INCY
|
||||
30 CONTINUE
|
||||
ELSE
|
||||
DO 40 I = 1,LENY
|
||||
Y(IY) = BETA*Y(IY)
|
||||
IY = IY + INCY
|
||||
40 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
END IF
|
||||
IF (ALPHA.EQ.ZERO) RETURN
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
*
|
||||
* Form y := alpha*A*x + y.
|
||||
*
|
||||
JX = KX
|
||||
IF (INCY.EQ.1) THEN
|
||||
DO 60 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
DO 50 I = 1,M
|
||||
Y(I) = Y(I) + TEMP*A(I,J)
|
||||
50 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
60 CONTINUE
|
||||
ELSE
|
||||
DO 80 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
IY = KY
|
||||
DO 70 I = 1,M
|
||||
Y(IY) = Y(IY) + TEMP*A(I,J)
|
||||
IY = IY + INCY
|
||||
70 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
80 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
*
|
||||
* Form y := alpha*A**T*x + y.
|
||||
*
|
||||
JY = KY
|
||||
IF (INCX.EQ.1) THEN
|
||||
DO 100 J = 1,N
|
||||
TEMP = ZERO
|
||||
DO 90 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(I)
|
||||
90 CONTINUE
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
100 CONTINUE
|
||||
ELSE
|
||||
DO 120 J = 1,N
|
||||
TEMP = ZERO
|
||||
IX = KX
|
||||
DO 110 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(IX)
|
||||
IX = IX + INCX
|
||||
110 CONTINUE
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
120 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
*
|
||||
RETURN
|
||||
*
|
||||
* End of SGEMV .
|
||||
*
|
||||
END
|
||||
@@ -0,0 +1,285 @@
|
||||
SUBROUTINE ZGEMV(TRANS,M,N,ALPHA,A,LDA,X,INCX,BETA,Y,INCY)
|
||||
* .. Scalar Arguments ..
|
||||
DOUBLE COMPLEX ALPHA,BETA
|
||||
INTEGER INCX,INCY,LDA,M,N
|
||||
CHARACTER TRANS
|
||||
* ..
|
||||
* .. Array Arguments ..
|
||||
DOUBLE COMPLEX A(LDA,*),X(*),Y(*)
|
||||
* ..
|
||||
*
|
||||
* Purpose
|
||||
* =======
|
||||
*
|
||||
* ZGEMV performs one of the matrix-vector operations
|
||||
*
|
||||
* y := alpha*A*x + beta*y, or y := alpha*A**T*x + beta*y, or
|
||||
*
|
||||
* y := alpha*A**H*x + beta*y,
|
||||
*
|
||||
* where alpha and beta are scalars, x and y are vectors and A is an
|
||||
* m by n matrix.
|
||||
*
|
||||
* Arguments
|
||||
* ==========
|
||||
*
|
||||
* TRANS - CHARACTER*1.
|
||||
* On entry, TRANS specifies the operation to be performed as
|
||||
* follows:
|
||||
*
|
||||
* TRANS = 'N' or 'n' y := alpha*A*x + beta*y.
|
||||
*
|
||||
* TRANS = 'T' or 't' y := alpha*A**T*x + beta*y.
|
||||
*
|
||||
* TRANS = 'C' or 'c' y := alpha*A**H*x + beta*y.
|
||||
*
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* M - INTEGER.
|
||||
* On entry, M specifies the number of rows of the matrix A.
|
||||
* M must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* N - INTEGER.
|
||||
* On entry, N specifies the number of columns of the matrix A.
|
||||
* N must be at least zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* ALPHA - COMPLEX*16 .
|
||||
* On entry, ALPHA specifies the scalar alpha.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* A - COMPLEX*16 array of DIMENSION ( LDA, n ).
|
||||
* Before entry, the leading m by n part of the array A must
|
||||
* contain the matrix of coefficients.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* LDA - INTEGER.
|
||||
* On entry, LDA specifies the first dimension of A as declared
|
||||
* in the calling (sub) program. LDA must be at least
|
||||
* max( 1, m ).
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* X - COMPLEX*16 array of DIMENSION at least
|
||||
* ( 1 + ( n - 1 )*abs( INCX ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( m - 1 )*abs( INCX ) ) otherwise.
|
||||
* Before entry, the incremented array X must contain the
|
||||
* vector x.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* INCX - INTEGER.
|
||||
* On entry, INCX specifies the increment for the elements of
|
||||
* X. INCX must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* BETA - COMPLEX*16 .
|
||||
* On entry, BETA specifies the scalar beta. When BETA is
|
||||
* supplied as zero then Y need not be set on input.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Y - COMPLEX*16 array of DIMENSION at least
|
||||
* ( 1 + ( m - 1 )*abs( INCY ) ) when TRANS = 'N' or 'n'
|
||||
* and at least
|
||||
* ( 1 + ( n - 1 )*abs( INCY ) ) otherwise.
|
||||
* Before entry with BETA non-zero, the incremented array Y
|
||||
* must contain the vector y. On exit, Y is overwritten by the
|
||||
* updated vector y.
|
||||
*
|
||||
* INCY - INTEGER.
|
||||
* On entry, INCY specifies the increment for the elements of
|
||||
* Y. INCY must not be zero.
|
||||
* Unchanged on exit.
|
||||
*
|
||||
* Further Details
|
||||
* ===============
|
||||
*
|
||||
* Level 2 Blas routine.
|
||||
* The vector and matrix arguments are not referenced when N = 0, or M = 0
|
||||
*
|
||||
* -- Written on 22-October-1986.
|
||||
* Jack Dongarra, Argonne National Lab.
|
||||
* Jeremy Du Croz, Nag Central Office.
|
||||
* Sven Hammarling, Nag Central Office.
|
||||
* Richard Hanson, Sandia National Labs.
|
||||
*
|
||||
* =====================================================================
|
||||
*
|
||||
* .. Parameters ..
|
||||
DOUBLE COMPLEX ONE
|
||||
PARAMETER (ONE= (1.0D+0,0.0D+0))
|
||||
DOUBLE COMPLEX ZERO
|
||||
PARAMETER (ZERO= (0.0D+0,0.0D+0))
|
||||
* ..
|
||||
* .. Local Scalars ..
|
||||
DOUBLE COMPLEX TEMP
|
||||
INTEGER I,INFO,IX,IY,J,JX,JY,KX,KY,LENX,LENY
|
||||
LOGICAL NOCONJ
|
||||
* ..
|
||||
* .. External Functions ..
|
||||
LOGICAL LSAME
|
||||
EXTERNAL LSAME
|
||||
* ..
|
||||
* .. External Subroutines ..
|
||||
EXTERNAL XERBLA
|
||||
* ..
|
||||
* .. Intrinsic Functions ..
|
||||
INTRINSIC DCONJG,MAX
|
||||
* ..
|
||||
*
|
||||
* Test the input parameters.
|
||||
*
|
||||
INFO = 0
|
||||
IF (.NOT.LSAME(TRANS,'N') .AND. .NOT.LSAME(TRANS,'T') .AND.
|
||||
+ .NOT.LSAME(TRANS,'C')) THEN
|
||||
INFO = 1
|
||||
ELSE IF (M.LT.0) THEN
|
||||
INFO = 2
|
||||
ELSE IF (N.LT.0) THEN
|
||||
INFO = 3
|
||||
ELSE IF (LDA.LT.MAX(1,M)) THEN
|
||||
INFO = 6
|
||||
ELSE IF (INCX.EQ.0) THEN
|
||||
INFO = 8
|
||||
ELSE IF (INCY.EQ.0) THEN
|
||||
INFO = 11
|
||||
END IF
|
||||
IF (INFO.NE.0) THEN
|
||||
CALL XERBLA('ZGEMV ',INFO)
|
||||
RETURN
|
||||
END IF
|
||||
*
|
||||
* Quick return if possible.
|
||||
*
|
||||
IF ((M.EQ.0) .OR. (N.EQ.0) .OR.
|
||||
+ ((ALPHA.EQ.ZERO).AND. (BETA.EQ.ONE))) RETURN
|
||||
*
|
||||
NOCONJ = LSAME(TRANS,'T')
|
||||
*
|
||||
* Set LENX and LENY, the lengths of the vectors x and y, and set
|
||||
* up the start points in X and Y.
|
||||
*
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
LENX = N
|
||||
LENY = M
|
||||
ELSE
|
||||
LENX = M
|
||||
LENY = N
|
||||
END IF
|
||||
IF (INCX.GT.0) THEN
|
||||
KX = 1
|
||||
ELSE
|
||||
KX = 1 - (LENX-1)*INCX
|
||||
END IF
|
||||
IF (INCY.GT.0) THEN
|
||||
KY = 1
|
||||
ELSE
|
||||
KY = 1 - (LENY-1)*INCY
|
||||
END IF
|
||||
*
|
||||
* Start the operations. In this version the elements of A are
|
||||
* accessed sequentially with one pass through A.
|
||||
*
|
||||
* First form y := beta*y.
|
||||
*
|
||||
IF (BETA.NE.ONE) THEN
|
||||
IF (INCY.EQ.1) THEN
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 10 I = 1,LENY
|
||||
Y(I) = ZERO
|
||||
10 CONTINUE
|
||||
ELSE
|
||||
DO 20 I = 1,LENY
|
||||
Y(I) = BETA*Y(I)
|
||||
20 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
IY = KY
|
||||
IF (BETA.EQ.ZERO) THEN
|
||||
DO 30 I = 1,LENY
|
||||
Y(IY) = ZERO
|
||||
IY = IY + INCY
|
||||
30 CONTINUE
|
||||
ELSE
|
||||
DO 40 I = 1,LENY
|
||||
Y(IY) = BETA*Y(IY)
|
||||
IY = IY + INCY
|
||||
40 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
END IF
|
||||
IF (ALPHA.EQ.ZERO) RETURN
|
||||
IF (LSAME(TRANS,'N')) THEN
|
||||
*
|
||||
* Form y := alpha*A*x + y.
|
||||
*
|
||||
JX = KX
|
||||
IF (INCY.EQ.1) THEN
|
||||
DO 60 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
DO 50 I = 1,M
|
||||
Y(I) = Y(I) + TEMP*A(I,J)
|
||||
50 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
60 CONTINUE
|
||||
ELSE
|
||||
DO 80 J = 1,N
|
||||
IF (X(JX).NE.ZERO) THEN
|
||||
TEMP = ALPHA*X(JX)
|
||||
IY = KY
|
||||
DO 70 I = 1,M
|
||||
Y(IY) = Y(IY) + TEMP*A(I,J)
|
||||
IY = IY + INCY
|
||||
70 CONTINUE
|
||||
END IF
|
||||
JX = JX + INCX
|
||||
80 CONTINUE
|
||||
END IF
|
||||
ELSE
|
||||
*
|
||||
* Form y := alpha*A**T*x + y or y := alpha*A**H*x + y.
|
||||
*
|
||||
JY = KY
|
||||
IF (INCX.EQ.1) THEN
|
||||
DO 110 J = 1,N
|
||||
TEMP = ZERO
|
||||
IF (NOCONJ) THEN
|
||||
DO 90 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(I)
|
||||
90 CONTINUE
|
||||
ELSE
|
||||
DO 100 I = 1,M
|
||||
TEMP = TEMP + DCONJG(A(I,J))*X(I)
|
||||
100 CONTINUE
|
||||
END IF
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
110 CONTINUE
|
||||
ELSE
|
||||
DO 140 J = 1,N
|
||||
TEMP = ZERO
|
||||
IX = KX
|
||||
IF (NOCONJ) THEN
|
||||
DO 120 I = 1,M
|
||||
TEMP = TEMP + A(I,J)*X(IX)
|
||||
IX = IX + INCX
|
||||
120 CONTINUE
|
||||
ELSE
|
||||
DO 130 I = 1,M
|
||||
TEMP = TEMP + DCONJG(A(I,J))*X(IX)
|
||||
IX = IX + INCX
|
||||
130 CONTINUE
|
||||
END IF
|
||||
Y(JY) = Y(JY) + ALPHA*TEMP
|
||||
JY = JY + INCY
|
||||
140 CONTINUE
|
||||
END IF
|
||||
END IF
|
||||
*
|
||||
RETURN
|
||||
*
|
||||
* End of ZGEMV .
|
||||
*
|
||||
END
|
||||
@@ -136,6 +136,7 @@ void NAME(char *SIDE, char *UPLO,
|
||||
FLOAT *sa, *sb;
|
||||
|
||||
#ifdef SMP
|
||||
#ifndef COMPLEX
|
||||
#ifdef XDOUBLE
|
||||
int mode = BLAS_XDOUBLE | BLAS_REAL;
|
||||
#elif defined(DOUBLE)
|
||||
@@ -143,6 +144,15 @@ void NAME(char *SIDE, char *UPLO,
|
||||
#else
|
||||
int mode = BLAS_SINGLE | BLAS_REAL;
|
||||
#endif
|
||||
#else
|
||||
#ifdef XDOUBLE
|
||||
int mode = BLAS_XDOUBLE | BLAS_COMPLEX;
|
||||
#elif defined(DOUBLE)
|
||||
int mode = BLAS_DOUBLE | BLAS_COMPLEX;
|
||||
#else
|
||||
int mode = BLAS_SINGLE | BLAS_COMPLEX;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(SMP) && !defined(NO_AFFINITY)
|
||||
@@ -237,6 +247,7 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_SIDE Side, enum CBLAS_UPLO Uplo,
|
||||
FLOAT *sa, *sb;
|
||||
|
||||
#ifdef SMP
|
||||
#ifndef COMPLEX
|
||||
#ifdef XDOUBLE
|
||||
int mode = BLAS_XDOUBLE | BLAS_REAL;
|
||||
#elif defined(DOUBLE)
|
||||
@@ -244,6 +255,15 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_SIDE Side, enum CBLAS_UPLO Uplo,
|
||||
#else
|
||||
int mode = BLAS_SINGLE | BLAS_REAL;
|
||||
#endif
|
||||
#else
|
||||
#ifdef XDOUBLE
|
||||
int mode = BLAS_XDOUBLE | BLAS_COMPLEX;
|
||||
#elif defined(DOUBLE)
|
||||
int mode = BLAS_DOUBLE | BLAS_COMPLEX;
|
||||
#else
|
||||
int mode = BLAS_SINGLE | BLAS_COMPLEX;
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(SMP) && !defined(NO_AFFINITY)
|
||||
|
||||
+2
-2
@@ -6,7 +6,7 @@ TOPDIR = ..
|
||||
include $(TOPDIR)/Makefile.system
|
||||
|
||||
ifdef TARGET_CORE
|
||||
CFLAGS += -DBUILD_KERNEL -DTABLE_NAME=gotoblas_$(TARGET_CORE)
|
||||
override CFLAGS += -DBUILD_KERNEL -DTABLE_NAME=gotoblas_$(TARGET_CORE)
|
||||
BUILD_KERNEL = 1
|
||||
KDIR =
|
||||
TSUFFIX = _$(TARGET_CORE)
|
||||
@@ -48,7 +48,7 @@ HPLOBJS = \
|
||||
|
||||
COMMONOBJS += lsame.$(SUFFIX) scabs1.$(SUFFIX) dcabs1.$(SUFFIX)
|
||||
|
||||
ifdef DYNAMIC_ARCH
|
||||
ifeq ($(DYNAMIC_ARCH), 1)
|
||||
SBLASOBJS += setparam$(TSUFFIX).$(SUFFIX)
|
||||
CCOMMON_OPT += -DTS=$(TSUFFIX)
|
||||
endif
|
||||
|
||||
@@ -498,6 +498,91 @@ $(KDIR)xgemm_kernel_r$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(XGEMMKERNEL) $(XGEMMD
|
||||
$(KDIR)xgemm_kernel_b$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(XGEMMKERNEL) $(XGEMMDEPEND)
|
||||
$(CC) $(CFLAGS) -c -DXDOUBLE -DCOMPLEX -DCC $< -o $@
|
||||
|
||||
ifeq ($(TARGET), LOONGSON3B)
|
||||
$(KDIR)strmm_kernel_LN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(STRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -UCOMPLEX -DLEFT -UTRANSA $< -o $@
|
||||
|
||||
$(KDIR)strmm_kernel_LT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(STRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -UCOMPLEX -DLEFT -DTRANSA $< -o $@
|
||||
|
||||
$(KDIR)strmm_kernel_RN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(STRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -UCOMPLEX -ULEFT -UTRANSA $< -o $@
|
||||
|
||||
$(KDIR)strmm_kernel_RT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(STRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -UCOMPLEX -ULEFT -DTRANSA $< -o $@
|
||||
|
||||
$(KDIR)dtrmm_kernel_LN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -UCOMPLEX -DLEFT -UTRANSA $< -o $@
|
||||
|
||||
$(KDIR)dtrmm_kernel_LT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -UCOMPLEX -DLEFT -DTRANSA $< -o $@
|
||||
|
||||
$(KDIR)dtrmm_kernel_RN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -UCOMPLEX -ULEFT -UTRANSA $< -o $@
|
||||
|
||||
$(KDIR)dtrmm_kernel_RT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(DTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -UCOMPLEX -ULEFT -DTRANSA $< -o $@
|
||||
|
||||
$(KDIR)qtrmm_kernel_LN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(QGEMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DXDOUBLE -UCOMPLEX -DLEFT -UTRANSA $< -o $@
|
||||
|
||||
$(KDIR)qtrmm_kernel_LT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(QGEMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DXDOUBLE -UCOMPLEX -DLEFT -DTRANSA $< -o $@
|
||||
|
||||
$(KDIR)qtrmm_kernel_RN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(QGEMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DXDOUBLE -UCOMPLEX -ULEFT -UTRANSA $< -o $@
|
||||
|
||||
$(KDIR)qtrmm_kernel_RT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(QGEMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DXDOUBLE -UCOMPLEX -ULEFT -DTRANSA $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_LN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -DLEFT -UTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_LT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -DLEFT -DTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_LR$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -DLEFT -UTRANSA -DCONJ -DCN $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_LC$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -DLEFT -DTRANSA -DCONJ -DCN $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_RN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -ULEFT -UTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_RT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -ULEFT -DTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_RR$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -ULEFT -UTRANSA -DCONJ -DNC $< -o $@
|
||||
|
||||
$(KDIR)ctrmm_kernel_RC$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(CTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -DCOMPLEX -ULEFT -DTRANSA -DCONJ -DNC $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_LN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -DLEFT -UTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_LT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -DLEFT -DTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_LR$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -DLEFT -UTRANSA -DCONJ -DCN $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_LC$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -DLEFT -DTRANSA -DCONJ -DCN $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_RN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -ULEFT -UTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_RT$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -ULEFT -DTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_RR$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -ULEFT -UTRANSA -DCONJ -DNC $< -o $@
|
||||
|
||||
$(KDIR)ztrmm_kernel_RC$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZTRMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -ULEFT -DTRANSA -DCONJ -DNC $< -o $@
|
||||
else
|
||||
$(KDIR)strmm_kernel_LN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(SGEMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -UDOUBLE -UCOMPLEX -DLEFT -UTRANSA $< -o $@
|
||||
|
||||
@@ -581,6 +666,7 @@ $(KDIR)ztrmm_kernel_RR$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZGEMMKERNEL)
|
||||
|
||||
$(KDIR)ztrmm_kernel_RC$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(ZGEMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DDOUBLE -DCOMPLEX -ULEFT -DTRANSA -DCONJ -DNC $< -o $@
|
||||
endif
|
||||
|
||||
$(KDIR)xtrmm_kernel_LN$(TSUFFIX).$(SUFFIX) : $(KERNELDIR)/$(XGEMMKERNEL)
|
||||
$(CC) $(CFLAGS) -c -DTRMMKERNEL -DXDOUBLE -DCOMPLEX -DLEFT -UTRANSA -UCONJ -DNN $< -o $@
|
||||
|
||||
@@ -0,0 +1,157 @@
|
||||
#include "common.h"
|
||||
int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alpha,FLOAT* ba,FLOAT* bb,FLOAT* C,BLASLONG ldc
|
||||
#ifdef TRMMKERNEL
|
||||
,BLASLONG offset
|
||||
#endif
|
||||
)
|
||||
{
|
||||
BLASLONG i,j,k;
|
||||
FLOAT *C0,*C1,*ptrba,*ptrbb;
|
||||
FLOAT res0,res1,res2,res3,load0,load1,load2,load3,load4,load5,load6,load7;
|
||||
for (j=0; j<bn/2; j+=1)
|
||||
{
|
||||
C0 = C;
|
||||
C1 = C0+ldc;
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
for (k=0; k<bk/4; k+=1)
|
||||
{
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res2 = res2+load0*load3;
|
||||
res3 = res3+load2*load3;
|
||||
load4 = ptrba[2*1+0];
|
||||
load5 = ptrbb[2*1+0];
|
||||
res0 = res0+load4*load5;
|
||||
load6 = ptrba[2*1+1];
|
||||
res1 = res1+load6*load5;
|
||||
load7 = ptrbb[2*1+1];
|
||||
res2 = res2+load4*load7;
|
||||
res3 = res3+load6*load7;
|
||||
load0 = ptrba[2*2+0];
|
||||
load1 = ptrbb[2*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*2+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*2+1];
|
||||
res2 = res2+load0*load3;
|
||||
res3 = res3+load2*load3;
|
||||
load4 = ptrba[2*3+0];
|
||||
load5 = ptrbb[2*3+0];
|
||||
res0 = res0+load4*load5;
|
||||
load6 = ptrba[2*3+1];
|
||||
res1 = res1+load6*load5;
|
||||
load7 = ptrbb[2*3+1];
|
||||
res2 = res2+load4*load7;
|
||||
res3 = res3+load6*load7;
|
||||
ptrba = ptrba+8;
|
||||
ptrbb = ptrbb+8;
|
||||
}
|
||||
for (k=0; k<(bk&3); k+=1)
|
||||
{
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res2 = res2+load0*load3;
|
||||
res3 = res3+load2*load3;
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = C0[0]+res0;
|
||||
res1 = res1*alpha;
|
||||
C0[1] = C0[1]+res1;
|
||||
res2 = res2*alpha;
|
||||
C1[0] = C1[0]+res2;
|
||||
res3 = res3*alpha;
|
||||
C1[1] = C1[1]+res3;
|
||||
C0 = C0+2;
|
||||
C1 = C1+2;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
for (k=0; k<bk; k+=1)
|
||||
{
|
||||
load0 = ptrba[0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrbb[2*0+1];
|
||||
res1 = res1+load0*load2;
|
||||
ptrba = ptrba+1;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = C0[0]+res0;
|
||||
res1 = res1*alpha;
|
||||
C1[0] = C1[0]+res1;
|
||||
C0 = C0+1;
|
||||
C1 = C1+1;
|
||||
}
|
||||
k = (bk<<1);
|
||||
bb = bb+k;
|
||||
i = (ldc<<1);
|
||||
C = C+i;
|
||||
}
|
||||
for (j=0; j<(bn&1); j+=1)
|
||||
{
|
||||
C0 = C;
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
for (k=0; k<bk; k+=1)
|
||||
{
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+1;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = C0[0]+res0;
|
||||
res1 = res1*alpha;
|
||||
C0[1] = C0[1]+res1;
|
||||
C0 = C0+2;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
for (k=0; k<bk; k+=1)
|
||||
{
|
||||
load0 = ptrba[0+0];
|
||||
load1 = ptrbb[0+0];
|
||||
res0 = res0+load0*load1;
|
||||
ptrba = ptrba+1;
|
||||
ptrbb = ptrbb+1;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = C0[0]+res0;
|
||||
C0 = C0+1;
|
||||
}
|
||||
k = (bk<<0);
|
||||
bb = bb+k;
|
||||
C = C+ldc;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,280 @@
|
||||
#include "common.h"
|
||||
int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alpha,FLOAT* ba,FLOAT* bb,FLOAT* C,BLASLONG ldc
|
||||
#ifdef TRMMKERNEL
|
||||
,BLASLONG offset
|
||||
#endif
|
||||
)
|
||||
{
|
||||
BLASLONG i,j,k;
|
||||
FLOAT *C0,*C1,*ptrba,*ptrbb;
|
||||
FLOAT res0,res1,res2,res3,load0,load1,load2,load3,load4,load5,load6,load7;
|
||||
BLASLONG off, temp;
|
||||
#if defined(TRMMKERNEL) && !defined(LEFT)
|
||||
off = -offset;
|
||||
#endif
|
||||
for (j=0; j<bn/2; j+=1)
|
||||
{
|
||||
C0 = C;
|
||||
C1 = C0+ldc;
|
||||
#if defined(TRMMKERNEL) && defined(LEFT)
|
||||
off = offset;
|
||||
#endif
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off*2;
|
||||
ptrbb = bb + off*2;
|
||||
#endif
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || \
|
||||
(!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#elif defined(LEFT)
|
||||
temp = off+2;
|
||||
#else
|
||||
temp = off+2;
|
||||
#endif
|
||||
for (k=0; k<temp/4; k+=1)
|
||||
{
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res2 = res2+load0*load3;
|
||||
res3 = res3+load2*load3;
|
||||
load4 = ptrba[2*1+0];
|
||||
load5 = ptrbb[2*1+0];
|
||||
res0 = res0+load4*load5;
|
||||
load6 = ptrba[2*1+1];
|
||||
res1 = res1+load6*load5;
|
||||
load7 = ptrbb[2*1+1];
|
||||
res2 = res2+load4*load7;
|
||||
res3 = res3+load6*load7;
|
||||
load0 = ptrba[2*2+0];
|
||||
load1 = ptrbb[2*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*2+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*2+1];
|
||||
res2 = res2+load0*load3;
|
||||
res3 = res3+load2*load3;
|
||||
load4 = ptrba[2*3+0];
|
||||
load5 = ptrbb[2*3+0];
|
||||
res0 = res0+load4*load5;
|
||||
load6 = ptrba[2*3+1];
|
||||
res1 = res1+load6*load5;
|
||||
load7 = ptrbb[2*3+1];
|
||||
res2 = res2+load4*load7;
|
||||
res3 = res3+load6*load7;
|
||||
ptrba = ptrba+8;
|
||||
ptrbb = ptrbb+8;
|
||||
}
|
||||
for (k=0; k<(temp&3); k+=1)
|
||||
{
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res2 = res2+load0*load3;
|
||||
res3 = res3+load2*load3;
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = res0;
|
||||
res1 = res1*alpha;
|
||||
C0[1] = res1;
|
||||
res2 = res2*alpha;
|
||||
C1[0] = res2;
|
||||
res3 = res3*alpha;
|
||||
C1[1] = res3;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#ifdef LEFT
|
||||
temp -= 2;
|
||||
#else
|
||||
temp -= 2;
|
||||
#endif
|
||||
ptrba += temp*2;
|
||||
ptrbb += temp*2;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 2;
|
||||
#endif
|
||||
C0 = C0+2;
|
||||
C1 = C1+2;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) ||(!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off;
|
||||
ptrbb = bb+off*2;
|
||||
#endif
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#elif defined(LEFT)
|
||||
temp = off+1;
|
||||
#else
|
||||
temp = off+2;
|
||||
#endif
|
||||
for (k=0; k<temp; k+=1)
|
||||
{
|
||||
load0 = ptrba[0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrbb[2*0+1];
|
||||
res1 = res1+load0*load2;
|
||||
ptrba = ptrba+1;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = res0;
|
||||
res1 = res1*alpha;
|
||||
C1[0] = res1;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#ifdef LEFT
|
||||
temp -= 1;
|
||||
#else
|
||||
temp -= 2;
|
||||
#endif
|
||||
ptrba += temp;
|
||||
ptrbb += temp*2;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 1;
|
||||
#endif
|
||||
C0 = C0+1;
|
||||
C1 = C1+1;
|
||||
}
|
||||
#if defined(TRMMKERNEL) && !defined(LEFT)
|
||||
off += 2;
|
||||
#endif
|
||||
k = (bk<<1);
|
||||
bb = bb+k;
|
||||
i = (ldc<<1);
|
||||
C = C+i;
|
||||
}
|
||||
for (j=0; j<(bn&1); j+=1)
|
||||
{
|
||||
C0 = C;
|
||||
#if defined(TRMMKERNEL) && defined(LEFT)
|
||||
off = offset;
|
||||
#endif
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off*2;
|
||||
ptrbb = bb + off;
|
||||
#endif
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || \
|
||||
(!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#elif defined(LEFT)
|
||||
temp = off+2;
|
||||
#else
|
||||
temp = off+1;
|
||||
#endif
|
||||
for (k=0; k<temp; k+=1)
|
||||
{
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+1;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = res0;
|
||||
res1 = res1*alpha;
|
||||
C0[1] = res1;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#ifdef LEFT
|
||||
temp -= 2;
|
||||
#else
|
||||
temp -= 1;
|
||||
#endif
|
||||
ptrba += temp*2;
|
||||
ptrbb += temp;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 2;
|
||||
#endif
|
||||
|
||||
C0 = C0+2;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off;
|
||||
ptrbb = bb+off;
|
||||
#endif
|
||||
res0 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#elif defined(LEFT)
|
||||
temp = off + 1;
|
||||
#else
|
||||
temp = off + 1;
|
||||
#endif
|
||||
for (k=0; k<temp; k+=1)
|
||||
{
|
||||
load0 = ptrba[0+0];
|
||||
load1 = ptrbb[0+0];
|
||||
res0 = res0+load0*load1;
|
||||
ptrba = ptrba+1;
|
||||
ptrbb = ptrbb+1;
|
||||
}
|
||||
res0 = res0*alpha;
|
||||
C0[0] = res0;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#ifdef LEFT
|
||||
temp -= 1;
|
||||
#else
|
||||
temp -= 1;
|
||||
#endif
|
||||
ptrba += temp;
|
||||
ptrbb += temp;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 1;
|
||||
#endif
|
||||
C0 = C0+1;
|
||||
}
|
||||
#if defined(TRMMKERNEL) && !defined(LEFT)
|
||||
off += 1;
|
||||
#endif
|
||||
k = (bk<<0);
|
||||
bb = bb+k;
|
||||
C = C+ldc;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. Neither the name of the ISCAS nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY 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 <stdio.h>
|
||||
#include "common.h"
|
||||
|
||||
int CNAME(BLASLONG row,BLASLONG col,FLOAT* src,BLASLONG srcdim,FLOAT* dest)
|
||||
{
|
||||
BLASLONG i,j;
|
||||
BLASLONG idx=0;
|
||||
BLASLONG ii;
|
||||
FLOAT *src0,*src1,*src2,*src3,*dest0;
|
||||
for (j=0; j<col/4; j+=1)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src2 = src1+2*srcdim;
|
||||
src3 = src2+2*srcdim;
|
||||
src = src3+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (row<<3);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<row/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
dest0[8] = src0[2];
|
||||
dest0[9] = src0[3];
|
||||
dest0[10] = src1[2];
|
||||
dest0[11] = src1[3];
|
||||
dest0[12] = src2[2];
|
||||
dest0[13] = src2[3];
|
||||
dest0[14] = src3[2];
|
||||
dest0[15] = src3[3];
|
||||
dest0[16] = src0[4];
|
||||
dest0[17] = src0[5];
|
||||
dest0[18] = src1[4];
|
||||
dest0[19] = src1[5];
|
||||
dest0[20] = src2[4];
|
||||
dest0[21] = src2[5];
|
||||
dest0[22] = src3[4];
|
||||
dest0[23] = src3[5];
|
||||
dest0[24] = src0[6];
|
||||
dest0[25] = src0[7];
|
||||
dest0[26] = src1[6];
|
||||
dest0[27] = src1[7];
|
||||
dest0[28] = src2[6];
|
||||
dest0[29] = src2[7];
|
||||
dest0[30] = src3[6];
|
||||
dest0[31] = src3[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
src2 = src2+8;
|
||||
src3 = src3+8;
|
||||
ii = (4<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
dest0[8] = src0[2];
|
||||
dest0[9] = src0[3];
|
||||
dest0[10] = src1[2];
|
||||
dest0[11] = src1[3];
|
||||
dest0[12] = src2[2];
|
||||
dest0[13] = src2[3];
|
||||
dest0[14] = src3[2];
|
||||
dest0[15] = src3[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
src2 = src2+4;
|
||||
src3 = src3+4;
|
||||
ii = (2<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
src2 = src2+2;
|
||||
src3 = src3+2;
|
||||
ii = (1<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src = src1+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (row<<2);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<row/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src0[2];
|
||||
dest0[5] = src0[3];
|
||||
dest0[6] = src1[2];
|
||||
dest0[7] = src1[3];
|
||||
dest0[8] = src0[4];
|
||||
dest0[9] = src0[5];
|
||||
dest0[10] = src1[4];
|
||||
dest0[11] = src1[5];
|
||||
dest0[12] = src0[6];
|
||||
dest0[13] = src0[7];
|
||||
dest0[14] = src1[6];
|
||||
dest0[15] = src1[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
ii = (4<<2);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src0[2];
|
||||
dest0[5] = src0[3];
|
||||
dest0[6] = src1[2];
|
||||
dest0[7] = src1[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
ii = (2<<2);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
ii = (1<<2);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
src0 = src;
|
||||
src = src0+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (row<<1);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<row/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
src0 = src0+8;
|
||||
ii = (4<<1);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
src0 = src0+4;
|
||||
ii = (2<<1);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
src0 = src0+2;
|
||||
ii = (1<<1);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,401 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. Neither the name of the ISCAS nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY 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 <stdio.h>
|
||||
#include "common.h"
|
||||
|
||||
int CNAME(BLASLONG row,BLASLONG col,FLOAT* src,BLASLONG srcdim,FLOAT* dest)
|
||||
{
|
||||
BLASLONG i,j;
|
||||
BLASLONG idx=0;
|
||||
BLASLONG ii;
|
||||
FLOAT *src0,*src1,*src2,*src3,*src4,*src5,*src6,*src7,*dest0;
|
||||
for (j=0; j<col/8; j+=1)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src2 = src1+2*srcdim;
|
||||
src3 = src2+2*srcdim;
|
||||
src4 = src3+2*srcdim;
|
||||
src5 = src4+2*srcdim;
|
||||
src6 = src5+2*srcdim;
|
||||
src7 = src6+2*srcdim;
|
||||
src = src7+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (row<<4);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<row/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
dest0[8] = src4[0];
|
||||
dest0[9] = src4[1];
|
||||
dest0[10] = src5[0];
|
||||
dest0[11] = src5[1];
|
||||
dest0[12] = src6[0];
|
||||
dest0[13] = src6[1];
|
||||
dest0[14] = src7[0];
|
||||
dest0[15] = src7[1];
|
||||
dest0[16] = src0[2];
|
||||
dest0[17] = src0[3];
|
||||
dest0[18] = src1[2];
|
||||
dest0[19] = src1[3];
|
||||
dest0[20] = src2[2];
|
||||
dest0[21] = src2[3];
|
||||
dest0[22] = src3[2];
|
||||
dest0[23] = src3[3];
|
||||
dest0[24] = src4[2];
|
||||
dest0[25] = src4[3];
|
||||
dest0[26] = src5[2];
|
||||
dest0[27] = src5[3];
|
||||
dest0[28] = src6[2];
|
||||
dest0[29] = src6[3];
|
||||
dest0[30] = src7[2];
|
||||
dest0[31] = src7[3];
|
||||
dest0[32] = src0[4];
|
||||
dest0[33] = src0[5];
|
||||
dest0[34] = src1[4];
|
||||
dest0[35] = src1[5];
|
||||
dest0[36] = src2[4];
|
||||
dest0[37] = src2[5];
|
||||
dest0[38] = src3[4];
|
||||
dest0[39] = src3[5];
|
||||
dest0[40] = src4[4];
|
||||
dest0[41] = src4[5];
|
||||
dest0[42] = src5[4];
|
||||
dest0[43] = src5[5];
|
||||
dest0[44] = src6[4];
|
||||
dest0[45] = src6[5];
|
||||
dest0[46] = src7[4];
|
||||
dest0[47] = src7[5];
|
||||
dest0[48] = src0[6];
|
||||
dest0[49] = src0[7];
|
||||
dest0[50] = src1[6];
|
||||
dest0[51] = src1[7];
|
||||
dest0[52] = src2[6];
|
||||
dest0[53] = src2[7];
|
||||
dest0[54] = src3[6];
|
||||
dest0[55] = src3[7];
|
||||
dest0[56] = src4[6];
|
||||
dest0[57] = src4[7];
|
||||
dest0[58] = src5[6];
|
||||
dest0[59] = src5[7];
|
||||
dest0[60] = src6[6];
|
||||
dest0[61] = src6[7];
|
||||
dest0[62] = src7[6];
|
||||
dest0[63] = src7[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
src2 = src2+8;
|
||||
src3 = src3+8;
|
||||
src4 = src4+8;
|
||||
src5 = src5+8;
|
||||
src6 = src6+8;
|
||||
src7 = src7+8;
|
||||
ii = (4<<4);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
dest0[8] = src4[0];
|
||||
dest0[9] = src4[1];
|
||||
dest0[10] = src5[0];
|
||||
dest0[11] = src5[1];
|
||||
dest0[12] = src6[0];
|
||||
dest0[13] = src6[1];
|
||||
dest0[14] = src7[0];
|
||||
dest0[15] = src7[1];
|
||||
dest0[16] = src0[2];
|
||||
dest0[17] = src0[3];
|
||||
dest0[18] = src1[2];
|
||||
dest0[19] = src1[3];
|
||||
dest0[20] = src2[2];
|
||||
dest0[21] = src2[3];
|
||||
dest0[22] = src3[2];
|
||||
dest0[23] = src3[3];
|
||||
dest0[24] = src4[2];
|
||||
dest0[25] = src4[3];
|
||||
dest0[26] = src5[2];
|
||||
dest0[27] = src5[3];
|
||||
dest0[28] = src6[2];
|
||||
dest0[29] = src6[3];
|
||||
dest0[30] = src7[2];
|
||||
dest0[31] = src7[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
src2 = src2+4;
|
||||
src3 = src3+4;
|
||||
src4 = src4+4;
|
||||
src5 = src5+4;
|
||||
src6 = src6+4;
|
||||
src7 = src7+4;
|
||||
ii = (2<<4);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
dest0[8] = src4[0];
|
||||
dest0[9] = src4[1];
|
||||
dest0[10] = src5[0];
|
||||
dest0[11] = src5[1];
|
||||
dest0[12] = src6[0];
|
||||
dest0[13] = src6[1];
|
||||
dest0[14] = src7[0];
|
||||
dest0[15] = src7[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
src2 = src2+2;
|
||||
src3 = src3+2;
|
||||
src4 = src4+2;
|
||||
src5 = src5+2;
|
||||
src6 = src6+2;
|
||||
src7 = src7+2;
|
||||
ii = (1<<4);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
}
|
||||
if (col&4)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src2 = src1+2*srcdim;
|
||||
src3 = src2+2*srcdim;
|
||||
src = src3+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (row<<3);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<row/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
dest0[8] = src0[2];
|
||||
dest0[9] = src0[3];
|
||||
dest0[10] = src1[2];
|
||||
dest0[11] = src1[3];
|
||||
dest0[12] = src2[2];
|
||||
dest0[13] = src2[3];
|
||||
dest0[14] = src3[2];
|
||||
dest0[15] = src3[3];
|
||||
dest0[16] = src0[4];
|
||||
dest0[17] = src0[5];
|
||||
dest0[18] = src1[4];
|
||||
dest0[19] = src1[5];
|
||||
dest0[20] = src2[4];
|
||||
dest0[21] = src2[5];
|
||||
dest0[22] = src3[4];
|
||||
dest0[23] = src3[5];
|
||||
dest0[24] = src0[6];
|
||||
dest0[25] = src0[7];
|
||||
dest0[26] = src1[6];
|
||||
dest0[27] = src1[7];
|
||||
dest0[28] = src2[6];
|
||||
dest0[29] = src2[7];
|
||||
dest0[30] = src3[6];
|
||||
dest0[31] = src3[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
src2 = src2+8;
|
||||
src3 = src3+8;
|
||||
ii = (4<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
dest0[8] = src0[2];
|
||||
dest0[9] = src0[3];
|
||||
dest0[10] = src1[2];
|
||||
dest0[11] = src1[3];
|
||||
dest0[12] = src2[2];
|
||||
dest0[13] = src2[3];
|
||||
dest0[14] = src3[2];
|
||||
dest0[15] = src3[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
src2 = src2+4;
|
||||
src3 = src3+4;
|
||||
ii = (2<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src2[0];
|
||||
dest0[5] = src2[1];
|
||||
dest0[6] = src3[0];
|
||||
dest0[7] = src3[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
src2 = src2+2;
|
||||
src3 = src3+2;
|
||||
ii = (1<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src = src1+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (row<<2);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<row/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src0[2];
|
||||
dest0[5] = src0[3];
|
||||
dest0[6] = src1[2];
|
||||
dest0[7] = src1[3];
|
||||
dest0[8] = src0[4];
|
||||
dest0[9] = src0[5];
|
||||
dest0[10] = src1[4];
|
||||
dest0[11] = src1[5];
|
||||
dest0[12] = src0[6];
|
||||
dest0[13] = src0[7];
|
||||
dest0[14] = src1[6];
|
||||
dest0[15] = src1[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
ii = (4<<2);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
dest0[4] = src0[2];
|
||||
dest0[5] = src0[3];
|
||||
dest0[6] = src1[2];
|
||||
dest0[7] = src1[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
ii = (2<<2);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src1[0];
|
||||
dest0[3] = src1[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
ii = (1<<2);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
src0 = src;
|
||||
src = src0+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (row<<1);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<row/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
src0 = src0+8;
|
||||
ii = (4<<1);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
src0 = src0+4;
|
||||
ii = (2<<1);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
src0 = src0+2;
|
||||
ii = (1<<1);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,237 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. Neither the name of the ISCAS nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY 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 <stdio.h>
|
||||
#include "common.h"
|
||||
|
||||
int CNAME(BLASLONG row,BLASLONG col,FLOAT* src,BLASLONG srcdim,FLOAT* dest)
|
||||
{
|
||||
BLASLONG i,j;
|
||||
BLASLONG idx=0;
|
||||
BLASLONG ii;
|
||||
FLOAT *src0,*src1,*src2,*src3,*dest0;
|
||||
FLOAT *dest1,*dest2;
|
||||
ii = col&-4;
|
||||
ii = ii*(2*row);
|
||||
dest2 = dest+ii;
|
||||
ii = col&-2;
|
||||
ii = ii*(2*row);
|
||||
dest1 = dest+ii;
|
||||
for (j=0; j<row/4; j+=1)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src2 = src1+2*srcdim;
|
||||
src3 = src2+2*srcdim;
|
||||
src = src3+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (4<<3);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<col/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
dest0[8] = src1[0];
|
||||
dest0[9] = src1[1];
|
||||
dest0[10] = src1[2];
|
||||
dest0[11] = src1[3];
|
||||
dest0[12] = src1[4];
|
||||
dest0[13] = src1[5];
|
||||
dest0[14] = src1[6];
|
||||
dest0[15] = src1[7];
|
||||
dest0[16] = src2[0];
|
||||
dest0[17] = src2[1];
|
||||
dest0[18] = src2[2];
|
||||
dest0[19] = src2[3];
|
||||
dest0[20] = src2[4];
|
||||
dest0[21] = src2[5];
|
||||
dest0[22] = src2[6];
|
||||
dest0[23] = src2[7];
|
||||
dest0[24] = src3[0];
|
||||
dest0[25] = src3[1];
|
||||
dest0[26] = src3[2];
|
||||
dest0[27] = src3[3];
|
||||
dest0[28] = src3[4];
|
||||
dest0[29] = src3[5];
|
||||
dest0[30] = src3[6];
|
||||
dest0[31] = src3[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
src2 = src2+8;
|
||||
src3 = src3+8;
|
||||
ii = (row<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
dest2[0] = src0[0];
|
||||
dest2[1] = src0[1];
|
||||
dest2[2] = src0[2];
|
||||
dest2[3] = src0[3];
|
||||
dest2[4] = src1[0];
|
||||
dest2[5] = src1[1];
|
||||
dest2[6] = src1[2];
|
||||
dest2[7] = src1[3];
|
||||
dest2[8] = src2[0];
|
||||
dest2[9] = src2[1];
|
||||
dest2[10] = src2[2];
|
||||
dest2[11] = src2[3];
|
||||
dest2[12] = src3[0];
|
||||
dest2[13] = src3[1];
|
||||
dest2[14] = src3[2];
|
||||
dest2[15] = src3[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
src2 = src2+4;
|
||||
src3 = src3+4;
|
||||
dest2 = dest2+16;
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
dest1[0] = src0[0];
|
||||
dest1[1] = src0[1];
|
||||
dest1[2] = src1[0];
|
||||
dest1[3] = src1[1];
|
||||
dest1[4] = src2[0];
|
||||
dest1[5] = src2[1];
|
||||
dest1[6] = src3[0];
|
||||
dest1[7] = src3[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
src2 = src2+2;
|
||||
src3 = src3+2;
|
||||
dest1 = dest1+8;
|
||||
}
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src = src1+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (2<<3);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<col/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
dest0[8] = src1[0];
|
||||
dest0[9] = src1[1];
|
||||
dest0[10] = src1[2];
|
||||
dest0[11] = src1[3];
|
||||
dest0[12] = src1[4];
|
||||
dest0[13] = src1[5];
|
||||
dest0[14] = src1[6];
|
||||
dest0[15] = src1[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
ii = (row<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
dest2[0] = src0[0];
|
||||
dest2[1] = src0[1];
|
||||
dest2[2] = src0[2];
|
||||
dest2[3] = src0[3];
|
||||
dest2[4] = src1[0];
|
||||
dest2[5] = src1[1];
|
||||
dest2[6] = src1[2];
|
||||
dest2[7] = src1[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
dest2 = dest2+8;
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
dest1[0] = src0[0];
|
||||
dest1[1] = src0[1];
|
||||
dest1[2] = src1[0];
|
||||
dest1[3] = src1[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
dest1 = dest1+4;
|
||||
}
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
src0 = src;
|
||||
src = src0+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (1<<3);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<col/4; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
src0 = src0+8;
|
||||
ii = (row<<3);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
dest2[0] = src0[0];
|
||||
dest2[1] = src0[1];
|
||||
dest2[2] = src0[2];
|
||||
dest2[3] = src0[3];
|
||||
src0 = src0+4;
|
||||
dest2 = dest2+4;
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
dest1[0] = src0[0];
|
||||
dest1[1] = src0[1];
|
||||
src0 = src0+2;
|
||||
dest1 = dest1+2;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,370 @@
|
||||
/*****************************************************************************
|
||||
Copyright (c) 2011,2012 Lab of Parallel Software and Computational Science,ISCAS
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
3. Neither the name of the ISCAS nor the names of its contributors may
|
||||
be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY 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 <stdio.h>
|
||||
#include "common.h"
|
||||
|
||||
int CNAME(BLASLONG row,BLASLONG col,FLOAT* src,BLASLONG srcdim,FLOAT* dest)
|
||||
{
|
||||
BLASLONG i,j;
|
||||
BLASLONG idx=0;
|
||||
BLASLONG ii;
|
||||
FLOAT *src0,*src1,*src2,*src3,*dest0;
|
||||
FLOAT *dest1,*dest2,*dest4;
|
||||
ii = col&-8;
|
||||
ii = ii*(2*row);
|
||||
dest4 = dest+ii;
|
||||
ii = col&-4;
|
||||
ii = ii*(2*row);
|
||||
dest2 = dest+ii;
|
||||
ii = col&-2;
|
||||
ii = ii*(2*row);
|
||||
dest1 = dest+ii;
|
||||
for (j=0; j<row/4; j+=1)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src2 = src1+2*srcdim;
|
||||
src3 = src2+2*srcdim;
|
||||
src = src3+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (4<<4);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<col/8; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
dest0[8] = src0[8];
|
||||
dest0[9] = src0[9];
|
||||
dest0[10] = src0[10];
|
||||
dest0[11] = src0[11];
|
||||
dest0[12] = src0[12];
|
||||
dest0[13] = src0[13];
|
||||
dest0[14] = src0[14];
|
||||
dest0[15] = src0[15];
|
||||
dest0[16] = src1[0];
|
||||
dest0[17] = src1[1];
|
||||
dest0[18] = src1[2];
|
||||
dest0[19] = src1[3];
|
||||
dest0[20] = src1[4];
|
||||
dest0[21] = src1[5];
|
||||
dest0[22] = src1[6];
|
||||
dest0[23] = src1[7];
|
||||
dest0[24] = src1[8];
|
||||
dest0[25] = src1[9];
|
||||
dest0[26] = src1[10];
|
||||
dest0[27] = src1[11];
|
||||
dest0[28] = src1[12];
|
||||
dest0[29] = src1[13];
|
||||
dest0[30] = src1[14];
|
||||
dest0[31] = src1[15];
|
||||
dest0[32] = src2[0];
|
||||
dest0[33] = src2[1];
|
||||
dest0[34] = src2[2];
|
||||
dest0[35] = src2[3];
|
||||
dest0[36] = src2[4];
|
||||
dest0[37] = src2[5];
|
||||
dest0[38] = src2[6];
|
||||
dest0[39] = src2[7];
|
||||
dest0[40] = src2[8];
|
||||
dest0[41] = src2[9];
|
||||
dest0[42] = src2[10];
|
||||
dest0[43] = src2[11];
|
||||
dest0[44] = src2[12];
|
||||
dest0[45] = src2[13];
|
||||
dest0[46] = src2[14];
|
||||
dest0[47] = src2[15];
|
||||
dest0[48] = src3[0];
|
||||
dest0[49] = src3[1];
|
||||
dest0[50] = src3[2];
|
||||
dest0[51] = src3[3];
|
||||
dest0[52] = src3[4];
|
||||
dest0[53] = src3[5];
|
||||
dest0[54] = src3[6];
|
||||
dest0[55] = src3[7];
|
||||
dest0[56] = src3[8];
|
||||
dest0[57] = src3[9];
|
||||
dest0[58] = src3[10];
|
||||
dest0[59] = src3[11];
|
||||
dest0[60] = src3[12];
|
||||
dest0[61] = src3[13];
|
||||
dest0[62] = src3[14];
|
||||
dest0[63] = src3[15];
|
||||
src0 = src0+16;
|
||||
src1 = src1+16;
|
||||
src2 = src2+16;
|
||||
src3 = src3+16;
|
||||
ii = (row<<4);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (col&4)
|
||||
{
|
||||
dest4[0] = src0[0];
|
||||
dest4[1] = src0[1];
|
||||
dest4[2] = src0[2];
|
||||
dest4[3] = src0[3];
|
||||
dest4[4] = src0[4];
|
||||
dest4[5] = src0[5];
|
||||
dest4[6] = src0[6];
|
||||
dest4[7] = src0[7];
|
||||
dest4[8] = src1[0];
|
||||
dest4[9] = src1[1];
|
||||
dest4[10] = src1[2];
|
||||
dest4[11] = src1[3];
|
||||
dest4[12] = src1[4];
|
||||
dest4[13] = src1[5];
|
||||
dest4[14] = src1[6];
|
||||
dest4[15] = src1[7];
|
||||
dest4[16] = src2[0];
|
||||
dest4[17] = src2[1];
|
||||
dest4[18] = src2[2];
|
||||
dest4[19] = src2[3];
|
||||
dest4[20] = src2[4];
|
||||
dest4[21] = src2[5];
|
||||
dest4[22] = src2[6];
|
||||
dest4[23] = src2[7];
|
||||
dest4[24] = src3[0];
|
||||
dest4[25] = src3[1];
|
||||
dest4[26] = src3[2];
|
||||
dest4[27] = src3[3];
|
||||
dest4[28] = src3[4];
|
||||
dest4[29] = src3[5];
|
||||
dest4[30] = src3[6];
|
||||
dest4[31] = src3[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
src2 = src2+8;
|
||||
src3 = src3+8;
|
||||
dest4 = dest4+32;
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
dest2[0] = src0[0];
|
||||
dest2[1] = src0[1];
|
||||
dest2[2] = src0[2];
|
||||
dest2[3] = src0[3];
|
||||
dest2[4] = src1[0];
|
||||
dest2[5] = src1[1];
|
||||
dest2[6] = src1[2];
|
||||
dest2[7] = src1[3];
|
||||
dest2[8] = src2[0];
|
||||
dest2[9] = src2[1];
|
||||
dest2[10] = src2[2];
|
||||
dest2[11] = src2[3];
|
||||
dest2[12] = src3[0];
|
||||
dest2[13] = src3[1];
|
||||
dest2[14] = src3[2];
|
||||
dest2[15] = src3[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
src2 = src2+4;
|
||||
src3 = src3+4;
|
||||
dest2 = dest2+16;
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
dest1[0] = src0[0];
|
||||
dest1[1] = src0[1];
|
||||
dest1[2] = src1[0];
|
||||
dest1[3] = src1[1];
|
||||
dest1[4] = src2[0];
|
||||
dest1[5] = src2[1];
|
||||
dest1[6] = src3[0];
|
||||
dest1[7] = src3[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
src2 = src2+2;
|
||||
src3 = src3+2;
|
||||
dest1 = dest1+8;
|
||||
}
|
||||
}
|
||||
if (row&2)
|
||||
{
|
||||
src0 = src;
|
||||
src1 = src0+2*srcdim;
|
||||
src = src1+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (2<<4);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<col/8; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
dest0[8] = src0[8];
|
||||
dest0[9] = src0[9];
|
||||
dest0[10] = src0[10];
|
||||
dest0[11] = src0[11];
|
||||
dest0[12] = src0[12];
|
||||
dest0[13] = src0[13];
|
||||
dest0[14] = src0[14];
|
||||
dest0[15] = src0[15];
|
||||
dest0[16] = src1[0];
|
||||
dest0[17] = src1[1];
|
||||
dest0[18] = src1[2];
|
||||
dest0[19] = src1[3];
|
||||
dest0[20] = src1[4];
|
||||
dest0[21] = src1[5];
|
||||
dest0[22] = src1[6];
|
||||
dest0[23] = src1[7];
|
||||
dest0[24] = src1[8];
|
||||
dest0[25] = src1[9];
|
||||
dest0[26] = src1[10];
|
||||
dest0[27] = src1[11];
|
||||
dest0[28] = src1[12];
|
||||
dest0[29] = src1[13];
|
||||
dest0[30] = src1[14];
|
||||
dest0[31] = src1[15];
|
||||
src0 = src0+16;
|
||||
src1 = src1+16;
|
||||
ii = (row<<4);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (col&4)
|
||||
{
|
||||
dest4[0] = src0[0];
|
||||
dest4[1] = src0[1];
|
||||
dest4[2] = src0[2];
|
||||
dest4[3] = src0[3];
|
||||
dest4[4] = src0[4];
|
||||
dest4[5] = src0[5];
|
||||
dest4[6] = src0[6];
|
||||
dest4[7] = src0[7];
|
||||
dest4[8] = src1[0];
|
||||
dest4[9] = src1[1];
|
||||
dest4[10] = src1[2];
|
||||
dest4[11] = src1[3];
|
||||
dest4[12] = src1[4];
|
||||
dest4[13] = src1[5];
|
||||
dest4[14] = src1[6];
|
||||
dest4[15] = src1[7];
|
||||
src0 = src0+8;
|
||||
src1 = src1+8;
|
||||
dest4 = dest4+16;
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
dest2[0] = src0[0];
|
||||
dest2[1] = src0[1];
|
||||
dest2[2] = src0[2];
|
||||
dest2[3] = src0[3];
|
||||
dest2[4] = src1[0];
|
||||
dest2[5] = src1[1];
|
||||
dest2[6] = src1[2];
|
||||
dest2[7] = src1[3];
|
||||
src0 = src0+4;
|
||||
src1 = src1+4;
|
||||
dest2 = dest2+8;
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
dest1[0] = src0[0];
|
||||
dest1[1] = src0[1];
|
||||
dest1[2] = src1[0];
|
||||
dest1[3] = src1[1];
|
||||
src0 = src0+2;
|
||||
src1 = src1+2;
|
||||
dest1 = dest1+4;
|
||||
}
|
||||
}
|
||||
if (row&1)
|
||||
{
|
||||
src0 = src;
|
||||
src = src0+2*srcdim;
|
||||
dest0 = dest;
|
||||
ii = (1<<4);
|
||||
dest = dest+ii;
|
||||
for (i=0; i<col/8; i+=1)
|
||||
{
|
||||
dest0[0] = src0[0];
|
||||
dest0[1] = src0[1];
|
||||
dest0[2] = src0[2];
|
||||
dest0[3] = src0[3];
|
||||
dest0[4] = src0[4];
|
||||
dest0[5] = src0[5];
|
||||
dest0[6] = src0[6];
|
||||
dest0[7] = src0[7];
|
||||
dest0[8] = src0[8];
|
||||
dest0[9] = src0[9];
|
||||
dest0[10] = src0[10];
|
||||
dest0[11] = src0[11];
|
||||
dest0[12] = src0[12];
|
||||
dest0[13] = src0[13];
|
||||
dest0[14] = src0[14];
|
||||
dest0[15] = src0[15];
|
||||
src0 = src0+16;
|
||||
ii = (row<<4);
|
||||
dest0 = dest0+ii;
|
||||
}
|
||||
if (col&4)
|
||||
{
|
||||
dest4[0] = src0[0];
|
||||
dest4[1] = src0[1];
|
||||
dest4[2] = src0[2];
|
||||
dest4[3] = src0[3];
|
||||
dest4[4] = src0[4];
|
||||
dest4[5] = src0[5];
|
||||
dest4[6] = src0[6];
|
||||
dest4[7] = src0[7];
|
||||
src0 = src0+8;
|
||||
dest4 = dest4+8;
|
||||
}
|
||||
if (col&2)
|
||||
{
|
||||
dest2[0] = src0[0];
|
||||
dest2[1] = src0[1];
|
||||
dest2[2] = src0[2];
|
||||
dest2[3] = src0[3];
|
||||
src0 = src0+4;
|
||||
dest2 = dest2+4;
|
||||
}
|
||||
if (col&1)
|
||||
{
|
||||
dest1[0] = src0[0];
|
||||
dest1[1] = src0[1];
|
||||
src0 = src0+2;
|
||||
dest1 = dest1+2;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,838 @@
|
||||
#include "common.h"
|
||||
/********************************
|
||||
ADD1 a*c
|
||||
ADD2 b*c
|
||||
ADD3 a*d
|
||||
ADD4 b*d
|
||||
*********************************/
|
||||
int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alphar,FLOAT alphai,FLOAT* ba,FLOAT* bb,FLOAT* C,BLASLONG ldc
|
||||
#ifdef TRMMKERNEL
|
||||
, BLASLONG offset
|
||||
#endif
|
||||
)
|
||||
{
|
||||
BLASLONG i,j,k;
|
||||
FLOAT *C0,*C1,*ptrba,*ptrbb;
|
||||
FLOAT res0,res1,res2,res3,res4,res5,res6,res7,load0,load1,load2,load3,load4,load5,load6,load7,load8,load9,load10,load11,load12,load13,load14,load15;
|
||||
for (j=0; j<bn/2; j+=1)
|
||||
{
|
||||
C0 = C;
|
||||
C1 = C0+2*ldc;
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
res4 = 0;
|
||||
res5 = 0;
|
||||
res6 = 0;
|
||||
res7 = 0;
|
||||
for (k=0; k<bk/4; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
#endif
|
||||
ptrba = ptrba+16;
|
||||
ptrbb = ptrbb+16;
|
||||
}
|
||||
for (k=0; k<(bk&3); k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
#endif
|
||||
ptrba = ptrba+4;
|
||||
ptrbb = ptrbb+4;
|
||||
}
|
||||
load0 = res0*alphar;
|
||||
C0[0] = C0[0]+load0;
|
||||
load1 = res1*alphar;
|
||||
C0[1] = C0[1]+load1;
|
||||
load0 = res1*alphai;
|
||||
C0[0] = C0[0]-load0;
|
||||
load1 = res0*alphai;
|
||||
C0[1] = C0[1]+load1;
|
||||
load2 = res2*alphar;
|
||||
C0[2] = C0[2]+load2;
|
||||
load3 = res3*alphar;
|
||||
C0[3] = C0[3]+load3;
|
||||
load2 = res3*alphai;
|
||||
C0[2] = C0[2]-load2;
|
||||
load3 = res2*alphai;
|
||||
C0[3] = C0[3]+load3;
|
||||
load4 = res4*alphar;
|
||||
C1[0] = C1[0]+load4;
|
||||
load5 = res5*alphar;
|
||||
C1[1] = C1[1]+load5;
|
||||
load4 = res5*alphai;
|
||||
C1[0] = C1[0]-load4;
|
||||
load5 = res4*alphai;
|
||||
C1[1] = C1[1]+load5;
|
||||
load6 = res6*alphar;
|
||||
C1[2] = C1[2]+load6;
|
||||
load7 = res7*alphar;
|
||||
C1[3] = C1[3]+load7;
|
||||
load6 = res7*alphai;
|
||||
C1[2] = C1[2]-load6;
|
||||
load7 = res6*alphai;
|
||||
C1[3] = C1[3]+load7;
|
||||
C0 = C0+4;
|
||||
C1 = C1+4;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
for (k=0; k<bk; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3+load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2-load2*load5;
|
||||
res3 = res3+load0*load5;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3+load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2+load2*load5;
|
||||
res3 = res3-load0*load5;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3-load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2+load2*load5;
|
||||
res3 = res3+load0*load5;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3-load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2-load2*load5;
|
||||
res3 = res3-load0*load5;
|
||||
#endif
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+4;
|
||||
}
|
||||
load0 = res0*alphar;
|
||||
C0[0] = C0[0]+load0;
|
||||
load1 = res1*alphar;
|
||||
C0[1] = C0[1]+load1;
|
||||
load0 = res1*alphai;
|
||||
C0[0] = C0[0]-load0;
|
||||
load1 = res0*alphai;
|
||||
C0[1] = C0[1]+load1;
|
||||
load2 = res2*alphar;
|
||||
C1[0] = C1[0]+load2;
|
||||
load3 = res3*alphar;
|
||||
C1[1] = C1[1]+load3;
|
||||
load2 = res3*alphai;
|
||||
C1[0] = C1[0]-load2;
|
||||
load3 = res2*alphai;
|
||||
C1[1] = C1[1]+load3;
|
||||
C0 = C0+2;
|
||||
C1 = C1+2;
|
||||
}
|
||||
k = (bk<<2);
|
||||
bb = bb+k;
|
||||
i = (ldc<<2);
|
||||
C = C+i;
|
||||
}
|
||||
for (j=0; j<(bn&1); j+=1)
|
||||
{
|
||||
C0 = C;
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
for (k=0; k<bk; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
#endif
|
||||
ptrba = ptrba+4;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
load0 = res0*alphar;
|
||||
C0[0] = C0[0]+load0;
|
||||
load1 = res1*alphar;
|
||||
C0[1] = C0[1]+load1;
|
||||
load0 = res1*alphai;
|
||||
C0[0] = C0[0]-load0;
|
||||
load1 = res0*alphai;
|
||||
C0[1] = C0[1]+load1;
|
||||
load2 = res2*alphar;
|
||||
C0[2] = C0[2]+load2;
|
||||
load3 = res3*alphar;
|
||||
C0[3] = C0[3]+load3;
|
||||
load2 = res3*alphai;
|
||||
C0[2] = C0[2]-load2;
|
||||
load3 = res2*alphai;
|
||||
C0[3] = C0[3]+load3;
|
||||
C0 = C0+4;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
ptrbb = bb;
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
for (k=0; k<bk; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
#endif
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
load0 = res0*alphar;
|
||||
C0[0] = C0[0]+load0;
|
||||
load1 = res1*alphar;
|
||||
C0[1] = C0[1]+load1;
|
||||
load0 = res1*alphai;
|
||||
C0[0] = C0[0]-load0;
|
||||
load1 = res0*alphai;
|
||||
C0[1] = C0[1]+load1;
|
||||
C0 = C0+2;
|
||||
}
|
||||
k = (bk<<1);
|
||||
bb = bb+k;
|
||||
i = (ldc<<1);
|
||||
C = C+i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,923 @@
|
||||
#include "common.h"
|
||||
/********************************
|
||||
ADD1 a*c
|
||||
ADD2 b*c
|
||||
ADD3 a*d
|
||||
ADD4 b*d
|
||||
*********************************/
|
||||
int CNAME(BLASLONG bm,BLASLONG bn,BLASLONG bk,FLOAT alphar,FLOAT alphai,FLOAT* ba,FLOAT* bb,
|
||||
FLOAT* C,BLASLONG ldc, BLASLONG offset)
|
||||
{
|
||||
BLASLONG i,j,k;
|
||||
FLOAT *C0,*C1,*ptrba,*ptrbb;
|
||||
FLOAT res0,res1,res2,res3,res4,res5,res6,res7,load0,load1,load2,load3,load4,load5,load6,load7,load8,load9,load10,load11,load12,load13,load14,load15;
|
||||
BLASLONG off, temp;
|
||||
|
||||
#if defined(TRMMKERNEL) && !defined(LEFT)
|
||||
off = -offset;
|
||||
#endif
|
||||
for (j=0; j<bn/2; j+=1)
|
||||
{
|
||||
#if defined(TRMMKERNEL) && defined(LEFT)
|
||||
off = offset;
|
||||
#endif
|
||||
C0 = C;
|
||||
C1 = C0+2*ldc;
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off*2*2;
|
||||
ptrbb = bb+off*2*2;
|
||||
#endif
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
res4 = 0;
|
||||
res5 = 0;
|
||||
res6 = 0;
|
||||
res7 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#elif defined(LEFT)
|
||||
temp = off + 2;
|
||||
#else
|
||||
temp = off + 2;
|
||||
#endif
|
||||
for (k=0; k<temp/4; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1+load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3+load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5+load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7+load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0+load10*load11;
|
||||
res1 = res1+load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2+load13*load11;
|
||||
res3 = res3+load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4+load10*load15;
|
||||
res5 = res5+load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6+load13*load15;
|
||||
res7 = res7+load12*load15;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*1+0];
|
||||
load9 = ptrbb[4*1+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*1+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*1+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*1+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*1+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*1+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*1+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
load0 = ptrba[4*2+0];
|
||||
load1 = ptrbb[4*2+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*2+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*2+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*2+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*2+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*2+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*2+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
load8 = ptrba[4*3+0];
|
||||
load9 = ptrbb[4*3+0];
|
||||
res0 = res0+load8*load9;
|
||||
load10 = ptrba[4*3+1];
|
||||
res1 = res1-load10*load9;
|
||||
load11 = ptrbb[4*3+1];
|
||||
res0 = res0-load10*load11;
|
||||
res1 = res1-load8*load11;
|
||||
load12 = ptrba[4*3+2];
|
||||
res2 = res2+load12*load9;
|
||||
load13 = ptrba[4*3+3];
|
||||
res3 = res3-load13*load9;
|
||||
res2 = res2-load13*load11;
|
||||
res3 = res3-load12*load11;
|
||||
load14 = ptrbb[4*3+2];
|
||||
res4 = res4+load8*load14;
|
||||
res5 = res5-load10*load14;
|
||||
load15 = ptrbb[4*3+3];
|
||||
res4 = res4-load10*load15;
|
||||
res5 = res5-load8*load15;
|
||||
res6 = res6+load12*load14;
|
||||
res7 = res7-load13*load14;
|
||||
res6 = res6-load13*load15;
|
||||
res7 = res7-load12*load15;
|
||||
#endif
|
||||
ptrba = ptrba+16;
|
||||
ptrbb = ptrbb+16;
|
||||
}
|
||||
for (k=0; k<(temp&3); k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5+load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7+load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4+load2*load7;
|
||||
res5 = res5+load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6+load5*load7;
|
||||
res7 = res7+load4*load7;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
load6 = ptrbb[4*0+2];
|
||||
res4 = res4+load0*load6;
|
||||
res5 = res5-load2*load6;
|
||||
load7 = ptrbb[4*0+3];
|
||||
res4 = res4-load2*load7;
|
||||
res5 = res5-load0*load7;
|
||||
res6 = res6+load4*load6;
|
||||
res7 = res7-load5*load6;
|
||||
res6 = res6-load5*load7;
|
||||
res7 = res7-load4*load7;
|
||||
#endif
|
||||
ptrba = ptrba+4;
|
||||
ptrbb = ptrbb+4;
|
||||
}
|
||||
load0 = res0*alphar-res1*alphai;
|
||||
load1 = res1*alphar+res0*alphai;
|
||||
C0[0] = load0;
|
||||
C0[1] = load1;
|
||||
|
||||
load2 = res2*alphar-res3*alphai;
|
||||
load3 = res3*alphar+res2*alphai;
|
||||
C0[2] = load2;
|
||||
C0[3] = load3;
|
||||
|
||||
load4 = res4*alphar-res5*alphai;
|
||||
load5 = res5*alphar+res4*alphai;
|
||||
C1[0] = load4;
|
||||
C1[1] = load5;
|
||||
|
||||
load6 = res6*alphar-res7*alphai;
|
||||
load7 = res7*alphar+res6*alphai;
|
||||
C1[2] = load6;
|
||||
C1[3] = load7;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#ifdef LEFT
|
||||
temp -= 2;
|
||||
#else
|
||||
temp -= 2;
|
||||
#endif
|
||||
ptrba += temp*2*2;
|
||||
ptrbb += temp*2*2;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 2;
|
||||
#endif
|
||||
|
||||
C0 = C0+4;
|
||||
C1 = C1+4;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off*2;
|
||||
ptrbb = bb + off*2*2;
|
||||
#endif
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#elif defined(LEFT)
|
||||
temp = off+1;
|
||||
#else
|
||||
temp = off+2;
|
||||
#endif
|
||||
for (k=0; k<temp; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3+load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2-load2*load5;
|
||||
res3 = res3+load0*load5;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3+load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2+load2*load5;
|
||||
res3 = res3-load0*load5;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3-load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2+load2*load5;
|
||||
res3 = res3+load0*load5;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[4*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[4*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrbb[4*0+2];
|
||||
res2 = res2+load0*load4;
|
||||
res3 = res3-load2*load4;
|
||||
load5 = ptrbb[4*0+3];
|
||||
res2 = res2-load2*load5;
|
||||
res3 = res3-load0*load5;
|
||||
#endif
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+4;
|
||||
}
|
||||
load0 = res0*alphar-res1*alphai;
|
||||
load1 = res1*alphar+res0*alphai;
|
||||
C0[0] = load0;
|
||||
C0[1] = load1;
|
||||
|
||||
load2 = res2*alphar-res3*alphai;
|
||||
load3 = res3*alphar+res2*alphai;
|
||||
C1[0] = load2;
|
||||
C1[1] = load3;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#ifdef LEFT
|
||||
temp -= 1;
|
||||
#else
|
||||
temp -= 2;
|
||||
#endif
|
||||
ptrba += temp*2;
|
||||
ptrbb += temp*2*2;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 1;
|
||||
#endif
|
||||
C0 = C0+2;
|
||||
C1 = C1+2;
|
||||
}
|
||||
#if defined(TRMMKERNEL) && !defined(LEFT)
|
||||
off += 2;
|
||||
#endif
|
||||
k = (bk<<2);
|
||||
bb = bb+k;
|
||||
i = (ldc<<2);
|
||||
C = C+i;
|
||||
}
|
||||
for (j=0; j<(bn&1); j+=1)
|
||||
{
|
||||
C0 = C;
|
||||
#if defined(TRMMKERNEL) && defined(LEFT)
|
||||
off = offset;
|
||||
#endif
|
||||
ptrba = ba;
|
||||
for (i=0; i<bm/2; i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off*2*2;
|
||||
ptrbb = bb+off*2;
|
||||
#endif
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
res2 = 0;
|
||||
res3 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#elif defined(LEFT)
|
||||
temp = off + 2;
|
||||
#else
|
||||
temp = off + 1;
|
||||
#endif
|
||||
for (k=0; k<temp; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3+load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2+load5*load3;
|
||||
res3 = res3+load4*load3;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[4*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[4*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
load4 = ptrba[4*0+2];
|
||||
res2 = res2+load4*load1;
|
||||
load5 = ptrba[4*0+3];
|
||||
res3 = res3-load5*load1;
|
||||
res2 = res2-load5*load3;
|
||||
res3 = res3-load4*load3;
|
||||
#endif
|
||||
ptrba = ptrba+4;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
load0 = res0*alphar-res1*alphai;
|
||||
load1 = res1*alphar+res0*alphai;
|
||||
C0[0] = load0;
|
||||
C0[1] = load1;
|
||||
|
||||
load2 = res2*alphar-res3*alphai;
|
||||
load3 = res3*alphar+res2*alphai;
|
||||
C0[2] = load2;
|
||||
C0[3] = load3;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#ifdef LEFT
|
||||
temp -= 2;
|
||||
#else
|
||||
temp -= 1;
|
||||
#endif
|
||||
ptrba += temp*2*2;
|
||||
ptrbb += temp*2;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 2;
|
||||
#endif
|
||||
C0 = C0+4;
|
||||
}
|
||||
for (i=0; i<(bm&1); i+=1)
|
||||
{
|
||||
#if (defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
|
||||
ptrbb = bb;
|
||||
#else
|
||||
ptrba += off*2;
|
||||
ptrbb = bb + off*2;
|
||||
#endif
|
||||
res0 = 0;
|
||||
res1 = 0;
|
||||
#if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
|
||||
temp = bk-off;
|
||||
#elif defined(LEFT)
|
||||
temp = off + 1;
|
||||
#else
|
||||
temp = off + 1;
|
||||
#endif
|
||||
for (k=0; k<temp; k+=1)
|
||||
{
|
||||
#if defined(NN) || defined(NT) || defined(TN) || defined(TT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
#endif
|
||||
#if defined(NR) || defined(NC) || defined(TR) || defined(TC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1+load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
#endif
|
||||
#if defined(RN) || defined(RT) || defined(CN) || defined(CT)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0+load2*load3;
|
||||
res1 = res1+load0*load3;
|
||||
#endif
|
||||
#if defined(RR) || defined(RC) || defined(CR) || defined(CC)
|
||||
load0 = ptrba[2*0+0];
|
||||
load1 = ptrbb[2*0+0];
|
||||
res0 = res0+load0*load1;
|
||||
load2 = ptrba[2*0+1];
|
||||
res1 = res1-load2*load1;
|
||||
load3 = ptrbb[2*0+1];
|
||||
res0 = res0-load2*load3;
|
||||
res1 = res1-load0*load3;
|
||||
#endif
|
||||
ptrba = ptrba+2;
|
||||
ptrbb = ptrbb+2;
|
||||
}
|
||||
load0 = res0*alphar-res1*alphai;
|
||||
load1 = res1*alphar+res0*alphai;
|
||||
C0[0] = load0;
|
||||
C0[1] = load1;
|
||||
#if ( defined(LEFT) && defined(TRANSA)) || \
|
||||
(!defined(LEFT) && !defined(TRANSA))
|
||||
temp = bk - off;
|
||||
#ifdef LEFT
|
||||
temp -= 1;
|
||||
#else
|
||||
temp -= 1;
|
||||
#endif
|
||||
ptrba += temp*2;
|
||||
ptrbb += temp*2;
|
||||
#endif
|
||||
#ifdef LEFT
|
||||
off += 1;
|
||||
#endif
|
||||
C0 = C0+2;
|
||||
}
|
||||
k = (bk<<1);
|
||||
bb = bb+k;
|
||||
i = (ldc<<1);
|
||||
C = C+i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+25
-3
@@ -123,15 +123,37 @@ ifndef DTRSMKERNEL_RT
|
||||
DTRSMKERNEL_RT = trsm_kernel_RT.S
|
||||
endif
|
||||
|
||||
ifndef CTRSMKERNEL_LN
|
||||
CTRSMKERNEL_LN = ztrsm_kernel_LT.S
|
||||
CTRSMKERNEL_LT = ztrsm_kernel_LT.S
|
||||
CTRSMKERNEL_RN = ztrsm_kernel_LT.S
|
||||
CTRSMKERNEL_RT = ztrsm_kernel_RT.S
|
||||
endif
|
||||
|
||||
ifndef CTRSMKERNEL_LT
|
||||
CTRSMKERNEL_LT = ztrsm_kernel_LT.S
|
||||
endif
|
||||
|
||||
ifndef CTRSMKERNEL_RN
|
||||
CTRSMKERNEL_RN = ztrsm_kernel_LT.S
|
||||
endif
|
||||
|
||||
ifndef CTRSMKERNEL_RT
|
||||
CTRSMKERNEL_RT = ztrsm_kernel_RT.S
|
||||
endif
|
||||
|
||||
ifndef ZTRSMKERNEL_LN
|
||||
ZTRSMKERNEL_LN = ztrsm_kernel_LT.S
|
||||
endif
|
||||
|
||||
ifndef ZTRSMKERNEL_LT
|
||||
ZTRSMKERNEL_LT = ztrsm_kernel_LT.S
|
||||
endif
|
||||
|
||||
ifndef ZTRSMKERNEL_RN
|
||||
ZTRSMKERNEL_RN = ztrsm_kernel_LT.S
|
||||
endif
|
||||
|
||||
ifndef ZTRSMKERNEL_RT
|
||||
ZTRSMKERNEL_RT = ztrsm_kernel_RT.S
|
||||
endif
|
||||
|
||||
CGEMM3MKERNEL = zgemm3m_kernel.S
|
||||
ZGEMM3MKERNEL = zgemm3m_kernel.S
|
||||
|
||||
@@ -1,18 +1,48 @@
|
||||
SAXPYKERNEL=axpy_loongson3a.S
|
||||
DAXPYKERNEL=daxpy_loongson3a_simd.S
|
||||
|
||||
SGEMMKERNEL = sgemm_kernel_loongson3a.S
|
||||
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
SGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
SGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
DGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
DGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
CGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
CGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
ZGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
ZGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
|
||||
|
||||
SGEMMKERNEL = sgemm_kernel_8x4_ps.S
|
||||
SGEMMINCOPY = ../generic/gemm_ncopy_8.c
|
||||
SGEMMITCOPY = ../generic/gemm_tcopy_8.c
|
||||
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
SGEMMINCOPYOBJ = sgemm_incopy.o
|
||||
SGEMMITCOPYOBJ = sgemm_itcopy.o
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy.o
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy.o
|
||||
|
||||
DGEMMKERNEL = gemm_kernel_loongson3a.S
|
||||
DGEMMKERNEL = dgemm_kernel_loongson3a_4x4.S
|
||||
DGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
DGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy.o
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy.o
|
||||
|
||||
CGEMMKERNEL = cgemm_kernel_loongson3a_4x2_ps.S
|
||||
CGEMMINCOPY = ../generic/zgemm_ncopy_4.c
|
||||
CGEMMITCOPY = ../generic/zgemm_tcopy_4.c
|
||||
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
CGEMMINCOPYOBJ = cgemm_incopy.o
|
||||
CGEMMITCOPYOBJ = cgemm_itcopy.o
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy.o
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy.o
|
||||
|
||||
ZGEMMKERNEL = zgemm_kernel_loongson3a_2x2.S
|
||||
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy.o
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy.o
|
||||
|
||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
STRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
@@ -22,3 +52,17 @@ DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
DTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
DTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
CTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
CTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
ZTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
SAXPYKERNEL=axpy_loongson3a.S
|
||||
DAXPYKERNEL=daxpy_loongson3a_simd.S
|
||||
|
||||
SGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
SGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
DGEMVNKERNEL = gemv_n_loongson3a.c
|
||||
DGEMVTKERNEL = gemv_t_loongson3a.c
|
||||
CGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
CGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
ZGEMVNKERNEL = zgemv_n_loongson3a.c
|
||||
ZGEMVTKERNEL = zgemv_t_loongson3a.c
|
||||
|
||||
STRMMKERNEL = ../generic/trmmkernel_2x2.c
|
||||
DTRMMKERNEL = ../generic/trmmkernel_2x2.c
|
||||
CTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
|
||||
ZTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
|
||||
|
||||
SGEMMKERNEL = ../generic/gemmkernel_2x2.c
|
||||
SGEMMONCOPY = ../generic/gemm_ncopy_2.c
|
||||
SGEMMOTCOPY = ../generic/gemm_tcopy_2.c
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy.o
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy.o
|
||||
|
||||
DGEMMKERNEL = ../generic/gemmkernel_2x2.c
|
||||
DGEMMONCOPY = ../generic/gemm_ncopy_2.c
|
||||
DGEMMOTCOPY = ../generic/gemm_tcopy_2.c
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy.o
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy.o
|
||||
|
||||
CGEMMKERNEL = ../generic/zgemmkernel_2x2.c
|
||||
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy.o
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy.o
|
||||
|
||||
ZGEMMKERNEL = ../generic/zgemmkernel_2x2.c
|
||||
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy.o
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy.o
|
||||
|
||||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
STRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
STRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
DTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
DTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
CTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
CTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
ZTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
|
||||
ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c
|
||||
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c
|
||||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,101 @@
|
||||
#include "common.h"
|
||||
|
||||
//These are auto-tuning codes on Loongson-3A platform.
|
||||
|
||||
//#define prefetch(x) __builtin_prefetch(x)
|
||||
//#define prefetch(x) do {_mm_prefetch((char *)(x), _MM_HINT_T0);} while(0)
|
||||
#define prefetch(x) __asm__ __volatile__("ld $0, %0"::"m"(x))
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
|
||||
#define spec_loop_alpha1 do {Y[i] += A[LDA * j + i] * X[k]; i++;} while(0)
|
||||
#define spec_loop do {Y[i] += ALPHA * A[LDA * j + i] * X[k]; i++;} while(0)
|
||||
#define norm_loop_alpha1 do {Y[h] += A[LDA * j + i] * X[k]; i++; h += INCY;} while(0)
|
||||
#define norm_loop do {Y[h] += ALPHA * A[LDA * j + i] * X[k]; i++; h += INCY;} while(0)
|
||||
|
||||
int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLONG LDA, FLOAT *X, BLASLONG INCX, FLOAT *Y, BLASLONG INCY, FLOAT *BUFFER)
|
||||
{
|
||||
|
||||
BLASLONG kx=0, ky=0;
|
||||
if(!ALPHA)
|
||||
return 0;
|
||||
|
||||
//if(INCX < 0)
|
||||
// kx = (1-N) * INCX;
|
||||
// INCX = -INCX;
|
||||
//if(INCY < 0)
|
||||
// ky = (1-M) * INCY;
|
||||
// INCY = -INCY;
|
||||
|
||||
BLASLONG fahead = 30;
|
||||
BLASLONG spec_unroll = 4;
|
||||
BLASLONG tMQ = M - M % spec_unroll;
|
||||
BLASLONG j = 0, k = 0;
|
||||
|
||||
if(ALPHA == 1) {
|
||||
if(INCY == 1) {
|
||||
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||
BLASLONG i = 0;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(Y[i + fahead]);
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
spec_loop_alpha1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||
BLASLONG i = 0, h = ky;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(Y[h + fahead]);
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
norm_loop_alpha1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(INCY == 1) {
|
||||
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||
BLASLONG i = 0;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(Y[i + fahead]);
|
||||
/*loop_mark*/ spec_loop;
|
||||
/*loop_mark*/ spec_loop;
|
||||
/*loop_mark*/ spec_loop;
|
||||
/*loop_mark*/ spec_loop;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
spec_loop;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(k=kx; likely(j < N); j++, k += INCX) {
|
||||
BLASLONG i = 0, h = ky;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(Y[h + fahead]);
|
||||
/*loop_mark*/ norm_loop;
|
||||
/*loop_mark*/ norm_loop;
|
||||
/*loop_mark*/ norm_loop;
|
||||
/*loop_mark*/ norm_loop;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
norm_loop;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
#include "common.h"
|
||||
|
||||
//These are auto-tuning codes on Loongson-3A platform.
|
||||
|
||||
//#define prefetch(x) __builtin_prefetch(x)
|
||||
//#define prefetch(x) do {_mm_prefetch((char *)(x), _MM_HINT_T0);} while(0)
|
||||
#define prefetch(x) __asm__ __volatile__("ld $0, %0"::"m"(x))
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
|
||||
#define spec_loop_alpha1 do {Y[k] += A[LDA * j + i] * X[i]; i++;} while(0)
|
||||
#define spec_loop do {Y[k] += ALPHA * A[LDA * j + i] * X[i]; i++;} while(0)
|
||||
#define norm_loop_alpha1 do {Y[k] += A[LDA * j + i] * X[h]; i++; h += INCX;} while(0)
|
||||
#define norm_loop do {Y[k] += ALPHA * A[LDA * j + i] * X[h]; i++; h += INCX;} while(0)
|
||||
|
||||
int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLONG LDA, FLOAT *X, BLASLONG INCX, FLOAT *Y, BLASLONG INCY, FLOAT *BUFFER) {
|
||||
|
||||
if(!ALPHA)
|
||||
return 0;
|
||||
|
||||
// if(INCX < 0)
|
||||
// INCX = -INCX;
|
||||
// if(INCY < 0)
|
||||
// INCY = -INCY;
|
||||
|
||||
BLASLONG fahead = 30;
|
||||
BLASLONG spec_unroll = 3;
|
||||
BLASLONG tMQ = M - M % spec_unroll;
|
||||
BLASLONG j = 0, k = 0;
|
||||
|
||||
if(ALPHA == 1) {
|
||||
if(INCX == 1) {
|
||||
for(; likely(j < N); j++, k += INCY) {
|
||||
BLASLONG i = 0;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(X[i + fahead]);
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
spec_loop_alpha1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(; likely(j < N); j++, k += INCY) {
|
||||
BLASLONG i = 0, h = 0;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(X[h + fahead]);
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
norm_loop_alpha1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(INCX == 1) {
|
||||
for(; likely(j < N); j++, k += INCY) {
|
||||
BLASLONG i = 0;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(X[i + fahead]);
|
||||
/*loop_mark*/ spec_loop;
|
||||
/*loop_mark*/ spec_loop;
|
||||
/*loop_mark*/ spec_loop;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
spec_loop;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(; likely(j < N); j++, k += INCY) {
|
||||
BLASLONG i = 0, h = 0;
|
||||
for(; likely(i < tMQ);) {
|
||||
prefetch(A[LDA * j + i + fahead]);
|
||||
prefetch(X[h + fahead]);
|
||||
/*loop_mark*/ norm_loop;
|
||||
/*loop_mark*/ norm_loop;
|
||||
/*loop_mark*/ norm_loop;
|
||||
}
|
||||
for(; likely(i < M);) {
|
||||
norm_loop;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,139 @@
|
||||
#include "common.h"
|
||||
|
||||
//typedef int BLASLONG;
|
||||
//typedef double FLOAT;
|
||||
|
||||
#define prefetch(x) __asm__ __volatile__("ld $0, %0"::"m"(x))
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
|
||||
#if !defined(CONJ) && !defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_0
|
||||
#define spec_loop spec_loop_0
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_0
|
||||
#define norm_loop norm_loop_0
|
||||
#endif
|
||||
|
||||
#if defined(CONJ) && !defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_1
|
||||
#define spec_loop spec_loop_1
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_1
|
||||
#define norm_loop norm_loop_1
|
||||
#endif
|
||||
|
||||
#if !defined(CONJ) && defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_2
|
||||
#define spec_loop spec_loop_2
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_2
|
||||
#define norm_loop norm_loop_2
|
||||
#endif
|
||||
|
||||
#if defined(CONJ) && defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_3
|
||||
#define spec_loop spec_loop_3
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_3
|
||||
#define norm_loop norm_loop_3
|
||||
#endif
|
||||
|
||||
#define spec_loop_alpha1_0 do {Y[ii] += A[jj + ii] * X[k]; Y[ii + 1] += A[jj + ii + 1] * X[k]; Y[ii + 1] += A[jj + ii] * X[k + 1]; Y[ii] -= A[jj + ii + 1] * X[k + 1]; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_alpha1_1 do {Y[ii] += A[jj + ii] * X[k]; Y[ii + 1] -= A[jj + ii + 1] * X[k]; Y[ii + 1] += A[jj + ii] * X[k + 1]; Y[ii] += A[jj + ii + 1] * X[k + 1]; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_alpha1_2 do {Y[ii] += A[jj + ii] * X[k]; Y[ii + 1] += A[jj + ii + 1] * X[k]; Y[ii + 1] -= A[jj + ii] * X[k + 1]; Y[ii] += A[jj + ii + 1] * X[k + 1]; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_alpha1_3 do {Y[ii] += A[jj + ii] * X[k]; Y[ii + 1] -= A[jj + ii + 1] * X[k]; Y[ii + 1] -= A[jj + ii] * X[k + 1]; Y[ii] -= A[jj + ii + 1] * X[k + 1]; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_0 do {rTmp = A[jj + ii] * X[k] - A[jj + ii + 1] * X[k + 1]; iTmp = A[jj + ii] * X[k + 1] + A[jj + ii + 1] * X[k]; Y[ii] += rTmp * rALPHA - iTmp * iALPHA; Y[ii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_1 do {rTmp = A[jj + ii] * X[k] + A[jj + ii + 1] * X[k + 1]; iTmp = A[jj + ii] * X[k + 1] - A[jj + ii + 1] * X[k]; Y[ii] += rTmp * rALPHA - iTmp * iALPHA; Y[ii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_2 do {rTmp = A[jj + ii] * X[k] + A[jj + ii + 1] * X[k + 1]; iTmp = -A[jj + ii] * X[k + 1] + A[jj + ii + 1] * X[k]; Y[ii] += rTmp * rALPHA - iTmp * iALPHA; Y[ii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_3 do {rTmp = A[jj + ii] * X[k] - A[jj + ii + 1] * X[k + 1]; iTmp = -A[jj + ii] * X[k + 1] - A[jj + ii + 1] * X[k]; Y[ii] += rTmp * rALPHA - iTmp * iALPHA; Y[ii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
|
||||
#define norm_loop_alpha1_0 do {Y[iii] += A[jj + ii] * X[k] - A[jj + ii + 1] * X[k + 1]; Y[iii + 1] += A[jj + ii] * X[k + 1] + A[jj + ii + 1] * X[k]; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
#define norm_loop_alpha1_1 do {Y[iii] += A[jj + ii] * X[k] + A[jj + ii + 1] * X[k + 1]; Y[iii + 1] += A[jj + ii] * X[k + 1] - A[jj + ii + 1] * X[k]; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
#define norm_loop_alpha1_2 do {Y[iii] += A[jj + ii] * X[k] + A[jj + ii + 1] * X[k + 1]; Y[iii + 1] += -A[jj + ii] * X[k + 1] + A[jj + ii + 1] * X[k]; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
#define norm_loop_alpha1_3 do {Y[iii] += A[jj + ii] * X[k] - A[jj + ii + 1] * X[k + 1]; Y[iii + 1] += -A[jj + ii] * X[k + 1] - A[jj + ii + 1] * X[k]; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
#define norm_loop_0 do {rTmp = A[jj + ii] * X[k] - A[jj + ii + 1] * X[k + 1]; iTmp = A[jj + ii] * X[k + 1] + A[jj + ii + 1] * X[k]; Y[iii] += rTmp * rALPHA - iTmp * iALPHA; Y[iii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
#define norm_loop_1 do {rTmp = A[jj + ii] * X[k] + A[jj + ii + 1] * X[k + 1]; iTmp = A[jj + ii] * X[k + 1] - A[jj + ii + 1] * X[k]; Y[iii] += rTmp * rALPHA - iTmp * iALPHA; Y[iii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
#define norm_loop_2 do {rTmp = A[jj + ii] * X[k] + A[jj + ii + 1] * X[k + 1]; iTmp = -A[jj + ii] * X[k + 1] + A[jj + ii + 1] * X[k]; Y[iii] += rTmp * rALPHA - iTmp * iALPHA; Y[iii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
#define norm_loop_3 do {rTmp = A[jj + ii] * X[k] - A[jj + ii + 1] * X[k + 1]; iTmp = -A[jj + ii] * X[k + 1] - A[jj + ii + 1] * X[k]; Y[iii] += rTmp * rALPHA - iTmp * iALPHA; Y[iii + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCY * 2;} while(0)
|
||||
|
||||
int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT rALPHA, FLOAT iALPHA, FLOAT *A, BLASLONG LDA, FLOAT *X, BLASLONG INCX, FLOAT *Y, BLASLONG INCY, FLOAT *BUFFER) {
|
||||
|
||||
if(!rALPHA && iALPHA)
|
||||
return 0;
|
||||
|
||||
BLASLONG fahead = 60;
|
||||
BLASLONG spec_unroll = 2;
|
||||
BLASLONG tMQ = M - M % spec_unroll;
|
||||
BLASLONG j = 0, k = 0, jj = 0;
|
||||
|
||||
if(rALPHA == 1 && iALPHA == 0) {
|
||||
if(INCY == 1) {
|
||||
for(; likely(j < N); j++, k += INCX * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(Y[ii + fahead]);
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
spec_loop_alpha1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(; likely(j < N); j++, k += INCX * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0, iii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(Y[iii + fahead]);
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
norm_loop_alpha1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FLOAT rTmp, iTmp;
|
||||
if(INCY == 1) {
|
||||
for(; likely(j < N); j++, k += INCX * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(Y[ii + fahead]);
|
||||
/*loop_mark*/ spec_loop;
|
||||
/*loop_mark*/ spec_loop;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
spec_loop;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(; likely(j < N); j++, k += INCX * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0, iii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(Y[iii + fahead]);
|
||||
/*loop_mark*/ norm_loop;
|
||||
/*loop_mark*/ norm_loop;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
norm_loop;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
#include "common.h"
|
||||
|
||||
#define prefetch(x) __asm__ __volatile__("ld $0, %0"::"m"(x))
|
||||
#define likely(x) __builtin_expect(!!(x), 1)
|
||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||
|
||||
#if !defined(CONJ) && !defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_0
|
||||
#define spec_loop spec_loop_0
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_0
|
||||
#define norm_loop norm_loop_0
|
||||
#endif
|
||||
|
||||
#if defined(CONJ) && !defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_1
|
||||
#define spec_loop spec_loop_1
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_1
|
||||
#define norm_loop norm_loop_1
|
||||
#endif
|
||||
|
||||
#if !defined(CONJ) && defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_2
|
||||
#define spec_loop spec_loop_2
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_2
|
||||
#define norm_loop norm_loop_2
|
||||
#endif
|
||||
|
||||
#if defined(CONJ) && defined(XCONJ)
|
||||
#define spec_loop_alpha1 spec_loop_alpha1_3
|
||||
#define spec_loop spec_loop_3
|
||||
#define norm_loop_alpha1 norm_loop_alpha1_3
|
||||
#define norm_loop norm_loop_3
|
||||
#endif
|
||||
|
||||
|
||||
#define spec_loop_alpha1_0 do {Y[k] += A[jj + ii] * X[ii]; Y[k + 1] += A[jj + ii + 1] * X[ii]; Y[k + 1] += A[jj + ii] * X[ii + 1]; Y[k] -= A[jj + ii + 1] * X[ii + 1]; ii += 2;} while(0)
|
||||
#define spec_loop_alpha1_1 do {Y[k] += A[jj + ii] * X[ii]; Y[k + 1] -= A[jj + ii + 1] * X[ii]; Y[k + 1] += A[jj + ii] * X[ii + 1]; Y[k] += A[jj + ii + 1] * X[ii + 1]; ii += 2;} while(0)
|
||||
#define spec_loop_alpha1_2 do {Y[k] += A[jj + ii] * X[ii]; Y[k + 1] += A[jj + ii + 1] * X[ii]; Y[k + 1] -= A[jj + ii] * X[ii + 1]; Y[k] += A[jj + ii + 1] * X[ii + 1]; ii += 2;} while(0)
|
||||
#define spec_loop_alpha1_3 do {Y[k] += A[jj + ii] * X[ii]; Y[k + 1] -= A[jj + ii + 1] * X[ii]; Y[k + 1] -= A[jj + ii] * X[ii + 1]; Y[k] -= A[jj + ii + 1] * X[ii + 1]; ii += 2;} while(0)
|
||||
|
||||
#define spec_loop_0 do {rTmp = A[jj + ii] * X[ii] - A[jj + ii + 1] * X[ii + 1]; iTmp = A[jj + ii] * X[ii + 1] + A[jj + ii + 1] * X[ii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
#define spec_loop_1 do {rTmp = A[jj + ii] * X[ii] + A[jj + ii + 1] * X[ii + 1]; iTmp = A[jj + ii] * X[ii + 1] - A[jj + ii + 1] * X[ii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
#define spec_loop_2 do {rTmp = A[jj + ii] * X[ii] + A[jj + ii + 1] * X[ii + 1]; iTmp = -A[jj + ii] * X[ii + 1] + A[jj + ii + 1] * X[ii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
#define spec_loop_3 do {rTmp = A[jj + ii] * X[ii] - A[jj + ii + 1] * X[ii + 1]; iTmp = -A[jj + ii] * X[ii + 1] - A[jj + ii + 1] * X[ii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2;} while(0)
|
||||
|
||||
#define norm_loop_alpha1_0 do {Y[k] += A[jj + ii] * X[iii] - A[jj + ii + 1] * X[iii + 1]; Y[k + 1] += A[jj + ii] * X[iii + 1] + A[jj + ii + 1] * X[iii]; ii += 2; iii += INCX * 2;} while(0)
|
||||
#define norm_loop_alpha1_1 do {Y[k] += A[jj + ii] * X[iii] + A[jj + ii + 1] * X[iii + 1]; Y[k + 1] += A[jj + ii] * X[iii + 1] - A[jj + ii + 1] * X[iii]; ii += 2; iii += INCX * 2;} while(0)
|
||||
#define norm_loop_alpha1_2 do {Y[k] += A[jj + ii] * X[iii] + A[jj + ii + 1] * X[iii + 1]; Y[k + 1] += -A[jj + ii] * X[iii + 1] + A[jj + ii + 1] * X[iii]; ii += 2; iii += INCX * 2;} while(0)
|
||||
#define norm_loop_alpha1_3 do {Y[k] += A[jj + ii] * X[iii] - A[jj + ii + 1] * X[iii + 1]; Y[k + 1] += -A[jj + ii] * X[iii + 1] - A[jj + ii + 1] * X[iii]; ii += 2; iii += INCX * 2;} while(0)
|
||||
|
||||
#define norm_loop_0 do {rTmp = A[jj + ii] * X[iii] - A[jj + ii + 1] * X[iii + 1]; iTmp = A[jj + ii] * X[iii + 1] + A[jj + ii + 1] * X[iii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCX * 2;} while(0)
|
||||
#define norm_loop_1 do {rTmp = A[jj + ii] * X[iii] + A[jj + ii + 1] * X[iii + 1]; iTmp = A[jj + ii] * X[iii + 1] - A[jj + ii + 1] * X[iii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCX * 2;} while(0)
|
||||
#define norm_loop_2 do {rTmp = A[jj + ii] * X[iii] + A[jj + ii + 1] * X[iii + 1]; iTmp = -A[jj + ii] * X[iii + 1] + A[jj + ii + 1] * X[iii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCX * 2;} while(0)
|
||||
#define norm_loop_3 do {rTmp = A[jj + ii] * X[iii] - A[jj + ii + 1] * X[iii + 1]; iTmp = -A[jj + ii] * X[iii + 1] - A[jj + ii + 1] * X[iii]; Y[k] += rTmp * rALPHA - iTmp * iALPHA; Y[k + 1] += rTmp * iALPHA + iTmp * rALPHA; ii += 2; iii += INCX * 2;} while(0)
|
||||
|
||||
int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT rALPHA, FLOAT iALPHA, FLOAT *A, BLASLONG LDA, FLOAT *X, BLASLONG INCX, FLOAT *Y, BLASLONG INCY, FLOAT *BUFFER) {
|
||||
|
||||
if(!rALPHA && iALPHA)
|
||||
return 0;
|
||||
|
||||
BLASLONG fahead = 30;
|
||||
BLASLONG spec_unroll = 2;
|
||||
BLASLONG tMQ = M - M % spec_unroll;
|
||||
BLASLONG j = 0, k = 0, jj = 0;
|
||||
|
||||
if(rALPHA == 1 && iALPHA == 0) {
|
||||
if(INCX == 1) {
|
||||
for(; likely(j < N); j++, k += INCY * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(X[ii + fahead]);
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
/*loop_mark*/ spec_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
spec_loop_alpha1;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(; likely(j < N); j++, k += INCY * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0, iii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(X[iii + fahead]);
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
/*loop_mark*/ norm_loop_alpha1;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
norm_loop_alpha1;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FLOAT rTmp, iTmp;
|
||||
if(INCX == 1) {
|
||||
for(; likely(j < N); j++, k += INCY * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(X[ii + fahead]);
|
||||
/*loop_mark*/ spec_loop;
|
||||
/*loop_mark*/ spec_loop;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
spec_loop;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(; likely(j < N); j++, k += INCY * 2, jj += LDA * 2) {
|
||||
BLASLONG i = 0, ii = 0, iii = 0;
|
||||
for(; likely(i < tMQ); i += spec_unroll) {
|
||||
prefetch(A[jj + ii + fahead]);
|
||||
prefetch(X[iii + fahead]);
|
||||
/*loop_mark*/ norm_loop;
|
||||
/*loop_mark*/ norm_loop;
|
||||
}
|
||||
for(; likely(i < M); i++) {
|
||||
norm_loop;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -746,6 +746,22 @@ static void init_parameter(void) {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef SANDYBRIDGE
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Sandybridge\n");
|
||||
#endif
|
||||
|
||||
TABLE_NAME.sgemm_p = SGEMM_DEFAULT_P;
|
||||
TABLE_NAME.dgemm_p = DGEMM_DEFAULT_P;
|
||||
TABLE_NAME.cgemm_p = CGEMM_DEFAULT_P;
|
||||
TABLE_NAME.zgemm_p = ZGEMM_DEFAULT_P;
|
||||
#ifdef EXPRECISION
|
||||
TABLE_NAME.qgemm_p = QGEMM_DEFAULT_P;
|
||||
TABLE_NAME.xgemm_p = XGEMM_DEFAULT_P;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef OPTERON
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -778,6 +794,22 @@ static void init_parameter(void) {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef BOBCAT
|
||||
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "Bobcate\n");
|
||||
#endif
|
||||
|
||||
TABLE_NAME.sgemm_p = SGEMM_DEFAULT_P;
|
||||
TABLE_NAME.dgemm_p = DGEMM_DEFAULT_P;
|
||||
TABLE_NAME.cgemm_p = CGEMM_DEFAULT_P;
|
||||
TABLE_NAME.zgemm_p = ZGEMM_DEFAULT_P;
|
||||
#ifdef EXPRECISION
|
||||
TABLE_NAME.qgemm_p = QGEMM_DEFAULT_P;
|
||||
TABLE_NAME.xgemm_p = XGEMM_DEFAULT_P;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef NANO
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
@@ -239,6 +239,22 @@ ifndef ZSWAPKERNEL
|
||||
ZSWAPKERNEL = zswap_sse2.S
|
||||
endif
|
||||
|
||||
ifndef DGEMVNKERNEL
|
||||
DGEMVNKERNEL = gemv_n_sse2.S
|
||||
endif
|
||||
|
||||
ifndef DGEMVTKERNEL
|
||||
DGEMVTKERNEL = gemv_t_sse2.S
|
||||
endif
|
||||
|
||||
ifndef ZGEMVNKERNEL
|
||||
ZGEMVNKERNEL = zgemv_n_sse2.S
|
||||
endif
|
||||
|
||||
ifndef ZGEMVTKERNEL
|
||||
ZGEMVTKERNEL = zgemv_t_sse2.S
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
SGEMMKERNEL = gemm_kernel_4x4_barcelona.S
|
||||
SGEMMINCOPY =
|
||||
SGEMMITCOPY =
|
||||
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
SGEMMINCOPYOBJ =
|
||||
SGEMMITCOPYOBJ =
|
||||
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMKERNEL = gemm_kernel_2x4_barcelona.S
|
||||
DGEMMINCOPY = ../generic/gemm_ncopy_2.c
|
||||
DGEMMITCOPY = ../generic/gemm_tcopy_2.c
|
||||
DGEMMONCOPY = ../generic/gemm_ncopy_4.c
|
||||
DGEMMOTCOPY = ../generic/gemm_tcopy_4.c
|
||||
DGEMMINCOPYOBJ = dgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMITCOPYOBJ = dgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMKERNEL = zgemm_kernel_2x2_barcelona.S
|
||||
CGEMMINCOPY =
|
||||
CGEMMITCOPY =
|
||||
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
CGEMMINCOPYOBJ =
|
||||
CGEMMITCOPYOBJ =
|
||||
CGEMMONCOPYOBJ = cgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
CGEMMOTCOPYOBJ = cgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMKERNEL = zgemm_kernel_1x2_barcelona.S
|
||||
ZGEMMINCOPY = ../generic/zgemm_ncopy_1.c
|
||||
ZGEMMITCOPY = ../generic/zgemm_tcopy_1.c
|
||||
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
|
||||
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
|
||||
ZGEMMINCOPYOBJ = zgemm_incopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMITCOPYOBJ = zgemm_itcopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMONCOPYOBJ = zgemm_oncopy$(TSUFFIX).$(SUFFIX)
|
||||
ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
|
||||
|
||||
STRSMKERNEL_LN = trsm_kernel_LN_4x4_sse.S
|
||||
STRSMKERNEL_LT = trsm_kernel_LT_4x4_sse.S
|
||||
STRSMKERNEL_RN = trsm_kernel_LT_4x4_sse.S
|
||||
STRSMKERNEL_RT = trsm_kernel_RT_4x4_sse.S
|
||||
|
||||
DTRSMKERNEL_LN = trsm_kernel_LN_2x4_sse2.S
|
||||
DTRSMKERNEL_LT = trsm_kernel_LT_2x4_sse2.S
|
||||
DTRSMKERNEL_RN = trsm_kernel_LT_2x4_sse2.S
|
||||
DTRSMKERNEL_RT = trsm_kernel_RT_2x4_sse2.S
|
||||
|
||||
CTRSMKERNEL_LN = ztrsm_kernel_LN_2x2_sse.S
|
||||
CTRSMKERNEL_LT = ztrsm_kernel_LT_2x2_sse.S
|
||||
CTRSMKERNEL_RN = ztrsm_kernel_LT_2x2_sse.S
|
||||
CTRSMKERNEL_RT = ztrsm_kernel_RT_2x2_sse.S
|
||||
|
||||
ZTRSMKERNEL_LN = ztrsm_kernel_LT_1x2_sse2.S
|
||||
ZTRSMKERNEL_LT = ztrsm_kernel_LT_1x2_sse2.S
|
||||
ZTRSMKERNEL_RN = ztrsm_kernel_LT_1x2_sse2.S
|
||||
ZTRSMKERNEL_RT = ztrsm_kernel_RT_1x2_sse2.S
|
||||
|
||||
CGEMM3MKERNEL = zgemm3m_kernel_4x4_barcelona.S
|
||||
ZGEMM3MKERNEL = zgemm3m_kernel_2x4_barcelona.S
|
||||
@@ -0,0 +1 @@
|
||||
include $(KERNELDIR)/KERNEL.PENRYN
|
||||
@@ -495,7 +495,6 @@
|
||||
ALIGN_4
|
||||
|
||||
.L999:
|
||||
RESTOREREGISTERS
|
||||
|
||||
subl $8, %esp
|
||||
movss %xmm0, (%esp)
|
||||
|
||||
@@ -76,6 +76,12 @@
|
||||
#define PREFETCHB prefetcht0
|
||||
#endif
|
||||
|
||||
#ifdef SANDYBRIDGE
|
||||
#define PREFETCHSIZE (8 * 1 - 4)
|
||||
#define PREFETCHW prefetcht0
|
||||
#define PREFETCHB prefetcht0
|
||||
#endif
|
||||
|
||||
#ifndef PREFETCH
|
||||
#define PREFETCH prefetcht0
|
||||
#endif
|
||||
|
||||
@@ -69,6 +69,12 @@
|
||||
#define PREFETCHB prefetcht0
|
||||
#endif
|
||||
|
||||
#ifdef SANDYBRIDGE
|
||||
#define PREFETCHSIZE (16 * 1 - 8)
|
||||
#define PREFETCHW prefetcht0
|
||||
#define PREFETCHB prefetcht0
|
||||
#endif
|
||||
|
||||
#ifndef PREFETCH
|
||||
#define PREFETCH prefetcht0
|
||||
#endif
|
||||
@@ -262,7 +268,7 @@
|
||||
movaps -16 * SIZE(AA), %xmm0
|
||||
|
||||
addps %xmm2, %xmm7
|
||||
#ifndef NEHALEM
|
||||
#if !(defined(NEHALEM) || defined(SANDYBRIDGE))
|
||||
PREFETCH (PREFETCHSIZE + 16) * SIZE(AA)
|
||||
#endif
|
||||
pshufd $0x93, %xmm1, %xmm2
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
#define PREFETCHSIZE (16 * 4)
|
||||
#endif
|
||||
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM)
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHW prefetcht0
|
||||
#define PREFETCHSIZE (16 * 7)
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
#define PREFETCHSIZE (8 * 2)
|
||||
#endif
|
||||
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM)
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHW prefetcht0
|
||||
#define PREFETCHSIZE (8 * 7)
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
#define PREFETCHSIZE (16 * 4)
|
||||
#endif
|
||||
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM)
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHW prefetcht0
|
||||
#define PREFETCHSIZE (16 * 7)
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
#define PREFETCHSIZE (8 * 2)
|
||||
#endif
|
||||
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM)
|
||||
#if defined(CORE2) || defined(PENRYN) || defined(DUNNINGTON) || defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHW prefetcht0
|
||||
#define PREFETCHSIZE (8 * 7)
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
xorps %xmm1, %xmm1
|
||||
comisd %xmm0, %xmm1
|
||||
jne .L100 # Alpha != ZERO
|
||||
|
||||
jp .L100 # For Alpha = NaN
|
||||
|
||||
/* Alpha == ZERO */
|
||||
cmpl $SIZE, INCX
|
||||
jne .L50
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
#ifdef NEHALEM
|
||||
#if defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
#define STACK_ALIGN 4096
|
||||
#define STACK_OFFSET 1024
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
#define PREFETCH prefetch
|
||||
#define PREFETCHSIZE (8 * 10 + 4)
|
||||
#endif
|
||||
@@ -439,7 +439,7 @@
|
||||
.L22:
|
||||
mulsd %xmm0, %xmm2
|
||||
addsd %xmm2, %xmm4
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
PREFETCH (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movlpd 2 * SIZE(BB), %xmm2
|
||||
@@ -488,7 +488,7 @@
|
||||
movlpd 40 * SIZE(BB), %xmm3
|
||||
addsd %xmm0, %xmm7
|
||||
movlpd 8 * SIZE(AA), %xmm0
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
PREFETCH (PREFETCHSIZE + 8) * SIZE(AA)
|
||||
#endif
|
||||
mulsd %xmm1, %xmm2
|
||||
@@ -1697,7 +1697,7 @@
|
||||
|
||||
.L42:
|
||||
mulpd %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
mulpd 2 * SIZE(BB), %xmm0
|
||||
@@ -1727,7 +1727,7 @@
|
||||
addpd %xmm0, %xmm7
|
||||
movapd 16 * SIZE(AA), %xmm0
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 8) * SIZE(AA)
|
||||
#endif
|
||||
mulpd %xmm1, %xmm2
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
#ifdef NEHALEM
|
||||
#if defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
#define BORIG 60(%esp)
|
||||
#define BUFFER 128(%esp)
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
#define PREFETCH prefetch
|
||||
#define PREFETCHW prefetchw
|
||||
#define PREFETCHSIZE (16 * 10 + 8)
|
||||
@@ -437,7 +437,7 @@
|
||||
.L32:
|
||||
mulss %xmm0, %xmm2
|
||||
addss %xmm2, %xmm4
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movss 4 * SIZE(BB), %xmm2
|
||||
@@ -833,7 +833,7 @@
|
||||
.L22:
|
||||
mulps %xmm0, %xmm2
|
||||
addps %xmm2, %xmm4
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movaps 4 * SIZE(BB), %xmm2
|
||||
@@ -1848,7 +1848,7 @@
|
||||
|
||||
.L72:
|
||||
mulss %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
mulss 4 * SIZE(BB), %xmm0
|
||||
@@ -2109,7 +2109,7 @@
|
||||
ALIGN_4
|
||||
|
||||
.L62:
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
|
||||
@@ -2429,7 +2429,7 @@
|
||||
|
||||
.L52:
|
||||
mulps %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
mulps 4 * SIZE(BB), %xmm0
|
||||
@@ -2459,7 +2459,7 @@
|
||||
addps %xmm0, %xmm5
|
||||
movaps 32 * SIZE(AA), %xmm0
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 16) * SIZE(AA)
|
||||
#endif
|
||||
mulps %xmm1, %xmm2
|
||||
@@ -2952,7 +2952,7 @@
|
||||
|
||||
.L112:
|
||||
mulss %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movss 1 * SIZE(AA), %xmm0
|
||||
@@ -3148,7 +3148,7 @@
|
||||
|
||||
.L102:
|
||||
mulps %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movsd 2 * SIZE(AA), %xmm0
|
||||
@@ -3389,7 +3389,7 @@
|
||||
|
||||
.L92:
|
||||
mulps %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movaps 4 * SIZE(AA), %xmm0
|
||||
@@ -3404,7 +3404,7 @@
|
||||
mulps 12 * SIZE(BB), %xmm0
|
||||
addps %xmm0, %xmm7
|
||||
movaps 32 * SIZE(AA), %xmm0
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 16) * SIZE(AA)
|
||||
#endif
|
||||
mulps %xmm1, %xmm3
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
#ifdef NEHALEM
|
||||
#if defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
#define STACK_ALIGN 4096
|
||||
#define STACK_OFFSET 1024
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
#define PREFETCH prefetch
|
||||
#define PREFETCHSIZE (8 * 10 + 4)
|
||||
#endif
|
||||
@@ -910,7 +910,7 @@
|
||||
.L22:
|
||||
mulsd %xmm0, %xmm2
|
||||
addsd %xmm2, %xmm4
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
PREFETCH (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movlpd 2 * SIZE(BB), %xmm2
|
||||
@@ -959,7 +959,7 @@
|
||||
movlpd 40 * SIZE(BB), %xmm3
|
||||
addsd %xmm0, %xmm7
|
||||
movlpd 8 * SIZE(AA), %xmm0
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
PREFETCH (PREFETCHSIZE + 8) * SIZE(AA)
|
||||
#endif
|
||||
mulsd %xmm1, %xmm2
|
||||
@@ -1439,7 +1439,7 @@
|
||||
|
||||
.L42:
|
||||
mulpd %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
mulpd 2 * SIZE(BB), %xmm0
|
||||
@@ -1469,7 +1469,7 @@
|
||||
addpd %xmm0, %xmm7
|
||||
movapd 16 * SIZE(AA), %xmm0
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 8) * SIZE(AA)
|
||||
#endif
|
||||
mulpd %xmm1, %xmm2
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
#ifdef NEHALEM
|
||||
#if defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
#define BORIG 60(%esp)
|
||||
#define BUFFER 128(%esp)
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
#define PREFETCH prefetch
|
||||
#define PREFETCHW prefetchw
|
||||
#define PREFETCHSIZE (16 * 10 + 8)
|
||||
@@ -872,7 +872,7 @@
|
||||
.L22:
|
||||
mulps %xmm0, %xmm2
|
||||
addps %xmm2, %xmm4
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movaps 4 * SIZE(BB), %xmm2
|
||||
@@ -1316,7 +1316,7 @@
|
||||
.L32:
|
||||
mulss %xmm0, %xmm2
|
||||
addss %xmm2, %xmm4
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movss 4 * SIZE(BB), %xmm2
|
||||
@@ -1855,7 +1855,7 @@
|
||||
|
||||
.L52:
|
||||
mulps %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
mulps 4 * SIZE(BB), %xmm0
|
||||
@@ -1885,7 +1885,7 @@
|
||||
addps %xmm0, %xmm5
|
||||
movaps 32 * SIZE(AA), %xmm0
|
||||
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 16) * SIZE(AA)
|
||||
#endif
|
||||
mulps %xmm1, %xmm2
|
||||
@@ -2249,7 +2249,7 @@
|
||||
ALIGN_4
|
||||
|
||||
.L62:
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
|
||||
@@ -2562,7 +2562,7 @@
|
||||
|
||||
.L72:
|
||||
mulss %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
mulss 4 * SIZE(BB), %xmm0
|
||||
@@ -2957,7 +2957,7 @@
|
||||
|
||||
.L92:
|
||||
mulps %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movaps 4 * SIZE(AA), %xmm0
|
||||
@@ -2972,7 +2972,7 @@
|
||||
mulps 12 * SIZE(BB), %xmm0
|
||||
addps %xmm0, %xmm7
|
||||
movaps 32 * SIZE(AA), %xmm0
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 16) * SIZE(AA)
|
||||
#endif
|
||||
mulps %xmm1, %xmm3
|
||||
@@ -3280,7 +3280,7 @@
|
||||
|
||||
.L102:
|
||||
mulps %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movsd 2 * SIZE(AA), %xmm0
|
||||
@@ -3515,7 +3515,7 @@
|
||||
|
||||
.L112:
|
||||
mulss %xmm0, %xmm2
|
||||
#if defined(OPTERON) || defined(BARCELONA)
|
||||
#if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT)
|
||||
prefetcht0 (PREFETCHSIZE + 0) * SIZE(AA)
|
||||
#endif
|
||||
movss 1 * SIZE(AA), %xmm0
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
#ifdef NEHALEM
|
||||
#if defined(NEHALEM) || defined(SANDYBRIDGE)
|
||||
#define PREFETCH prefetcht0
|
||||
#define PREFETCHSIZE (8 * 21 + 4)
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user