66#include " ../cblas.h"
77#include " cpp_thread_safety_common.h"
88
9- void launch_cblas_dgemv (double * A, double * x, double * y, const blasint randomMatSize){
9+ void launch_cblas_dgemv (double * A, double * x, double * y, const blasint randomMatSize)
10+ {
1011 const blasint inc = 1 ;
1112 cblas_dgemv (CblasColMajor, CblasNoTrans, randomMatSize, randomMatSize, 1.0 , A, randomMatSize, x, inc, 0.1 , y, inc);
12- }
13+ }
1314
14- int main (int argc, char * argv[]){
15+ int main (int argc, char * argv[])
16+ {
1517 blasint randomMatSize = 1024 ; // dimension of the random square matrices and vectors being used
1618 uint32_t numConcurrentThreads = 52 ; // number of concurrent calls of the functions being tested
1719 uint32_t numTestRounds = 16 ; // number of testing rounds before success exit
@@ -20,20 +22,23 @@ int main(int argc, char* argv[]){
2022 if (maxHwThreads < 52 )
2123 numConcurrentThreads = maxHwThreads;
2224
23- if (argc > 4 ){
25+ if (argc > 4 )
26+ {
2427 std::cout<<" ERROR: too many arguments for thread safety tester" <<std::endl;
2528 abort ();
26- }
27- if (argc == 4 ){
29+ }
30+ if (argc == 4 )
31+ {
2832 std::vector<std::string> cliArgs;
29- for (int i = 1 ; i < argc; i++){
33+ for (int i = 1 ; i < argc; i++)
34+ {
3035 cliArgs.push_back (argv[i]);
3136 std::cout<<argv[i]<<std::endl;
32- }
37+ }
3338 randomMatSize = std::stoul (cliArgs.at (0 ));
3439 numConcurrentThreads = std::stoul (cliArgs.at (1 ));
3540 numTestRounds = std::stoul (cliArgs.at (2 ));
36- }
41+ }
3742
3843 std::uniform_real_distribution<double > rngdist{-1.0 , 1.0 };
3944 std::vector<std::vector<double >> matBlock (numConcurrentThreads);
@@ -56,15 +61,18 @@ int main(int argc, char* argv[]){
5661
5762 std::cout<<" Preparing to test CBLAS DGEMV thread safety\n " ;
5863 std::cout<<" Allocating matrices..." <<std::flush;
59- for (uint32_t i=0 ; i<numConcurrentThreads; i++){
64+ for (uint32_t i=0 ; i<numConcurrentThreads; i++)
65+ {
6066 matBlock.at (i).resize (randomMatSize*randomMatSize);
61- }
67+ }
6268 std::cout<<" done\n " ;
6369 std::cout<<" Allocating vectors..." <<std::flush;
64- for (uint32_t i=0 ; i<(numConcurrentThreads*2 ); i++){
70+ for (uint32_t i=0 ; i<(numConcurrentThreads*2 ); i++)
71+ {
6572 vecBlock.at (i).resize (randomMatSize);
66- }
73+ }
6774 std::cout<<" done\n " ;
75+
6876 // pauser();
6977
7078 std::cout<<" Filling matrices with random numbers..." <<std::flush;
@@ -77,31 +85,35 @@ int main(int argc, char* argv[]){
7785
7886 std::cout<<" Testing CBLAS DGEMV thread safety" <<std::endl;
7987 omp_set_num_threads (numConcurrentThreads);
80- for (uint32_t R=0 ; R<numTestRounds; R++){
88+ for (uint32_t R=0 ; R<numTestRounds; R++)
89+ {
8190 std::cout<<" DGEMV round #" <<R<<std::endl;
8291 std::cout<<" Launching " <<numConcurrentThreads<<" threads simultaneously using OpenMP..." <<std::flush;
8392 #pragma omp parallel for default(none) shared(futureBlock, matBlock, vecBlock, randomMatSize, numConcurrentThreads)
84- for (uint32_t i=0 ; i<numConcurrentThreads; i++){
93+ for (uint32_t i=0 ; i<numConcurrentThreads; i++)
94+ {
8595 futureBlock[i] = std::async (std::launch::async, launch_cblas_dgemv, &matBlock[i][0 ], &vecBlock[i*2 ][0 ], &vecBlock[i*2 +1 ][0 ], randomMatSize);
86- }
96+ }
8797 std::cout<<" done\n " ;
8898 std::cout<<" Waiting for threads to finish..." <<std::flush;
89- for (uint32_t i=0 ; i<numConcurrentThreads; i++){
99+ for (uint32_t i=0 ; i<numConcurrentThreads; i++)
100+ {
90101 futureBlock[i].get ();
91- }
102+ }
92103 std::cout<<" done\n " ;
93104 std::cout<<" Comparing results from different threads..." <<std::flush;
94105 for (uint32_t i=2 ; i<(numConcurrentThreads*2 ); i+=2 ){ // i is the index of vector x, for a given thread
95- for (uint32_t j = 0 ; j < static_cast <uint32_t >(randomMatSize); j++){
106+ for (uint32_t j = 0 ; j < static_cast <uint32_t >(randomMatSize); j++)
107+ {
96108 if (std::abs (vecBlock[i+1 ][j] - vecBlock[1 ][j]) > 1.0E-13 ){ // i+1 is the index of vector y, for a given thread
97109 std::cout<<" ERROR: one of the threads returned a different result! Index : " <<i+1 <<std::endl;
98110 std::cout<<" CBLAS DGEMV thread safety test FAILED!" <<std::endl;
99111 return -1 ;
112+ }
100113 }
101114 }
115+ std::cout<<" OK!\n " <<std::endl;
102116 }
103- std::cout<<" OK!\n " <<std::endl;
104- }
105117 std::cout<<" CBLAS DGEMV thread safety test PASSED!\n " <<std::endl;
106118 return 0 ;
107- }
119+ }
0 commit comments