Sample solution
Content |
The wanted RAII class can be formulated quite simply:
struct Guard { Guard(std::mutex& mutex) : mutex(mutex) { mutex.lock(); } ~Guard() { mutex.unlock(); } std::mutex& mutex; };
This allows to simplify the gen method:
double gen() { Guard guard(mutex); return uniform(mt); }
It shouldn't be surprising that a similar class is present in the standard C++ library. It is named std::lock_guard and gets the mutex class as template parameter:
double gen() { std::lock_guard<std::mutex> guard(mutex); return uniform(mt); }
#include <cstdlib> #include <mutex> #include <random> #include <thread> #include <vector> #include <hpc/aux/slices.hpp> #include <hpc/matvec/gematrix.hpp> #include <hpc/matvec/iterators.hpp> #include <hpc/matvec/print.hpp> #include <hpc/matvec/views.hpp> using namespace hpc; using namespace hpc::aux; using namespace hpc::matvec; struct Guard { Guard(std::mutex& mutex) : mutex(mutex) { mutex.lock(); } ~Guard() { mutex.unlock(); } std::mutex& mutex; }; struct MyRandomGenerator { MyRandomGenerator() : mt(std::random_device()()), uniform(-100, 100) { } double gen() { Guard guard(mutex); return uniform(mt); } private: std::mutex mutex; std::mt19937 mt; std::uniform_real_distribution<double> uniform; }; template < template<typename> class MatrixA, typename T, typename RNG, Require< Ge<MatrixA<T>> > = true > void randomInit(MatrixA<T>& A, RNG& rng) { for (auto [i, j, Aij]: A) { Aij = rng.gen(); (void) i; (void) j; // suppress gcc warning } } int main() { MyRandomGenerator rng; GeMatrix<double> A(51, 7); std::size_t nof_threads = std::thread::hardware_concurrency(); std::vector<std::thread> threads(nof_threads); UniformSlices<std::size_t> slices(nof_threads, A.numRows()); for (std::size_t index = 0; index < nof_threads; ++index) { auto firstRow = slices.offset(index); auto numRows = slices.size(index); threads[index] = std::thread([ A_ = A.view(firstRow, 0, numRows, A.numCols()), &rng ]() mutable { randomInit(A_, rng); }); } for (std::size_t index = 0; index < nof_threads; ++index) { threads[index].join(); } print(A, " %7.2f"); }
theon$ g++ -O3 -g -I/home/numerik/pub/hpc/ws19/session16 -std=c++17 -o random_init9 random_init9.cpp theon$ ./random_init9 91.61 49.35 -90.07 -1.73 53.38 51.23 -55.87 -0.09 59.57 -81.86 7.13 36.51 58.61 -67.74 -11.29 80.32 0.60 12.73 -50.94 -88.11 -49.64 -74.40 -85.65 -87.28 99.93 -41.68 45.43 49.74 1.28 -51.36 -11.55 64.68 31.23 -74.61 7.18 -46.01 42.31 93.78 34.98 43.76 22.83 68.01 15.64 53.39 97.54 54.98 54.81 71.58 23.38 61.55 28.99 -72.58 -53.40 -89.27 15.82 41.90 -52.93 -70.69 78.32 75.77 -88.28 91.46 -96.27 -88.61 -42.34 -35.55 -95.89 89.33 49.25 -67.93 -82.86 -28.76 -27.17 -53.83 15.62 99.74 -46.57 8.27 18.07 -28.92 3.59 -31.47 14.57 -98.96 86.02 98.89 39.52 -6.06 -50.20 -58.07 -13.97 -17.76 71.63 -19.30 -68.95 82.82 -86.29 63.66 -17.76 58.16 -80.17 -13.42 64.68 -51.59 23.38 -52.21 -46.75 -49.71 78.91 -44.79 -80.76 46.36 -92.83 61.13 -58.99 -33.27 65.28 87.08 68.47 -24.19 61.61 -27.15 -3.60 35.18 -79.71 -89.43 62.61 -89.97 -69.77 -99.14 62.69 -48.52 -61.21 31.61 94.32 -64.62 -28.07 -20.34 61.83 50.32 -52.11 14.40 88.35 28.56 -95.18 13.58 -68.65 -69.76 -62.19 82.55 -92.81 61.73 -20.46 -50.85 68.77 -96.25 -88.00 -64.44 -36.79 -50.65 15.53 56.47 54.23 50.77 -82.12 18.20 45.96 -90.23 -9.72 82.45 -44.85 -24.11 -25.19 -46.66 1.41 -35.86 21.75 -6.24 16.88 79.84 93.77 84.87 95.53 -46.68 -67.82 32.06 42.29 12.83 -49.82 64.28 -71.80 -72.42 3.34 91.94 20.69 18.15 92.27 71.63 -26.76 25.33 32.26 53.55 -84.39 -16.34 86.35 -0.82 -57.90 65.03 27.03 -5.67 76.17 -83.67 -11.47 -50.14 -78.98 78.58 34.71 -71.27 -96.03 -81.47 94.22 -83.45 -60.27 20.21 91.05 -97.63 -97.52 34.12 -88.73 19.30 63.53 22.81 -79.23 75.31 -90.29 63.16 -80.96 -49.36 56.78 -37.00 87.17 -81.72 -33.55 94.02 -73.09 -28.15 -57.52 94.93 59.49 88.01 47.83 -10.56 -28.06 -25.82 -71.54 -98.54 92.45 -48.29 -45.50 87.59 -49.58 -70.30 12.04 -1.07 -53.97 2.61 -0.56 -11.38 -79.19 -17.73 9.21 -63.06 -5.57 61.35 23.97 30.37 -55.31 59.32 50.91 69.87 37.96 -38.15 -45.62 -43.64 92.27 -55.39 -92.96 -28.69 -5.35 27.90 -35.15 -77.23 80.53 -97.98 46.34 -54.31 -86.51 -4.11 93.43 9.56 26.70 95.83 96.01 22.20 -51.69 -10.89 -40.07 66.97 -97.26 34.83 -5.84 -94.82 8.61 99.26 -45.07 -76.22 8.70 -81.21 91.94 75.42 -4.36 -21.83 40.46 60.53 -29.94 -18.61 -73.06 -8.07 -57.41 95.79 60.00 -35.98 41.66 -63.55 -20.69 -84.39 49.94 -4.99 -2.60 -52.29 -86.19 97.84 -54.57 -50.76 -62.99 -55.42 -2.46 -6.69 -40.35 -1.72 95.16 36.89 53.87 -93.62 -98.90 66.45 71.40 theon$
heim$ g++-8.3 -O3 -g -I/home/numerik/pub/hpc/ws19/session16 -std=c++17 -o random_init9 random_init9.cpp -lpthread heim$ ./random_init9 -18.34 -82.55 -33.01 -91.82 66.29 -63.08 -36.06 60.73 13.11 -2.10 -34.09 -4.36 -74.55 -80.30 -33.32 -2.48 11.90 -33.01 -7.33 -24.57 99.71 46.63 -33.19 -65.95 79.95 -29.89 81.73 62.37 76.24 27.28 78.01 80.30 87.92 44.97 34.63 -76.45 57.52 65.14 -74.11 -2.50 52.54 84.06 -38.95 -39.02 42.31 -56.76 -81.40 97.41 0.84 46.12 6.22 94.45 -67.77 -27.10 82.78 80.81 98.37 -3.58 -84.42 -29.65 -57.63 97.68 18.13 -76.42 35.43 63.01 10.97 -7.49 2.80 74.59 -52.50 -97.72 -51.81 -84.56 -90.63 -19.22 -3.17 -0.51 -96.08 -26.47 43.56 55.52 68.07 -95.70 -73.15 -39.50 31.92 58.23 35.16 -90.31 -3.89 -92.56 55.30 -8.32 76.54 6.01 -47.66 -66.55 -39.42 -35.45 -95.60 27.47 -88.16 -62.28 15.94 51.23 -97.71 -35.82 -59.68 41.87 -77.63 -77.37 64.45 -26.81 17.83 -73.59 -33.78 49.28 79.87 6.09 95.95 32.82 -73.90 48.78 -24.46 93.57 62.83 13.84 7.75 -20.36 -66.36 -96.73 -4.96 35.73 -16.40 -8.27 -99.96 71.48 43.61 94.94 -26.80 -49.36 -22.05 86.70 -58.31 -96.69 46.33 -66.13 -29.12 -4.41 -48.35 -31.12 29.71 -56.23 98.38 -83.27 -98.40 92.54 -11.90 27.21 -43.16 40.39 4.28 -39.68 52.15 -6.61 -84.01 46.12 52.59 77.23 -36.01 41.28 -79.12 -31.73 -84.06 -13.71 36.79 -8.52 -66.18 -61.66 -17.74 93.29 50.76 75.52 54.44 62.30 -68.51 55.08 69.97 -49.00 -36.69 5.47 -53.55 -78.76 -70.43 9.67 92.41 4.08 -64.79 42.40 -39.92 82.12 -43.63 -61.94 -32.22 -41.77 66.29 87.96 -29.31 -87.35 -96.97 -85.34 8.35 -87.20 -95.23 -75.19 -47.67 16.87 61.29 11.63 47.23 -46.51 -77.34 -53.60 -12.68 3.36 63.32 -84.97 -2.75 9.93 -93.76 -93.18 -52.16 67.02 -89.03 49.21 -94.10 -26.17 -94.30 41.42 -20.97 -94.48 17.21 -11.52 -1.29 -97.55 -78.15 -62.99 57.94 59.94 49.03 67.11 -84.20 -66.69 46.46 40.61 -89.71 19.00 -63.19 -37.32 -99.95 47.60 -39.21 92.25 90.55 -6.31 15.00 -41.40 -6.42 -8.81 88.93 65.85 93.81 -11.14 25.88 42.76 -12.74 87.93 -40.70 42.24 49.68 -97.71 -59.77 -88.69 19.16 -96.66 51.56 0.91 -82.11 -82.97 45.34 -79.66 -5.38 7.66 -56.58 -86.66 2.56 -58.20 74.97 61.61 -58.98 -55.46 5.07 -94.96 -10.94 98.06 66.10 81.53 52.00 58.65 -28.76 -6.70 18.81 -7.81 65.45 92.34 24.54 50.66 -44.54 56.26 73.81 -83.69 28.96 -57.15 34.74 8.03 14.05 -60.61 64.28 49.39 -2.37 -72.26 -83.43 71.89 -24.07 75.06 -80.89 86.36 -83.71 3.24 -45.31 10.38 44.90 -61.75 16.39 -38.73 68.59 63.80 54.45 -53.09 21.63 52.67 -19.17 4.96 -31.57 -65.25 87.11 heim$