Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /trunk/test/MIP/mip_c.c
ViewVC logotype

Annotation of /trunk/test/MIP/mip_c.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 439 - (view) (download) (as text)

1 : jhr 434 /*! \file mip_c.c
2 :     *
3 :     * \author John Reppy
4 :     *
5 :     * This is a "by hand" translation of the vr-MIP.diderot example into parallel C code that
6 :     * uses SSE instructions and pthreads.
7 :     */
8 :    
9 :     /*
10 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
11 :     * All rights reserved.
12 :     */
13 :    
14 :     #include <stdio.h>
15 :     #include <stdlib.h>
16 :     #include <stdbool.h>
17 :     #include <stdint.h>
18 :     #include <sys/sysctl.h>
19 :     #include <sys/stat.h>
20 :     #include <teem/nrrd.h>
21 :    
22 :     /* SSE vector types */
23 :     typedef float float4 __attribute__ ((__vector_size__ (16)));
24 :     typedef double double2 __attribute__ ((__vector_size__ (16)));
25 :    
26 :     /* union types for converting extracting vector data */
27 :     typedef union {
28 :     float f[4];
29 :     float4 v;
30 :     } f4union;
31 :    
32 :     typedef union {
33 :     double d[2];
34 :     double2 v;
35 :     } d2union;
36 :    
37 :     /* typedefs for Diderot types */
38 :     typedef int32_t Diderot_int;
39 :     typedef float Diderot_real;
40 :     typedef f4union Diderot_vec3; // padded to fit in SSE register
41 :     typedef f4union Diderot_vec4;
42 :     typedef const char *Diderot_string;
43 :     typedef float
44 :    
45 :     /* global state representation */
46 :     typedef struct {
47 :     Diderot_string dataFile; // name of dataset
48 :     Diderot_real stepSz; // size of steps
49 :     // e.g. 0.1
50 :     Diderot_vec3 eye; // location of eye point
51 :     // e.g. txs: (25,15,10)
52 :     // vox1,x: (-8,2,2)
53 :     // vox1,y: (2,-8,2)
54 :     // vox1,z: (2,2,-8)
55 :     // vfrhand: (127.331,-1322.05,272.53)
56 :     Diderot_vec3 orig; // location of pixel (0,0)
57 :     // e.g. txs: (8.83877,2.5911,7.65275)
58 :     // vox1,x: (0,3.4036,3.4036)
59 :     // vox1,y: (0.596402,0,3.4036)
60 :     // vox1,z: (3.4036,3.4036,0)
61 :     // vfrhand: (122.835,17.7112,188.044)
62 :     Diderot_vec3 cVec; // vector between pixels horizontally
63 :     // e.g. txs: (-0.0151831,0.0278357,0)
64 :     // vox1,x: (0,-0.014036,0)
65 :     // vox1,y: (0.014036,0,0)
66 :     // vox1,z: (-0.014036,0,0)
67 :     // vfrhand: (-0.00403611,-0.029826,-0.244066)
68 :     Diderot_vec3 rVec; // vector between pixels vertically
69 :     // e.g. txs: (0.0074887,0.00408474,-0.0305383)
70 :     // vox1,x: (0,0,-0.014036)
71 :     // vox1,y: (0,0,-0.014036)
72 :     // vox1,z: (0,-0.014036,0)
73 :     // vfrhand: (-0.245595,-0.0112916,0.00544129)
74 :     Diderot_image3Df *img;
75 :     } GlobalState_t;
76 :    
77 :     /* actor state representation */
78 :     typedef struct {
79 :     Diderot_vec3 pos;
80 :     Diderot_vec3 dir;
81 :     Diderot_real t;
82 :     Diderot_real maxval;
83 :     Diderot_real padding[2];
84 :     } RayCast_t;
85 :    
86 :     void RayCast_init (GlobalState_t *glob, RayCast_t *self, int row, int col)
87 :     {
88 :     self->pos = orig + real(row)*rVec + real(col)*cVec;
89 :     self->dir = (pos - eye)/|pos - eye|;
90 :     self->t = 0.0f;
91 :     self->maxval = M_INF;
92 :     }
93 :    
94 :     void RayCast_update (GlobalState_t *glob, RayCast_t *self)
95 :     {
96 : jhr 439 // shadow state variables
97 :     Diderot_vec3 pos, dir;
98 :     Diderot_real t, maxval;
99 :    
100 : jhr 438 // pos = pos + stepSz*dir;
101 :     // if (inside (pos,F)) {
102 :     // real val = F@pos;
103 :     // maxval = max(val, maxval);
104 :     // }
105 :     // if (t > 20.0)
106 :     // stabilize;
107 :     // t = t + stepSz;
108 : jhr 439
109 :     Diderot_CopyV3 (&dir, &(glob->dir));
110 :     Diderot_vec3 _t1;
111 :     Diderot_ScaleV3 (&_t1, glob->stepSz,, &dir);
112 :     Diderot_CopyV3 (&pos, &(glob->pos));
113 :     Diderot_AddV3 (&pos, &pos, &_t);
114 :    
115 :     /* ??? */
116 :     if (/* ?? inside ?? */) {
117 :     /* ?? probe ?? */
118 :     maxval = self->maxval;
119 :     maxval = Diderot_max(val, maxval);
120 :     self->maxval = maxval;
121 :     }
122 :    
123 :     t = self->t;
124 :     if (t > 20.0f) {
125 :     Diderot_CopyV3 (&(glob->pos), &pos);
126 :     RayCast_stabilize (glob, self);
127 :     return;
128 :     }
129 :    
130 :     t = t + glob->stepSz;
131 :    
132 :     Diderot_CopyV3 (&(glob->pos), &pos);
133 :     self->t = t;
134 :     self->maxval = maxval;
135 :    
136 : jhr 434 }
137 :    
138 : jhr 437 void Global_init (GlobalState_t *glob)
139 :     {
140 : jhr 438 glob->stepSz = 0.1f; // default value
141 :    
142 :     if ((Diderot_InputString("dataFile", &(glob->dataFile), false) != DIDEROT_OK)
143 :     || (Diderot_InputReal("stepSz", &(glob->stepSz), true) != DIDEROT_OK)
144 :     || (Diderot_InputVec3("eye", &(glob->eye), false) != DIDEROT_OK)
145 :     || (Diderot_InputVec3("orig", &(glob->orig), false) != DIDEROT_OK)
146 :     || (Diderot_InputVec3("cVec", &(glob->cVec), false) != DIDEROT_OK)
147 :     || (Diderot_InputVec3("rVec", &(glob->rVec), false) != DIDEROT_OK))
148 : jhr 437 // error processing inputs
149 :     exit (1);
150 :    
151 :     // image(3)[] img = load (dataFile);
152 : jhr 438 if (Diderot_LoadImage3D(glob->dataFile, &(glob->img)))
153 :     // error loading image data
154 :     exit (1);
155 : jhr 437
156 :     }
157 :    
158 :    
159 : jhr 434 int main (int argc, char ** argv)
160 : jhr 437 {
161 :     GlobalState_t glob;
162 :    
163 :     glob.argc = argc;
164 :     glob.argv = argv;
165 :     Global_init (glob);
166 :    
167 :     /* initial actors */
168 :    
169 :     /* run simulation */
170 :    
171 :     /* output */
172 :    
173 : jhr 434 char *dataFile = "../../data/txs.nrrd";
174 :     float transformMatrix[16];
175 :     float inverseMatrix[16];
176 :    
177 :     if (argc == 2) {
178 :     dataFile = argv[1];
179 :     }
180 :    
181 :     float *out = (float *) malloc(sizeof(float) * (SIZE * SIZE));
182 : jhr 437 Nrrd * nin = loadNrrdFile (dataFile);
183 : jhr 434
184 :     int sAxis[] = {nin->axis[0].size, nin->axis[1].size,nin->axis[2].size};
185 :    
186 :     loadTransformMatrix(nin,transformMatrix);
187 :     invMatrix(transformMatrix,inverseMatrix);
188 :    
189 :    
190 :     exe_MIP_Kernel((float *)nin->data, (int)nrrdElementNumber(nin),inverseMatrix, sAxis, out);
191 :    
192 :     return 0;
193 :     }

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0