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

SCM Repository

[diderot] Annotation of /benchmarks/programs/mandelbrot/bmark-teem.c
ViewVC logotype

Annotation of /benchmarks/programs/mandelbrot/bmark-teem.c

Parent Directory Parent Directory | Revision Log Revision Log


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

1 : jhr 1908 /*! \file bmark-teem.c
2 :     *
3 :     * \author John Reppy
4 :     */
5 :    
6 :     /*
7 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
8 :     * All rights reserved.
9 :     */
10 :    
11 :     // unu quantize -b 8 -i bmark-teem.nrrd -o bmark-teem.png
12 :    
13 :     #include <stdio.h>
14 :     #include <math.h>
15 :     #include <stdbool.h>
16 :     #include "teem/nrrd.h"
17 :     #include "teem/ell.h"
18 :     #include "teem-defs.h"
19 :    
20 :     #if 1
21 :     # define REAL float
22 :     # define POW powf
23 :     # define SIN sinf
24 :     # define nrrdTypeReal nrrdTypeFloat
25 :     #else
26 :     # define REAL double
27 :     # define POW pow
28 :     # define SIN sin
29 :     # define nrrdTypeReal nrrdTypeDouble
30 :     #endif
31 :    
32 :     #define RESOLUTION 2000
33 :     #define MAX_ITER 2000
34 :     #define FOV 0.15
35 :    
36 :     STATIC_INLINE REAL lerp (REAL out_min, REAL out_max, REAL in_min, REAL in, REAL in_max)
37 :     {
38 :     return (out_min * (in_max - in) + out_max * (in - in_min)) / (in_max - in_min);
39 :     }
40 :    
41 :     STATIC_INLINE REAL sqr (REAL x) { return x*x; }
42 :    
43 :     STATIC_INLINE REAL dot2 (REAL vec1[2], REAL vec2[2])
44 :     {
45 :     return (vec1[0] * vec2[0] + vec1[1] * vec2[1]);
46 :     }
47 :    
48 :     int main (int argc, const char *argv[])
49 :     {
50 :     const char *me = argv[0];
51 :     char *outFile = "bmark-teem.nrrd";
52 :     REAL center[2] = {-1.2, -0.3};
53 :    
54 :     airArray *mop;
55 :     mop = airMopNew();
56 :    
57 :     Nrrd *nOut = nrrdNew();
58 :     airMopAdd(mop, nOut, (airMopper)nrrdNuke, airMopAlways);
59 :     if (nrrdAlloc_va(nOut, nrrdTypeReal, 3,
60 :     AIR_CAST(size_t, 3),
61 :     AIR_CAST(size_t, RESOLUTION),
62 :     AIR_CAST(size_t, RESOLUTION)))
63 :     {
64 :     char *err = biffGetDone(NRRD);
65 :     airMopAdd (mop, err, airFree, airMopAlways);
66 :     fprintf (stderr, "%s: Trouble allocating:\n%s", me, err);
67 :     airMopError (mop);
68 :     return -1;
69 :     }
70 :     REAL *outData = AIR_CAST(REAL *, nOut->data);
71 :    
72 :     double t0 = airTime(); // start timing
73 :    
74 :     for (int ciIdx = 1; ciIdx <= RESOLUTION; ciIdx++) {
75 :     for (int crIdx = 1; crIdx <= RESOLUTION; crIdx++) {
76 :     REAL c[2] = {
77 :     lerp(center[0]-FOV, center[0]+FOV, 1.0, (REAL)crIdx, (REAL)RESOLUTION),
78 :     lerp(center[1]-FOV, center[1]+FOV, 1.0, (REAL)ciIdx, (REAL)RESOLUTION)
79 :     };
80 :     REAL z[2] = {0.0, 0.0};
81 :     int iter = 0;
82 :     while (true) {
83 :     // z = z^2 + c
84 :     REAL re = sqr(z[0]) - sqr(z[1]);
85 :     REAL im = 2.0 * z[0] * z[1];
86 :     ELL_2V_SET(z, re + c[0], im + c[1]);
87 :     iter += 1;
88 :     if (dot2(z, z) > 4.0) {
89 :     // point has escaped; set color based on iteration
90 :     REAL t = 11.0* POW((REAL)iter, 0.2);
91 :     REAL red = (SIN(t) + 1.7) / 2.7;
92 :     REAL green = (SIN(t + 2.0*M_PI/3.0) + 1.7) / 2.7;
93 :     REAL blue = (SIN(t - 2.0*M_PI/3.0) + 1.7) / 2.7;
94 :     ELL_3V_SET(outData + 3*(crIdx-1 + RESOLUTION*(ciIdx-1)), red, green, blue);
95 :     break;
96 :     }
97 :     else if (iter > MAX_ITER) {
98 :     ELL_3V_SET(outData + 3*(crIdx-1 + RESOLUTION*(ciIdx-1)), 0.0, 0.0, 0.0);
99 :     break;
100 :     }
101 :     }
102 :     }
103 :     }
104 :    
105 :     double totalTime = airTime() - t0;
106 :     printf("usr=%f\n", totalTime);
107 :    
108 :     if (nrrdSave(outFile, nOut, NULL)) {
109 :     char *err = biffGetDone(NRRD);
110 :     airMopAdd(mop, err, airFree, airMopAlways);
111 :     fprintf(stderr, "%s: Trouble saving:\n%s", me, err);
112 :     airMopError(mop);
113 :     return -1;
114 :     }
115 :    
116 :     airMopOkay(mop);
117 :     return 0;
118 :    
119 :     }

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