add an openmp version of mandelbrot.c
This commit is contained in:
		
							parent
							
								
									d0be71ac8f
								
							
						
					
					
						commit
						9ccfdd96ac
					
				
					 3 changed files with 98 additions and 1 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
					@ -31,3 +31,4 @@ undefined-behaviour
 | 
				
			||||||
multibrot-openmp
 | 
					multibrot-openmp
 | 
				
			||||||
multibrot-openmp.png
 | 
					multibrot-openmp.png
 | 
				
			||||||
hello-openmp
 | 
					hello-openmp
 | 
				
			||||||
 | 
					mandelbrot-openmp
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										5
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										5
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
					@ -5,7 +5,7 @@ CFLAGS=-std=c99 -Wextra -pedantic -g -O0
 | 
				
			||||||
CC_OPENMP=gcc # no OpenMP in our clang
 | 
					CC_OPENMP=gcc # no OpenMP in our clang
 | 
				
			||||||
CFLAGS_OPENMP=$(CFLAGS) -fopenmp
 | 
					CFLAGS_OPENMP=$(CFLAGS) -fopenmp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TARGETS=approximate-pi linked-list mandelbrot threads circular-buffer structs ncurses-pong bit-fuckery bit-fuckery2 checkcheck multibrot bloom wo-lernen lua-foo binsearch test-inline-assembly uiowa-threads-example mtrace-test av-variance undefined-behaviour multibrot-openmp hello-openmp
 | 
					TARGETS=approximate-pi linked-list mandelbrot threads circular-buffer structs ncurses-pong bit-fuckery bit-fuckery2 checkcheck multibrot bloom wo-lernen lua-foo binsearch test-inline-assembly uiowa-threads-example mtrace-test av-variance undefined-behaviour multibrot-openmp hello-openmp mandelbrot-openmp
 | 
				
			||||||
EXTRAS=mandelbrot.bmp multibrot.png test-inline-assembly.s tags mtrace-test.trace mtrace-test.txt
 | 
					EXTRAS=mandelbrot.bmp multibrot.png test-inline-assembly.s tags mtrace-test.trace mtrace-test.txt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: all
 | 
					.PHONY: all
 | 
				
			||||||
| 
						 | 
					@ -72,3 +72,6 @@ hello-openmp: hello-openmp.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
multibrot-openmp: multibrot-openmp.c
 | 
					multibrot-openmp: multibrot-openmp.c
 | 
				
			||||||
	$(CC_OPENMP) $(CFLAGS_OPENMP) -o $@ $< -lm -lpng
 | 
						$(CC_OPENMP) $(CFLAGS_OPENMP) -o $@ $< -lm -lpng
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					mandelbrot-openmp: mandelbrot-openmp.c
 | 
				
			||||||
 | 
						$(CC_OPENMP) $(CFLAGS_OPENMP) $(shell sdl-config --cflags) -o $@ $< $(shell sdl-config --libs) -lm
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										93
									
								
								mandelbrot-openmp.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								mandelbrot-openmp.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,93 @@
 | 
				
			||||||
 | 
					#include "SDL.h"
 | 
				
			||||||
 | 
					#include <complex.h>
 | 
				
			||||||
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The maximum iteration count. */
 | 
				
			||||||
 | 
					const int max_it = 170;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Compute the out-coloring based on the iteration counter. */
 | 
				
			||||||
 | 
					Uint32 outcolor(int it) {
 | 
				
			||||||
 | 
					  return 0x00010001 * ((it * 0xff) / max_it);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* "Compute" the in-coloring. */
 | 
				
			||||||
 | 
					Uint32 incolor() {
 | 
				
			||||||
 | 
					  return 0x00000000;            /* black */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void drawmandelbrot(SDL_Surface * surface) {
 | 
				
			||||||
 | 
					  if (SDL_MUSTLOCK(surface)) {
 | 
				
			||||||
 | 
					    SDL_LockSurface(surface);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  Uint32 *pixels = (Uint32 *) surface->pixels;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  #pragma omp parallel for
 | 
				
			||||||
 | 
					  for (int i = 0; i < surface->w * surface->h; i++) {
 | 
				
			||||||
 | 
					    int y = i / surface->w;
 | 
				
			||||||
 | 
					    int x = i % surface->w;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    float complex c = ((3.0f * x / surface->w) - 2.0f)
 | 
				
			||||||
 | 
					        + I * ((2.0f * y / surface->h) - 1.0f);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    bool diverges = false;
 | 
				
			||||||
 | 
					    float complex z = 0;
 | 
				
			||||||
 | 
					    int it;
 | 
				
			||||||
 | 
					    for (it = 1; it <= max_it; it++) {
 | 
				
			||||||
 | 
					      /* z = z² + c */
 | 
				
			||||||
 | 
					      z = cpowf(z, 2) + c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /* If |z| ever gets greater than 2, it diverges. */
 | 
				
			||||||
 | 
					      if (cabsf(z) > 2) {
 | 
				
			||||||
 | 
					        diverges = true;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Uint32 color;
 | 
				
			||||||
 | 
					    if (diverges) {
 | 
				
			||||||
 | 
					      color = outcolor(it);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      color = incolor();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pixels[i] = color;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Update the screen every 10 lines. */
 | 
				
			||||||
 | 
					    #pragma omp critical
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					      if (y % 10 == 0 && x == 0) {
 | 
				
			||||||
 | 
					        SDL_Flip(surface);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Update the screen a final time. */
 | 
				
			||||||
 | 
					  SDL_Flip(surface);
 | 
				
			||||||
 | 
					  if (SDL_MUSTLOCK(surface)) {
 | 
				
			||||||
 | 
					    SDL_UnlockSurface(surface);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(void) {
 | 
				
			||||||
 | 
					  /* Set up SDL. */
 | 
				
			||||||
 | 
					  if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
 | 
				
			||||||
 | 
					    fprintf(stderr, "Error: Could not initialize SDL: %s.\n",
 | 
				
			||||||
 | 
					            SDL_GetError());
 | 
				
			||||||
 | 
					    exit(1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  SDL_Surface *screen = SDL_SetVideoMode(1024, 768, 32, SDL_SWSURFACE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Do the mandelbrot. */
 | 
				
			||||||
 | 
					  drawmandelbrot(screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Save BMP */
 | 
				
			||||||
 | 
					  char *file = "mandelbrot.bmp";
 | 
				
			||||||
 | 
					  if (SDL_SaveBMP(screen, file) != 0) {
 | 
				
			||||||
 | 
					    fprintf(stderr, "Could not write %s!\n", file);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* Quit. */
 | 
				
			||||||
 | 
					  /* FIXME: wait for key press here */
 | 
				
			||||||
 | 
					  SDL_Delay(0*20000);
 | 
				
			||||||
 | 
					  SDL_Quit();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue