diff --git a/cpp_thread_test/dgemm_thread_safety.cpp b/cpp_thread_test/dgemm_thread_safety.cpp new file mode 100644 index 000000000..8b91d0232 --- /dev/null +++ b/cpp_thread_test/dgemm_thread_safety.cpp @@ -0,0 +1,104 @@ +#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 = 64; //number of concurrent calls of the functions being tested +const uint32_t numTestRounds = 32; //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<<"Initializing random number generator..."< 1.0E-13){ + std::cout<<"ERROR: one of the threads returned a different result!"<