matInclude.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00036 #ifndef MAT_MATINCLUDE
00037 #define MAT_MATINCLUDE
00038 #include <iostream>
00039 #include <vector>
00040 #include <fstream>
00041 #include <ios>
00042 #include <cassert>
00043 #include <ctime>
00044 #include <limits>
00045
00046 #ifdef _OPENMP
00047 #include <omp.h>
00048 #endif
00049
00050 #include "Failure.h"
00051 #include "DebugPolicies.h"
00052 #include "SizesAndBlocks.h"
00053
00054 #ifdef _OPENMP
00055 #define MAT_OMP_INIT enum omp_failType {noFail = 0, standardFail, matFail}; \
00056 volatile omp_failType omp_fail = noFail; \
00057 std::exception omp_exce; \
00058 Failure omp_matFail; \
00059 omp_set_nested(true);
00060
00061 #define MAT_OMP_START try {
00062 #define MAT_OMP_END } \
00063 catch(Failure & omp_fail_caught) { \
00064 omp_fail = matFail; omp_matFail = omp_fail_caught; } \
00065 catch(std::exception & omp_exce_caught) { \
00066 omp_fail = standardFail; omp_exce = omp_exce_caught; }
00067 #define MAT_OMP_FINALIZE if(omp_fail) \
00068 { std::cerr<<"Exception was thrown in OpenMP parallel region\n"; \
00069 switch (omp_fail) { \
00070 case standardFail: throw omp_exce; break; \
00071 case matFail: throw omp_matFail; break; \
00072 default: throw Failure("Odd error in omp parallel loop\n");} \
00073 }
00074 #else
00075 #define MAT_OMP_INIT
00076 #define MAT_OMP_START
00077 #define MAT_OMP_END
00078 #define MAT_OMP_FINALIZE
00079 #endif
00080
00081 namespace mat{
00082 class Params {
00083 protected:
00084 #ifdef _OPENMP
00085 static unsigned int nProcs;
00086 static unsigned int matrixParallelLevel;
00087 #endif
00088 public:
00089 static unsigned int getNProcs() {
00090 #ifdef _OPENMP
00091 if (nProcs == 0)
00092 throw Failure("mat::Params::getNProcs(): nProcs == 0 Forgot to call setNProcs()?");
00093 return nProcs;
00094 #else
00095 return 1;
00096 #endif
00097 }
00098 static void setNProcs(unsigned int const nP) {
00099 #ifdef _OPENMP
00100 nProcs = nP;
00101 #endif
00102 }
00103 static unsigned int getMatrixParallelLevel() {
00104 #ifdef _OPENMP
00105 if (matrixParallelLevel == 0)
00106 throw Failure("mat::Params::getMatrixParallelLevel(): matrixParallelLevel == 0 Forgot to call setMatrixParallelLevel()?");
00107 return matrixParallelLevel;
00108 #else
00109 return 0;
00110 #endif
00111 }
00112 static void setMatrixParallelLevel(unsigned int const mPL) {
00113 #ifdef _OPENMP
00114 matrixParallelLevel = mPL;
00115 #endif
00116 }
00117 };
00118
00119
00120
00121 enum property {zero, ful};
00122 enum normType {frobNorm, euclNorm, mixedNorm};
00123 normType getNormType(const char* normStr);
00124 std::string getNormTypeString(normType nType);
00125
00126
00127 template<typename Treal>
00128 inline static Treal getRelPrecision() {
00129 throw Failure("getPrecision() : The used type is not supported by"
00130 " getPrecision() ");
00131 }
00132 template<>
00133 inline long double getRelPrecision<long double>() {
00134 return std::numeric_limits<long double>::epsilon();
00135 }
00136 template<>
00137 inline double getRelPrecision<double>() {
00138 return std::numeric_limits<double>::epsilon();
00139 }
00140 template<>
00141 inline float getRelPrecision<float>() {
00142 return std::numeric_limits<float>::epsilon();
00143 }
00144
00145 class Time {
00146 static double get_wall_seconds();
00147 double ticTime;
00148 public:
00149 Time();
00150 void tic();
00151 float toc();
00152 };
00153
00154 class MemUsage {
00155 private:
00156 static int getNumberFromBuffer(const char* buffer, const char* s);
00157 public:
00158 struct Values {
00159 float res;
00160 float virt;
00161 float peak;
00162 Values() : res(0), virt(0), peak(0) { }
00163 };
00164 static void getMemUsage(Values & values);
00165 };
00166
00167 }
00168 #endif