Add CPUID identification of Intel Ice Lake
[platform/upstream/openblas.git] / interface / ger.c
1 /*********************************************************************/
2 /* Copyright 2009, 2010 The University of Texas at Austin.           */
3 /* All rights reserved.                                              */
4 /*                                                                   */
5 /* Redistribution and use in source and binary forms, with or        */
6 /* without modification, are permitted provided that the following   */
7 /* conditions are met:                                               */
8 /*                                                                   */
9 /*   1. Redistributions of source code must retain the above         */
10 /*      copyright notice, this list of conditions and the following  */
11 /*      disclaimer.                                                  */
12 /*                                                                   */
13 /*   2. Redistributions in binary form must reproduce the above      */
14 /*      copyright notice, this list of conditions and the following  */
15 /*      disclaimer in the documentation and/or other materials       */
16 /*      provided with the distribution.                              */
17 /*                                                                   */
18 /*    THIS  SOFTWARE IS PROVIDED  BY THE  UNIVERSITY OF  TEXAS AT    */
19 /*    AUSTIN  ``AS IS''  AND ANY  EXPRESS OR  IMPLIED WARRANTIES,    */
20 /*    INCLUDING, BUT  NOT LIMITED  TO, THE IMPLIED  WARRANTIES OF    */
21 /*    MERCHANTABILITY  AND FITNESS FOR  A PARTICULAR  PURPOSE ARE    */
22 /*    DISCLAIMED.  IN  NO EVENT SHALL THE UNIVERSITY  OF TEXAS AT    */
23 /*    AUSTIN OR CONTRIBUTORS BE  LIABLE FOR ANY DIRECT, INDIRECT,    */
24 /*    INCIDENTAL,  SPECIAL, EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES    */
25 /*    (INCLUDING, BUT  NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE    */
26 /*    GOODS  OR  SERVICES; LOSS  OF  USE,  DATA,  OR PROFITS;  OR    */
27 /*    BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON ANY THEORY OF    */
28 /*    LIABILITY, WHETHER  IN CONTRACT, STRICT  LIABILITY, OR TORT    */
29 /*    (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT    */
30 /*    OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF ADVISED  OF  THE    */
31 /*    POSSIBILITY OF SUCH DAMAGE.                                    */
32 /*                                                                   */
33 /* The views and conclusions contained in the software and           */
34 /* documentation are those of the authors and should not be          */
35 /* interpreted as representing official policies, either expressed   */
36 /* or implied, of The University of Texas at Austin.                 */
37 /*********************************************************************/
38
39 #include <stdio.h>
40 #include "common.h"
41 #ifdef FUNCTION_PROFILE
42 #include "functable.h"
43 #endif
44
45 #ifdef SMP
46 #ifdef __64BIT__
47 #define SMPTEST 1
48 #endif
49 #endif
50
51 #ifdef XDOUBLE
52 #define ERROR_NAME "QGER  "
53 #elif defined DOUBLE
54 #define ERROR_NAME "DGER  "
55 #else
56 #define ERROR_NAME "SGER  "
57 #endif
58
59 #define GER             GERU_K
60
61 #if   defined XDOUBLE
62 #define GER_THREAD      qger_thread
63 #elif defined DOUBLE
64 #define GER_THREAD      dger_thread
65 #else
66 #define GER_THREAD      sger_thread
67 #endif
68
69
70 #ifndef CBLAS
71
72 void NAME(blasint *M, blasint *N, FLOAT *Alpha,
73           FLOAT *x, blasint *INCX,
74           FLOAT *y, blasint *INCY,
75           FLOAT *a, blasint *LDA){
76
77   blasint    m     = *M;
78   blasint    n     = *N;
79   FLOAT  alpha = *Alpha;
80   blasint    incx  = *INCX;
81   blasint    incy  = *INCY;
82   blasint    lda   = *LDA;
83   FLOAT *buffer;
84 #ifdef SMPTEST
85   int nthreads;
86 #endif
87
88   blasint info;
89
90   PRINT_DEBUG_NAME;
91
92   info = 0;
93
94   if (lda < MAX(1,m)) info = 9;
95   if (incy == 0)      info = 7;
96   if (incx == 0)      info = 5;
97   if (n < 0)          info = 2;
98   if (m < 0)          info = 1;
99
100   if (info){
101     BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME));
102     return;
103   }
104
105 #else
106
107 void CNAME(enum CBLAS_ORDER order,
108            blasint m, blasint n,
109            FLOAT alpha,
110            FLOAT  *x, blasint incx,
111            FLOAT  *y, blasint incy,
112            FLOAT  *a, blasint lda) {
113
114   FLOAT *buffer;
115   blasint info, t;
116 #ifdef SMPTEST
117   int nthreads;
118 #endif
119
120   PRINT_DEBUG_CNAME;
121
122   info  =  0;
123
124   if (order == CblasColMajor) {
125     info = -1;
126
127     if (lda < MAX(1,m)) info = 9;
128     if (incy == 0)      info = 7;
129     if (incx == 0)      info = 5;
130     if (n < 0)          info = 2;
131     if (m < 0)          info = 1;
132   }
133
134   if (order == CblasRowMajor) {
135     info = -1;
136
137     t = n;
138     n = m;
139     m = t;
140
141     t    = incx;
142     incx = incy;
143     incy = t;
144
145     buffer = x;
146     x = y;
147     y = buffer;
148
149     if (lda < MAX(1,m)) info = 9;
150     if (incy == 0)      info = 7;
151     if (incx == 0)      info = 5;
152     if (n < 0)          info = 2;
153     if (m < 0)          info = 1;
154   }
155
156   if (info >= 0) {
157     BLASFUNC(xerbla)(ERROR_NAME, &info, sizeof(ERROR_NAME));
158     return;
159   }
160
161 #endif
162
163   /*     Quick return if possible. */
164   if (m == 0 || n == 0) return;
165   if (alpha == 0.) return;
166
167   IDEBUG_START;
168
169   FUNCTION_PROFILE_START();
170
171   if (incy < 0) y -= (n - 1) * incy;
172   if (incx < 0) x -= (m - 1) * incx;
173
174   STACK_ALLOC(m, FLOAT, buffer);
175
176 #ifdef SMPTEST
177   // Threshold chosen so that speed-up is > 1 on a Xeon E5-2630
178   if(1L * m * n > 2048L * GEMM_MULTITHREAD_THRESHOLD)
179     nthreads = num_cpu_avail(2);
180   else
181     nthreads = 1;
182
183   if (nthreads == 1) {
184 #endif
185
186     GER(m, n, 0, alpha, x, incx, y, incy, a, lda, buffer);
187
188 #ifdef SMPTEST
189   } else {
190
191     GER_THREAD(m, n, alpha, x, incx, y, incy, a, lda, buffer, nthreads);
192
193   }
194 #endif
195
196   STACK_FREE(buffer);
197   FUNCTION_PROFILE_END(1, m * n + m + n, 2 * m * n);
198
199   IDEBUG_END;
200
201   return;
202 }