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 438 - (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 438 // pos = pos + stepSz*dir;
97 :     // if (inside (pos,F)) {
98 :     // real val = F@pos;
99 :     // maxval = max(val, maxval);
100 :     // }
101 :     // if (t > 20.0)
102 :     // stabilize;
103 :     // t = t + stepSz;
104 :     Diderot_AddScaledV3 (&pos, &pos, glob->stepSz, &pos);
105 : jhr 434 }
106 :    
107 : jhr 437 void Global_init (GlobalState_t *glob)
108 :     {
109 : jhr 438 glob->stepSz = 0.1f; // default value
110 :    
111 :     if ((Diderot_InputString("dataFile", &(glob->dataFile), false) != DIDEROT_OK)
112 :     || (Diderot_InputReal("stepSz", &(glob->stepSz), true) != DIDEROT_OK)
113 :     || (Diderot_InputVec3("eye", &(glob->eye), false) != DIDEROT_OK)
114 :     || (Diderot_InputVec3("orig", &(glob->orig), false) != DIDEROT_OK)
115 :     || (Diderot_InputVec3("cVec", &(glob->cVec), false) != DIDEROT_OK)
116 :     || (Diderot_InputVec3("rVec", &(glob->rVec), false) != DIDEROT_OK))
117 : jhr 437 // error processing inputs
118 :     exit (1);
119 :    
120 :     // image(3)[] img = load (dataFile);
121 : jhr 438 if (Diderot_LoadImage3D(glob->dataFile, &(glob->img)))
122 :     // error loading image data
123 :     exit (1);
124 : jhr 437
125 :     }
126 :    
127 :    
128 : jhr 434 int main (int argc, char ** argv)
129 : jhr 437 {
130 :     GlobalState_t glob;
131 :    
132 :     glob.argc = argc;
133 :     glob.argv = argv;
134 :     Global_init (glob);
135 :    
136 :     /* initial actors */
137 :    
138 :     /* run simulation */
139 :    
140 :     /* output */
141 :    
142 : jhr 434 char *dataFile = "../../data/txs.nrrd";
143 :     float transformMatrix[16];
144 :     float inverseMatrix[16];
145 :    
146 :     if (argc == 2) {
147 :     dataFile = argv[1];
148 :     }
149 :    
150 :     float *out = (float *) malloc(sizeof(float) * (SIZE * SIZE));
151 : jhr 437 Nrrd * nin = loadNrrdFile (dataFile);
152 : jhr 434
153 :     int sAxis[] = {nin->axis[0].size, nin->axis[1].size,nin->axis[2].size};
154 :    
155 :     loadTransformMatrix(nin,transformMatrix);
156 :     invMatrix(transformMatrix,inverseMatrix);
157 :    
158 :    
159 :     exe_MIP_Kernel((float *)nin->data, (int)nrrdElementNumber(nin),inverseMatrix, sAxis, out);
160 :    
161 :     return 0;
162 :     }

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