mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-25 17:28:50 -05:00
Added a benchmark framework
This commit is contained in:
parent
2efa7ab594
commit
375db9ae21
@ -214,6 +214,7 @@ endif()
|
|||||||
add_subdirectory(sdrbase)
|
add_subdirectory(sdrbase)
|
||||||
add_subdirectory(sdrgui)
|
add_subdirectory(sdrgui)
|
||||||
add_subdirectory(sdrsrv)
|
add_subdirectory(sdrsrv)
|
||||||
|
add_subdirectory(sdrbench)
|
||||||
add_subdirectory(httpserver)
|
add_subdirectory(httpserver)
|
||||||
add_subdirectory(logging)
|
add_subdirectory(logging)
|
||||||
add_subdirectory(qrtplib)
|
add_subdirectory(qrtplib)
|
||||||
@ -293,6 +294,29 @@ target_link_libraries(sdrangelsrv
|
|||||||
|
|
||||||
qt5_use_modules(sdrangelsrv Multimedia)
|
qt5_use_modules(sdrangelsrv Multimedia)
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# main benchmark application
|
||||||
|
|
||||||
|
set(sdrangelbench_SOURCES
|
||||||
|
appbench/main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
add_executable(sdrangelbench
|
||||||
|
${sdrangelbench_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(sdrangelbench
|
||||||
|
PUBLIC ${CMAKE_SOURCE_DIR}/sdrbench
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(sdrangelbench
|
||||||
|
sdrbench
|
||||||
|
logging
|
||||||
|
${QT_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
qt5_use_modules(sdrangelbench Multimedia)
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
if (BUILD_DEBIAN)
|
if (BUILD_DEBIAN)
|
||||||
@ -325,6 +349,7 @@ endif(LIBUSB_FOUND AND UNIX)
|
|||||||
#install targets
|
#install targets
|
||||||
install(TARGETS sdrangel DESTINATION bin)
|
install(TARGETS sdrangel DESTINATION bin)
|
||||||
install(TARGETS sdrangelsrv DESTINATION bin)
|
install(TARGETS sdrangelsrv DESTINATION bin)
|
||||||
|
install(TARGETS sdrangelbench DESTINATION bin)
|
||||||
#install(TARGETS sdrbase DESTINATION lib)
|
#install(TARGETS sdrbase DESTINATION lib)
|
||||||
|
|
||||||
#install files and directories
|
#install files and directories
|
||||||
|
110
appbench/main.cpp
Normal file
110
appbench/main.cpp
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
||||||
|
// //
|
||||||
|
// Swagger server adapter interface //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation as version 3 of the License, or //
|
||||||
|
// //
|
||||||
|
// This program is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License V3 for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QSysInfo>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "loggerwithfile.h"
|
||||||
|
#include "mainbench.h"
|
||||||
|
#include "dsp/dsptypes.h"
|
||||||
|
|
||||||
|
void handler(int sig) {
|
||||||
|
fprintf(stderr, "quit the application by signal(%d).\n", sig);
|
||||||
|
QCoreApplication::quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
void catchUnixSignals(const std::vector<int>& quitSignals) {
|
||||||
|
sigset_t blocking_mask;
|
||||||
|
sigemptyset(&blocking_mask);
|
||||||
|
|
||||||
|
for (std::vector<int>::const_iterator it = quitSignals.begin(); it != quitSignals.end(); ++it) {
|
||||||
|
sigaddset(&blocking_mask, *it);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct sigaction sa;
|
||||||
|
sa.sa_handler = handler;
|
||||||
|
sa.sa_mask = blocking_mask;
|
||||||
|
sa.sa_flags = 0;
|
||||||
|
|
||||||
|
for (std::vector<int>::const_iterator it = quitSignals.begin(); it != quitSignals.end(); ++it) {
|
||||||
|
sigaction(*it, &sa, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int runQtApplication(int argc, char* argv[], qtwebapp::LoggerWithFile *logger)
|
||||||
|
{
|
||||||
|
QCoreApplication a(argc, argv);
|
||||||
|
|
||||||
|
QCoreApplication::setOrganizationName("f4exb");
|
||||||
|
QCoreApplication::setApplicationName("SDRangelBench");
|
||||||
|
QCoreApplication::setApplicationVersion("3.14.5");
|
||||||
|
|
||||||
|
int catchSignals[] = {SIGQUIT, SIGINT, SIGTERM, SIGHUP};
|
||||||
|
std::vector<int> vsig(catchSignals, catchSignals + sizeof(catchSignals) / sizeof(int));
|
||||||
|
catchUnixSignals(vsig);
|
||||||
|
|
||||||
|
ParserBench parser;
|
||||||
|
parser.parse(a);
|
||||||
|
|
||||||
|
#if QT_VERSION >= 0x050400
|
||||||
|
qInfo("%s %s Qt %s %db %s %s DSP Rx:%db Tx:%db PID %lld",
|
||||||
|
qPrintable(QCoreApplication::applicationName()),
|
||||||
|
qPrintable(QCoreApplication::applicationVersion()),
|
||||||
|
qPrintable(QString(QT_VERSION_STR)),
|
||||||
|
QT_POINTER_SIZE*8,
|
||||||
|
qPrintable(QSysInfo::currentCpuArchitecture()),
|
||||||
|
qPrintable(QSysInfo::prettyProductName()),
|
||||||
|
SDR_RX_SAMP_SZ,
|
||||||
|
SDR_TX_SAMP_SZ,
|
||||||
|
QCoreApplication::applicationPid());
|
||||||
|
#else
|
||||||
|
qInfo("%s %s Qt %s %db DSP Rx:%db Tx:%db PID %lld",
|
||||||
|
qPrintable(QCoreApplication::applicationName()),
|
||||||
|
qPrintable((QCoreApplication::>applicationVersion()),
|
||||||
|
qPrintable(QString(QT_VERSION_STR)),
|
||||||
|
QT_POINTER_SIZE*8,
|
||||||
|
SDR_RX_SAMP_SZ,
|
||||||
|
SDR_TX_SAMP_SZ,
|
||||||
|
QCoreApplication::applicationPid());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MainBench m(logger, parser, &a);
|
||||||
|
|
||||||
|
// This will cause the application to exit when the main core is finished
|
||||||
|
QObject::connect(&m, SIGNAL(finished()), &a, SLOT(quit()));
|
||||||
|
// This will run the task from the application event loop
|
||||||
|
QTimer::singleShot(0, &m, SLOT(run()));
|
||||||
|
|
||||||
|
return a.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
qtwebapp::LoggerWithFile *logger = new qtwebapp::LoggerWithFile(qApp);
|
||||||
|
logger->installMsgHandler();
|
||||||
|
int res = runQtApplication(argc, argv, logger);
|
||||||
|
qWarning("SDRangel quit.");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
42
sdrbench/CMakeLists.txt
Normal file
42
sdrbench/CMakeLists.txt
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
project (sdrbench)
|
||||||
|
|
||||||
|
set(sdrbench_SOURCES
|
||||||
|
mainbench.cpp
|
||||||
|
parserbench.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(sdrbench_HEADERS
|
||||||
|
mainbench.h
|
||||||
|
parserbench.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(sdrbench_SOURCES
|
||||||
|
${sdrbench_SOURCES}
|
||||||
|
${sdrbench_HEADERS}
|
||||||
|
)
|
||||||
|
|
||||||
|
add_definitions(${QT_DEFINITIONS})
|
||||||
|
add_definitions(-DQT_SHARED)
|
||||||
|
|
||||||
|
add_library(sdrbench SHARED
|
||||||
|
${sdrbench_SOURCES}
|
||||||
|
${sdrbench_HEADERS_MOC}
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
.
|
||||||
|
${CMAKE_SOURCE_DIR}/logging
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(sdrbench
|
||||||
|
${QT_LIBRARIES}
|
||||||
|
logging
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_features(sdrbench PRIVATE cxx_generalized_initializers) # cmake >= 3.1.0
|
||||||
|
|
||||||
|
qt5_use_modules(sdrbench Core Gui)
|
||||||
|
|
||||||
|
install(TARGETS sdrbench DESTINATION lib)
|
||||||
|
|
46
sdrbench/mainbench.cpp
Normal file
46
sdrbench/mainbench.cpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
||||||
|
// //
|
||||||
|
// Swagger server adapter interface //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation as version 3 of the License, or //
|
||||||
|
// //
|
||||||
|
// This program is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License V3 for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include "mainbench.h"
|
||||||
|
|
||||||
|
MainBench *MainBench::m_instance = 0;
|
||||||
|
|
||||||
|
MainBench::MainBench(qtwebapp::LoggerWithFile *logger, const ParserBench& parser, QObject *parent) :
|
||||||
|
QObject(parent),
|
||||||
|
m_logger(logger),
|
||||||
|
m_parser(parser)
|
||||||
|
{
|
||||||
|
qDebug() << "MainBench::MainBench: start";
|
||||||
|
m_instance = this;
|
||||||
|
qDebug() << "MainBench::MainBench: end";
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainBench::run()
|
||||||
|
{
|
||||||
|
qDebug() << "MainBench::run: work in progress";
|
||||||
|
qDebug() << "MainBench::run: parameters:"
|
||||||
|
<< " test: " << m_parser.getTest()
|
||||||
|
<< " nsamples: " << m_parser.getNbSamples()
|
||||||
|
<< " repet: " << m_parser.getRepetition()
|
||||||
|
<< " log2f: " << m_parser.getLog2Factor();
|
||||||
|
emit finished();
|
||||||
|
}
|
||||||
|
|
||||||
|
MainBench::~MainBench()
|
||||||
|
{}
|
49
sdrbench/mainbench.h
Normal file
49
sdrbench/mainbench.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2018 Edouard Griffiths, F4EXB. //
|
||||||
|
// //
|
||||||
|
// Swagger server adapter interface //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation as version 3 of the License, or //
|
||||||
|
// //
|
||||||
|
// This program is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License V3 for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SDRBENCH_MAINBENCH_H_
|
||||||
|
#define SDRBENCH_MAINBENCH_H_
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "parserbench.h"
|
||||||
|
|
||||||
|
namespace qtwebapp {
|
||||||
|
class LoggerWithFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainBench: public QObject {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainBench(qtwebapp::LoggerWithFile *logger, const ParserBench& parser, QObject *parent = 0);
|
||||||
|
~MainBench();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void run();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void finished();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static MainBench *m_instance;
|
||||||
|
qtwebapp::LoggerWithFile *m_logger;
|
||||||
|
const ParserBench& m_parser;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SDRBENCH_MAINBENCH_H_
|
113
sdrbench/parserbench.cpp
Normal file
113
sdrbench/parserbench.cpp
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2018 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation as version 3 of the License, or //
|
||||||
|
// //
|
||||||
|
// This program is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License V3 for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include <QCommandLineOption>
|
||||||
|
#include <QRegExpValidator>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "parserbench.h"
|
||||||
|
|
||||||
|
ParserBench::ParserBench() :
|
||||||
|
m_testOption(QStringList() << "t" << "test",
|
||||||
|
"Test type.",
|
||||||
|
"test",
|
||||||
|
"decimate"),
|
||||||
|
m_nbSamplesOption(QStringList() << "n" << "nb-samples",
|
||||||
|
"Number of sample to deal with.",
|
||||||
|
"samples",
|
||||||
|
"1048576"),
|
||||||
|
m_repetitionOption(QStringList() << "r" << "repeat",
|
||||||
|
"Number of repetitions.",
|
||||||
|
"repetition",
|
||||||
|
"1"),
|
||||||
|
m_log2FactorOption(QStringList() << "l" << "log2-factor",
|
||||||
|
"Log2 factor for rate conversion.",
|
||||||
|
"log2",
|
||||||
|
"2")
|
||||||
|
{
|
||||||
|
m_test = "decimate";
|
||||||
|
m_nbSamples = 1048576;
|
||||||
|
m_repetition = 1;
|
||||||
|
m_log2Factor = 4;
|
||||||
|
|
||||||
|
m_parser.setApplicationDescription("Software Defined Radio application benchmarks");
|
||||||
|
m_parser.addHelpOption();
|
||||||
|
m_parser.addVersionOption();
|
||||||
|
|
||||||
|
m_parser.addOption(m_testOption);
|
||||||
|
m_parser.addOption(m_nbSamplesOption);
|
||||||
|
m_parser.addOption(m_repetitionOption);
|
||||||
|
m_parser.addOption(m_log2FactorOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
ParserBench::~ParserBench()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void ParserBench::parse(const QCoreApplication& app)
|
||||||
|
{
|
||||||
|
m_parser.process(app);
|
||||||
|
|
||||||
|
int pos;
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
// test switch
|
||||||
|
|
||||||
|
QString test = m_parser.value(m_testOption);
|
||||||
|
|
||||||
|
QString testStr = "(decimate)";
|
||||||
|
QRegExp ipRegex ("^" + testStr + "$");
|
||||||
|
QRegExpValidator ipValidator(ipRegex);
|
||||||
|
|
||||||
|
if (ipValidator.validate(test, pos) == QValidator::Acceptable) {
|
||||||
|
m_test = test;
|
||||||
|
} else {
|
||||||
|
qWarning() << "ParserBench::parse: test type invalid. Defaulting to " << m_test;
|
||||||
|
}
|
||||||
|
|
||||||
|
// number of samples
|
||||||
|
|
||||||
|
QString nbSamplesStr = m_parser.value(m_nbSamplesOption);
|
||||||
|
int nbSamples = nbSamplesStr.toInt(&ok);
|
||||||
|
|
||||||
|
if (ok && (nbSamples > 1024) && (nbSamples < 1073741824)) {
|
||||||
|
m_nbSamples = nbSamples;
|
||||||
|
} else {
|
||||||
|
qWarning() << "ParserBench::parse: number of samples invalid. Defaulting to " << m_nbSamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
// repetition
|
||||||
|
|
||||||
|
QString repetitionStr = m_parser.value(m_repetitionOption);
|
||||||
|
int repetition = repetitionStr.toInt(&ok);
|
||||||
|
|
||||||
|
if (ok && (repetition >= 0)) {
|
||||||
|
m_repetition = repetition;
|
||||||
|
} else {
|
||||||
|
qWarning() << "ParserBench::parse: repetition invalid. Defaulting to " << m_repetition;
|
||||||
|
}
|
||||||
|
|
||||||
|
// log2 factor
|
||||||
|
|
||||||
|
QString log2FactorStr = m_parser.value(m_log2FactorOption);
|
||||||
|
int log2Factor = log2FactorStr.toInt(&ok);
|
||||||
|
|
||||||
|
if (ok && (log2Factor >= 0) && (log2Factor <= 6)) {
|
||||||
|
m_log2Factor = log2Factor;
|
||||||
|
} else {
|
||||||
|
qWarning() << "ParserBench::parse: repetilog2 factortion invalid. Defaulting to " << m_log2Factor;
|
||||||
|
}
|
||||||
|
}
|
52
sdrbench/parserbench.h
Normal file
52
sdrbench/parserbench.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Copyright (C) 2018 F4EXB //
|
||||||
|
// written by Edouard Griffiths //
|
||||||
|
// //
|
||||||
|
// This program is free software; you can redistribute it and/or modify //
|
||||||
|
// it under the terms of the GNU General Public License as published by //
|
||||||
|
// the Free Software Foundation as version 3 of the License, or //
|
||||||
|
// //
|
||||||
|
// This program is distributed in the hope that it will be useful, //
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
||||||
|
// GNU General Public License V3 for more details. //
|
||||||
|
// //
|
||||||
|
// You should have received a copy of the GNU General Public License //
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SDRBENCH_PARSERBENCH_H_
|
||||||
|
#define SDRBENCH_PARSERBENCH_H_
|
||||||
|
|
||||||
|
#include <QCommandLineParser>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
class ParserBench
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ParserBench();
|
||||||
|
~ParserBench();
|
||||||
|
|
||||||
|
void parse(const QCoreApplication& app);
|
||||||
|
|
||||||
|
const QString& getTest() const { return m_test; }
|
||||||
|
uint32_t getNbSamples() const { return m_nbSamples; }
|
||||||
|
uint32_t getRepetition() const { return m_repetition; }
|
||||||
|
uint32_t getLog2Factor() const { return m_log2Factor; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_test;
|
||||||
|
uint32_t m_nbSamples;
|
||||||
|
uint32_t m_repetition;
|
||||||
|
uint32_t m_log2Factor;
|
||||||
|
|
||||||
|
QCommandLineParser m_parser;
|
||||||
|
QCommandLineOption m_testOption;
|
||||||
|
QCommandLineOption m_nbSamplesOption;
|
||||||
|
QCommandLineOption m_repetitionOption;
|
||||||
|
QCommandLineOption m_log2FactorOption;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* SDRBENCH_PARSERBENCH_H_ */
|
Loading…
Reference in New Issue
Block a user