// 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
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
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
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
\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
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
};\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
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
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
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
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
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
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
}\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