[2615] | 1 | #include "sopnamsp.h"
|
---|
[1028] | 2 | #include "machdefs.h"
|
---|
| 3 | #include "JTC/JTC.h"
|
---|
| 4 |
|
---|
| 5 | #include <math.h>
|
---|
[2322] | 6 | #include <iostream>
|
---|
[1028] | 7 |
|
---|
| 8 | #include "tarrinit.h"
|
---|
| 9 | #include "array.h"
|
---|
| 10 | #include "timing.h"
|
---|
| 11 |
|
---|
| 12 | // Programme de test des threads JThreadsC++
|
---|
| 13 | // avec les arrays de Sophya
|
---|
| 14 |
|
---|
| 15 | // A global monitor for print synchronisation
|
---|
[1033] | 16 | JTCMonitor prtmon; // <JThreadC++>
|
---|
[1028] | 17 |
|
---|
| 18 | // A thread class for doing matrix computation
|
---|
[1033] | 19 | class MtxComputer : public JTCThread // <JThreadC++>
|
---|
[1028] | 20 | {
|
---|
| 21 | public:
|
---|
| 22 | MtxComputer(int id, int sz, int nloop);
|
---|
| 23 | virtual void run();
|
---|
| 24 | protected:
|
---|
| 25 | int id_;
|
---|
| 26 | int sz_;
|
---|
| 27 | int nloop_;
|
---|
| 28 | };
|
---|
| 29 |
|
---|
| 30 | MtxComputer::MtxComputer(int id, int sz, int nloop)
|
---|
| 31 | {
|
---|
| 32 | id_ = id; sz_ = sz; nloop_ = nloop;
|
---|
| 33 | }
|
---|
| 34 |
|
---|
| 35 | void MtxComputer::run()
|
---|
| 36 | {
|
---|
| 37 | int n = sz_;
|
---|
| 38 | double seuil = 1.e-6;
|
---|
| 39 | Matrix id;
|
---|
| 40 | id = IdentityMatrix(1.,n);
|
---|
[1033] | 41 | double gmax = -1.e99;
|
---|
| 42 | double gmin = 1.e99;
|
---|
| 43 | int npb = 0;
|
---|
[1028] | 44 | // Loop creating a random matrix, inverting it
|
---|
| 45 | // and checking the result
|
---|
| 46 | for(int k=0; k<nloop_; k++) {
|
---|
| 47 | try {
|
---|
| 48 | Matrix a(n,n);
|
---|
| 49 | a = Sequence(RandomSequence(RandomSequence::Gaussian, 0., 2.5));
|
---|
| 50 | Matrix inva = Inverse(a);
|
---|
| 51 | Matrix diff = id-a*inva;
|
---|
| 52 | double max = -1.e99;
|
---|
| 53 | double min = 1.e99;
|
---|
| 54 | double x;
|
---|
| 55 | int nerr = 0;
|
---|
| 56 | for(int i=0; i<n; i++)
|
---|
| 57 | for(int j=0; j<n; j++) {
|
---|
| 58 | x = diff(i,j);
|
---|
| 59 | if (x < min) min = diff(i,j);
|
---|
| 60 | if (x > max) max = diff(i,j);
|
---|
| 61 | if (fabs(x) > seuil) nerr++;
|
---|
| 62 | }
|
---|
[1033] | 63 | if (min < gmin) gmin = min;
|
---|
| 64 | if (max > gmax) gmax = max;
|
---|
| 65 | if (nerr > 0) npb++;
|
---|
| 66 | { // Synchronized writing to cout stream
|
---|
| 67 | JTCSynchronized sync(prtmon); // <JThreadC++>
|
---|
[1028] | 68 | cout << " ------- Thread[" << id_ << "] K= "
|
---|
| 69 | << k << " NErr = " << nerr << endl;
|
---|
| 70 | cout << " Min(Diff) = " << min << " Max(Diff) = " << max << endl;
|
---|
[1033] | 71 | if (k == nloop_-1) {
|
---|
| 72 | double frac = (double)npb*100./(double)nloop_;
|
---|
| 73 | cout << " ...... Thread[" << id_ << "] End NPb= " << npb
|
---|
| 74 | << " / NTot= " << nloop_ << " ( = " << frac << " %) " << endl;
|
---|
| 75 | cout << " GMin(Diff) = " << gmin << " GMax(Diff) = " << gmax << endl;
|
---|
| 76 | cout << " ..................................................... " << endl;
|
---|
| 77 | }
|
---|
[1028] | 78 | }
|
---|
| 79 | }
|
---|
| 80 | catch (PException const & e) {
|
---|
| 81 | cerr << " Catched PException in Thread(" << (string)getName()
|
---|
| 82 | << ") Msg= " << e.Msg() << endl;
|
---|
| 83 | }
|
---|
[1033] | 84 | catch (JTCException const & e) { // <JThreadC++>
|
---|
[1028] | 85 | cerr << " Catched JTCException in Thread(" << (string)getName()
|
---|
| 86 | << ") Msg= " << e.getMessage() << endl;
|
---|
| 87 | }
|
---|
| 88 | }
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 |
|
---|
| 92 | // ------- The main program ---------
|
---|
| 93 | int main(int narg, char* arg[])
|
---|
| 94 | {
|
---|
| 95 |
|
---|
| 96 | #define MAXNTHR 10
|
---|
| 97 | if (narg < 4) {
|
---|
| 98 | cout << " jtctarr - JThreadsC++/Sophya::TArray<T> Test \n "
|
---|
| 99 | << " ... Usage jtctarr NThreads NLoop MtxSize [-JTCss ... \n"
|
---|
| 100 | << " NThreads=1...4 NLoop=10...10^4 MtxSize=10...10^3 \n"
|
---|
| 101 | << endl;
|
---|
[1033] | 102 | exit(0);
|
---|
[1028] | 103 | }
|
---|
| 104 |
|
---|
| 105 | InitTim(); // Initializing the CPU timer
|
---|
| 106 |
|
---|
| 107 | int nthr = atoi(arg[1]);
|
---|
| 108 | if (nthr > MAXNTHR) nthr = MAXNTHR;
|
---|
| 109 | int nloop = atoi(arg[2]);
|
---|
| 110 | int size = atoi(arg[3]);
|
---|
| 111 | cout << " ::::: jtctarr - JThreadsC++/Sophya::TArray<T> Test ::::: \n"
|
---|
| 112 | << " NThreads= " << nthr << " NLoop= " << nloop << " MtxSize= "
|
---|
| 113 | << size << endl;
|
---|
| 114 |
|
---|
| 115 | try {
|
---|
| 116 | SophyaInit(); // Sophya Initialization
|
---|
[1033] | 117 | JTCInitialize iniJTC(narg, arg); // <JThreadC++> Initialize library
|
---|
| 118 |
|
---|
| 119 | JTCThreadHandle t[MAXNTHR]; // <JThreadC++>
|
---|
[1030] | 120 | int k;
|
---|
| 121 | for(k=0; k<nthr; k++) t[k] = new MtxComputer(k, size, nloop);
|
---|
[1028] | 122 | cout << " Starting threads ... " << endl;
|
---|
[1033] | 123 | for(k=0; k<nthr; k++) t[k]->start(); // <JThreadC++>
|
---|
[1028] | 124 | // Waiting for threads to end
|
---|
[1033] | 125 | for(k=0; k<nthr; k++) t[k]->join(); // <JThreadC++>
|
---|
[1028] | 126 | }
|
---|
| 127 | catch (PThrowable const & e) {
|
---|
| 128 | cerr << " Catched PThrowable in main Msg= " << e.Msg() << endl;
|
---|
| 129 | }
|
---|
[1033] | 130 | catch (JTCException const & e) { // <JThreadC++>
|
---|
[1028] | 131 | cerr << " Catched JTCException in main Msg= " << e.getMessage() << endl;
|
---|
| 132 | }
|
---|
| 133 | catch(...) {
|
---|
| 134 | cerr << " Catched ... exception in main " << endl;
|
---|
| 135 | }
|
---|
| 136 |
|
---|
| 137 | PrtTim("End of jtctarr");
|
---|
| 138 | }
|
---|