# 2016q3 Homework1 (raytracing) ###### tags: `HahaSula` --- 先來按表操課 ```shell= sula@sula-IdeaPad-U430p:~/workspace/raytracing$ gprof ./raytracing | less ``` ```shell= Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 24.01 0.66 0.66 56956357 0.00 0.00 subtract_vector 20.74 1.23 0.57 69646433 0.00 0.00 dot_product 8.73 1.47 0.24 31410180 0.00 0.00 multiply_vector 8.37 1.70 0.23 13861875 0.00 0.00 rayRectangularIntersection 8.00 1.92 0.22 10598450 0.00 0.00 normalize 5.82 2.08 0.16 17821809 0.00 0.00 cross_product 5.64 2.24 0.16 17836094 0.00 0.00 add_vector 5.09 2.38 0.14 4620625 0.00 0.00 ray_hit_object 4.00 2.49 0.11 13861875 0.00 0.00 raySphereIntersection 2.55 2.56 0.07 1048576 0.00 0.00 ray_color 1.46 2.60 0.04 4221152 0.00 0.00 multiply_vectors 1.46 2.64 0.04 1 0.04 2.75 raytracing 0.91 2.66 0.03 2110576 0.00 0.00 compute_specular_diffuse 0.91 2.69 0.03 2110576 0.00 0.00 localColor 0.73 2.71 0.02 1241598 0.00 0.00 refraction 0.36 2.72 0.01 2520791 0.00 0.00 idx_stack_top 0.36 2.73 0.01 1241598 0.00 0.00 protect_color_overflow 0.36 2.74 0.01 1241598 0.00 0.00 reflection 0.36 2.75 0.01 1048576 0.00 0.00 rayConstruction 0.18 2.75 0.01 3838091 0.00 0.00 length ``` 於是從計算時間最多的下手 loop unrolling --- ```clike= //math-toolkit.h //before // //static inline double dot_product(const double *v1, const double *v2) { double dp = 0.0; for (int i = 0; i < 3; i++) dp += v1[i] * v2[i]; return dp; } //after static inline double dot_product(const double *v1, const double *v2) { double dp = 0.0; //for (int i = 0; i < 3; i++) // dp += v1[i] * v2[i]; dp = v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2] ; return dp; } ``` 執行時間 0.57>>>0.26(應該多做幾次做統計比較好) ```shell= Flat profile: Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 21.41 0.43 0.43 56956357 0.00 0.00 subtract_vector 12.94 0.69 0.26 69646433 0.00 0.00 dot_product ``` 接著來對subtract_vector,multiply_vector,add_vector,multiply_vector下手看看 ```clike= static inline void subtract_vector(const double *a, const double *b, double *out) { out[0] = a[0] - b[0] ; out[1] = a[1] - b[1] ; out[2] = a[2] - b[2] ; //for (int i = 0; i < 3; i++) // out[i] = a[i] - b[i]; } static inline void add_vector(const double *a, const double *b, double *out) { out[0] = a[0] + b[0] ; out[1] = a[1] + b[1] ; out[2] = a[2] + b[2] ; //for (int i = 0; i < 3; i++) // out[i] = a[i] + b[i]; } static inline void subtract_vector(const double *a, const double *b, double *out) { out[0] = a[0] - b[0] ; out[1] = a[1] - b[1] ; out[2] = a[2] - b[2] ; //for (int i = 0; i < 3; i++) // out[i] = a[i] - b[i]; } static inline void multiply_vectors(const double *a, const double *b, double *out) { out[0] = a[0] * b[0]; out[1] = a[1] * b[1]; out[2] = a[2] * b[2]; //for (int i = 0; i < 3; i++) // out[i] = a[i] * b[i]; } static inline void multiply_vector(const double *a, double b, double *out) { out[0] = a[0] * b; out[1] = a[1] * b; out[2] = a[2] * b; //for (int i = 0; i < 3; i++) // out[i] = a[i] * b; } ``` ```shell= Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 15.14 0.23 0.23 69646433 0.00 0.00 dot_product 13.17 0.43 0.20 56956357 0.00 0.00 subtract_vector 11.19 0.60 0.17 10598450 0.00 0.00 normalize 9.22 0.74 0.14 4620625 0.00 0.00 ray_hit_object 7.90 0.86 0.12 13861875 0.00 0.00 raySphereIntersection 7.24 0.97 0.11 13861875 0.00 0.00 rayRectangularIntersection 6.25 1.07 0.10 17821809 0.00 0.00 cross_product 4.61 1.14 0.07 1 0.07 1.51 raytracing 4.28 1.20 0.07 4221152 0.00 0.00 multiply_vectors 3.95 1.26 0.06 31410180 0.00 0.00 multiply_vector ```