PKGBUILDs/aur/par2cmdline/07-Optimization-by-inlining.patch
2011-06-09 17:56:14 -04:00

152 lines
5.7 KiB
Diff

--- a/reedsolomon.cpp
+++ b/reedsolomon.cpp
@@ -51,7 +51,7 @@ u32 gcd(u32 a, u32 b)
}
}
-bool ReedSolomon<Galois8>::SetInput(const vector<bool> &present)
+template<> bool ReedSolomon<Galois8>::SetInput(const vector<bool> &present)
{
inputcount = (u32)present.size();
@@ -80,7 +80,7 @@ bool ReedSolomon<Galois8>::SetInput(const vector<bool> &present)
return true;
}
-bool ReedSolomon<Galois8>::SetInput(u32 count)
+template<> bool ReedSolomon<Galois8>::SetInput(u32 count)
{
inputcount = count;
@@ -101,15 +101,8 @@ bool ReedSolomon<Galois8>::SetInput(u32 count)
return true;
}
-bool ReedSolomon<Galois8>::Process(size_t size, u32 inputindex, const void *inputbuffer, u32 outputindex, void *outputbuffer)
+template<> bool ReedSolomon<Galois8>::InternalProcess(const Galois8 &factor, size_t size, const void *inputbuffer, void *outputbuffer)
{
- // Look up the appropriate element in the RS matrix
- Galois8 factor = leftmatrix[outputindex * (datapresent + datamissing) + inputindex];
-
- // Do nothing if the factor happens to be 0
- if (factor == 0)
- return eSuccess;
-
#ifdef LONGMULTIPLY
// The 8-bit long multiplication tables
Galois8 *table = glmt->tables;
@@ -189,7 +182,7 @@ bool ReedSolomon<Galois8>::Process(size_t size, u32 inputindex, const void *inpu
// Set which of the source files are present and which are missing
// and compute the base values to use for the vandermonde matrix.
-bool ReedSolomon<Galois16>::SetInput(const vector<bool> &present)
+template<> bool ReedSolomon<Galois16>::SetInput(const vector<bool> &present)
{
inputcount = (u32)present.size();
@@ -233,7 +226,7 @@ bool ReedSolomon<Galois16>::SetInput(const vector<bool> &present)
// Record that the specified number of source files are all present
// and compute the base values to use for the vandermonde matrix.
-bool ReedSolomon<Galois16>::SetInput(u32 count)
+template<> bool ReedSolomon<Galois16>::SetInput(u32 count)
{
inputcount = count;
@@ -267,15 +260,8 @@ bool ReedSolomon<Galois16>::SetInput(u32 count)
return true;
}
-bool ReedSolomon<Galois16>::Process(size_t size, u32 inputindex, const void *inputbuffer, u32 outputindex, void *outputbuffer)
+template<> bool ReedSolomon<Galois16>::InternalProcess(const Galois16 &factor, size_t size, const void *inputbuffer, void *outputbuffer)
{
- // Look up the appropriate element in the RS matrix
-
- Galois16 factor = leftmatrix[outputindex * (datapresent + datamissing) + inputindex];
- // Do nothing if the factor happens to be 0
- if (factor == 0)
- return eSuccess;
-
#ifdef LONGMULTIPLY
// The 8-bit long multiplication tables
Galois16 *table = glmt->tables;
--- a/reedsolomon.h
+++ b/reedsolomon.h
@@ -64,7 +64,8 @@ public:
const void *inputbuffer, // Buffer containing input data
u32 outputindex, // The row in the RS matrix
void *outputbuffer); // Buffer containing output data
-
+private:
+ bool InternalProcess(const g &factor, size_t size, const void *inputbuffer, void *outputbuffer); // Optimization
protected:
// Perform Gaussian Elimination
bool GaussElim(CommandLine::NoiseLevel noiselevel,
@@ -146,6 +147,20 @@ inline ReedSolomon<g>::~ReedSolomon(void)
#endif
}
+template<class g>
+inline bool ReedSolomon<g>::Process(size_t size, u32 inputindex, const void *inputbuffer, u32 outputindex, void *outputbuffer)
+{
+ // Optimization: it occurs frequently the function exits early on, so inline the start.
+ // This resulted in a speed gain of approx. 8% in repairing.
+
+ // Look up the appropriate element in the RS matrix
+ g factor = leftmatrix[outputindex * (datapresent + datamissing) + inputindex];
+ // Do nothing if the factor happens to be 0
+ if (factor == 0)
+ return eSuccess;
+ return this->InternalProcess (factor, size, inputbuffer, outputbuffer);
+}
+
u32 gcd(u32 a, u32 b);
// Record whether the recovery block with the specified
@@ -242,11 +257,14 @@ inline bool ReedSolomon<g>::Compute(CommandLine::NoiseLevel noiselevel)
// One row for each present recovery block that will be used for a missing data block
for (unsigned int row=0; row<datamissing; row++)
{
+ // Define MPDL to skip reporting and speed things up
+#ifndef MPDL
if (noiselevel > CommandLine::nlQuiet)
{
int progress = row * 1000 / (datamissing+parmissing);
cout << "Constructing: " << progress/10 << '.' << progress%10 << "%\r" << flush;
}
+#endif
// Get the exponent of the next present recovery block
while (!outputrow->present)
@@ -286,11 +304,14 @@ inline bool ReedSolomon<g>::Compute(CommandLine::NoiseLevel noiselevel)
outputrow = outputrows.begin();
for (unsigned int row=0; row<parmissing; row++)
{
+ // Define MPDL to skip reporting and speed things up
+#ifndef MPDL
if (noiselevel > CommandLine::nlQuiet)
{
int progress = (row+datamissing) * 1000 / (datamissing+parmissing);
cout << "Constructing: " << progress/10 << '.' << progress%10 << "%\r" << flush;
}
+#endif
// Get the exponent of the next missing recovery block
while (outputrow->present)
@@ -420,6 +441,8 @@ inline bool ReedSolomon<g>::GaussElim(CommandLine::NoiseLevel noiselevel, unsign
// For every other row in the matrix
for (unsigned int row2=0; row2<rows; row2++)
{
+ // Define MPDL to skip reporting and speed things up
+#ifndef MPDL
if (noiselevel > CommandLine::nlQuiet)
{
int newprogress = (row*rows+row2) * 1000 / (datamissing*rows);
@@ -429,6 +452,7 @@ inline bool ReedSolomon<g>::GaussElim(CommandLine::NoiseLevel noiselevel, unsign
cout << "Solving: " << progress/10 << '.' << progress%10 << "%\r" << flush;
}
}
+#endif
if (row != row2)
{