ex2!: 3 times height
This commit is contained in:
@@ -10,17 +10,16 @@ NPROC := 3
|
|||||||
|
|
||||||
.PHONY: all clean run
|
.PHONY: all clean run
|
||||||
|
|
||||||
all: clean run
|
all: parallel
|
||||||
|
|
||||||
$(TARGET): $(SRC)
|
$(TARGET): $(SRC)
|
||||||
mkdir -p $(OUTDIR)
|
|
||||||
$(CC) $(CFLAGS) -o $(OUT) $<
|
$(CC) $(CFLAGS) -o $(OUT) $<
|
||||||
|
|
||||||
run: $(TARGET)
|
run: $(TARGET)
|
||||||
cd $(OUTDIR) && ./$< $(ARGS)
|
cd $(OUTDIR) && ./$< $(ARGS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(OUTDIR)
|
rm -rf $(OUTDIR)/*
|
||||||
|
|
||||||
time: $(TARGET)
|
time: $(TARGET)
|
||||||
python3 bench.py './$(OUT) 0' $(NBENCH)
|
python3 bench.py './$(OUT) 0' $(NBENCH)
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
#include <mpi.h>
|
#include <mpi.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#define XSIZE 2560
|
#define XSIZE 2560
|
||||||
#define YSIZE 2048
|
#define YSIZE 2048
|
||||||
@@ -22,6 +23,8 @@ typedef struct {
|
|||||||
double real, imag;
|
double real, imag;
|
||||||
} complex_t;
|
} complex_t;
|
||||||
|
|
||||||
|
int rank, size;
|
||||||
|
|
||||||
void calculate() {
|
void calculate() {
|
||||||
for (int i = 0; i < XSIZE; i++) {
|
for (int i = 0; i < XSIZE; i++) {
|
||||||
for (int j = 0; j < YSIZE; j++) {
|
for (int j = 0; j < YSIZE; j++) {
|
||||||
@@ -83,36 +86,53 @@ void fancycolour(uchar *p, int iter) {
|
|||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
MPI_Init(&argc, &argv);
|
MPI_Init(&argc, &argv);
|
||||||
int rank, size;
|
|
||||||
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|
||||||
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
||||||
printf("hello from rank %d/%d", rank, size);
|
|
||||||
if (argc == 1) {
|
|
||||||
puts("Usage: MANDEL n");
|
|
||||||
puts("n decides whether image should be written to disk (1=yes, 0=no)");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* Calculate the range in the y-axis such that we preserve the
|
|
||||||
aspect ratio */
|
|
||||||
step = (xright - xleft) / XSIZE;
|
step = (xright - xleft) / XSIZE;
|
||||||
yupper = ycenter + (step * YSIZE) / 2;
|
double old_yupper = ycenter + (step * YSIZE) / 2;
|
||||||
ylower = ycenter - (step * YSIZE) / 2;
|
double old_ylower = ycenter - (step * YSIZE) / 2;
|
||||||
|
double delta = (old_yupper - old_ylower) / size;
|
||||||
|
|
||||||
|
ylower = old_ylower + rank * delta;
|
||||||
|
yupper = old_ylower + (rank + 1) * delta;
|
||||||
|
|
||||||
calculate();
|
calculate();
|
||||||
|
|
||||||
if (strtol(argv[1], NULL, 10) != 0) {
|
printf("after calculate %d\n", rank);
|
||||||
/* create nice image from iteration counts. take care to create it upside
|
|
||||||
down (bmp format) */
|
const int bufsize = XSIZE * YSIZE * 3;
|
||||||
unsigned char *buffer = calloc(XSIZE * YSIZE * 3, 1);
|
unsigned char *buffer = calloc(bufsize, 1);
|
||||||
for (int i = 0; i < XSIZE; i++) {
|
for (int i = 0; i < XSIZE; i++) {
|
||||||
for (int j = 0; j < YSIZE; j++) {
|
for (int j = 0; j < YSIZE; j++) {
|
||||||
int p = ((YSIZE - j - 1) * XSIZE + i) * 3;
|
int p = ((YSIZE - j - 1) * XSIZE + i) * 3;
|
||||||
fancycolour(buffer + p, pixel[PIXEL(i, j)]);
|
fancycolour(buffer + p, pixel[PIXEL(i, j)]);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* write image to disk */
|
|
||||||
savebmp("mandel.bmp", buffer, XSIZE, YSIZE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("after buffer %d\n", rank);
|
||||||
|
|
||||||
|
if (rank != 0)
|
||||||
|
MPI_Send(buffer, bufsize, MPI_INT8_T, 0, 0, MPI_COMM_WORLD);
|
||||||
|
|
||||||
|
printf("hello again from %d\n", rank);
|
||||||
|
|
||||||
|
// use process 0 as central process: gather calulations and output image
|
||||||
|
if (rank == 0) {
|
||||||
|
unsigned char *bufferest = calloc(bufsize * size, 1);
|
||||||
|
memcpy(bufferest, buffer, bufsize);
|
||||||
|
printf("after memcpy\n");
|
||||||
|
|
||||||
|
for (int i = 1; i < size; i++) {
|
||||||
|
MPI_Recv(buffer, bufsize, MPI_INT8_T, i, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
|
||||||
|
memcpy(bufferest + bufsize * i, buffer, bufsize);
|
||||||
|
}
|
||||||
|
printf("after loop\n");
|
||||||
|
|
||||||
|
savebmp("mandel.bmp", buffer, XSIZE, YSIZE * size);
|
||||||
|
printf("after save\n");
|
||||||
|
}
|
||||||
|
|
||||||
MPI_Finalize();
|
MPI_Finalize();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user