forked from libxsmm/libxsmm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlibxsmm_generator.h
199 lines (173 loc) · 11.4 KB
/
libxsmm_generator.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/******************************************************************************
* Copyright (c) Intel Corporation - All rights reserved. *
* This file is part of the LIBXSMM library. *
* *
* For information on the license, see the LICENSE file. *
* Further information: https://github.com/libxsmm/libxsmm/ *
* SPDX-License-Identifier: BSD-3-Clause *
******************************************************************************/
/* Alexander Heinecke, Hans Pabst (Intel Corp.)
******************************************************************************/
#ifndef LIBXSMM_GENERATOR_H
#define LIBXSMM_GENERATOR_H
#include "libxsmm_typedefs.h"
/** Signal if dummy-kernel is generated for an empty shape. */
#if defined(LIBXSMM_PLATFORM_X86)
# define LIBXSMM_GEMM_NULL_KERNEL(M, N, K) 1
#else
# define LIBXSMM_GEMM_NULL_KERNEL(M, N, K) (0 < (M) && 0 < (N) && 0 < (K))
#endif
/** Determine if libxsmm_dispatch_gemm yields non-NULL kernel. */
#define LIBXSMM_GEMM_NO_BYPASS(SHAPE, ALPHA, BETA, FLAGS) ( \
((LIBXSMM_FEQ(1, ALPHA) /*|| LIBXSMM_FEQ(-1, ALPHA)*/)) && \
((LIBXSMM_GEMM_FLAG_BETA_0 & (FLAGS)) || LIBXSMM_FEQ(1, BETA)) && \
((LIBXSMM_GEMM_NULL_KERNEL((SHAPE).m, (SHAPE).n, (SHAPE).k))))
/** Initialize GEMM descriptor (generic). */
LIBXSMM_API libxsmm_gemm_descriptor* libxsmm_gemm_descriptor_init(libxsmm_descriptor_blob* blob,
libxsmm_datatype a_type, libxsmm_datatype b_type, libxsmm_datatype comp_type, libxsmm_datatype c_type,
libxsmm_blasint m, libxsmm_blasint n, libxsmm_blasint k,
libxsmm_blasint lda, libxsmm_blasint ldb, libxsmm_blasint ldc, int flags, int prefetch);
/** Initialize mateltwise descriptor */
LIBXSMM_API libxsmm_meltw_descriptor* libxsmm_meltw_descriptor_init(libxsmm_descriptor_blob* blob,
libxsmm_datatype in_type, libxsmm_datatype out_type,
libxsmm_blasint m, libxsmm_blasint n,
libxsmm_blasint ldo, libxsmm_blasint ldi,
unsigned short flags, unsigned short param, unsigned char operation);
LIBXSMM_API libxsmm_meltw_descriptor* libxsmm_meltw_descriptor_init2(libxsmm_descriptor_blob* blob,
libxsmm_datatype in0_type, libxsmm_datatype in1_type, libxsmm_datatype in2_type, libxsmm_datatype comp_type, libxsmm_datatype out_type,
libxsmm_blasint m, libxsmm_blasint n,
libxsmm_blasint ldi, libxsmm_blasint ldo, libxsmm_blasint ldi2, libxsmm_blasint ldi3,
unsigned short flags, unsigned short param, unsigned char operation);
/** Initialize matrix equation as used by low-level routines */
LIBXSMM_API libxsmm_meqn_descriptor* libxsmm_meqn_descriptor_init(libxsmm_descriptor_blob* blob,
libxsmm_datatype type, libxsmm_blasint m, libxsmm_blasint n,
libxsmm_blasint ldo, unsigned int eqn_idx);
/** Structure referring to the generated code with some attached information. */
LIBXSMM_EXTERN_C typedef struct libxsmm_generated_code {
void* generated_code; /** pointer to memory which can contain strings or binary code */
unsigned int buffer_size; /** total size of the buffer generated_code */
unsigned int code_size; /** size in bytes used for generated_code (without constant data) */
unsigned int code_type; /**
* 0: generated code contains inline assembly in a C function
* which can be dumped into a *.c/cc/cpp file
* 1: generated code contains assembly which can be
* dumped into an *.s file
* >1: generated code contains a function in binary code which can
* be called, when the code is copied into executable memory
*/
unsigned int data_size; /**
* amount of constant data located after the generated code
* data_size size is separate/excluded from code_size
*/
unsigned int last_error; /**
* 0: no error occurred
* >0: error code
*/
unsigned int arch; /* target arch for the current code generation task */
} libxsmm_generated_code;
/** Translate LIBXSMM generator error-codes to error messages */
LIBXSMM_API
const char* libxsmm_strerror(unsigned int i_error_code);
/* TODO: change int based architecture value */
LIBXSMM_API
void libxsmm_generator_gemm_inlineasm(const char* i_file_out,
const char* i_routine_name,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const char* i_arch );
/* TODO: change int based architecture value */
LIBXSMM_API
void libxsmm_generator_gemm_directasm(const char* i_file_out,
const char* i_routine_name,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const char* i_arch );
LIBXSMM_API
void libxsmm_generator_gemm_kernel(libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc );
LIBXSMM_API
void libxsmm_generator_gemm_reference_kernel(libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc );
/* TODO: change int based architecture value */
LIBXSMM_API
void libxsmm_generator_spgemm(const char* i_file_out,
const char* i_routine_name,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const char* i_arch,
const char* i_file_in,
const int i_is_csr);
/* TODO: change int based architecture value */
LIBXSMM_API
void libxsmm_generator_spgemm_csc_kernel(libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const char* i_arch,
const unsigned int* i_row_idx,
const unsigned int* i_column_idx,
const double* i_values);
/* TODO: change int based architecture value */
LIBXSMM_API
void libxsmm_generator_spgemm_csr_kernel(libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const char* i_arch,
const unsigned int* i_row_idx,
const unsigned int* i_column_idx,
const double* i_values);
LIBXSMM_API
void libxsmm_generator_spgemm_csr_reg_kernel(libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const unsigned int* i_row_idx,
const unsigned int* i_column_idx,
const double* i_values);
LIBXSMM_API
void libxsmm_generator_packed_spgemm_csr_kernel( libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const unsigned int* i_row_idx,
const unsigned int* i_column_idx,
const void* i_values,
const unsigned int i_packed_width );
LIBXSMM_API
void libxsmm_generator_packed_spgemm_csc_kernel( libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const unsigned int* i_row_idx,
const unsigned int* i_column_idx,
const void* i_values,
const unsigned int i_packed_width );
LIBXSMM_API
void libxsmm_generator_packed_spgemm_bcsc_kernel( libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const unsigned int i_packed_width,
const unsigned int i_bk,
const unsigned int i_bn );
LIBXSMM_API
void libxsmm_generator_packed_gemm_ac_rm( libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const unsigned int i_packed_width );
LIBXSMM_API
void libxsmm_generator_packed_gemm_bc_rm( libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const unsigned int i_packed_width );
LIBXSMM_API
void libxsmm_generator_packed_gemm( libxsmm_generated_code* io_generated_code,
const libxsmm_gemm_descriptor* i_xgemm_desc,
const unsigned int i_packed_width );
LIBXSMM_API
void libxsmm_generator_mateltwise_kernel( libxsmm_generated_code* io_generated_code,
const libxsmm_meltw_descriptor* i_mateltw_desc );
LIBXSMM_API
void libxsmm_generator_mateltwise_reference_kernel( libxsmm_generated_code* io_generated_code,
const libxsmm_meltw_descriptor* i_mateltw_desc );
LIBXSMM_API
void libxsmm_generator_matequation_kernel( libxsmm_generated_code* io_generated_code,
const libxsmm_meqn_descriptor* i_mateqn_desc );
LIBXSMM_API
void libxsmm_generator_matequation_reference_kernel( libxsmm_generated_code* io_generated_code,
const libxsmm_meqn_descriptor* i_mateqn_desc );
/** Used for system/user specific locking (I/O). */
LIBXSMM_APIVAR_PUBLIC(int libxsmm_stdio_handle);
/** Initialization counter that can be used to check whether the library is initialized (!=0) or not (==0). */
LIBXSMM_APIVAR_PUBLIC(unsigned int libxsmm_ninit);
/** Target architecture (libxsmm_get_target_archid, libxsmm_set_target_archid). */
LIBXSMM_APIVAR_PUBLIC(int libxsmm_target_archid);
/** Verbosity level (0: quiet, 1: errors, 2: warnings, 3: info, neg.: all/dump). */
LIBXSMM_APIVAR_PUBLIC(int libxsmm_verbosity);
/** Security-enhanced environment. */
LIBXSMM_APIVAR_PUBLIC(int libxsmm_se);
#endif /*LIBXSMM_GENERATOR_H*/