added more GPU perf. tests, refactored
authorAlexey Spizhevoy <no@email>
Wed, 26 Jan 2011 07:49:56 +0000 (07:49 +0000)
committerAlexey Spizhevoy <no@email>
Wed, 26 Jan 2011 07:49:56 +0000 (07:49 +0000)
samples/gpu/performance/performance.cpp
samples/gpu/performance/performance.h
samples/gpu/performance/tests.cpp

index 68d5811829bcefd56355ce2fdb457c7fc348a95a..c112072081db4a682d6864bb411b59155b88f759 100644 (file)
@@ -9,11 +9,14 @@ void TestSystem::run()
     // Run initializers\r
     vector<Runnable*>::iterator it = inits_.begin();\r
     for (; it != inits_.end(); ++it)\r
+    {\r
         (*it)->run();\r
+    }\r
 \r
     cout << setiosflags(ios_base::left);\r
     cout << TAB << setw(10) << "CPU, ms" << setw(10) << "GPU, ms" \r
-        << setw(10) << "SPEEDUP" << "DESCRIPTION\n";\r
+        << setw(10) << "SPEEDUP" \r
+        << "DESCRIPTION\n";\r
     cout << resetiosflags(ios_base::left);\r
 \r
     // Run tests\r
@@ -24,30 +27,23 @@ void TestSystem::run()
         try\r
         {\r
             (*it)->run();\r
-            flush_subtest_data();\r
+            flushSubtestData();\r
         }\r
-        catch (const cv::Exception& e)\r
+        catch (const cv::Exception&)\r
         {\r
-            cout << TAB << "error";\r
-            switch (e.code)\r
-            {\r
-                case CV_StsNoMem: cout << ": out of memory"; break;\r
-            }\r
-            if (!description_.str().empty())\r
-                cout << " [" << description_.str() << "]";\r
-            cout << endl;\r
-            reset_subtest_data();\r
+            resetSubtestData();\r
         }\r
     }\r
 \r
-    cout << setiosflags(ios_base::fixed | ios_base::left);\r
-    cout << "\naverage GPU speedup: x" << setprecision(3) \r
-        << speedup_total_ / num_subtests_called_ << endl;\r
-    cout << resetiosflags(ios_base::fixed | ios_base::left);\r
+    cout << setiosflags(ios_base::fixed);\r
+    cout << "\naverage GPU speedup: x" \r
+        << setprecision(3) << speedup_total_ / num_subtests_called_ \r
+        << endl;\r
+    cout << resetiosflags(ios_base::fixed);\r
 }\r
 \r
 \r
-void TestSystem::flush_subtest_data()\r
+void TestSystem::flushSubtestData()\r
 {\r
     if (!can_flush_)\r
         return;\r
@@ -58,9 +54,10 @@ void TestSystem::flush_subtest_data()
     double speedup = static_cast<double>(cpu_time) / std::max(1, gpu_time);\r
     speedup_total_ += speedup;\r
 \r
-    cout << TAB << setiosflags(ios_base::fixed | ios_base::left);\r
+    cout << TAB << setiosflags(ios_base::left);\r
 \r
     stringstream stream;\r
+\r
     stream << cpu_time;\r
     cout << setw(10) << stream.str();\r
 \r
@@ -73,11 +70,10 @@ void TestSystem::flush_subtest_data()
     cout << setw(10) << stream.str();\r
 \r
     cout << description_.str();\r
-\r
-    cout << resetiosflags(ios_base::fixed | ios_base::left) << endl;\r
+    cout << resetiosflags(ios_base::left) << endl;\r
     \r
     num_subtests_called_++;\r
-    reset_subtest_data();\r
+    resetSubtestData();\r
 }\r
 \r
 \r
index 7b833b057e8043a470984d9f95c65ddb6169c7c4..9ed575b9b82ce789ecc97548783621e51ce691bc 100644 (file)
@@ -38,6 +38,13 @@ public:
 \r
     void run();\r
 \r
+    // Ends current subtest and starts new one\r
+    std::stringstream& subtest()\r
+    {\r
+        flushSubtestData();\r
+        return description_;\r
+    }\r
+\r
     void cpuOn() { cpu_started_ = cv::getTickCount(); }\r
 \r
     void cpuOff() \r
@@ -56,20 +63,13 @@ public:
         can_flush_ = true;\r
     }\r
 \r
-    // Ends current subtest and starts new one\r
-    std::stringstream& subtest()\r
-    {\r
-        flush_subtest_data();\r
-        return description_;\r
-    }\r
-\r
 private:\r
     TestSystem(): can_flush_(false), cpu_elapsed_(0), gpu_elapsed_(0), \r
                   speedup_total_(0.0), num_subtests_called_(0) {};\r
 \r
