36 #include <visp3/core/vpConfig.h>
38 #ifdef VISP_HAVE_CATCH2
39 #define CATCH_CONFIG_ENABLE_BENCHMARKING
40 #define CATCH_CONFIG_RUNNER
43 #include <visp3/core/vpMatrix.h>
45 #if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
46 #include <opencv2/core.hpp>
49 #ifdef VISP_HAVE_EIGEN3
50 #include <Eigen/Dense>
56 bool g_runBenchmark =
false;
59 vpMatrix generateMatrix(
unsigned int sz1,
unsigned int sz2)
63 for (
unsigned int i = 0; i < M.getRows(); i++) {
64 for (
unsigned int j = 0; j < M.getCols(); j++) {
65 M[i][j] = i * M.getCols() + j;
72 vpMatrix generateMatrixTranspose(
unsigned int sz1,
unsigned int sz2)
76 for (
unsigned int j = 0; j < M.getCols(); j++) {
77 for (
unsigned int i = 0; i < M.getRows(); i++) {
78 M[i][j] = j * M.getRows() + i;
91 for (
unsigned int i = 0; i < A.
getRows(); i++) {
93 for (
unsigned int j = 0; j < A.
getCols(); j++) {
107 for (
unsigned int j = 0; j < A.
getCols(); j++) {
108 double *coli = At[j];
109 for (
unsigned int i = 0; i < A.
getRows(); i++) {
123 for (
unsigned int i = 0; i < A.
getRows(); i += tileSize) {
124 for (
unsigned int j = 0; j < A.
getCols(); j++) {
125 for (
unsigned int b = 0; b < tileSize && i + b < A.
getRows(); b++) {
126 At[j][i + b] = A[i + b][j];
140 const int nrows =
static_cast<int>(A.
getRows());
141 const int ncols =
static_cast<int>(A.
getCols());
143 for (
int i = 0; i < nrows;) {
144 for (; i <= nrows - tileSize; i += tileSize) {
146 for (; j <= ncols - tileSize; j += tileSize) {
147 for (
int k = i; k < i + tileSize; k++) {
148 for (
int l = j; l < j + tileSize; l++) {
154 for (
int k = i; k < i + tileSize; k++) {
155 for (
int l = j; l < ncols; l++) {
161 for (; i < nrows; i++) {
162 for (
int j = 0; j < ncols; j++) {
173 TEST_CASE(
"Benchmark vpMatrix transpose",
"[benchmark]")
175 if (g_runBenchmark) {
176 const std::vector<std::pair<int, int> > sizes = {
177 {701, 1503}, {1791, 837}, {1201, 1201}, {1024, 1024}, {2000, 2000}, {10, 6}, {25, 6}, {100, 6}, {200, 6},
178 {500, 6}, {1000, 6}, {1500, 6}, {2000, 6}, {6, 10}, {6, 25}, {6, 100}, {6, 200}, {6, 500},
179 {6, 1000}, {6, 1500}, {6, 2000}, {640, 1000}, {800, 640}, {640, 500}, {500, 640}, {640, 837}};
181 for (
auto sz : sizes) {
182 vpMatrix M = generateMatrix(sz.first, sz.second);
183 vpMatrix Mt_true = generateMatrixTranspose(sz.first, sz.second);
185 std::ostringstream oss;
186 oss << sz.first <<
"x" << sz.second;
188 BENCHMARK(oss.str().c_str())
191 REQUIRE(Mt == Mt_true);
196 oss << sz.first <<
"x" << sz.second;
197 oss <<
" - transposeIterateSrc(M)";
198 BENCHMARK(oss.str().c_str())
200 vpMatrix Mt = transposeIterateSrc(M);
201 REQUIRE(Mt == Mt_true);
206 oss << sz.first <<
"x" << sz.second;
207 oss <<
" - transposeIterateDst(M)";
208 BENCHMARK(oss.str().c_str())
210 vpMatrix Mt = transposeIterateDst(M);
211 REQUIRE(Mt == Mt_true);
216 oss << sz.first <<
"x" << sz.second;
217 oss <<
" - transposeTilingSO(M, tileSize=" << g_tileSize <<
")";
218 BENCHMARK(oss.str().c_str())
220 vpMatrix Mt = transposeTilingSO(M, g_tileSize);
221 REQUIRE(Mt == Mt_true);
226 oss << sz.first <<
"x" << sz.second;
227 oss <<
" - transposeTiling(M, tileSize=" << g_tileSize <<
")";
228 BENCHMARK(oss.str().c_str())
230 vpMatrix Mt = transposeTiling(M, g_tileSize);
231 REQUIRE(Mt == Mt_true);
235 #if (VISP_HAVE_OPENCV_VERSION >= 0x030000)
236 cv::Mat matM(sz.first, sz.second, CV_64FC1);
238 for (
unsigned int i = 0; i < M.
getRows(); i++) {
239 for (
unsigned int j = 0; j < M.
getCols(); j++) {
240 matM.at<
double>(i, j) = M[i][j];
245 oss << sz.first <<
"x" << sz.second;
247 BENCHMARK(oss.str().c_str())
249 cv::Mat matMt = matM.t();
254 #ifdef VISP_HAVE_EIGEN3
255 Eigen::MatrixXd eigenM(sz.first, sz.second);
257 for (
unsigned int i = 0; i < M.
getRows(); i++) {
258 for (
unsigned int j = 0; j < M.
getCols(); j++) {
259 eigenM(i, j) = M[i][j];
264 oss << sz.first <<
"x" << sz.second;
266 BENCHMARK(oss.str().c_str())
268 Eigen::MatrixXd eigenMt = eigenM.
transpose();
274 vpMatrix M = generateMatrix(11, 17);
275 vpMatrix Mt_true = generateMatrixTranspose(11, 17);
278 REQUIRE(Mt == Mt_true);
282 int main(
int argc,
char *argv[])
284 Catch::Session session;
287 using namespace Catch::clara;
288 auto cli = session.cli()
289 | Opt(g_runBenchmark)
292 | Opt(g_tileSize,
"tileSize")[
"--tileSize"](
"Tile size?");
298 session.applyCommandLine(argc, argv);
300 int numFailed = session.run();
310 int main() {
return EXIT_SUCCESS; }
unsigned int getCols() const
void resize(unsigned int nrows, unsigned int ncols, bool flagNullify=true, bool recopy_=true)
unsigned int getRows() const
Implementation of a matrix and operations on matrices.
vpMatrix transpose() const