PLASMA  2.4.5
PLASMA - Parallel Linear Algebra for Scalable Multi-core Architectures
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
core_dplrnt.c
Go to the documentation of this file.
1 
17 #include "common.h"
18 
19 #define REAL
20 #undef COMPLEX
21 
22 /*
23  Rnd64seed is a global variable but it doesn't spoil thread safety. All matrix
24  generating threads only read Rnd64seed. It is safe to set Rnd64seed before
25  and after any calls to create_tile(). The only problem can be caused if
26  Rnd64seed is changed during the matrix generation time.
27  */
28 
29 //static unsigned long long int Rnd64seed = 100;
30 #define Rnd64_A 6364136223846793005ULL
31 #define Rnd64_C 1ULL
32 #define RndF_Mul 5.4210108624275222e-20f
33 #define RndD_Mul 5.4210108624275222e-20
34 
35 #ifdef COMPLEX
36 #define NBELEM 2
37 #else
38 #define NBELEM 1
39 #endif
40 
41 static unsigned long long int
42 Rnd64_jump(unsigned long long int n, unsigned long long int seed ) {
43  unsigned long long int a_k, c_k, ran;
44  int i;
45 
46  a_k = Rnd64_A;
47  c_k = Rnd64_C;
48 
49  ran = seed;
50  for (i = 0; n; n >>= 1, ++i) {
51  if (n & 1)
52  ran = a_k * ran + c_k;
53  c_k *= (a_k + 1);
54  a_k *= a_k;
55  }
56 
57  return ran;
58 }
59 
60 #if defined(PLASMA_HAVE_WEAK)
61 #pragma weak CORE_dplrnt = PCORE_dplrnt
62 #define CORE_dplrnt PCORE_dplrnt
63 #endif
64 void CORE_dplrnt( int m, int n, double *A, int lda,
65  int bigM, int m0, int n0, unsigned long long int seed )
66 {
67  double *tmp = A;
68  int64_t i, j;
69  unsigned long long int ran, jump;
70 
71  jump = m0 + n0 * bigM;
72 
73  for (j=0; j<n; ++j ) {
74  ran = Rnd64_jump( NBELEM*jump, seed );
75  for (i = 0; i < m; ++i) {
76  *tmp = 0.5f - ran * RndF_Mul;
77  ran = Rnd64_A * ran + Rnd64_C;
78 #ifdef COMPLEX
79  *tmp += I*(0.5f - ran * RndF_Mul);
80  ran = Rnd64_A * ran + Rnd64_C;
81 #endif
82  tmp++;
83  }
84  tmp += lda-i;
85  jump += bigM;
86  }
87 }
88 
89 /***************************************************************************/
92 void QUARK_CORE_dplrnt( Quark *quark, Quark_Task_Flags *task_flags,
93  int m, int n, double *A, int lda,
94  int bigM, int m0, int n0, unsigned long long int seed )
95 {
97  QUARK_Insert_Task(quark, CORE_dplrnt_quark, task_flags,
98  sizeof(int), &m, VALUE,
99  sizeof(int), &n, VALUE,
100  sizeof(double)*lda*n, A, OUTPUT,
101  sizeof(int), &lda, VALUE,
102  sizeof(int), &bigM, VALUE,
103  sizeof(int), &m0, VALUE,
104  sizeof(int), &n0, VALUE,
105  sizeof(unsigned long long int), &seed, VALUE,
106  0);
107 }
108 
109 /***************************************************************************/
112 #if defined(PLASMA_HAVE_WEAK)
113 #pragma weak CORE_dplrnt_quark = PCORE_dplrnt_quark
114 #define CORE_dplrnt_quark PCORE_dplrnt_quark
115 #endif
117 {
118  int m;
119  int n;
120  double *A;
121  int lda;
122  int bigM;
123  int m0;
124  int n0;
125  unsigned long long int seed;
126 
127  quark_unpack_args_8( quark, m, n, A, lda, bigM, m0, n0, seed );
128  CORE_dplrnt( m, n, A, lda, bigM, m0, n0, seed );
129 }
130