#include #include #include #include #include #include #include #include #include #ifdef OPENBLAS_USE_GENERATED_CBLAS_H #include "generated/cblas.h" #else #include "../cblas.h" #endif #include "cpp_thread_safety_common.h" void compute_dgemm_pair(std::vector& transA, std::vector& noTransA, std::vector& B, double* firstOutput, double* secondOutput, const blasint randomMatSize, const bool sameVariant){ cblas_dgemm(CblasRowMajor, CblasTrans, CblasNoTrans, randomMatSize, 2, 2, 1.0, &transA[0], randomMatSize, &B[0], 2, 0.0, firstOutput, 2); if (sameVariant) cblas_dgemm(CblasRowMajor, CblasTrans, CblasNoTrans, randomMatSize, 2, 4, 1.0, &transA[0], randomMatSize, &B[0], 2, 0.0, secondOutput, 2); else cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, randomMatSize, 2, 4, 1.0, &noTransA[0], 4, &B[0], 2, 0.0, secondOutput, 2); } void run_worker(std::vector& transA, std::vector& noTransA, std::vector& B, const std::vector& referenceFirst, const std::vector& referenceSecond, const blasint randomMatSize, const uint32_t numTestRounds, const bool sameVariant, std::atomic& readyThreads, std::atomic& startThreads, uint32_t& mismatches){ std::vector firstOutput(static_cast(randomMatSize) * 2); std::vector secondOutput(static_cast(randomMatSize) * 2); const size_t outputBytes = static_cast(randomMatSize) * 2 * sizeof(double); uint32_t localMismatches = 0; readyThreads.fetch_add(1); while (!startThreads.load()) std::this_thread::yield(); for(uint32_t i=0; i [sameVariant]"< cliArgs; for (int i = 1; i < argc; i++){ cliArgs.push_back(argv[i]); std::cout<(randomMatSize) * 4; const size_t outputElements = static_cast(randomMatSize) * 2; std::vector transA(matrixElements); std::vector noTransA(matrixElements); std::vector B(8); std::vector referenceFirst(outputElements); std::vector referenceSecond(outputElements); std::vector threads(numConcurrentThreads); std::vector mismatchBlock(numConcurrentThreads); std::atomic readyThreads(0); std::atomic startThreads(false); std::cout<<"*----------------------------------*\n"; std::cout<<"| Mixed DGEMM thread safety tester |\n"; std::cout<<"*----------------------------------*\n"; std::cout<<"Tall-skinny DGEMM M dimension: "<(matrixElements) * 2 * 8 + static_cast(outputElements) * (2 + 2 * numConcurrentThreads) * 8)/static_cast(1024*1024)<<" MiB of RAM\n"<(i % 512); noTransA[i] = static_cast((i * 7) % 512); } std::cout<<"done\n"; std::cout<<"Filling RHS matrix..."<(i + 1); } std::cout<<"done\n"; std::cout<<"Computing reference results..."<