#include #include #include #include #include #include "/opt/OpenBLAS_zen_serial/include/cblas.h" const blasint randomMatSize = 1024; //dimension of the random square matrices used const uint32_t numConcurrentThreads = 52; //number of concurrent calls of the functions being tested const uint32_t numTestRounds = 8; //number of testing rounds before success exit inline void pauser(){ /// a portable way to pause a program std::string dummy; std::cout << "Press enter to continue..."; std::getline(std::cin, dummy); } void launch_cblas_dgemm(double* A, double* B, double* C){ cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, randomMatSize, randomMatSize, randomMatSize, 1.0, A, randomMatSize, B, randomMatSize, 0.1, C, randomMatSize); } void FillMatrices(std::vector>& matBlock, std::mt19937_64& PRNG, std::uniform_real_distribution& rngdist){ for(uint32_t i=0; i<3; i++){ for(uint32_t j=0; j<(randomMatSize*randomMatSize); j++){ matBlock[i][j] = rngdist(PRNG); } } for(uint32_t i=3; i<(numConcurrentThreads*3); i+=3){ matBlock[i] = matBlock[0]; matBlock[i+1] = matBlock[1]; matBlock[i+2] = matBlock[2]; } } std::mt19937_64 InitPRNG(){ std::random_device rd; std::mt19937_64 PRNG(rd()); //seed PRNG using /dev/urandom or similar OS provided RNG std::uniform_real_distribution rngdist{-1.0, 1.0}; //make sure the internal state of the PRNG is properly mixed by generating 10M random numbers //PRNGs often have unreliable distribution uniformity and other statistical properties before their internal state is sufficiently mixed for (uint32_t i=0;i<10000000;i++) rngdist(PRNG); return PRNG; } void PrintMatrices(const std::vector>& matBlock){ for (uint32_t i=0;i rngdist{-1.0, 1.0}; std::vector> matBlock(numConcurrentThreads*3); std::vector> futureBlock(numConcurrentThreads); std::cout<<"*----------------------------*\n"; std::cout<<"| DGEMM thread safety tester |\n"; std::cout<<"*----------------------------*\n"; std::cout<<"Size of random matrices(N=M=K): "<(randomMatSize*randomMatSize)*numConcurrentThreads*3*8)/static_cast(1024*1024)<<" MiB of RAM\n"< 1.0E-13){ std::cout<<"ERROR: one of the threads returned a different result!"<