diff --git a/applications/test/speed/Make/files b/applications/test/speed/Make/files deleted file mode 100644 index 84a6d2fa6202cc1e7fb7482bfc9e23dc718b406d..0000000000000000000000000000000000000000 --- a/applications/test/speed/Make/files +++ /dev/null @@ -1,3 +0,0 @@ -speedTest.C - -EXE = $(FOAM_USER_APPBIN)/speedTest diff --git a/applications/test/speed/Make/options b/applications/test/speed/Make/options deleted file mode 100644 index e68056198750cebb50fea02c6fffbf8db9220261..0000000000000000000000000000000000000000 --- a/applications/test/speed/Make/options +++ /dev/null @@ -1 +0,0 @@ -EXE_INC = /* -ffast-math -mtune=core2 */ diff --git a/applications/test/speed/scalarSpeedTest/Make/files b/applications/test/speed/scalarSpeedTest/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..dae64db89f8cb8366067016721994cf8b3d09b82 --- /dev/null +++ b/applications/test/speed/scalarSpeedTest/Make/files @@ -0,0 +1,3 @@ +scalarSpeedTest.C + +EXE = $(FOAM_USER_APPBIN)/scalarSpeedTest diff --git a/applications/test/speed/scalarSpeedTest/Make/options b/applications/test/speed/scalarSpeedTest/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/applications/test/speed/scalarSpeedTest/scalarSpeedTest.C b/applications/test/speed/scalarSpeedTest/scalarSpeedTest.C new file mode 100644 index 0000000000000000000000000000000000000000..e1858e2d42bf578d54a747c469019fedbd1a3bdd --- /dev/null +++ b/applications/test/speed/scalarSpeedTest/scalarSpeedTest.C @@ -0,0 +1,192 @@ +#include "primitiveFields.H" +#include "Random.H" +#include "cpuTime.H" +#include "IOstreams.H" +#include "OFstream.H" + +using namespace Foam; + +int main() +{ + Info<< "Initialising fields" << endl; + + const label nIter = 100; + const label size = 10000000; + const label rndAddrSkip = 40; + const label redFac = 6; + const label redSize = size/redFac; + Random genAddr(100); + + double* f1 = new double[size]; + double* f2 = new double[size]; + double* f3 = new double[size]; + double* f4 = new double[size]; + double* fr = new double[redSize]; + label* addr = new label[size]; + label* redAddr = new label[size]; + label* redAddr2 = new label[size]; + + for (register label i=0; i<size; i++) + { + f1[i] = 1.0; + f2[i] = 1.0; + f3[i] = 1.0; + addr[i] = i; + redAddr[i] = i/redFac; + redAddr2[i] = (size - i - 1)/redFac; + } + + for (register label i=0; i<size; i+=rndAddrSkip) + { + addr[i] = genAddr.integer(0, size-1); + } + + for (register label i=0; i<redSize; i++) + { + fr[i] = 1.0; + } + + Info<< "Done\n" <<endl; + + { + Info<< "Single loop combined operation (expression templates)" + << endl; + + cpuTime executionTime; + + for (int j=0; j<nIter; j++) + { + for (register label i=0; i<size; i++) + { + f4[i] = f1[i] + f2[i] - f3[i]; + } + } + + Info<< "ExecutionTime = " + << executionTime.elapsedCpuTime() + << " s\n" << endl; + + Snull<< f4[1] << endl << endl; + } + + { + Info<< "Single loop combined operation with indirect addressing" + << endl; + + cpuTime executionTime; + + for (int j=0; j<nIter; j++) + { + for (register label i=0; i<size; i++) + { + f4[addr[i]] = f1[addr[i]] + f2[addr[i]] - f3[addr[i]]; + } + } + + Info<< "ExecutionTime = " + << executionTime.elapsedCpuTime() + << " s\n" << endl; + + Snull<< f4[1] << endl << endl; + } + + { + Info<< "Single loop reduction operation" + << endl; + + cpuTime executionTime; + label redOffset = (size - 1)/redFac; + + for (int j=0; j<nIter; j++) + { + for (register label i=0; i<size; i++) + { + label j = i/redFac; + fr[j] += f1[i]; + fr[redOffset - j] -= f2[i]; + } + } + + Info<< "ExecutionTime = " + << executionTime.elapsedCpuTime() + << " s\n" << endl; + + Snull<< fr[1] << endl << endl; + } + + { + Info<< "Single loop reduction operation with indirect addressing" + << endl; + + cpuTime executionTime; + + for (int j=0; j<nIter; j++) + { + for (register label i=0; i<size; i++) + { + fr[redAddr[i]] += f1[i]; + fr[redAddr2[i]] -= f2[i]; + } + } + + Info<< "ExecutionTime = " + << executionTime.elapsedCpuTime() + << " s\n" << endl; + + Snull<< fr[1] << endl << endl; + } + + { + Info<< "Separate loops ?= operations" << endl; + + cpuTime executionTime; + + for (int j=0; j<nIter; j++) + { + for (register label i=0; i<size; i++) + { + f4[i] = f1[i]; + } + for (register label i=0; i<size; i++) + { + f4[i] += f2[i]; + } + for (register label i=0; i<size; i++) + { + f4[i] -= f3[i]; + } + } + + Info<< "ExecutionTime = " + << executionTime.elapsedCpuTime() + << " s\n" << endl; + + Snull<< f4[1] << endl << endl; + } + + { + Info<< "OpenFOAM field algebra" << endl; + + scalarField + sf1(size, 1.0), + sf2(size, 1.0), + sf3(size, 1.0), + sf4(size); + + cpuTime executionTime; + + for (int j=0; j<nIter; j++) + { + //sf4 = sf1 + sf2 - sf3; + sf4 = sf1; + sf4 += sf2; + sf4 -= sf3; + } + + Info<< "ExecutionTime = " + << executionTime.elapsedCpuTime() + << " s\n" << endl; + + Snull<< sf4[1] << endl << endl; + } +} diff --git a/applications/test/speed/speedTest.C b/applications/test/speed/speedTest.C deleted file mode 100644 index 052514359190204cbf8d9cab1fab1470461f9f2d..0000000000000000000000000000000000000000 --- a/applications/test/speed/speedTest.C +++ /dev/null @@ -1,99 +0,0 @@ -#include "primitiveFields.H" -#include "cpuTime.H" -#include "IOstreams.H" - -using namespace Foam; - -int main() -{ - const label nIter = 10; - const label size = 10000000; - - double* f1 = new double[size]; - double* f2 = new double[size]; - double* f3 = new double[size]; - double* f4 = new double[size]; - - for (register label i=0; i<size; i++) - { - f1[i] = 1.0; - f2[i] = 1.0; - f3[i] = 1.0; - } - - cpuTime executionTime1; - - for (int j=0; j<nIter; j++) - { - for (register label i=0; i<size; i++) - { - f4[i] = f1[i] + f2[i] - f3[i]; - } - } - - Info<< "ExecutionTime = " - << executionTime1.elapsedCpuTime() - << " s\n" << endl; - - Info << f4[1] << endl << endl; - - - scalarField sf1(size, 1.0), sf2(size, 1.0), sf3(size, 1.0), sf4(size); - - cpuTime executionTime2; - - for (register int j=0; j<nIter; j++) - { - sf4 = sf1 + sf2 - sf3; - //sf4 = sf1; - //sf4 += sf2; - //sf4 -= sf3; - } - - Info<< "ExecutionTime = " - << executionTime2.elapsedCpuTime() - << " s\n" << endl; - - Info << sf4[1] << endl << endl; - - - vectorField - vf1(size, vector::one), - vf2(size, vector::one), - vf3(size, vector::one), - vf4(size); - - cpuTime executionTime3; - - for (register int j=0; j<nIter; j++) - { - vf4 = vf1 + vf2 - vf3; - } - - Info<< "ExecutionTime = " - << executionTime3.elapsedCpuTime() - << " s\n" << endl; - - Info << vf4[1] << endl << endl; - - cpuTime executionTime4; - - scalarField sf11(size, 1.0), sf12(size, 1.0), sf13(size, 1.0), sf14(size); - scalarField sf21(size, 1.0), sf22(size, 1.0), sf23(size, 1.0), sf24(size); - scalarField sf31(size, 1.0), sf32(size, 1.0), sf33(size, 1.0), sf34(size); - - for (register int j=0; j<nIter; j++) - { - sf14 = sf11 + sf12 - sf13; - sf24 = sf21 + sf22 - sf23; - sf34 = sf31 + sf32 - sf33; - } - - Info<< "ExecutionTime = " - << executionTime4.elapsedCpuTime() - << " s\n" << endl; - - Info << sf14[1] << sf24[1] << sf34[1] << endl << endl; - - -} diff --git a/applications/test/speed/vectorSpeedTest/Make/files b/applications/test/speed/vectorSpeedTest/Make/files new file mode 100644 index 0000000000000000000000000000000000000000..ccb0187615ed49e981498b9ad532c2f7b7b55326 --- /dev/null +++ b/applications/test/speed/vectorSpeedTest/Make/files @@ -0,0 +1,3 @@ +vectorSpeedTest.C + +EXE = $(FOAM_USER_APPBIN)/vectorSpeedTest diff --git a/applications/test/speed/vectorSpeedTest/Make/options b/applications/test/speed/vectorSpeedTest/Make/options new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/applications/test/speed/vectorSpeedTest/vectorSpeedTest.C b/applications/test/speed/vectorSpeedTest/vectorSpeedTest.C new file mode 100644 index 0000000000000000000000000000000000000000..da802bab20e7c39767f97318d484536f127f5a40 --- /dev/null +++ b/applications/test/speed/vectorSpeedTest/vectorSpeedTest.C @@ -0,0 +1,39 @@ +#include "primitiveFields.H" +#include "cpuTime.H" +#include "IOstreams.H" +#include "OFstream.H" + +using namespace Foam; + +int main() +{ + const label nIter = 100; + const label size = 1000000; + + Info<< "Initialising fields" << endl; + + vectorField + vf1(size, vector::one), + vf2(size, vector::one), + vf3(size, vector::one), + vf4(size); + + Info<< "Done\n" << endl; + + { + cpuTime executionTime; + + Info<< "vectorField algebra" << endl; + + for (register int j=0; j<nIter; j++) + { + vf4 = vf1 + vf2 - vf3; + } + + Info<< "ExecutionTime = " + << executionTime.elapsedCpuTime() + << " s\n" << endl; + + Snull<< vf4[1] << endl << endl; + } +}