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,89 @@ 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 || strlen (isa) == 0 )
1868
+ {
1869
+ return 0 ;
1870
+ }
1871
+
1872
+ char * isa_copy = strdup (isa);
1873
+
1874
+ if (!isa_copy)
1875
+ {
1876
+ return 0 ;
1877
+ }
1878
+
1879
+ char * token = strtok (isa_copy, " ," );
1880
+
1881
+ while (token != NULL )
1882
+ {
1883
+ if (strcmp (token, isa_flags) == 0 )
1884
+ {
1885
+ if (isa_flags[0 ] == ' +' )
1886
+ return false ;
1887
+ if (isa_flags[0 ] == ' -' )
1888
+ {
1889
+ memmove (token, token + 1 , strlen (token));
1890
+ fprintf (stderr, " warning: %s disabled via environment variable!\n " , token);
1891
+ return 1 ;
1892
+ }
1893
+ }
1894
+ token = strtok (NULL , " ," );
1895
+ }
1896
+
1897
+ free (isa_copy);
1898
+ return 0 ;
1899
+ }
1900
+
1901
+ #if (__aarch64__ || __arm__)
1902
+ static int is_cpu_arm_cpuid_disabled = get_isa_env(" -cpuid" );
1903
+ static int is_cpu_arm_asimdhp_disabled = get_isa_env(" -asimdhp" );
1904
+ static int is_cpu_arm_asimddp_disabled = get_isa_env(" -asimddp" );
1905
+ static int is_cpu_arm_asimdfhm_disabled = get_isa_env(" -asimdfhm" );
1906
+ static int is_cpu_arm_bf16_disabled = get_isa_env(" -bf16" );
1907
+ static int is_cpu_arm_i8mm_disabled = get_isa_env(" -i8mm" );
1908
+ static int is_cpu_arm_sve_disabled = get_isa_env(" -sve" );
1909
+ static int is_cpu_arm_sve2_disabled = get_isa_env(" -sve2" );
1910
+ static int is_cpu_arm_svebf16_disabled = get_isa_env(" -svebf16" );
1911
+ static int is_cpu_arm_svei8mm_disabled = get_isa_env(" -svei8mm" );
1912
+ static int is_cpu_arm_svef32mm_disabled = get_isa_env(" -svef32mm" );
1913
+ static int is_cpu_arm_edsp_disabled = get_isa_env(" -edsp" );
1914
+ static int is_cpu_arm_vfpv4_disabled = get_isa_env(" -vfpv4" );
1915
+ static int is_cpu_arm_neon_disabled = get_isa_env(" -neon" );
1916
+ #endif
1917
+
1918
+ #if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
1919
+ static int is_cpu_x86_avx_disabled = get_isa_env(" -avx" );
1920
+ static int is_cpu_x86_fma_disabled = get_isa_env(" -fma" );
1921
+ static int is_cpu_x86_xop_disabled = get_isa_env(" -xop" );
1922
+ static int is_cpu_x86_f16c_disabled = get_isa_env(" -f16c" );
1923
+ static int is_cpu_x86_avx2_disabled = get_isa_env(" -avx2" );
1924
+ static int is_cpu_x86_avx_vnni_disabled = get_isa_env(" -avx_vnni" );
1925
+ static int is_cpu_x86_avx512_disabled = get_isa_env(" -avx512" );
1926
+ static int is_cpu_x86_avx512_vnni_disabled = get_isa_env(" -avx512_vnni" );
1927
+ static int is_cpu_x86_avx512_bf16_disabled = get_isa_env(" -avx512_bf16" );
1928
+ static int is_cpu_x86_avx512_fp16_disabled = get_isa_env(" -avx512_fp16" );
1929
+ #endif
1930
+
1931
+ #if __loongarch64
1932
+ static int is_cpu_loongarch_lsx_disabled = get_isa_env(" -lsx" );
1933
+ static int is_cpu_loongarch_lasx_disabled = get_isa_env(" -lasx" );
1934
+ #endif
1935
+
1936
+ #if __mips__
1937
+ static int is_cpu_mips_msa_disabled = get_isa_env(" -msa" );
1938
+ static int is_cpu_loongson_mmi_disabled = get_isa_env(" -mmi" );
1939
+ #endif
1940
+
1941
+ #if __riscv
1942
+ static int is_cpu_riscv_v_disabled = get_isa_env(" -rvv" );
1943
+ static int is_cpu_riscv_zfh_disabled = get_isa_env(" -zfh" );
1944
+ #endif
1945
+
1862
1946
// the initialization
1863
1947
static void initialize_global_cpu_info ()
1864
1948
{
@@ -2087,6 +2171,8 @@ int cpu_support_arm_edsp()
2087
2171
{
2088
2172
try_initialize_global_cpu_info ();
2089
2173
#if __arm__ && !__aarch64__
2174
+ if (is_cpu_arm_edsp_disabled)
2175
+ return 0 ;
2090
2176
#if defined _WIN32
2091
2177
return g_cpu_support_arm_edsp;
2092
2178
#elif defined __ANDROID__ || defined __linux__
@@ -2107,6 +2193,8 @@ int cpu_support_arm_neon()
2107
2193
#if __aarch64__
2108
2194
return 1 ;
2109
2195
#elif __arm__
2196
+ if (is_cpu_arm_neon_disabled)
2197
+ return 0 ;
2110
2198
#if defined _WIN32
2111
2199
return g_cpu_support_arm_neon;
2112
2200
#elif defined __ANDROID__ || defined __linux__
@@ -2127,6 +2215,8 @@ int cpu_support_arm_vfpv4()
2127
2215
#if __aarch64__
2128
2216
return 1 ;
2129
2217
#elif __arm__
2218
+ if (is_cpu_arm_vfpv4_disabled)
2219
+ return 0 ;
2130
2220
#if defined _WIN32
2131
2221
return g_cpu_support_arm_vfpv4;
2132
2222
#elif defined __ANDROID__ || defined __linux__
@@ -2145,6 +2235,8 @@ int cpu_support_arm_asimdhp()
2145
2235
{
2146
2236
try_initialize_global_cpu_info ();
2147
2237
#if __aarch64__
2238
+ if (is_cpu_arm_asimdhp_disabled)
2239
+ return 0 ;
2148
2240
#if defined _WIN32
2149
2241
return g_cpu_support_arm_asimdhp;
2150
2242
#elif defined __ANDROID__ || defined __linux__
@@ -2173,6 +2265,8 @@ int cpu_support_arm_cpuid()
2173
2265
{
2174
2266
try_initialize_global_cpu_info ();
2175
2267
#if __aarch64__
2268
+ if (is_cpu_arm_cpuid_disabled)
2269
+ return 0 ;
2176
2270
#if defined _WIN32
2177
2271
return g_cpu_support_arm_cpuid;
2178
2272
#elif defined __ANDROID__ || defined __linux__
@@ -2191,6 +2285,8 @@ int cpu_support_arm_asimddp()
2191
2285
{
2192
2286
try_initialize_global_cpu_info ();
2193
2287
#if __aarch64__
2288
+ if (is_cpu_arm_asimddp_disabled)
2289
+ return 0 ;
2194
2290
#if defined _WIN32
2195
2291
return g_cpu_support_arm_asimddp;
2196
2292
#elif defined __ANDROID__ || defined __linux__
@@ -2217,6 +2313,8 @@ int cpu_support_arm_asimdfhm()
2217
2313
{
2218
2314
try_initialize_global_cpu_info ();
2219
2315
#if __aarch64__
2316
+ if (is_cpu_arm_asimdfhm_disabled)
2317
+ return 0 ;
2220
2318
#if defined _WIN32
2221
2319
return g_cpu_support_arm_asimdfhm;
2222
2320
#elif defined __ANDROID__ || defined __linux__
@@ -2243,6 +2341,8 @@ int cpu_support_arm_bf16()
2243
2341
{
2244
2342
try_initialize_global_cpu_info ();
2245
2343
#if __aarch64__
2344
+ if (is_cpu_arm_bf16_disabled)
2345
+ return 0 ;
2246
2346
#if defined _WIN32
2247
2347
return g_cpu_support_arm_bf16;
2248
2348
#elif defined __ANDROID__ || defined __linux__
@@ -2267,6 +2367,8 @@ int cpu_support_arm_i8mm()
2267
2367
{
2268
2368
try_initialize_global_cpu_info ();
2269
2369
#if __aarch64__
2370
+ if (is_cpu_arm_i8mm_disabled)
2371
+ return 0 ;
2270
2372
#if defined _WIN32
2271
2373
return g_cpu_support_arm_i8mm;
2272
2374
#elif defined __ANDROID__ || defined __linux__
@@ -2291,6 +2393,8 @@ int cpu_support_arm_sve()
2291
2393
{
2292
2394
try_initialize_global_cpu_info ();
2293
2395
#if __aarch64__
2396
+ if (is_cpu_arm_sve_disabled)
2397
+ return 0 ;
2294
2398
#if defined _WIN32
2295
2399
return g_cpu_support_arm_sve;
2296
2400
#elif defined __ANDROID__ || defined __linux__
@@ -2309,6 +2413,8 @@ int cpu_support_arm_sve2()
2309
2413
{
2310
2414
try_initialize_global_cpu_info ();
2311
2415
#if __aarch64__
2416
+ if (is_cpu_arm_sve2_disabled)
2417
+ return 0 ;
2312
2418
#if defined _WIN32
2313
2419
return g_cpu_support_arm_sve2;
2314
2420
#elif defined __ANDROID__ || defined __linux__
@@ -2327,6 +2433,8 @@ int cpu_support_arm_svebf16()
2327
2433
{
2328
2434
try_initialize_global_cpu_info ();
2329
2435
#if __aarch64__
2436
+ if (is_cpu_arm_svebf16_disabled)
2437
+ return 0 ;
2330
2438
#if defined _WIN32
2331
2439
return g_cpu_support_arm_svebf16;
2332
2440
#elif defined __ANDROID__ || defined __linux__
@@ -2345,6 +2453,8 @@ int cpu_support_arm_svei8mm()
2345
2453
{
2346
2454
try_initialize_global_cpu_info ();
2347
2455
#if __aarch64__
2456
+ if (is_cpu_arm_svei8mm_disabled)
2457
+ return 0 ;
2348
2458
#if defined _WIN32
2349
2459
return g_cpu_support_arm_svei8mm;
2350
2460
#elif defined __ANDROID__ || defined __linux__
@@ -2363,6 +2473,8 @@ int cpu_support_arm_svef32mm()
2363
2473
{
2364
2474
try_initialize_global_cpu_info ();
2365
2475
#if __aarch64__
2476
+ if (is_cpu_arm_svef32mm_disabled)
2477
+ return 0 ;
2366
2478
#if defined _WIN32
2367
2479
return g_cpu_support_arm_svef32mm;
2368
2480
#elif defined __ANDROID__ || defined __linux__
@@ -2381,7 +2493,7 @@ int cpu_support_x86_avx()
2381
2493
{
2382
2494
try_initialize_global_cpu_info ();
2383
2495
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2384
- return g_cpu_support_x86_avx;
2496
+ return g_cpu_support_x86_avx && !is_cpu_x86_avx_disabled ;
2385
2497
#else
2386
2498
return 0 ;
2387
2499
#endif
@@ -2391,7 +2503,7 @@ int cpu_support_x86_fma()
2391
2503
{
2392
2504
try_initialize_global_cpu_info ();
2393
2505
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2394
- return g_cpu_support_x86_fma;
2506
+ return g_cpu_support_x86_fma && !is_cpu_x86_fma_disabled ;
2395
2507
#else
2396
2508
return 0 ;
2397
2509
#endif
@@ -2401,7 +2513,7 @@ int cpu_support_x86_xop()
2401
2513
{
2402
2514
try_initialize_global_cpu_info ();
2403
2515
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2404
- return g_cpu_support_x86_xop;
2516
+ return g_cpu_support_x86_xop && !is_cpu_x86_xop_disabled ;
2405
2517
#else
2406
2518
return 0 ;
2407
2519
#endif
@@ -2411,7 +2523,7 @@ int cpu_support_x86_f16c()
2411
2523
{
2412
2524
try_initialize_global_cpu_info ();
2413
2525
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2414
- return g_cpu_support_x86_f16c;
2526
+ return g_cpu_support_x86_f16c && !is_cpu_x86_f16c_disabled ;
2415
2527
#else
2416
2528
return 0 ;
2417
2529
#endif
@@ -2421,7 +2533,7 @@ int cpu_support_x86_avx2()
2421
2533
{
2422
2534
try_initialize_global_cpu_info ();
2423
2535
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2424
- return g_cpu_support_x86_avx2;
2536
+ return g_cpu_support_x86_avx2 && !is_cpu_x86_avx2_disabled ;
2425
2537
#else
2426
2538
return 0 ;
2427
2539
#endif
@@ -2431,7 +2543,7 @@ int cpu_support_x86_avx_vnni()
2431
2543
{
2432
2544
try_initialize_global_cpu_info ();
2433
2545
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2434
- return g_cpu_support_x86_avx_vnni;
2546
+ return g_cpu_support_x86_avx_vnni && !is_cpu_x86_avx_vnni_disabled ;
2435
2547
#else
2436
2548
return 0 ;
2437
2549
#endif
@@ -2441,7 +2553,7 @@ int cpu_support_x86_avx512()
2441
2553
{
2442
2554
try_initialize_global_cpu_info ();
2443
2555
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2444
- return g_cpu_support_x86_avx512;
2556
+ return g_cpu_support_x86_avx512 && !is_cpu_x86_avx512_disabled ;
2445
2557
#else
2446
2558
return 0 ;
2447
2559
#endif
@@ -2451,7 +2563,7 @@ int cpu_support_x86_avx512_vnni()
2451
2563
{
2452
2564
try_initialize_global_cpu_info ();
2453
2565
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2454
- return g_cpu_support_x86_avx512_vnni;
2566
+ return g_cpu_support_x86_avx512_vnni && !is_cpu_x86_avx512_vnni_disabled ;
2455
2567
#else
2456
2568
return 0 ;
2457
2569
#endif
@@ -2461,7 +2573,7 @@ int cpu_support_x86_avx512_bf16()
2461
2573
{
2462
2574
try_initialize_global_cpu_info ();
2463
2575
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2464
- return g_cpu_support_x86_avx512_bf16;
2576
+ return g_cpu_support_x86_avx512_bf16 && !is_cpu_x86_avx512_bf16_disabled ;
2465
2577
#else
2466
2578
return 0 ;
2467
2579
#endif
@@ -2471,7 +2583,7 @@ int cpu_support_x86_avx512_fp16()
2471
2583
{
2472
2584
try_initialize_global_cpu_info ();
2473
2585
#if defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_X64)
2474
- return g_cpu_support_x86_avx512_fp16;
2586
+ return g_cpu_support_x86_avx512_fp16 && !is_cpu_x86_avx512_fp16_disabled ;
2475
2587
#else
2476
2588
return 0 ;
2477
2589
#endif
@@ -2482,7 +2594,7 @@ int cpu_support_mips_msa()
2482
2594
try_initialize_global_cpu_info ();
2483
2595
#if defined __ANDROID__ || defined __linux__
2484
2596
#if __mips__
2485
- return g_hwcaps & HWCAP_MIPS_MSA;
2597
+ return ( g_hwcaps & HWCAP_MIPS_MSA) && !is_cpu_mips_msa_disabled ;
2486
2598
#else
2487
2599
return 0 ;
2488
2600
#endif
@@ -2496,7 +2608,7 @@ int cpu_support_loongarch_lsx()
2496
2608
try_initialize_global_cpu_info ();
2497
2609
#if defined __ANDROID__ || defined __linux__
2498
2610
#if __loongarch64
2499
- return g_hwcaps & HWCAP_LOONGARCH_LSX;
2611
+ return ( g_hwcaps & HWCAP_LOONGARCH_LSX) && !is_cpu_loongarch_lsx_disabled ;
2500
2612
#else
2501
2613
return 0 ;
2502
2614
#endif
@@ -2510,7 +2622,7 @@ int cpu_support_loongarch_lasx()
2510
2622
try_initialize_global_cpu_info ();
2511
2623
#if defined __ANDROID__ || defined __linux__
2512
2624
#if __loongarch64
2513
- return g_hwcaps & HWCAP_LOONGARCH_LASX;
2625
+ return ( g_hwcaps & HWCAP_LOONGARCH_LASX) && !is_cpu_loongarch_lasx_disabled ;
2514
2626
#else
2515
2627
return 0 ;
2516
2628
#endif
@@ -2524,7 +2636,7 @@ int cpu_support_loongson_mmi()
2524
2636
try_initialize_global_cpu_info ();
2525
2637
#if defined __ANDROID__ || defined __linux__
2526
2638
#if __mips__
2527
- return g_hwcaps & HWCAP_LOONGSON_MMI;
2639
+ return ( g_hwcaps & HWCAP_LOONGSON_MMI) && !is_cpu_loongson_mmi_disabled ;
2528
2640
#else
2529
2641
return 0 ;
2530
2642
#endif
@@ -2538,7 +2650,7 @@ int cpu_support_riscv_v()
2538
2650
try_initialize_global_cpu_info ();
2539
2651
#if defined __ANDROID__ || defined __linux__
2540
2652
#if __riscv
2541
- return g_hwcaps & COMPAT_HWCAP_ISA_V;
2653
+ return ( g_hwcaps & COMPAT_HWCAP_ISA_V) && !is_cpu_riscv_v_disabled ;
2542
2654
#else
2543
2655
return 0 ;
2544
2656
#endif
@@ -2554,7 +2666,7 @@ int cpu_support_riscv_zfh()
2554
2666
#if __riscv
2555
2667
// v + f does not imply zfh, but how to discover zfh properly ?
2556
2668
// 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;
2669
+ return ( g_hwcaps & COMPAT_HWCAP_ISA_V && g_hwcaps & COMPAT_HWCAP_ISA_F) && !is_cpu_riscv_zfh_disabled ;
2558
2670
#else
2559
2671
return 0 ;
2560
2672
#endif
0 commit comments