[x265] [PATCH] Add --nobench to TestBench to disable benchmarking

George Steed george.steed at arm.com
Fri Oct 11 16:40:07 UTC 2024


Allow disabling benchmarking if we are just running tests to check for
correctness. This requires us to refactor parameter parsing to enable
options without an argument.
---
 source/test/testbench.cpp | 72 +++++++++++++++++++++++----------------
 1 file changed, 42 insertions(+), 30 deletions(-)

diff --git a/source/test/testbench.cpp b/source/test/testbench.cpp
index de5fef2c2..ac93e37b3 100644
--- a/source/test/testbench.cpp
+++ b/source/test/testbench.cpp
@@ -83,9 +83,10 @@ const char* const* chromaPartStr[X265_CSP_COUNT] =
 void do_help()
 {
     printf("x265 optimized primitive testbench\n\n");
-    printf("usage: TestBench [--cpuid CPU] [--testbench BENCH] [--help]\n\n");
+    printf("usage: TestBench [--cpuid CPU] [--testbench BENCH] [--nobench] [--help]\n\n");
     printf("       CPU is comma separated SIMD arch list, example: SSE4,AVX\n");
     printf("       BENCH is one of (pixel,transforms,interp,intrapred)\n\n");
+    printf("       --nobench disables running benchmarks, only run correctness tests\n\n");
     printf("By default, the test bench will test all benches on detected CPU architectures\n");
     printf("Options and testbench name may be truncated.\n");
 }
@@ -100,13 +101,9 @@ int main(int argc, char *argv[])
     bool enableavx512 = true;
     int cpuid = X265_NS::cpu_detect(enableavx512);
     const char *testname = 0;
+    bool run_benchmarks = true;
 
-    if (!(argc & 1))
-    {
-        do_help();
-        return 0;
-    }
-    for (int i = 1; i < argc - 1; i += 2)
+    for (int i = 1; i < argc; )
     {
         if (strncmp(argv[i], "--", 2))
         {
@@ -115,8 +112,13 @@ int main(int argc, char *argv[])
             return 1;
         }
         const char *name = argv[i] + 2;
-        const char *value = argv[i + 1];
-        if (!strncmp(name, "cpuid", strlen(name)))
+        const char *value = i + 1 < argc ? argv[i + 1] : "";
+        if (!strncmp(name, "help", strlen(name)))
+        {
+          do_help();
+          return 0;
+        }
+        else if (!strncmp(name, "cpuid", strlen(name)))
         {
             bool bError = false;
             cpuid = parseCpuName(value, bError, enableavx512);
@@ -125,11 +127,19 @@ int main(int argc, char *argv[])
                 printf("Invalid CPU name: %s\n", value);
                 return 1;
             }
+            i += 2;
         }
         else if (!strncmp(name, "testbench", strlen(name)))
         {
             testname = value;
             printf("Testing only harnesses that match name <%s>\n", testname);
+            i += 2;
+        }
+        else if (!strncmp(name, "nobench", strlen(name)))
+        {
+            printf("Disabling performance benchmarking\n");
+            run_benchmarks = false;
+            i += 1;
         }
         else
         {
@@ -233,34 +243,36 @@ int main(int argc, char *argv[])
     }
 
     /******************* Cycle count for all primitives **********************/
-
-    EncoderPrimitives optprim;
-    memset(&optprim, 0, sizeof(optprim));
+    if (run_benchmarks)
+    {
+        EncoderPrimitives optprim;
+        memset(&optprim, 0, sizeof(optprim));
 #if defined(X265_ARCH_X86) || defined(X265_ARCH_ARM64)
-    setupIntrinsicPrimitives(optprim, cpuid);
+        setupIntrinsicPrimitives(optprim, cpuid);
 #endif
 
-    setupAssemblyPrimitives(optprim, cpuid);
+        setupAssemblyPrimitives(optprim, cpuid);
 
-    /* Note that we do not setup aliases for performance tests, that would be
-     * redundant. The testbench only verifies they are correctly aliased */
+        /* Note that we do not setup aliases for performance tests, that would be
+         * redundant. The testbench only verifies they are correctly aliased */
 
-    /* some hybrid primitives may rely on other primitives in the
-     * global primitive table, so set up those pointers. This is a
-     * bit ugly, but I don't see a better solution */
-    memcpy(&primitives, &optprim, sizeof(EncoderPrimitives));
+        /* some hybrid primitives may rely on other primitives in the
+         * global primitive table, so set up those pointers. This is a
+         * bit ugly, but I don't see a better solution */
+        memcpy(&primitives, &optprim, sizeof(EncoderPrimitives));
 
-    printf("\nTest performance improvement with full optimizations\n");
-    fflush(stdout);
+        printf("\nTest performance improvement with full optimizations\n");
+        fflush(stdout);
 
-    for (size_t h = 0; h < sizeof(harness) / sizeof(TestHarness*); h++)
-    {
-        if (testname && strncmp(testname, harness[h]->getName(), strlen(testname)))
-            continue;
-        printf("== %s primitives ==\n", harness[h]->getName());
-        harness[h]->measureSpeed(cprim, optprim);
-    }
+        for (size_t h = 0; h < sizeof(harness) / sizeof(TestHarness*); h++)
+        {
+            if (testname && strncmp(testname, harness[h]->getName(), strlen(testname)))
+                continue;
+            printf("== %s primitives ==\n", harness[h]->getName());
+            harness[h]->measureSpeed(cprim, optprim);
+        }
 
-    printf("\n");
+        printf("\n");
+    }
     return 0;
 }
-- 
2.34.1

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-nobench-to-TestBench-to-disable-benchmarking.patch
Type: text/x-diff
Size: 5397 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20241011/3241634b/attachment.patch>


More information about the x265-devel mailing list