Merge branch 'develop' into msvc
[platform/upstream/openblas.git] / cpp_thread_test / cpp_thread_safety_common.h
1 inline void pauser(){
2     /// a portable way to pause a program
3     std::string dummy;
4     std::cout << "Press enter to continue...";
5     std::getline(std::cin, dummy);
6 }
7
8 void FailIfThreadsAreZero(uint32_t numConcurrentThreads) {
9         if(numConcurrentThreads == 0) {
10                 std::cout<<"ERROR: Invalid parameter 0 for number of concurrent calls into OpenBLAS!"<<std::endl;
11                 std::cout<<"CBLAS DGEMV thread safety test FAILED!"<<std::endl;
12                 exit(-1);
13         }
14 }
15
16 void FillMatrices(std::vector<std::vector<double>>& matBlock, std::mt19937_64& PRNG, std::uniform_real_distribution<double>& rngdist, const blasint randomMatSize, const uint32_t numConcurrentThreads, const uint32_t numMat){
17         for(uint32_t i=0; i<numMat; i++){
18                 for(uint32_t j = 0; j < static_cast<uint32_t>(randomMatSize*randomMatSize); j++){
19                         matBlock[i][j] = rngdist(PRNG);
20                 }
21         }
22         for(uint32_t i=numMat; i<(numConcurrentThreads*numMat); i+=numMat){
23                 for(uint32_t j=0; j<numMat; j++){
24                         matBlock[i+j] = matBlock[j];
25                 }
26         }
27 }
28
29 void FillVectors(std::vector<std::vector<double>>& vecBlock, std::mt19937_64& PRNG, std::uniform_real_distribution<double>& rngdist, const blasint randomMatSize, const uint32_t numConcurrentThreads, const uint32_t numVec){
30         for(uint32_t i=0; i<numVec; i++){
31                 for(uint32_t j = 0; j < static_cast<uint32_t>(randomMatSize); j++){
32                         vecBlock[i][j] = rngdist(PRNG);
33                 }
34         }
35         for(uint32_t i=numVec; i<(numConcurrentThreads*numVec); i+=numVec){
36                 for(uint32_t j=0; j<numVec; j++){
37                         vecBlock[i+j] = vecBlock[j];
38                 }
39         }
40 }
41
42 std::mt19937_64 InitPRNG(){
43         std::random_device rd;
44         std::mt19937_64 PRNG(rd()); //seed PRNG using /dev/urandom or similar OS provided RNG
45         std::uniform_real_distribution<double> rngdist{-1.0, 1.0};
46         //make sure the internal state of the PRNG is properly mixed by generating 10M random numbers
47         //PRNGs often have unreliable distribution uniformity and other statistical properties before their internal state is sufficiently mixed
48         for (uint32_t i=0;i<10000000;i++) rngdist(PRNG);
49         return PRNG;
50 }
51
52 void PrintMatrices(const std::vector<std::vector<double>>& matBlock, const blasint randomMatSize, const uint32_t numConcurrentThreads, const uint32_t numMat){
53         for (uint32_t i=0;i<numConcurrentThreads*numMat;i++){
54                 std::cout<<i<<std::endl;
55                 for (uint32_t j = 0; j < static_cast<uint32_t>(randomMatSize); j++){
56                         for (uint32_t k = 0; k < static_cast<uint32_t>(randomMatSize); k++){
57                                 std::cout<<matBlock[i][j*randomMatSize + k]<<"  ";
58                         }
59                         std::cout<<std::endl;
60                 }
61                 std::cout<<std::endl;
62         }
63 }