-    void flush_subtest_data();\r
+    void flushSubtestData();\r
 \r
-    void reset_subtest_data() \r
+    void resetSubtestData() \r
     {\r
         cpu_elapsed_ = 0;\r
         gpu_elapsed_ = 0;\r
@@ -93,17 +93,6 @@ private:
 };\r
 \r
 \r
-#define TEST(name) \\r
-    struct name##_test: Runnable \\r
-    { \\r
-        name##_test(): Runnable(#name) { \\r
-            TestSystem::instance()->addTest(this); \\r
-        } \\r
-        void run(); \\r
-    } name##_test_instance; \\r
-    void name##_test::run()\r
-\r
-\r
 #define INIT(name) \\r
     struct name##_init: Runnable \\r
     { \\r
@@ -115,12 +104,22 @@ private:
     void name##_init::run()\r
 \r
 \r
+#define TEST(name) \\r
+    struct name##_test: Runnable \\r
+    { \\r
+        name##_test(): Runnable(#name) { \\r
+            TestSystem::instance()->addTest(this); \\r
+        } \\r
+        void run(); \\r
+    } name##_test_instance; \\r
+    void name##_test::run()\r
+\r
+#define SUBTEST TestSystem::instance()->subtest()\r
+#define DESCRIPTION TestSystem::instance()->subtest()\r
 #define CPU_ON TestSystem::instance()->cpuOn()\r
 #define GPU_ON TestSystem::instance()->gpuOn()\r
 #define CPU_OFF TestSystem::instance()->cpuOff()\r
 #define GPU_OFF TestSystem::instance()->gpuOff()\r
-#define SUBTEST TestSystem::instance()->subtest()\r
-#define DESCRIPTION TestSystem::instance()->subtest()\r
 \r
 void gen(cv::Mat& mat, int rows, int cols, int type, cv::Scalar low, \r
          cv::Scalar high);\r
index f0729b9c4e7f2f07b4ec215f37f088d22b67c5b1..7ef8ad4c3f2f6124b47bad71b2db5829c773b312 100644 (file)
@@ -6,42 +6,40 @@
 using namespace std;\r
 using namespace cv;\r
 \r
-// This code calls CUFFT DFT and initializes that lib\r
-INIT(CUFFT_library)\r
+INIT(matchTemplate)\r
 {\r
-    Mat src, templ;\r
-    gen(src, 500, 500, CV_32F, 0, 1);\r
-    gen(templ, 500, 500, CV_32F, 0, 1);\r
+    Mat src; gen(src, 500, 500, CV_32F, 0, 1);\r
+    Mat templ; gen(templ, 500, 500, CV_32F, 0, 1);\r
 \r
-    gpu::GpuMat d_src(src);\r
-    gpu::GpuMat d_templ(templ);\r
-    gpu::GpuMat d_result;\r
+    gpu::GpuMat d_src(src), d_templ(templ), d_dst;\r
 \r
-    gpu::matchTemplate(d_src, d_templ, d_result, CV_TM_CCORR);\r
+    gpu::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR);\r
 }\r
 \r
 \r
 TEST(matchTemplate)\r
 {\r
-    Mat src, templ, result;\r
+    Mat src, templ, dst;\r
     gen(src, 3000, 3000, CV_32F, 0, 1);\r
 \r
-    gpu::GpuMat d_image(src), d_templ, d_result;\r
+    gpu::GpuMat d_src(src), d_templ, d_dst;\r
 \r
-    for (int templ_size = 5; templ_size <= 1000; templ_size *= 2)\r
+    for (int templ_size = 5; templ_size < 200; templ_size *= 5)\r
     {\r
         SUBTEST << "src " << src.rows << ", templ " << templ_size << ", 32F, CCORR";\r
 \r
         gen(templ, templ_size, templ_size, CV_32F, 0, 1);\r
+        dst.create(src.rows - templ.rows + 1, src.cols - templ.cols + 1, CV_32F);\r
 \r
         CPU_ON;\r
-        matchTemplate(src, templ, result, CV_TM_CCORR);\r
+        matchTemplate(src, templ, dst, CV_TM_CCORR);\r
         CPU_OFF;\r
 \r
         d_templ = templ;\r
+        d_dst.create(d_src.rows - d_templ.rows + 1, d_src.cols - d_templ.cols + 1, CV_32F);\r
 \r
         GPU_ON;\r
-        gpu::matchTemplate(d_image, d_templ, d_result, CV_TM_CCORR);\r
+        gpu::matchTemplate(d_src, d_templ, d_dst, CV_TM_CCORR);\r
         GPU_OFF;\r
     }\r
 }\r
