Blame view

validate/validate-complex.cu 4.94 KB
f1402849   dmayerich   renewed commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  #include <complex>

  #include <iostream>

  #include "rts/complex.h"

  

  #include "compare.h"

  

  

  template<typename T>

  __global__ void add(rts::complex<T> a, rts::complex<T> b, rts::complex<T>* c)

  {

  	*c = a + b;

  }

  
  template<typename T>

  __global__ void multiply(rts::complex<T> a, rts::complex<T> b, rts::complex<T>* c)

  {

  	*c = a * b;

  }

  
  template<typename T>

  __global__ void multiply(rts::complex<T> a, T b, rts::complex<T>* c)

  {

  	*c = a * b;

  }

  
  template<typename T>

  __global__ void divide(rts::complex<T> a, rts::complex<T> b, rts::complex<T>* c)

  {

  	*c = a / b;

  }

  
  template<typename T>

  __global__ void log(rts::complex<T> a, rts::complex<T>* c)

  {

  	*c = rts::log(a);

  }

  
  template<typename T>

  __global__ void sqrt(rts::complex<T> a, rts::complex<T>* c)

  {

  	*c = rts::sqrt(a);

  }

  
  template<typename T>

  __global__ void exp(rts::complex<T> a, rts::complex<T>* c)

  {

  	*c = rts::exp(a);

  }

  
  template<typename T>

  __global__ void pow(rts::complex<T> a, rts::complex<T>* c)

  {

  	*c = rts::pow(a, (T)2.0);

  }

  
  template<typename T>

  __global__ void sin(rts::complex<T> a, rts::complex<T>* c)

  {

  	*c = rts::sin(a);

  }

  
  template<typename T>

  __global__ void cos(rts::complex<T> a, rts::complex<T>* c)

  {

  	*c = rts::cos(a);

  }

  
  template <typename T>
  void gpuValidateOperators()
  {
      int precision = sizeof(T) * 8;
      std::stringstream ss;
      ss<<" ("<<precision<<"-bit)";
      std::string bitString = ss.str();
  
      rts::complex<T>* gpuResult;

      cudaMalloc((void**)&gpuResult, sizeof(rts::complex<T>));
  
      //validate complex binary functions

  	T x0, x1, y0, y1;

  	for(int i = 0; i<N; i++)

  	{

  		//generate a random complex number

  		x0 = (double)rand()/(double)RAND_MAX * 2 - 1;

  		y0 = (double)rand()/(double)RAND_MAX * 2 - 1;

  		x1 = (double)rand()/(double)RAND_MAX * 2 - 1;

  		y1 = (double)rand()/(double)RAND_MAX * 2 - 1;

  

  		//create an STD and RTS instance of the complex class

  		std::complex<T> stdComplex0(x0, y0);

  		rts::complex<T> rtsComplex0(x0, y0);

  

  		std::complex<T> stdComplex1(x1, y1);

  		rts::complex<T> rtsComplex1(x1, y1);

  

  		std::complex<T> stdResult;

  		rts::complex<T> rtsResult;

  

  

  		//test addition

  		stdResult = stdComplex0 + stdComplex1;

  		add<<<1, 1>>>(rtsComplex0, rtsComplex1, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("Binary Addition") + bitString);

  		//std::cout<<stdResult<<"------"<<rtsResult.toStr()<<std::endl;

  

  		//test multiplication

  		stdResult = stdComplex0 * stdComplex1;

  		multiply<<<1, 1>>>(rtsComplex0, rtsComplex1, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("Binary Multiplication") + bitString);

  

  		//test multiplication with constant

  		stdResult = stdComplex0 * stdComplex1.real();

  		multiply<<<1, 1>>>(rtsComplex0, rtsComplex1.r, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("Multiplication with Real Value") + bitString);

  

  		//test division

  		stdResult = stdComplex0 / stdComplex1;

  		divide<<<1, 1>>>(rtsComplex0, rtsComplex1, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("Binary Division") + bitString);

  

  		//test log()

  		stdResult = log(stdComplex0);

  		log<<<1, 1>>>(rtsComplex0, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("log()") + bitString);

  

  		//test exp()

  		stdResult = exp(stdComplex0);

  		exp<<<1, 1>>>(rtsComplex0, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("exp()") + bitString);

  

  		//test pow()

  		stdResult = pow(stdComplex0, 2);

  		pow<<<1, 1>>>(rtsComplex0, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("pow()") + bitString);

  

  		//test sqrt()

  		stdResult = sqrt(stdComplex0);

  		sqrt<<<1, 1>>>(rtsComplex0, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("sqrt()") + bitString);

  

  		//trigonometric functions

  		stdResult = sin(stdComplex0);

  		sin<<<1, 1>>>(rtsComplex0, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("sin()") + bitString);

  

  		//trigonometric functions

  		stdResult = cos(stdComplex0);

  		cos<<<1, 1>>>(rtsComplex0, gpuResult);

  		cudaMemcpy(&rtsResult, gpuResult, sizeof(rts::complex<T>), cudaMemcpyDeviceToHost);

  		compare(stdResult, rtsResult, std::string("cos()") + bitString);

  
  

  	}
  	cudaFree(gpuResult);
  
  }
  

  void gpuValidateComplex()

  {
  

  	gpuValidateOperators<float>();
  	//gpuValidateOperators<double>();

  }