per thread context loading is ok, working on global context
This commit is contained in:
@@ -19,7 +19,7 @@ PRIVATE void load_intrinsic_avx(sn_intrinsic *context, SIMDID id);
|
||||
PRIVATE void load_intrinsic_512_dual(sn_intrinsic *context, SIMDID id);
|
||||
PRIVATE void load_intrinsic_512(sn_intrinsic *context, SIMDID id);
|
||||
|
||||
SN_API SIMDID load_intrinsic_function(void *intrinsic_context, uint64_t id)
|
||||
SN_API void load_intrinsic_function(void *intrinsic_context, uint64_t id)
|
||||
{
|
||||
sn_null_assert(intrinsic_context);
|
||||
|
||||
@@ -45,7 +45,6 @@ SN_API SIMDID load_intrinsic_function(void *intrinsic_context, uint64_t id)
|
||||
load_intrinsic_512(context, simdid);
|
||||
break;
|
||||
}
|
||||
return simdid;
|
||||
}
|
||||
|
||||
void load_intrinsic_sse(sn_intrinsic *context, SIMDID id)
|
||||
|
||||
@@ -20,33 +20,34 @@
|
||||
* [63..56] uArchHi make_byte[7]
|
||||
* ----------------------------------------------------------------------- */
|
||||
|
||||
#define FIELD_MAIN(id) ((unsigned char)(id).make_byte[1])
|
||||
#define FIELD_AVX512(id) ((uint16_t)((unsigned char)(id).make_byte[2] | \
|
||||
((unsigned char)(id).make_byte[3] << 8)))
|
||||
#define FIELD_AMX(id) ((unsigned char)(id).make_byte[4])
|
||||
#define FIELD_AVX(id) ((unsigned char)(id).make_byte[5])
|
||||
#define FIELD_AVX10(id) ((unsigned char)(id).make_byte[6])
|
||||
#define FIELD_UARCH(id) ((unsigned char)(id).make_byte[7])
|
||||
#define FIELD_MAIN(id) ((unsigned char)(id).make_byte[1])
|
||||
#define FIELD_AVX512(id) \
|
||||
((uint16_t)((unsigned char)(id).make_byte[2] | ((unsigned char)(id).make_byte[3] << 8)))
|
||||
#define FIELD_AMX(id) ((unsigned char)(id).make_byte[4])
|
||||
#define FIELD_AVX(id) ((unsigned char)(id).make_byte[5])
|
||||
#define FIELD_AVX10(id) ((unsigned char)(id).make_byte[6])
|
||||
#define FIELD_UARCH(id) ((unsigned char)(id).make_byte[7])
|
||||
|
||||
/* Portable popcount for a 16-bit value. */
|
||||
static int popcount16(uint16_t v)
|
||||
{
|
||||
int c = 0;
|
||||
while (v) { v &= v - 1; c++; }
|
||||
while (v) {
|
||||
v &= v - 1;
|
||||
c++;
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
/* Map AVX512_IMPL 2-bit field to a strength ordinal for tie-breaking.
|
||||
* DUAL(1) => 0 (weakest), UNKNOWN(0) => 1, NATIVE(2) => 2 (strongest) */
|
||||
* Index = impl value (0=UNKNOWN, 1=DUAL, 2=NATIVE, 3=reserved).
|
||||
* Strength: DUAL(0) < UNKNOWN(1) < NATIVE(2). */
|
||||
static const int impl_strength_table[4] = { 1, 0, 2, 1 };
|
||||
|
||||
static int impl_strength(uint16_t avx512)
|
||||
{
|
||||
unsigned impl = (avx512 >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u;
|
||||
switch (impl) {
|
||||
case 1: return 0; /* DUAL — glue / downclock risk */
|
||||
case 0: return 1; /* UNKNOWN — conservatively mid */
|
||||
case 2: return 2; /* NATIVE — full-width ALU */
|
||||
default: return 1; /* reserved, treat as unknown */
|
||||
}
|
||||
return impl_strength_table[impl];
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------
|
||||
@@ -85,11 +86,10 @@ SN_API SIMDID SN_DECL sn_get_unite_simd(SIMDID left, SIMDID right)
|
||||
/* Clear the IMPL field, then set the weaker one */
|
||||
int ls = impl_strength(l512);
|
||||
int rs = impl_strength(r512);
|
||||
unsigned weak_impl = (ls <= rs)
|
||||
? ((l512 >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u)
|
||||
: ((r512 >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u);
|
||||
merged = (merged & ~(uint16_t)SIMDID_AVX512_IMPL_MASK)
|
||||
| (uint16_t)(weak_impl << SIMDID_AVX512_IMPL_SHIFT);
|
||||
int s = (ls <= rs) ? l512 : r512; /* pick the one with weaker strength ordinal */
|
||||
unsigned weak_impl = (s >> SIMDID_AVX512_IMPL_SHIFT) & 0x3u;
|
||||
merged &= ~(uint16_t)SIMDID_AVX512_IMPL_MASK;
|
||||
merged |= (uint16_t)(weak_impl << SIMDID_AVX512_IMPL_SHIFT);
|
||||
out.make_byte[2] = (char)(merged & 0xFF);
|
||||
out.make_byte[3] = (char)((merged >> 8) & 0xFF);
|
||||
|
||||
@@ -171,10 +171,9 @@ SN_API int SN_DECL sn_compare_simd(SIMDID left, SIMDID right)
|
||||
if (lb != rb)
|
||||
return lb > rb ? 1 : -1;
|
||||
|
||||
/* 4. Extension popcount (mask out BASE + IMPL + reserved low nibble) */
|
||||
uint16_t ext_mask = (uint16_t)~(SIMDID_AVX512_BASE
|
||||
| SIMDID_AVX512_IMPL_MASK
|
||||
| 0x000Fu);
|
||||
// 4. Extension popcount (mask out BASE + IMPL + reserved low nibble)
|
||||
int drop = ~(SIMDID_AVX512_BASE | SIMDID_AVX512_IMPL_MASK | 0x000Fu);
|
||||
uint16_t ext_mask = drop & (l512 | r512); /* only consider bits set in either */
|
||||
int lp = popcount16(l512 & ext_mask);
|
||||
int rp = popcount16(r512 & ext_mask);
|
||||
if (lp != rp)
|
||||
@@ -196,4 +195,4 @@ SN_API int SN_DECL sn_compare_simd(SIMDID left, SIMDID right)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user