int main() { printf("pid: %d\n", getpid()); uint8_t *pixels; light_node lights = NULL; rectangular_node rectangulars = NULL; sphere_node spheres = NULL; color background = { 0.0, 0.1, 0.1 }; struct timespec start, end; #include "use-models.h" /* allocate by the given resolution */ pixels = malloc(sizeof(unsigned char) * ROWS * COLS * 3); if (!pixels) exit(-1); printf("# Rendering scene\n"); /* do the ray tracing with the given geometry */ clock_gettime(CLOCK_REALTIME, &start); raytracing(pixels, background, rectangulars, spheres, lights, &view, ROWS, COLS); clock_gettime(CLOCK_REALTIME, &end); { FILE *outfile = fopen(OUT_FILENAME, "wb"); write_to_ppm(outfile, pixels, ROWS, COLS); fclose(outfile); } delete_rectangular_list(&rectangulars); delete_sphere_list(&spheres); delete_light_list(&lights); free(pixels); printf("Done!\n"); printf("Execution time of raytracing() : %lf sec\n", diff_in_second(start, end)); return 0; }
int main() { uint8_t *pixels; light_node lights = NULL; rectangular_node rectangulars = NULL; sphere_node spheres = NULL; color background = { 0.0, 0.1, 0.1 }; struct timespec start, end; pthread_attr_t attr; void *status; #include "use-models.h" pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); /* allocate by the given resolution */ pixels = malloc(sizeof(unsigned char) * ROWS * COLS * 3); thread_arg *arg_lefttop = setThread_arg(pixels, background, rectangulars, spheres, lights, &view, ROWS/2, COLS/2, 0, 0); thread_arg *arg_leftdown = setThread_arg(pixels, background, rectangulars, spheres, lights, &view, ROWS, COLS/2, ROWS/2, 0); thread_arg *arg_righttop = setThread_arg(pixels, background, rectangulars, spheres, lights, &view, ROWS/2, COLS, 0, COLS/2); thread_arg *arg_rightdown = setThread_arg(pixels, background, rectangulars, spheres, lights, &view, ROWS, COLS, ROWS/2, COLS/2); pthread_attr_destroy(&attr); if (!pixels) exit(-1); printf("# Rendering scene\n"); /* do the ray tracing with the given geometry */ clock_gettime(CLOCK_REALTIME, &start); pthread_create(&callThd[0], &attr, raytracing, (void *)arg_lefttop); pthread_create(&callThd[1], &attr, raytracing, (void *)arg_leftdown); pthread_create(&callThd[2], &attr, raytracing, (void *)arg_righttop); pthread_create(&callThd[3], &attr, raytracing, (void *)arg_rightdown); //raytracing(pixels, background, // rectangulars, spheres, lights, &view, ROWS, COLS); pthread_attr_destroy(&attr); pthread_join(callThd[0], &status); pthread_join(callThd[1], &status); pthread_join(callThd[2], &status); pthread_join(callThd[3], &status); clock_gettime(CLOCK_REALTIME, &end); { FILE *outfile = fopen(OUT_FILENAME, "wb"); write_to_ppm(outfile, pixels, ROWS, COLS); fclose(outfile); } delete_rectangular_list(&rectangulars); delete_sphere_list(&spheres); delete_light_list(&lights); free(pixels); printf("Done!\n"); printf("Execution time of raytracing() : %lf sec\n", diff_in_second(start, end)); return 0; }
int main() { /*thread variable*/ pthread_t *threadx; struct parameter *threadpara; uint8_t *pixels; light_node lights = NULL; rectangular_node rectangulars = NULL; sphere_node spheres = NULL; color background = { 0.0, 0.1, 0.1 }; struct timespec start, end; #include "use-models.h" /* allocate by the given resolution */ pixels = malloc(sizeof(unsigned char) * ROWS * COLS * 3); if (!pixels) exit(-1); printf("# Rendering scene\n"); /* do the ray tracing with the given geometry */ clock_gettime(CLOCK_REALTIME, &start); /*****create parameter which thread used****/ threadpara =(struct parameter*)malloc(THREAD_NUM*sizeof(struct parameter)); for(int i =0; i<THREAD_NUM; i++) { threadpara[i].begin_col =COLS*((double)i/THREAD_NUM); threadpara[i].finish_col =COLS*((double)(i+1.0)/THREAD_NUM); threadpara[i].pixels =pixels; threadpara[i].lights =lights; threadpara[i].rectangulars = rectangulars; threadpara[i].spheres =spheres; memcpy( threadpara[i].background,background,sizeof(color)); threadpara[i].view = &view; threadpara[i].width = ROWS; threadpara[i].height = COLS; } threadx=(pthread_t*)malloc(THREAD_NUM*sizeof(pthread_t)); /* pthread_create(&threadx[0],NULL,&raytracing,&threadpara[0]); pthread_create(&threadx[1],NULL,&raytracing,&threadpara[1]); pthread_create(&threadx[2],NULL,&raytracing,&threadpara[2]); pthread_create(&threadx[3],NULL,&raytracing,&threadpara[3]); pthread_join(threadx[0],NULL); pthread_join(threadx[1],NULL); pthread_join(threadx[2],NULL); pthread_join(threadx[3],NULL); */ for(int i=0; i<THREAD_NUM; i++) { pthread_create(&threadx[i],NULL,&raytracing,&threadpara[i]); } for(int i=0; i<THREAD_NUM; i++) { pthread_join(threadx[i],NULL); } clock_gettime(CLOCK_REALTIME, &end); { FILE *outfile = fopen(OUT_FILENAME, "wb"); write_to_ppm(outfile, pixels, ROWS, COLS); fclose(outfile); } delete_rectangular_list(&rectangulars); delete_sphere_list(&spheres); delete_light_list(&lights); free(pixels); FILE *output; output= fopen("opt.txt","a"); fprintf(output,"raytracing(): %lf \n", diff_in_second(start, end)); fclose(output); printf("Done!\n"); printf("Execution time of raytracing() : %lf sec\n", diff_in_second(start, end)); free(threadx); return 0; }