mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-30 08:42:00 +00:00 
			
		
		
		
	ggml-cpu: move s390x typedef to own header file
Signed-off-by: Aaron Teo <aaron.teo1@ibm.com>
This commit is contained in:
		
							
								
								
									
										155
									
								
								ggml/src/ggml-cpu/arch/s390/typedef.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								ggml/src/ggml-cpu/arch/s390/typedef.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | ||||
| #ifndef GGML_S390X_TYPEDEF_H | ||||
| #define GGML_S390X_TYPEDEF_H | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <vecintrin.h> | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #if defined(__s390x__) && defined(__VEC__) | ||||
| #define vec_neg(a)    (-(a))                // Vector Negate | ||||
| #define vec_add(a, b) ((a) + (b))           // Vector Add | ||||
| #define vec_sub(a, b) ((a) - (b))           // Vector Subtract | ||||
| #define vec_mul(a, b) ((a) * (b))           // Vector Multiply | ||||
| #define vec_div(a, b) ((a) / (b))           // Vector Divide | ||||
| #define vec_sl(a, b)  ((a) << (b))          // Vector Shift Left | ||||
| #define vec_sra(a, b) ((a) >> (b))          // Vector Shift Right | ||||
| #define vec_sr(a, b)  ((a) >> (b))          // Vector Shift Right Algebraic | ||||
| #define vec_slo(a, b) vec_slb(a, (b) << 64) // Vector Shift Left by Octet | ||||
| #define vec_sro(a, b) vec_srb(a, (b) << 64) // Vector Shift Right by Octet | ||||
|  | ||||
| #ifndef vec_and | ||||
| #define vec_and(a, b) ((a) & (b)) // Vector AND | ||||
| #endif | ||||
|  | ||||
| #ifndef vec_or | ||||
| #define vec_or(a, b)  ((a) | (b)) // Vector OR | ||||
| #endif | ||||
|  | ||||
| #ifndef vec_xor | ||||
| #define vec_xor(a, b) ((a) ^ (b)) // Vector XOR | ||||
| #endif | ||||
|  | ||||
| typedef signed   char char8x16_t  __attribute__((vector_size(16))); | ||||
| typedef unsigned char uchar8x16_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef int8_t  int8x16_t __attribute__((vector_size(16))); | ||||
| typedef int16_t int16x8_t __attribute__((vector_size(16))); | ||||
| typedef int32_t int32x4_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef uint8_t  uint8x16_t __attribute__((vector_size(16))); | ||||
| typedef uint16_t uint16x8_t __attribute__((vector_size(16))); | ||||
| typedef uint32_t uint32x4_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef float  float32x4_t  __attribute__((vector_size(16))); | ||||
| typedef double double64x2_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef signed   long long long64x2_t  __attribute__((vector_size(16))); | ||||
| typedef unsigned long long ulong64x2_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef struct ggml_uint8x16x2_t { | ||||
|     uint8x16_t val[2]; | ||||
| } ggml_uint8x16x2_t; | ||||
|  | ||||
| inline static ggml_uint8x16x2_t ggml_vec_xl_u8x2(const uint8_t * ptr) { | ||||
|     ggml_uint8x16x2_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| typedef struct ggml_uint8x16x4_t { | ||||
|     uint8x16_t val[4]; | ||||
| } ggml_uint8x16x4_t; | ||||
|  | ||||
| inline static ggml_uint8x16x4_t ggml_vec_xl_u8x4(const uint8_t * ptr) { | ||||
|     ggml_uint8x16x4_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|     res.val[2] = vec_xl(32, ptr); | ||||
|     res.val[3] = vec_xl(48, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| typedef struct ggml_int8x16x4_t { | ||||
|     int8x16_t val[4]; | ||||
| } ggml_int8x16x4_t; | ||||
|  | ||||
| inline static ggml_int8x16x4_t ggml_vec_xl_s8x4(const int8_t * ptr) { | ||||
|     ggml_int8x16x4_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|     res.val[2] = vec_xl(32, ptr); | ||||
|     res.val[3] = vec_xl(48, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| typedef struct ggml_int16x8x2_t { | ||||
|     int16x8_t val[2]; | ||||
| } ggml_int16x8x2_t; | ||||
|  | ||||
| inline static ggml_int16x8x2_t ggml_vec_xl_s16x2(const int16_t * ptr) { | ||||
|     ggml_int16x8x2_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| /* | ||||
|     ! WARNING: Very slow. Use vec_perm if possible. Refer to iq4_xs | ||||
|     !          or iq4_nl for example implementation. | ||||
| */ | ||||
| inline static int8x16_t ggml_vec_tbl(int8x16_t a, uint8x16_t b) { | ||||
|     int8x16_t res; | ||||
|  | ||||
|     res[ 0] = a[b[ 0]]; | ||||
|     res[ 1] = a[b[ 1]]; | ||||
|     res[ 2] = a[b[ 2]]; | ||||
|     res[ 3] = a[b[ 3]]; | ||||
|     res[ 4] = a[b[ 4]]; | ||||
|     res[ 5] = a[b[ 5]]; | ||||
|     res[ 6] = a[b[ 6]]; | ||||
|     res[ 7] = a[b[ 7]]; | ||||
|     res[ 8] = a[b[ 8]]; | ||||
|     res[ 9] = a[b[ 9]]; | ||||
|     res[10] = a[b[10]]; | ||||
|     res[11] = a[b[11]]; | ||||
|     res[12] = a[b[12]]; | ||||
|     res[13] = a[b[13]]; | ||||
|     res[14] = a[b[14]]; | ||||
|     res[15] = a[b[15]]; | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| inline static int16x8_t vec_padd_s16(int16x8_t a, int16x8_t b) { | ||||
|     const uchar8x16_t v_maske = {  0,  1,  4,  5,  8,  9, 12, 13, | ||||
|                                   16, 17, 20, 21, 24, 25, 28, 29 }; | ||||
|  | ||||
|     const int16x8_t v_abo = vec_pack((int32x4_t)a, (int32x4_t)b); | ||||
|     const int16x8_t v_abe = vec_perm(a, b, v_maske); | ||||
|     return v_abo + v_abe; | ||||
| } | ||||
|  | ||||
| inline static int32x4_t ggml_vec_dot(int32x4_t acc, int8x16_t a, int8x16_t b) { | ||||
|     const int16x8_t p = vec_mule(a, b) + vec_mulo(a, b); | ||||
|     return acc + (vec_unpackh(p) + vec_unpackl(p)); | ||||
| } | ||||
|  | ||||
| #endif  // __s390x__ && __VEC__ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif  // __cplusplus | ||||
|  | ||||
| #endif  // GGML_S390X_TYPEDEF_H | ||||
| @@ -353,144 +353,7 @@ inline static int32x4_t ggml_vdotq_s32(int32x4_t acc, int8x16_t a, int8x16_t b) | ||||
|  | ||||
| #if defined(__VXE__) || defined(__VXE2__) | ||||
| #include <vecintrin.h> | ||||
|  | ||||
| #define vec_neg(a)    (-(a))                // Vector Negate | ||||
| #define vec_add(a, b) ((a) + (b))           // Vector Add | ||||
| #define vec_sub(a, b) ((a) - (b))           // Vector Subtract | ||||
| #define vec_mul(a, b) ((a) * (b))           // Vector Multiply | ||||
| #define vec_div(a, b) ((a) / (b))           // Vector Divide | ||||
| #define vec_sl(a, b)  ((a) << (b))          // Vector Shift Left | ||||
| #define vec_sra(a, b) ((a) >> (b))          // Vector Shift Right | ||||
| #define vec_sr(a, b)  ((a) >> (b))          // Vector Shift Right Algebraic | ||||
| #define vec_slo(a, b) vec_slb(a, (b) << 64) // Vector Shift Left by Octet | ||||
| #define vec_sro(a, b) vec_srb(a, (b) << 64) // Vector Shift Right by Octet | ||||
|  | ||||
| #ifndef vec_and | ||||
| #define vec_and(a, b) ((a) & (b)) // Vector AND | ||||
| #endif | ||||
|  | ||||
| #ifndef vec_or | ||||
| #define vec_or(a, b)  ((a) | (b)) // Vector OR | ||||
| #endif | ||||
|  | ||||
| #ifndef vec_xor | ||||
| #define vec_xor(a, b) ((a) ^ (b)) // Vector XOR | ||||
| #endif | ||||
|  | ||||
| typedef signed   char char8x16_t  __attribute__((vector_size(16))); | ||||
| typedef unsigned char uchar8x16_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef int8_t  int8x16_t __attribute__((vector_size(16))); | ||||
| typedef int16_t int16x8_t __attribute__((vector_size(16))); | ||||
| typedef int32_t int32x4_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef uint8_t  uint8x16_t __attribute__((vector_size(16))); | ||||
| typedef uint16_t uint16x8_t __attribute__((vector_size(16))); | ||||
| typedef uint32_t uint32x4_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef float  float32x4_t  __attribute__((vector_size(16))); | ||||
| typedef double double64x2_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef signed   long long long64x2_t  __attribute__((vector_size(16))); | ||||
| typedef unsigned long long ulong64x2_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef struct ggml_uint8x16x2_t { | ||||
|     uint8x16_t val[2]; | ||||
| } ggml_uint8x16x2_t; | ||||
|  | ||||
| inline static ggml_uint8x16x2_t ggml_vec_xl_u8x2(const uint8_t * ptr) { | ||||
|     ggml_uint8x16x2_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| typedef struct ggml_uint8x16x4_t { | ||||
|     uint8x16_t val[4]; | ||||
| } ggml_uint8x16x4_t; | ||||
|  | ||||
| inline static ggml_uint8x16x4_t ggml_vec_xl_u8x4(const uint8_t * ptr) { | ||||
|     ggml_uint8x16x4_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|     res.val[2] = vec_xl(32, ptr); | ||||
|     res.val[3] = vec_xl(48, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| typedef struct ggml_int8x16x4_t { | ||||
|     int8x16_t val[4]; | ||||
| } ggml_int8x16x4_t; | ||||
|  | ||||
| inline static ggml_int8x16x4_t ggml_vec_xl_s8x4(const int8_t * ptr) { | ||||
|     ggml_int8x16x4_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|     res.val[2] = vec_xl(32, ptr); | ||||
|     res.val[3] = vec_xl(48, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| typedef struct ggml_int16x8x2_t { | ||||
|     int16x8_t val[2]; | ||||
| } ggml_int16x8x2_t; | ||||
|  | ||||
| inline static ggml_int16x8x2_t ggml_vec_xl_s16x2(const int16_t * ptr) { | ||||
|     ggml_int16x8x2_t res; | ||||
|  | ||||
|     res.val[0] = vec_xl( 0, ptr); | ||||
|     res.val[1] = vec_xl(16, ptr); | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| /* | ||||
|     ! WARNING: Very slow. Use vec_perm if possible. Refer to iq4_xs | ||||
|     !          or iq4_nl for example implementation. | ||||
| */ | ||||
| inline static int8x16_t ggml_vec_tbl(int8x16_t a, uint8x16_t b) { | ||||
|     int8x16_t res; | ||||
|  | ||||
|     res[ 0] = a[b[ 0]]; | ||||
|     res[ 1] = a[b[ 1]]; | ||||
|     res[ 2] = a[b[ 2]]; | ||||
|     res[ 3] = a[b[ 3]]; | ||||
|     res[ 4] = a[b[ 4]]; | ||||
|     res[ 5] = a[b[ 5]]; | ||||
|     res[ 6] = a[b[ 6]]; | ||||
|     res[ 7] = a[b[ 7]]; | ||||
|     res[ 8] = a[b[ 8]]; | ||||
|     res[ 9] = a[b[ 9]]; | ||||
|     res[10] = a[b[10]]; | ||||
|     res[11] = a[b[11]]; | ||||
|     res[12] = a[b[12]]; | ||||
|     res[13] = a[b[13]]; | ||||
|     res[14] = a[b[14]]; | ||||
|     res[15] = a[b[15]]; | ||||
|  | ||||
|     return res; | ||||
| } | ||||
|  | ||||
| inline static int16x8_t vec_padd_s16(int16x8_t a, int16x8_t b) { | ||||
|     const uchar8x16_t v_maske = {  0,  1,  4,  5,  8,  9, 12, 13, | ||||
|                                   16, 17, 20, 21, 24, 25, 28, 29 }; | ||||
|  | ||||
|     const int16x8_t v_abo = vec_pack((int32x4_t)a, (int32x4_t)b); | ||||
|     const int16x8_t v_abe = vec_perm(a, b, v_maske); | ||||
|     return v_abo + v_abe; | ||||
| } | ||||
|  | ||||
| inline static int32x4_t ggml_vec_dot(int32x4_t acc, int8x16_t a, int8x16_t b) { | ||||
|     const int16x8_t p = vec_mule(a, b) + vec_mulo(a, b); | ||||
|     return acc + (vec_unpackh(p) + vec_unpackl(p)); | ||||
| } | ||||
|  | ||||
| #include <ggml-cpu/arch/s390/typedef.h> | ||||
| #endif | ||||
|  | ||||
| #if defined(__loongarch_asx) | ||||
|   | ||||
| @@ -30,46 +30,7 @@ | ||||
|  | ||||
| #if defined(__s390x__) && defined(__VEC__) | ||||
| #include <vecintrin.h> | ||||
|  | ||||
| #define vec_neg(a)    (-(a))                // Vector Negate | ||||
| #define vec_add(a, b) ((a) + (b))           // Vector Add | ||||
| #define vec_sub(a, b) ((a) - (b))           // Vector Subtract | ||||
| #define vec_mul(a, b) ((a) * (b))           // Vector Multiply | ||||
| #define vec_div(a, b) ((a) / (b))           // Vector Divide | ||||
| #define vec_sl(a, b)  ((a) << (b))          // Vector Shift Left | ||||
| #define vec_sra(a, b) ((a) >> (b))          // Vector Shift Right | ||||
| #define vec_sr(a, b)  ((a) >> (b))          // Vector Shift Right Algebraic | ||||
| #define vec_slo(a, b) vec_slb(a, (b) << 64) // Vector Shift Left by Octet | ||||
| #define vec_sro(a, b) vec_srb(a, (b) << 64) // Vector Shift Right by Octet | ||||
|  | ||||
| #ifndef vec_and | ||||
| #define vec_and(a, b) ((a) & (b)) // Vector AND | ||||
| #endif | ||||
|  | ||||
| #ifndef vec_or | ||||
| #define vec_or(a, b)  ((a) | (b)) // Vector OR | ||||
| #endif | ||||
|  | ||||
| #ifndef vec_xor | ||||
| #define vec_xor(a, b) ((a) ^ (b)) // Vector XOR | ||||
| #endif | ||||
|  | ||||
| typedef signed   char char8x16_t  __attribute__((vector_size(16))); | ||||
| typedef unsigned char uchar8x16_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef int8_t  int8x16_t __attribute__((vector_size(16))); | ||||
| typedef int16_t int16x8_t __attribute__((vector_size(16))); | ||||
| typedef int32_t int32x4_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef uint8_t  uint8x16_t __attribute__((vector_size(16))); | ||||
| typedef uint16_t uint16x8_t __attribute__((vector_size(16))); | ||||
| typedef uint32_t uint32x4_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef float  float32x4_t  __attribute__((vector_size(16))); | ||||
| typedef double double64x2_t __attribute__((vector_size(16))); | ||||
|  | ||||
| typedef signed   long long long64x2_t  __attribute__((vector_size(16))); | ||||
| typedef unsigned long long ulong64x2_t __attribute__((vector_size(16))); | ||||
| #include <ggml-cpu/arch/s390/typedef.h> | ||||
|  | ||||
| #if defined(GGML_NNPA) | ||||
| #ifndef __NNPA__ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Aaron Teo
					Aaron Teo