23
23
#endif // __wasi__
24
24
#include < stdio.h>
25
25
#include < string.h>
26
+ #include < stdlib.h>
26
27
27
28
#ifdef _OPENMP
28
29
#if NCNN_SIMPLEOMP
@@ -1859,6 +1860,55 @@ static int detect_cpu_is_arm_a53_a55()
1859
1860
#endif // __aarch64__
1860
1861
#endif // defined __ANDROID__ || defined __linux__
1861
1862
1863
+ static int get_isa_env (const char * isa_flags)
1864
+ {
1865
+ const char * isa = getenv (" NCNN_ISA" );
1866
+
1867
+ if (!isa)
1868
+ {
1869
+ return false ;
1870
+ }
1871
+
1872
+ char * isa_copy = strdup (isa);
1873
+ char * token = strtok (isa_copy, " ," );
1874
+
1875
+ while (token != NULL )
1876
+ {
1877
+ if (strcmp (token, isa_flags) == 0 )
1878
+ {
1879
+ if (isa_flags[0 ] == ' +' )
1880
+ return false ;
1881
+ if (isa_flags[0 ] == ' -' )
1882
+ {
1883
+ memmove (token, token + 1 , strlen (token));
1884
+ fprintf (stderr, " warning: %s disabled via environment variable!\n " , token);
1885
+ return true ;
1886
+ }
1887
+ }
1888
+ token = strtok (NULL , " ," );
1889
+ }
1890
+
1891
+ free (isa_copy);
1892
+ return false ;
1893
+ }
1894
+
1895
+ #if (__aarch64__ || __arm__)
1896
+ static int is_cpu_arm_cpuid_disabled = get_isa_env(" -cpuid" );
1897
+ static int is_cpu_arm_asimdhp_disabled = get_isa_env(" -asimdhp" );
1898
+ static int is_cpu_arm_asimddp_disabled = get_isa_env(" -asimddp" );
1899
+ static int is_cpu_arm_asimdfhm_disabled = get_isa_env(" -asimdfhm" );
1900
+ static int is_cpu_arm_bf16_disabled = get_isa_env(" -bf16" );
1901
+ static int is_cpu_arm_i8mm_disabled = get_isa_env(" -i8mm" );
1902
+ static int is_cpu_arm_sve_disabled = get_isa_env(" -sve" );
1903
+ static int is_cpu_arm_sve2_disabled = get_isa_env(" -sve2" );
1904
+ static int is_cpu_arm_svebf16_disabled = get_isa_env(" -svebf16" );
1905
+ static int is_cpu_arm_svei8mm_disabled = get_isa_env(" -svei8mm" );
1906
+ static int is_cpu_arm_svef32mm_disabled = get_isa_env(" -svef32mm" );
1907
+ static int is_cpu_arm_edsp_disabled = get_isa_env(" -edsp" );
1908
+ static int is_cpu_arm_vfpv4_disabled = get_isa_env(" -vfpv4" );
1909
+ static int is_cpu_arm_neon_disabled = get_isa_env(" -neon" );
1910
+ #endif
1911
+
1862
1912
// the initialization
1863
1913
static void initialize_global_cpu_info ()
1864
1914
{
@@ -1909,16 +1959,16 @@ static void initialize_global_cpu_info()
1909
1959
#endif
1910
1960
1911
1961
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
1912
- g_cpu_support_x86_avx = get_cpu_support_x86_avx ();
1913
- g_cpu_support_x86_fma = get_cpu_support_x86_fma ();
1914
- g_cpu_support_x86_xop = get_cpu_support_x86_xop ();
1915
- g_cpu_support_x86_f16c = get_cpu_support_x86_f16c ();
1916
- g_cpu_support_x86_avx2 = get_cpu_support_x86_avx2 ();
1917
- g_cpu_support_x86_avx_vnni = get_cpu_support_x86_avx_vnni ();
1918
- g_cpu_support_x86_avx512 = get_cpu_support_x86_avx512 ();
1919
- g_cpu_support_x86_avx512_vnni = get_cpu_support_x86_avx512_vnni ();
1920
- g_cpu_support_x86_avx512_bf16 = get_cpu_support_x86_avx512_bf16 ();
1921
- g_cpu_support_x86_avx512_fp16 = get_cpu_support_x86_avx512_fp16 ();
1962
+ g_cpu_support_x86_avx = get_cpu_support_x86_avx () && !( get_isa_env ( " -avx " )) ;
1963
+ g_cpu_support_x86_fma = get_cpu_support_x86_fma () && !( get_isa_env ( " -fma " )) ;
1964
+ g_cpu_support_x86_xop = get_cpu_support_x86_xop () && !( get_isa_env ( " -xop " )) ;
1965
+ g_cpu_support_x86_f16c = get_cpu_support_x86_f16c () && !( get_isa_env ( " -f16c " )) ;
1966
+ g_cpu_support_x86_avx2 = get_cpu_support_x86_avx2 () && !( get_isa_env ( " -avx2 " )) ;
1967
+ g_cpu_support_x86_avx_vnni = get_cpu_support_x86_avx_vnni () && !( get_isa_env ( " -avx_vnni " )) ;
1968
+ g_cpu_support_x86_avx512 = get_cpu_support_x86_avx512 () && !( get_isa_env ( " -avx512 " )) ;
1969
+ g_cpu_support_x86_avx512_vnni = get_cpu_support_x86_avx512_vnni () && !( get_isa_env ( " -avx512_vnni " )) ;
1970
+ g_cpu_support_x86_avx512_bf16 = get_cpu_support_x86_avx512_bf16 () && !( get_isa_env ( " -bf16 " )) ;
1971
+ g_cpu_support_x86_avx512_fp16 = get_cpu_support_x86_avx512_fp16 () && !( get_isa_env ( " -fp16 " )) ;
1922
1972
#endif // defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
1923
1973
1924
1974
g_cpu_level2_cachesize = get_cpu_level2_cachesize ();
@@ -2087,6 +2137,8 @@ int cpu_support_arm_edsp()
2087
2137
{
2088
2138
try_initialize_global_cpu_info ();
2089
2139
#if __arm__ && !__aarch64__
2140
+ if (is_cpu_arm_edsp_disabled)
2141
+ return 0 ;
2090
2142
#if defined _WIN32
2091
2143
return g_cpu_support_arm_edsp;
2092
2144
#elif defined __ANDROID__ || defined __linux__
@@ -2107,6 +2159,8 @@ int cpu_support_arm_neon()
2107
2159
#if __aarch64__
2108
2160
return 1 ;
2109
2161
#elif __arm__
2162
+ if (is_cpu_arm_neon_disabled)
2163
+ return 0 ;
2110
2164
#if defined _WIN32
2111
2165
return g_cpu_support_arm_neon;
2112
2166
#elif defined __ANDROID__ || defined __linux__
@@ -2127,6 +2181,8 @@ int cpu_support_arm_vfpv4()
2127
2181
#if __aarch64__
2128
2182
return 1 ;
2129
2183
#elif __arm__
2184
+ if (is_cpu_arm_vfpv4_disabled)
2185
+ return 0 ;
2130
2186
#if defined _WIN32
2131
2187
return g_cpu_support_arm_vfpv4;
2132
2188
#elif defined __ANDROID__ || defined __linux__
@@ -2145,6 +2201,8 @@ int cpu_support_arm_asimdhp()
2145
2201
{
2146
2202
try_initialize_global_cpu_info ();
2147
2203
#if __aarch64__
2204
+ if (is_cpu_arm_asimdhp_disabled)
2205
+ return 0 ;
2148
2206
#if defined _WIN32
2149
2207
return g_cpu_support_arm_asimdhp;
2150
2208
#elif defined __ANDROID__ || defined __linux__
@@ -2173,6 +2231,8 @@ int cpu_support_arm_cpuid()
2173
2231
{
2174
2232
try_initialize_global_cpu_info ();
2175
2233
#if __aarch64__
2234
+ if (is_cpu_arm_cpuid_disabled)
2235
+ return 0 ;
2176
2236
#if defined _WIN32
2177
2237
return g_cpu_support_arm_cpuid;
2178
2238
#elif defined __ANDROID__ || defined __linux__
@@ -2191,6 +2251,8 @@ int cpu_support_arm_asimddp()
2191
2251
{
2192
2252
try_initialize_global_cpu_info ();
2193
2253
#if __aarch64__
2254
+ if (is_cpu_arm_asimddp_disabled)
2255
+ return 0 ;
2194
2256
#if defined _WIN32
2195
2257
return g_cpu_support_arm_asimddp;
2196
2258
#elif defined __ANDROID__ || defined __linux__
@@ -2217,6 +2279,8 @@ int cpu_support_arm_asimdfhm()
2217
2279
{
2218
2280
try_initialize_global_cpu_info ();
2219
2281
#if __aarch64__
2282
+ if (is_cpu_arm_asimdfhm_disabled)
2283
+ return 0 ;
2220
2284
#if defined _WIN32
2221
2285
return g_cpu_support_arm_asimdfhm;
2222
2286
#elif defined __ANDROID__ || defined __linux__
@@ -2243,6 +2307,8 @@ int cpu_support_arm_bf16()
2243
2307
{
2244
2308
try_initialize_global_cpu_info ();
2245
2309
#if __aarch64__
2310
+ if (is_cpu_arm_bf16_disabled)
2311
+ return 0 ;
2246
2312
#if defined _WIN32
2247
2313
return g_cpu_support_arm_bf16;
2248
2314
#elif defined __ANDROID__ || defined __linux__
@@ -2267,6 +2333,8 @@ int cpu_support_arm_i8mm()
2267
2333
{
2268
2334
try_initialize_global_cpu_info ();
2269
2335
#if __aarch64__
2336
+ if (is_cpu_arm_i8mm_disabled)
2337
+ return 0 ;
2270
2338
#if defined _WIN32
2271
2339
return g_cpu_support_arm_i8mm;
2272
2340
#elif defined __ANDROID__ || defined __linux__
@@ -2291,6 +2359,8 @@ int cpu_support_arm_sve()
2291
2359
{
2292
2360
try_initialize_global_cpu_info ();
2293
2361
#if __aarch64__
2362
+ if (is_cpu_arm_sve_disabled)
2363
+ return 0 ;
2294
2364
#if defined _WIN32
2295
2365
return g_cpu_support_arm_sve;
2296
2366
#elif defined __ANDROID__ || defined __linux__
@@ -2309,6 +2379,8 @@ int cpu_support_arm_sve2()
2309
2379
{
2310
2380
try_initialize_global_cpu_info ();
2311
2381
#if __aarch64__
2382
+ if (is_cpu_arm_sve2_disabled)
2383
+ return 0 ;
2312
2384
#if defined _WIN32
2313
2385
return g_cpu_support_arm_sve2;
2314
2386
#elif defined __ANDROID__ || defined __linux__
@@ -2327,6 +2399,8 @@ int cpu_support_arm_svebf16()
2327
2399
{
2328
2400
try_initialize_global_cpu_info ();
2329
2401
#if __aarch64__
2402
+ if (is_cpu_arm_svebf16_disabled)
2403
+ return 0 ;
2330
2404
#if defined _WIN32
2331
2405
return g_cpu_support_arm_svebf16;
2332
2406
#elif defined __ANDROID__ || defined __linux__
@@ -2345,6 +2419,8 @@ int cpu_support_arm_svei8mm()
2345
2419
{
2346
2420
try_initialize_global_cpu_info ();
2347
2421
#if __aarch64__
2422
+ if (is_cpu_arm_svei8mm_disabled)
2423
+ return 0 ;
2348
2424
#if defined _WIN32
2349
2425
return g_cpu_support_arm_svei8mm;
2350
2426
#elif defined __ANDROID__ || defined __linux__
@@ -2363,6 +2439,8 @@ int cpu_support_arm_svef32mm()
2363
2439
{
2364
2440
try_initialize_global_cpu_info ();
2365
2441
#if __aarch64__
2442
+ if (is_cpu_arm_svef32mm_disabled)
2443
+ return 0 ;
2366
2444
#if defined _WIN32
2367
2445
return g_cpu_support_arm_svef32mm;
2368
2446
#elif defined __ANDROID__ || defined __linux__
@@ -2482,7 +2560,7 @@ int cpu_support_mips_msa()
2482
2560
try_initialize_global_cpu_info ();
2483
2561
#if defined __ANDROID__ || defined __linux__
2484
2562
#if __mips__
2485
- return g_hwcaps & HWCAP_MIPS_MSA;
2563
+ return ( g_hwcaps & HWCAP_MIPS_MSA) && ! get_isa_env (( " -msa " )) ;
2486
2564
#else
2487
2565
return 0 ;
2488
2566
#endif
@@ -2538,7 +2616,7 @@ int cpu_support_riscv_v()
2538
2616
try_initialize_global_cpu_info ();
2539
2617
#if defined __ANDROID__ || defined __linux__
2540
2618
#if __riscv
2541
- return g_hwcaps & COMPAT_HWCAP_ISA_V;
2619
+ return ( g_hwcaps & COMPAT_HWCAP_ISA_V) && ! get_isa_env (( " -rvv " )) ;
2542
2620
#else
2543
2621
return 0 ;
2544
2622
#endif
@@ -2554,7 +2632,7 @@ int cpu_support_riscv_zfh()
2554
2632
#if __riscv
2555
2633
// v + f does not imply zfh, but how to discover zfh properly ?
2556
2634
// upstream issue https://github.com/riscv/riscv-isa-manual/issues/414
2557
- return g_hwcaps & COMPAT_HWCAP_ISA_V && g_hwcaps & COMPAT_HWCAP_ISA_F;
2635
+ return ( g_hwcaps & COMPAT_HWCAP_ISA_V && g_hwcaps & COMPAT_HWCAP_ISA_F) && ! get_isa_env (( " -rvzfh " )) ;
2558
2636
#else
2559
2637
return 0 ;
2560
2638
#endif
0 commit comments