-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathutils.cpp
More file actions
96 lines (73 loc) · 2.71 KB
/
utils.cpp
File metadata and controls
96 lines (73 loc) · 2.71 KB
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
#include "utils.h"
float vbo_time;
const int LOGN = log2(N);
namespace vbo {
GLuint vbo = 0;
struct cudaGraphicsResource* cuda_vbo_resource = NULL;
void* d_vbo_buffer = NULL;
namespace cpu {
void createVBO(GLuint* vbo) {
assert(vbo);
// create buffer object
glGenBuffers(1, vbo);
glBindBuffer(GL_ARRAY_BUFFER, *vbo);
// initialize buffer object
glBufferData(GL_ARRAY_BUFFER, N * N * sizeof(float3), 0, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
SDK_CHECK_ERROR_GL();
}
void deleteVBO(GLuint* vbo) {
glBindBuffer(1, *vbo);
glDeleteBuffers(1, vbo);
*vbo = 0;
}
}
namespace gpu {
void createVBO(GLuint* vbo, struct cudaGraphicsResource** vbo_res, unsigned int vbo_res_flags) {
assert(vbo);
// create buffer object
glGenBuffers(1, vbo);
glBindBuffer(GL_ARRAY_BUFFER, *vbo);
// initialize buffer object
//unsigned int size = MESH_WIDTH * MESH_HEIGHT * 4 * sizeof(float);
glBufferData(GL_ARRAY_BUFFER, N * N * sizeof(float3), 0, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
// register this buffer object with CUDA
checkCudaErrors(cudaGraphicsGLRegisterBuffer(vbo_res, *vbo, vbo_res_flags));
SDK_CHECK_ERROR_GL();
}
void deleteVBO(GLuint* vbo, struct cudaGraphicsResource* vbo_res) {
// unregister this buffer object with CUDA
checkCudaErrors(cudaGraphicsUnregisterResource(vbo_res));
glBindBuffer(1, *vbo);
glDeleteBuffers(1, vbo);
*vbo = 0;
}
}
}
void cuda_debug_check() {
cudaError cerror;
if (DEBUG) {
cudaDeviceSynchronize();
if (cerror = cudaGetLastError()) {
fprintf(stderr, "error: %s\n", cudaGetErrorString(cerror));
exit(cerror);
}
}
}
float* shared::h_random_numbers;
float* shared::d_random_numbers;
void shared::generate_random_numbers() {
size_t random_numbers_size = N * N * 4 * sizeof(float);
curandGenerator_t curandGenerator;
curandCreateGenerator(&curandGenerator, CURAND_RNG_PSEUDO_XORWOW);
curandSetPseudoRandomGeneratorSeed(curandGenerator, time(NULL));
cudaMalloc(&d_random_numbers, random_numbers_size);
curandGenerateNormal(curandGenerator, d_random_numbers, N * N * 4, 0.0, 1.0f);
switch (MODE) {
case(CPU):
case(CORRECTNESS):
h_random_numbers = (float*)malloc(random_numbers_size);
cudaMemcpy(h_random_numbers, d_random_numbers, random_numbers_size, cudaMemcpyDeviceToHost);
}
}