@@ -86,6 +84,7 @@ TEST(remap)
         gen(src, size, size, CV_8UC1, 0, 256);\r
         gen(xmap, size, size, CV_32F, 0, size);\r
         gen(ymap, size, size, CV_32F, 0, size);\r
+        dst.create(xmap.size(), src.type());\r
 \r
         CPU_ON;\r
         remap(src, dst, xmap, ymap, INTER_LINEAR);\r
@@ -94,6 +93,7 @@ TEST(remap)
         d_src = src;\r
         d_xmap = xmap;\r
         d_ymap = ymap;\r
+        d_dst.create(d_xmap.size(), d_src.type());\r
 \r
         GPU_ON;\r
         gpu::remap(d_src, d_dst, d_xmap, d_ymap);\r
@@ -107,17 +107,19 @@ TEST(dft)
     Mat src, dst;\r
     gpu::GpuMat d_src, d_dst;\r
 \r
-    for (int size = 1000; size <= 8000; size *= 2)\r
+    for (int size = 1000; size <= 4000; size *= 2)\r
     {\r
         SUBTEST << "size " << size << ", 32FC2, complex-to-complex";\r
 \r
         gen(src, size, size, CV_32FC2, Scalar::all(0), Scalar::all(1));\r
+        dst.create(src.size(), src.type());\r
 \r
         CPU_ON;\r
         dft(src, dst);\r
         CPU_OFF;\r
 \r
         d_src = src;\r
+        d_dst.create(d_src.size(), d_src.type());\r
 \r
         GPU_ON;\r
         gpu::dft(d_src, d_dst, Size(size, size));\r
@@ -136,12 +138,14 @@ TEST(cornerHarris)
         SUBTEST << "size " << size << ", 32FC1";\r
 \r
         gen(src, size, size, CV_32F, 0, 1);\r
+        dst.create(src.size(), src.type());\r
 \r
         CPU_ON;\r
         cornerHarris(src, dst, 5, 7, 0.1, BORDER_REFLECT101);\r
         CPU_OFF;\r
 \r
         d_src = src;\r
+        d_dst.create(src.size(), src.type());\r
 \r
         GPU_ON;\r
         gpu::cornerHarris(d_src, d_dst, 5, 7, 0.1);\r
@@ -150,22 +154,51 @@ TEST(cornerHarris)
 }\r
 \r
 \r
-TEST(memoryAllocation)\r
+TEST(integral)\r
 {\r
-    Mat mat;\r
-    gpu::GpuMat d_mat;\r
+    Mat src, sum;\r
+    gpu::GpuMat d_src, d_sum;\r
+\r
+    for (int size = 1000; size <= 8000; size *= 2)\r
+    {\r
+        SUBTEST << "size " << size << ", 8U";\r
 \r
-    int begin = 100, end = 8000, step = 100;\r
+        gen(src, size, size, CV_8U, 0, 256);\r
+        sum.create(size + 1, size + 1, CV_32S);\r
 \r
-    DESCRIPTION << "32F matrices from " << begin << " to " << end;\r
+        CPU_ON;\r
+        integral(src, sum);\r
+        CPU_OFF;\r
 \r
-    CPU_ON;\r
-    for (int size = begin; size <= end; size += step)\r
-        mat.create(size, size, CV_32FC1);\r
-    CPU_OFF;\r
+        d_src = src;\r
+        d_sum.create(size + 1, size + 1, CV_32S);\r
 \r
-    GPU_ON;\r
-    for (int size = begin; size <= end; size += step)\r
-        d_mat.create(size, size, CV_32FC1);\r
-    GPU_OFF;\r
+        GPU_ON;\r
+        gpu::integral(d_src, d_sum);\r
+        GPU_OFF;\r
+    }\r
+}\r
+\r
+\r
+TEST(norm)\r
+{\r
+    Mat src;\r
+    gpu::GpuMat d_src;\r
+\r
+    for (int size = 1000; size <= 8000; size *= 2)\r
+    {\r
+        SUBTEST << "size " << size << ", 8U";\r
+\r
+        gen(src, size, size, CV_8U, 0, 256);\r
+\r
+        CPU_ON;\r
+        norm(src);\r
+        CPU_OFF;\r
+\r
+        d_src = src;\r
+\r
+        GPU_ON;\r
+        gpu::norm(d_src);\r
+        GPU_OFF;\r
+    }\r
 }\r