mirror of
https://github.com/Tencent/ncnn.git
synced 2026-10-19 14:32:15 +08:00
174 lines
5.4 KiB
C++
174 lines
5.4 KiB
C++
// Copyright 2017 Tencent
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
#include <iostream>
|
|
#include <iostream>
|
|
#include <fstream>
|
|
#include <vector>
|
|
#include <string>
|
|
#include <cfloat>
|
|
#include "Rcards.h"
|
|
//---------------------------------------------------------------------------
|
|
using namespace std;
|
|
//---------------------------------------------------------------------------
|
|
#define REF_BOARD "Raspberry Pi 5 Broadcom BCM2712, Cortex-A76 (ARMv8)"
|
|
//---------------------------------------------------------------------------
|
|
// Define a custom comparator function for sorting based on Ratio
|
|
bool compareByRatio(const TBoard& a, const TBoard& b)
|
|
{
|
|
return a.Ratio < b.Ratio;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
int main(int argc, char** argv)
|
|
{
|
|
size_t i, t, n, r;
|
|
int RefBoard;
|
|
float f, x;
|
|
string Line;
|
|
TModel Model;
|
|
vector<string> Lines; // Vector to store strings
|
|
vector<TBoard> Boards; // Vector to store boards
|
|
ifstream inputFile;
|
|
|
|
// Check existence of the ../README.md file
|
|
inputFile.open("../README.md");
|
|
if (!inputFile.is_open())
|
|
{
|
|
if (argc != 2)
|
|
{
|
|
fprintf(stderr, "Usage: ./RankCards <your README.md> \n");
|
|
return -1;
|
|
}
|
|
const char* imagepath = argv[1];
|
|
// Open the file given as argument
|
|
inputFile.open(imagepath);
|
|
// Check if the file is open
|
|
if (!inputFile.is_open())
|
|
{
|
|
cerr << "Error opening file" << endl;
|
|
return 1; // Return an error code
|
|
}
|
|
}
|
|
|
|
// Read each Line from the file and add it to the vector
|
|
while (std::getline(inputFile, Line))
|
|
{
|
|
Lines.push_back(Line);
|
|
}
|
|
// Close the file
|
|
inputFile.close();
|
|
|
|
// Get the boards.
|
|
for (i = 0; i < Lines.size(); i++)
|
|
{
|
|
TBoard Brd;
|
|
if (Lines[i].find("###") != string::npos)
|
|
{
|
|
Brd.Name = Lines[i].substr(4, Lines[i].length() - 4);
|
|
Brd.StartLine = i + 1;
|
|
Boards.push_back(Brd);
|
|
}
|
|
}
|
|
// Get the boards end Line.
|
|
for (t = 0; t < Boards.size() - 1; t++)
|
|
{
|
|
Boards[t].EndLine = Boards[t + 1].StartLine;
|
|
}
|
|
Boards[t].EndLine = Lines.size();
|
|
|
|
// Get the bench sets (must always start with squeezenet)
|
|
for (t = 0; t < Boards.size(); t++)
|
|
{
|
|
TModelSet MdSet;
|
|
bool FirstSet = true;
|
|
for (n = Boards[t].StartLine; n < Boards[t].EndLine; n++)
|
|
{
|
|
GetNameAver(Lines[n], Model);
|
|
MdSet.Store(Model);
|
|
|
|
if (Model.Name == "squeezenet")
|
|
{
|
|
//start of new set, check if it is the first set
|
|
if (FirstSet)
|
|
FirstSet = false;
|
|
else
|
|
Boards[t].BenchSet.push_back(MdSet);
|
|
}
|
|
}
|
|
Boards[t].BenchSet.push_back(MdSet);
|
|
}
|
|
|
|
// Get the total AvrTime of the bench sets and set the lowest as best set
|
|
for (t = 0; t < Boards.size(); t++)
|
|
{
|
|
x = FLT_MAX;
|
|
for (n = 0; n < Boards[t].BenchSet.size(); n++)
|
|
{
|
|
f = Boards[t].BenchSet[n].Sum();
|
|
if (f < x)
|
|
{
|
|
x = f;
|
|
Boards[t].BestSet = n;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get the reference set
|
|
RefBoard = -1;
|
|
for (t = 0; t < Boards.size(); t++)
|
|
{
|
|
if (Boards[t].Name.find(REF_BOARD) != string::npos)
|
|
{
|
|
RefBoard = static_cast<int>(t);
|
|
}
|
|
}
|
|
if (RefBoard == -1)
|
|
{
|
|
cerr << "Error finding reference board :" << endl;
|
|
cerr << REF_BOARD << endl;
|
|
return 1; // Return an error code
|
|
}
|
|
|
|
// Get the ratios between the best bench sets and reference
|
|
r = Boards[RefBoard].BestSet;
|
|
for (t = 0; t < Boards.size(); t++)
|
|
{
|
|
n = Boards[t].BestSet;
|
|
Boards[t].Ratio = Boards[t].BenchSet[n].Ratio(Boards[RefBoard].BenchSet[r]);
|
|
}
|
|
|
|
// Sort the vector using the custom comparator
|
|
std::sort(Boards.begin(), Boards.end(), compareByRatio);
|
|
|
|
// Open an output README.md file
|
|
std::ofstream outputFile("README.md");
|
|
|
|
// Check if the file is successfully opened
|
|
if (outputFile.is_open())
|
|
{
|
|
outputFile << "### Rank the boards." << endl;
|
|
outputFile << "The table below is generated by RankCards, using the timings found in the /ncnn/benchmark/README.md file.<br>" << endl;
|
|
outputFile << "First, the best set of timings is selected from each board.<br>" << endl;
|
|
outputFile << "The set is then compared to a reference set by calculating the ratio of each model one by one and averaging all results.<br>" << endl;
|
|
outputFile << "Finally, the boards are ranked from fast to slow.<br>" << endl;
|
|
outputFile << "| | Board | Ratio | " << endl;
|
|
outputFile << "| :--: | :---- | :--- | " << endl;
|
|
// Write the sorted vector to the file
|
|
for (t = 0; t < Boards.size(); t++)
|
|
{
|
|
outputFile << "| " << t + 1 << " | " << Boards[t].Name << " | " << setprecision(3) << Boards[t].Ratio << " | " << endl;
|
|
}
|
|
// Close the file stream
|
|
outputFile.close();
|
|
cout << "Sorted data has been written to README.md" << endl;
|
|
}
|
|
else
|
|
{
|
|
cerr << "Error opening the file." << endl;
|
|
return 1; // Return an error code
|
|
}
|
|
|
|
return 0; // Return success
|
|
}
|
|
//---------------------------------------------------------------------------
|